SSH yetkili_anahtarlar komut seçeneği: çoklu komutlar?


17

Authority_keys, bir anahtarı tek bir komutla sınırlayan bir command = "..." seçeneğine sahiptir. Bir anahtarı birden fazla komutla sınırlamanın bir yolu var mı ? Örneğin, burada bir normal ifadeyle veya başka bir yapılandırma dosyasını düzenleyerek?

Yanıtlar:


9

Hayır. "İzin verilen" komut değil, "zorunlu" komut ( ForceCommand seçeneği olarak).

Tek olasılık, farklı komutlar için farklı anahtarlar kullanmak veya parametreleri okumaktır stdin.


27

Her tuş için yalnızca bir komutunuz olabilir, çünkü komut “zorunlu” dur.

Ancak bir sarmalayıcı komut dosyası kullanabilirsiniz. Çağrılan komut orijinal komut satırını $SSH_ORIGINAL_COMMANDdeğerlendirebileceği ortam değişkeni olarak alır .

Örneđin bunu koy ~/.ssh/allowed-commands.sh:

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

Daha sonra içine referans ~/.ssh/authorized_keysile

command="/home/user/.ssh/allowed-commands.sh",…

1
İşe yarar. Komut dosyalarında kullanılabilmesi için SSH_ORIGINAL_COMMAND(per man sshd) ekleyen sshd'nin kendisini daha açık hale getirmeye değer olabilir . Ayrıca belirli kalıpların SSH_ORIGINAL_COMMANDçalışmasına izin veren otomatik komut dosyalarına örnek vermek . Ayrıca bkz. Unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight

7

O'Reilly'nin harika SSH'si olan Güvenli Kabuk: Kesin Kılavuz kitabında, sekizinci bölümde, aşağıdaki gibi bir komut dosyası kullanılarak verilen güzel bir örnek var:

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

Bunu .authorized_keysdosyanızda şu şekilde kullanmak :

command="/path/to/your/script.sh" <ssh-key>

... bunu yaparken ssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:

Ama böyle temelde senaryo sonları scp, sftpve tüm diğer şeyler, bir gün yarayabilecek.
Jakuje

3
@Jakuje Bu commandseçenek genel olarak geçerli değil mi?
gf_

1

Diğer yaklaşımlar, örneğin, söz konusu kullanıcı için kısıtlanmış bir kabuk kullanır veya belirli bir dizinde bulunan tüm dosyalara / komut dosyalarına komutları kısıtlayan ve böylece sargıyı değiştirmeden komut listesini genişletmeye izin veren bir sarıcı kullanır.

Başka bir makalede , izin verilen komutlara komut satırı bağımsız değişkenlerine de izin veren, ancak bunları normal ifadeler olarak ifade edilen kurallarla kilitlemeye izin veren genel bir komut dosyası açıklanır.

Bu örnek şu şekilde ifade edilebilir:

command="only systemctl shutdown"

Ve .onlyrulesbu içerikle bir dosya hazırlanmış olacak:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

Bu 'tek' yaklaşımın avantajı, her kullanıcı ve durum için ayrı komut dosyaları yazmaya gerek olmamasıdır.


Kabuğu değiştirmeyle ilgili sorun, kısıtlanması amaçlanmamış bir anahtarı olanlarda bile tüm girişlere uygulanacağıdır. Ayrıca, yalnızca oturum açma işlemini gerçekleştirirseniz ve yönetici erişiminiz yoksa yapılandırılmış kabuğunuzu istediğiniz gibi değiştiremezsiniz. Ancak yine de authority_keys dosyanızı düzenleyebilirsiniz.
kasperd

Bir "kısıtlanmış kabuk" kullanabilirsinizForcedCommand
Georg Lehner

Bana göre, kullanılan hesabın normal bir kullanıcı hesabı olması ve gerekli eylemlerin ayrıcalıklı olması, bir kişinin denetimi yapmak için sudo'ya güvenebileceği ve yetkili_anahtarlar komut seçeneğini "sudo $ SSH_ORIGINAL_COMMAND" olarak ayarlayabileceği bir durumda mı?
Steve Dee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.