Můžete také omezit klíče na povolené příkazy (v souboru author_keys).
Tj. uživatel by se nepřihlásil přes ssh a měl by pak omezenou sadu příkazů, ale spíše by mohl tyto příkazy spouštět pouze přes ssh (např. "ssh somehost bin/showlogfile")
To, co hledáte, se nazývá Restricted Shell. Bash poskytuje takový režim, ve kterém mohou uživatelé provádět pouze příkazy přítomné v jejich domovských adresářích (a nemohou se přesouvat do jiných adresářů), což by pro vás mohlo být dost dobré.
Zjistil jsem, že toto vlákno je velmi ilustrativní, i když trochu staré.
ssh
následuje za rsh
tradici pomocí uživatelského shell programu ze souboru s hesly k provádění příkazů.
To znamená, že to můžeme vyřešit bez použití ssh
konfiguraci jakýmkoli způsobem.
Pokud nechcete, aby uživatel mohl mít přístup k shellu, jednoduše nahraďte shell tohoto uživatele skriptem. Pokud se podíváte do /etc/passwd
uvidíte, že existuje pole, které každému uživateli přiřadí interpret příkazů shellu. Skript se používá jako shell pro jejich interaktivní přihlášení ssh [email protected]
stejně jako pro příkazy ssh [email protected] command arg ...
.
Zde je příklad. Vytvořil jsem uživatele foo
jehož shell je skript. Skript vytiskne zprávu my arguments are:
následují jeho argumenty (každý na samostatném řádku a v lomených závorkách) a končí. V případě logu nejsou žádné argumenty. Zde je to, co se stane:
webserver:~# ssh [email protected]
[email protected]'s password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
Pokud se uživatel pokusí spustit příkaz, vypadá takto:
webserver:~# ssh [email protected] cat /etc/passwd
[email protected]'s password:
my arguments are:
<-c>
<cat /etc/passwd>
Náš "shell" obdrží -c
vyvolání stylu, s celým příkazem jako jedním argumentem, stejně jako /bin/sh
obdrží.
Jak tedy vidíte, co nyní můžeme udělat, je vyvinout skript dále, aby rozpoznal případ, kdy byl vyvolán s -c
argument a poté analyzuje řetězec (řekněme pomocí porovnávání vzorů). Tyto povolené řetězce mohou být předány skutečnému shellu rekurzivním vyvoláním /bin/bash -c <string>
. Případ odmítnutí může vytisknout chybovou zprávu a skončit (včetně případu, kdy -c
chybí).
Musíte si dávat pozor, jak to píšete. Doporučuji psát pouze pozitivní shody, které povolují pouze velmi specifické věci, a zakázat vše ostatní.
Poznámka: pokud jste root
, stále se můžete přihlásit k tomuto účtu přepsáním shellu v su
příkaz, jako je tento su -s /bin/bash foo
. (Nahraďte shell dle výběru.) Non-root to nemůže udělat.
Zde je příklad skriptu:omezte uživatele pouze na použití ssh
pro git
přístup k úložištím pod /git
.
#!/bin/sh
if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
printf "interactive login not permitted\n"
exit 1
fi
set -- $2
if [ $# != 2 ] ; then
printf "wrong number of arguments\n"
exit 1
fi
case "$1" in
( git-upload-pack | git-receive-pack )
;; # continue execution
( * )
printf "command not allowed\n"
exit 1
;;
esac
# Canonicalize the path name: we don't want escape out of
# git via ../ path components.
gitpath=$(readlink -f "$2") # GNU Coreutils specific
case "$gitpath" in
( /git/* )
;; # continue execution
( * )
printf "access denied outside of /git\n"
exit 1
;;
esac
if ! [ -e "$gitpath" ] ; then
printf "that git repo doesn't exist\n"
exit 1
fi
"$1" "$gitpath"
Samozřejmě věříme, že tyto programy Git git-upload-pack
a git-receive-pack
nemají díry ani únikové poklopy, které uživatelům umožní přístup do systému.
To je vlastní tomuto druhu omezovacího schématu. Uživatel je ověřen, aby mohl spouštět kód v určité bezpečnostní doméně, a my zavádíme omezení, abychom tuto doménu omezili na subdoménu. Pokud například uživateli povolíte spouštět vim
příkazem na konkrétním souboru jej upravit, uživatel může získat pouze shell s :!sh[Enter]
.