A kérdés a következő: hogy oldaható meg az, hogy egy adott user ne tudjon interaktívan belépni, csak sshból bizonyos parancsokat futtatni?
(A kérdés komoly, rendesen körbejártam, nincs triviális megoldás, ezért kérdezem.)
Megoldás:
kell egy script, ami meg van adva authorized_keys command-jában és login shellnek is, amiben a SSH_ORIGINAL_COMMAND környezeti változót kell ellenőrizni, és megfelelőség esetén lefuttatni, ami benne van.
- 1627 megtekintés
Hozzászólások
Hm, senki? Nem hiszem el, hogy még senkinél nem jött elő ez a probléma...
- A hozzászóláshoz be kell jelentkezni
Sajat login shell-t irsz, ahol csak a bizonyos parancsokra hivod meg az exec()-t
- A hozzászóláshoz be kell jelentkezni
Igen, épp most találtam rá a mágikus SSH_ORIGINAL_COMMAND környezeti változóra. Valószínűleg ez lesz a megoldás, de kicsit gányolás szaga van... Valami olyasmit keresek, mint ami a sudo-ban meg a super-ben van, hogy megadható egy parancs maszk.
- A hozzászóláshoz be kell jelentkezni
Lasd a hozzaszolasom alant. Pici wrapper hozza, vagy keyenkent egy parancs, amelyik tetszik, es maris van egy jo megoldasod. Kb fel perc googlezas utan...
Jol korbe lett jarva a tema, latom :P
- A hozzászóláshoz be kell jelentkezni
"keyenkent egy parancs"
Na ez az, ami miatt nem működik a megoldásod. Mellesleg azt a kérdést sem oldja meg, hogy lokálból ne tudjon a user beléni, ugyanis command mágia ide vagy oda, mégiscsak a passwd-ben megadott shell-el futtatja, ergo /bin/false nem játszik.
- A hozzászóláshoz be kell jelentkezni
A local belepes ellen "*" a password helyere az /etc/shadow-ban es RSA kulcsos ssh auth hasznalata.
Egyebkent ilyen problemara kulonbozo (webes) frontendeket szoktak irni, minthogy ssh-val buveszkedjenek.
- A hozzászóláshoz be kell jelentkezni
Vagy, mint mondtam, pici wrappert irsz kore.
A belepest meg egy no-pty opcioval szepen egyszeruen kiutod.
- A hozzászóláshoz be kell jelentkezni
authorized_keys-ben a command= parancs kell neked: http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html
- A hozzászóláshoz be kell jelentkezni
Nem, nem az kell nekem. Nem figyelsz. Részlet a manból:
"Specifies that the command is executed whenever this key is used for authentication. The command supplied by the user (if any) is ignored."
Azaz ahány parancsot szeretnék, ahány paraméterrel, arra mind külön kulcsot kéne gnerálnom, ami kezelhetetlen.
- A hozzászóláshoz be kell jelentkezni
authorized_keys2 ben a command= "xxx.sh" kulcs
valami ilyesmi kell neked ??
( menteshez hasznalom ... )
xxx.sh:
F_SYS=("/boot" )
f_count=${#F_SYS[*]}
ALLOWED_IP=("192.168.254.61" "192.168.212.253" "192.168.254.240" "192.168.100.102" "192.168.100.105")
ip_count=${#ALLOWED_IP[*]}
ip () {
for (( j=0; j<$ip_count; j++ )); do
if [ ${ALLOWED_IP[$j]} = $FROM ]; then
return 0
fi
done
return 1
}
#
# this command executed from /root/.ssh/authorized_keys2 file
#
#
# echo `date` $SSH_ORIGINAL_COMMAND $SSH_CONNECTION >>/tmp/ssh_cmd.${USER}
CMD=`echo $SSH_ORIGINAL_COMMAND | awk '{print $1}'`
if [ -z $CMD ]; then
SSH_ORIGINAL_COMMAND="/usr/bin/script -a -q /tmp/ssh_log.${USER}"
fi
FROM=`echo $SSH_CONNECTION | awk '{print $1}'`
if ip $FROM ; then
eval $SSH_ORIGINAL_COMMAND
else
case $CMD in
rsync)
for (( i=0; i<$f_count; i++ )); do
F=`echo $SSH_ORIGINAL_COMMAND | grep ${F_SYS[$i]}`
if [ ! -z "$F" ]; then
mount ${F_SYS[$i]}
eval $SSH_ORIGINAL_COMMAND
umount ${F_SYS[$i]}
exit
fi
done
eval $SSH_ORIGINAL_COMMAND
;;
scp)
eval $SSH_ORIGINAL_COMMAND
;;
esac
- A hozzászóláshoz be kell jelentkezni
Csinalj neki restricted shellt peldaul, akkor akar be is lephet. Vagy masik megoldas, hogy sudon keresztul futtathat mindent, es ForceCommand-nak a sudot adod meg, mar ha az fel tud venni argumentumokat.
Meg lehet azt is oldani, hogy egy shell script a login shellje, amiben fuggvenyeket hivogat getopts vagy case segitsegevel.
Csak aztan a kesz megoldast ird is le, hadd probaljunk meg kitorni belole.
- A hozzászóláshoz be kell jelentkezni
Ezen már túl vagyok, sajnos nem működik, mert valaki, valahol út közben átad egy "-c" paramétert, amire a sudo besír, hogy neki nincs ilyenje. :-(
Valószínűleg az lesz, amit másodjára írtál, shell scriptes login shell, és természetesen megírom a megoldást! Pár perc szerintem és kész.
- A hozzászóláshoz be kell jelentkezni
Ja, most tesztelgetem en is.
Szerk. A -c mindenkeppen bennmarad, de azt mint allando elso argumentumot egy shifttel le lehet dobni.
- A hozzászóláshoz be kell jelentkezni
Ez mukodik nekem:
sshsh:x:6666:100::/home/sshsh:/usr/local/bin/sshsh
#!/bin/bash
shift
if ! [ "$1" ]; then
echo "Goodbye"
exit 0
fi
case "$1" in
uname)
uname -a
exit 0
;;
whoami)
whoami
exit 0
;;
*)
echo "Command is not available"
exit 1
;;
esac
Ha persze mondjuk 'uname -a' -t akarsz hasznalni inputkent is, arra nem fog mukodni...
- A hozzászóláshoz be kell jelentkezni
Na, a következő lett a végleges megoldás. Feltesszük, hogy a user nem tud környezeti változókkal mahinálni mielőtt a login shell lefut (azaz az SSH_ORIGINAL_COMMAND-ban tényleg az van, aminek kell, és ha nincs értéke, akkor nem remote shellről van szó, így lokálból indítva semmit nem csinál). Továbbá a valid parancsokat a könnyebb üzemeltethetőség érdekében összegyűjtjük egy könyvtárba (ezek úgyis mindig scriptek):
#!/bin/bash
cmd=${SSH_ORIGINAL_COMMAND%% *}
if [ "$cmd" != "" ]; then
canonized=$(readlink -f $cmd)
if [ "${canonized%/*}" == "/usr/lib/remotecommands" ]; then
$SSH_ORIGINAL_COMMAND
fi
fi
Szerk: ja, és a fenti script van megadva login shellnek a passwd-ben.
- A hozzászóláshoz be kell jelentkezni
Szerintem a freeshell.org-on pont az hasznaljak, ami neked kell. Alapbol egy korlatozott shellt kapsz, ha elofizetsz kapsz egy teljes ertekut. Biztos vagyok benne, hogy talalsz hozza leirast, vagy ha belepsz a chatre az admin tud neked segiteni.
- A hozzászóláshoz be kell jelentkezni
Kösz a tippet, bár már megoldottam a fenti scripttel, de azért kiváncsiság az kiváncsiság :-D
- A hozzászóláshoz be kell jelentkezni
Sub
- A hozzászóláshoz be kell jelentkezni