[MEGOLDVA] ssh parancskorlátozás

Fórumok

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.

Hozzászólások

Hm, senki? Nem hiszem el, hogy még senkinél nem jött elő ez a probléma...

Sajat login shell-t irsz, ahol csak a bizonyos parancsokra hivod meg az exec()-t

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.

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

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.

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.

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...

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.

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.