Opsi perintah SSH Authorized_keys: beberapa perintah?

17

Resmi_kunci memiliki opsi perintah = "..." yang membatasi kunci untuk satu perintah. Apakah ada cara untuk membatasi kunci untuk beberapa perintah? Misalnya dengan memiliki regex di sana, atau dengan mengedit beberapa file konfigurasi lainnya?

dkaeae
sumber

Jawaban:

9

Tidak. Ini bukan perintah "diizinkan", tetapi perintah "terpaksa" (sebagai opsi ForceCommand ).

Satu-satunya kemungkinan adalah menggunakan kunci yang berbeda untuk perintah yang berbeda atau membaca parameter dari stdin.

Jakuje
sumber
27

Anda hanya dapat memiliki satu perintah per kunci, karena perintah itu "dipaksa".

Tetapi Anda dapat menggunakan skrip wrapper. Perintah yang dipanggil mendapatkan baris perintah asli sebagai variabel lingkungan $SSH_ORIGINAL_COMMAND, yang dapat dievaluasi.

Misalnya, masukkan ~/.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

Kemudian referensi ~/.ssh/authorized_keysdengan

command="/home/user/.ssh/allowed-commands.sh",…
hfs
sumber
1
Berguna. Mungkin perlu diperjelas bahwa itu adalah sshd itu sendiri yang menambahkan SSH_ORIGINAL_COMMAND(per man sshd) sehingga tersedia dalam skrip. Juga untuk memberikan contoh untuk skrip otomatis yang memungkinkan pola tertentu SSH_ORIGINAL_COMMANDdijalankan. Lihat juga unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight
7

Dalam SSH yang hebat , buku The Secure Shell: The Definitive Guide karya O'Reilly, dalam bab delapan, ada contoh yang bagus diberikan dengan menggunakan skrip seperti berikut:

#!/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

Menggunakan ini di .authorized_keysfile Anda seperti:

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

... memberi Anda ini saat melakukan ssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:
gf_
sumber
Tetapi skrip semacam itu pada dasarnya rusak scp, sftpdan semua hal lain yang mungkin berguna untuk Anda kelak.
Jakuje
3
@ Jakuje Bukankah ini berlaku untuk commandopsi secara umum?
gf_
1

Pendekatan lain menggunakan misalnya shell terbatas untuk pengguna yang diberikan atau menggunakan pembungkus yang menahan perintah untuk semua file / skrip yang ditemukan di direktori tertentu, sehingga memungkinkan untuk menambah daftar perintah tanpa mengubah pembungkus.

Artikel lain menjelaskan skrip generik, yang juga memungkinkan argumen baris perintah ke perintah yang diizinkan, tetapi memungkinkan untuk menguncinya dengan aturan yang dinyatakan sebagai ekspresi reguler.

Contoh ini akan diungkapkan dengan cara berikut:

command="only systemctl shutdown"

Dan sebuah .onlyrulesfile akan dibuat dengan konten ini:

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

Keuntungan dari pendekatan 'satu-satunya' ini adalah bahwa tidak perlu menulis skrip individual untuk setiap pengguna dan situasi.

Georg Lehner
sumber
Masalah dengan mengganti shell adalah itu akan berlaku untuk semua login, bahkan mereka yang memiliki kunci yang tidak dimaksudkan untuk dibatasi. Terlebih lagi jika Anda hanya login shell dan tidak ada akses administrator Anda tidak bisa hanya mengubah shell yang dikonfigurasi untuk apa pun yang Anda inginkan. Tetapi Anda masih dapat mengedit file otor_keys Anda.
kasperd
Anda dapat menggunakan "shell terbatas" sebagaiForcedCommand
Georg Lehner
Terjadi pada saya, untuk situasi di mana akun yang digunakan adalah akun pengguna normal, dan tindakan yang diperlukan adalah hak istimewa, bahwa seseorang dapat mengandalkan sudo untuk melakukan pengecekan, dan mengatur opsi perintah otor_keys menjadi "sudo $ SSH_ORIGINAL_COMMAND"?
Steve Dee