HELP - root jog scripten belül

Egy roppant egyszerű scriptet kéne írnom, ám van benne egy pici csavar, egy másoláshoz kéne root jog:

A lényegi rész
...
wget http://x.hu/valami_program #letöltöm a programot
cp valami_program /usr/local/bin #itt a probléma, mert ide root jog kellene
...

A biztonsági szempontok nem játszanak, desktop gép, néha a juzernek upgrade-elnie kéne a progit, ennyi az egész, csak nem akarom, hogy jelszavakat gépeljen be, használja a su-t, minél egyszerűbb életet akarok neki. Tudja a root jelszót, csak nem akarom, hogy egy parancs kiadásánál többet kelljen csinálnia.

Valami ötlet?

Hozzászólások

"A biztonsági szempontok nem játszanak, desktop gép, néha a juzernek upgrade-elnie kéne a progit,"

Mi akadályozza meg, hogy cronból a root fennhatósága alatt töltsd le, és rögtön el is helyezd a célállomásán a programot tetszőleges rendszerességgel?

Mert ha tényleg megakadályozza valami, akkor tényleg egy sudo bejegyzés, NOPASSWD-vel.

Lemented a scriptet root ownerrel es teszel ra setuid bitet, onnantol rootkent fut. :)

Feláldoztatott a szekhól- és terrorizmusellenes küzdelemben (nem mindenhol, de elég helyen ahhoz, hogy nagy tétben ne fogadj vakon a lehetőségre):

# touch /tmp/ownedbyroot
# ls -l /tmp/ownedbyroot
-rw-r--r-- 1 root root 0 2013-06-12 11:12 /tmp/ownedbyroot
# cat /tmp/setuidscript.sh

echo "I am: $USER";
echo "who: "; who
echo "whoami: "; whoami
echo "id: "; id
date >> /tmp/ownedbyroot

# chmod 4755 /tmp/setuidscript.sh

$ /tmp/setuidscript.sh
I am: lx
who:
lx tty7 Jun 12 07:06 (:0)
whoami:
lx
id:
uid=500(lx) ...
/tmp/setuidscript.sh: line 6: /tmp/ownedbyroot: Permission denied

Más jellegű kérdés, ha már így alakult... miért jobb a `` mint a $() parancs futtatására?

ha tippelnem kéne arra gondolnék, hogy előbbi több shellben működik mint utóbbi, de ez nem biztos.... esetleg csak megszokás? (régebben én is így használtam amíg rá nem leltem a $() -re :-) )

Jól tipelsz.
De egy kezemen meg tudnám számolni, 15 év alatt hányszor volt gondom abból, hogy másolt szkript(részlet) $()-re volt hangszerelve `` helyett. Távoli rendszereken a Bourne-féle volt a nekem mint gyalogszintű júzernek alapértelmezett shell - de az is csak a távoli admin benézéséből.

Igen, több shellben működik. És ugyan rohadt csekély esélye van a dolognak, de elvben lehet értelmes, valódi funkciót ellátó scriptet írni úgy, hogy mind a Bourne-, mind a C-shell elfogadja. Viszont a C-shell csak a `parancs`formát ismeri, a $(parancs) formát nem fogadja el (mint ahogy egyébként az eredeti/vagy azzal kompatibilis Bourne-shell sem - ez ugyanis a Korn-shellben jelent meg előszőr, onnan szivárgott be a többibe, a POSIX-, illetve a Bash-shellekbe).

Hol nem halt ki? Konkrétan aki még emlékszik, talán a 4-es perl része volt a suidperl nevű bináris, pont amiatt, hogy ha kell, akkor legalább perl-scripttel lehessen ilyet csinálni. Szóval hol működik még ez a lehetőség?
Szerk: FreeBSD-n nem megy a SUID-script; Linuxon nem megy; HP-UX-on (11iV3) egyik tesztelő szerint nem megy, Solaris10-en másik tesztelő szerint nem megy. Kimaradt az AIX (az akkora őskövület tud időnként lenni, hogy akár el is tudom képzelni - bár inkább azt se), meg a OSX illetve kb. a kihalt állatok (mint IRIX, Tru64)

Egyszerűbb a dolog, első körben kell root, utána már nem:
# touch /usr/local/bin/valami && chown juzerke /usr/local/bin/valami

Ez után már a juzerke felül tudja írni a /usr/local/bin/valami fájlt. De lehet úgy is, hogy chgrp _a_juzerke_csoportja_ /usr/local/bin/valami && chmod g+w /usr/local/bin/valami

Köszönöm mindekinek!

A visudo és társai lesz a megoldás, most hirtelen egyelőre egy ALL(ALL) ALL dolgot beírogattam és attól működik, bár egy security expert ettől nyilván fejhangon sírva borulna a karjaira az asztalon, gondolván, hogy ez a marha ennyi erővel 755-öt is adhatna rekurzívan mindenre a gyökérből, de most működnie kell és gyorsan, a cifrázást már megoldom SSH-val távolról is.

Szóval mégegyszer köszi!

Ha biztonságon szeretnél "picit" javítani a jövőben, akkor érdemes lehet két script.
Egyik ami root jogú másolást végzi (sajat_copy_script) és a visudo -ban csak arra adsz sudo jogot.
A másik script meg a jelenlegi scripted. Így a scripted a felhasználó jogán fog futni, de a másolás már rootként futhat anélkül, hogy a /bin/cp -re vagy épp mindenre adnál sudo jogot növelve a biztonsági kockázatokat... (ami persze most nem játszik...)
Így a scriptedben a másolás rész így nézne ki...
sudo -u root /usr/local/sbin/sajat_copy_script

(amúgy a cp-nél az install parancs jobb, mert lehet ownership és mode-okat is adni... )

visudo-ban:
#%users -> users csoport tagjai
#(root) csak a root nevében tudják futtatni máséban nem (persze ha nem feltétlen pont root kell akkor érdemes annak akár system user jogán, akinek van írás joga arra a mappára/meglévő fájlra, amit felül akarsz írni másolni akarod...)
#NOPASSWD: ne kérje a felhasználó jelszavát (pl ha nincs a felhasználóidnak jelszava mert kulccsal lépnek be...)

%users ALL=(root) NOPASSWD: /usr/local/sbin/sajat_copy_script

Ezzel picit fokoztad a biztonságot és relatíve gyorsan megvan...

Ha tényleg nem számítanak a biztonsági szempontok, kockázatok:
chmod a+rwx /usr/local/bin
vagy
chown -R $USER /usr/local/bin