Menambahkan pengguna yang hanya dapat menjalankan skrip dari jarak jauh

14

Saya ingin membuat pengguna yang hanya dapat melakukan satu hal: melalui ssh tentukan skrip (dan argumen commandline ke skrip) yang berada di satu folder tertentu (untuk keperluan pertanyaan ini, sebut saja /local/remote_only_scripts/foo) dan minta skrip dijalankan dan kembalikan hasilnya.

Untuk memperjelas beberapa contoh hal yang saya tidak ingin pengguna dapat lakukan:

  • Masuk ke akun secara lokal. Aplikasi login adalah /bin/login. Ini bukan skrip di /local/remote_only_scripts/foofolder, jadi tidak boleh dipanggil oleh pengguna.
  • Login ke akun dari jarak jauh. Sekali lagi masuk (apakah itu yang disebut dengan ssh?) Bukan skrip di folder yang relevan.
  • Daftar isi direktori. ls adalah di /bin/ls. Ini bukan skrip di direktori yang sesuai.
  • Edit file di direktori itu. emacs, vi, gedit kebanyakan editor lain bukan skrip dalam directoy itu.
  • Lihat konten file dalam direktori itu.
  • Jalankan file dalam direktori itu yang tidak memiliki izin untuk dieksekusi.

Perhatikan bahwa ini adalah contoh ada banyak tindakan lain yang saya tidak ingin pengguna dapat melakukannya. Dalam mempertimbangkan tindakan, tanyakan "apakah ini dilakukan dengan skrip /local/remote_only_scripts/foo?" jika jawabannya tidak, pengguna seharusnya tidak dapat melakukannya. Jika jawabannya adalah ya maka pengguna harus dapat melakukannya.

PS: Izinkan saya mengklarifikasi apa yang saya maksud dengan "menambahkan pengguna". Saya tidak bermaksud menambahkan pengguna ke beberapa subsistem ssh. Yang saya maksud adalah menambahkan pengguna ke sistem komputer. Jadi, misalnya, saya memiliki sistem yang menjalankan debian stable, sebut dengan alamatnya, www.hg.bar.com. Saya ingin menambahkan pengguna (melalui kuser, pengguna-admin atau useradd atau cara serupa lainnya) memanggilnya hg_guest. hg_guest tidak dapat masuk secara lokal atau melakukan hal-hal di daftar di atas. Yang bisa dilakukan hg_guest hanyalah menjalankan skrip "jarak jauh". Saya mengatakan dia harus dapat melakukannya melalui ssh, tetapi memikirkannya sekarang, mungkin mengizinkannya untuk menggunakan ssh memungkinkan dia untuk masuk secara lokal, sehingga beberapa mekanisme lain mungkin diperlukan.

HandyGandy
sumber

Jawaban:

12

Ada opsi perintah dalam file Authorized_key. Opsi ini tampaknya melakukan apa yang Anda inginkan.

Perhatikan bahwa ini bukan chroot atau shell yang dibatasi. Ini memungkinkan untuk mengeksekusi hanya perintah-perintah itu melalui ssh. Dengan contoh Anda, itu akan menjadi:

ssh somehost /local/remote_only_scripts/foo

Untuk file yang diotorisasi ini:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Ada banyak cara jika Anda tidak ingin pengguna Anda dapat masuk secara lokal. Anda dapat:

  • cukup setel shellnya ke / bin / false (mungkin Anda perlu / bin / true karena ssh membutuhkan login yang valid)
  • kunci kata sandinya, lihat passwd -l

EDIT : menambahkan lebih banyak opsi pembatasan dan memperjelas cara Anda menghapus akses lokal.

Coren
sumber
Saya tidak berpikir Anda perlu menentukan perintah itu di ssh di sisi klien, itu adalah perintah 'paksa' sehingga akan selalu dijalankan;) Pengguna di situs jarak jauh masih memerlukan shell yang valid didefinisikan di / etc / passwd.
jirib
1
Selain itu command=, opsi no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptydiperlukan untuk benar-benar membatasi akun.
jofel
Baik. Saya terbangun di tengah malam dan memutuskan untuk memeriksa jawaban. Karena saya mengantuk, saya tidak akan mengasimilasi seluruh jawaban tetapi menanyakan sesuatu yang membuat saya bingung. Bagaimana ini mencegah hg_quest masuk dari tty?
HandyGandy
@HandyGandy Ini adalah bagian yang paling sederhana. Saya telah menambahkan 2 cara untuk melakukannya, tapi saya pikir masih ada lagi
Coren
0

Coba ini sebagai shell login untuk pengguna:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Anda mungkin juga ingin memiliki ini di authorized_keysfile secara eksplisit seperti pada jawaban Coren; tapi ganti '... / foo; dengan programnya di sini. Yang akan mencegah perintah dari SSH seperti sftp, scp, dan ssh hostname command.

Arcege
sumber
Jika Anda hanya ingin pengguna dapat menjalankan perintah dari direktori Anda (dan jumlahnya tidak terlalu banyak), Anda bisa mengeluarkan "prog" dari baca di atas dan menggunakan pernyataan pilih untuk menawarkan menu teks pilihan dari program-program tersebut dan kemudian membaca argumen. Saya juga akan menguji ini untuk memastikan apa yang terjadi jika Anda mengetikkan sekelompok Ctrl-C di berbagai titik dalam skrip. Anda mungkin menginginkan perintah jebakan di sana juga.
Joe
0

Jika mereka hanya perlu mengakses satu skrip, ini berfungsi dengan baik untuk saya. Tambahkan pengguna dan ubah shell default mereka ke jalur skrip. Ketika mereka terhubung melalui ssh, ia akan menjalankan skrip dan menutup sesi mereka.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

2bc
sumber