ssh
bu rsh
geleneği, komutları yürütmek için parola dosyasından kullanıcının kabuk programını kullanarak izler .
Bu ssh
, herhangi bir şekilde yapılandırmaya dahil olmadan bunu çözebileceğimiz anlamına gelir .
Kullanıcının kabuk erişimine sahip olmasını istemiyorsanız, o kullanıcının kabuğunu bir komut dosyasıyla değiştirin. İçeri bakarsanız, /etc/passwd
her kullanıcıya bir kabuk komut yorumlayıcısı atayan bir alan olduğunu göreceksiniz. Komut dosyası, hem etkileşimli oturum açma ssh user@host
hem de komutlar için kabuk olarak kullanılır ssh user@host command arg ...
.
İşte bir örnek. foo
Kabuğu betik olan bir kullanıcı oluşturdum . Komut dosyası, mesajın my arguments are:
ardından argümanlarını (her biri ayrı bir satırda ve köşeli parantez içinde) yazdırır ve sona erer. Durumda günlükte hiçbir argüman yoktur. İşte olanlar:
webserver:~
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
Kullanıcı bir komutu çalıştırmayı denerse, şöyle görünür:
webserver:~
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>
"Kabuğumuz" -c
, tüm komutun tek bir argüman olarak olduğu bir stil çağrısı alır , tıpkı /bin/sh
onu alacak gibi.
Gördüğünüz gibi, şimdi yapabileceğimiz şey, komut dosyasını daha da geliştirmektir, böylece bir -c
argümanla çağrıldığında durumu tanır ve sonra dizeyi ayrıştırır (örneğin desen eşleştirerek). İzin verilen dizeler özyinelemeli olarak çağrılarak gerçek kabuğa geçirilebilir /bin/bash -c <string>
. Red durumu, bir hata mesajı yazdırabilir ve sona erebilir ( -c
eksik olduğu durum dahil ).
Bunu nasıl yazdığına dikkat etmelisin. Yalnızca çok özel şeylere izin veren ve diğer her şeye izin vermeyen pozitif eşleşmeler yazmanızı öneririm.
Not: Eğer root
öyleyseniz su
, bunun gibi komuttaki kabuğu geçersiz kılarak bu hesaba yine de giriş yapabilirsiniz su -s /bin/bash foo
. (Yedek kabuk seçimi.) Kök olmayanlar bunu yapamaz.
İşte bir örnek script: Sadece kullanarak kullanıcıyı kısıtlamak ssh
için git
altında havuzlarına erişim /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 )
;;
( * )
printf "command not allowed\n"
exit 1
;;
esac
gitpath=$(readlink -f "$2")
case "$gitpath" in
( /git/* )
;;
( * )
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"
Tabii ki, bu Git programlarının git-upload-pack
ve git-receive-pack
kullanıcıların sisteme erişimini sağlayacak delikler veya kaçış kapakları olmadığına güveniyoruz .
Bu, bu tür bir kısıtlama planının doğasında vardır. Kullanıcının, belirli bir güvenlik etki alanında kod yürütmesi için kimliği doğrulanır ve bu etki alanını bir alt etki alanıyla sınırlamak için bir kısıtlama getiriyoruz. Örneğin, bir kullanıcının vim
düzenlemesi için belirli bir dosya üzerinde komutu çalıştırmasına izin verirseniz , kullanıcı sadece bir kabuk alabilir :!sh[Enter]
.