GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara membatasi pengguna SSH ke serangkaian perintah yang telah ditentukan setelah login?

Anda juga dapat membatasi kunci untuk perintah yang diizinkan (dalam file authorized_keys).

Yaitu. pengguna tidak akan masuk melalui ssh dan kemudian memiliki serangkaian perintah terbatas tetapi hanya akan diizinkan untuk menjalankan perintah tersebut melalui ssh (mis. "ssh somehost bin/showlogfile")


Apa yang Anda cari disebut Restricted Shell. Bash menyediakan mode di mana pengguna hanya dapat menjalankan perintah yang ada di direktori home mereka (dan mereka tidak dapat pindah ke direktori lain), yang mungkin cukup baik untuk Anda.

Saya menemukan utas ini sangat ilustratif, jika agak kuno.


ssh mengikuti rsh tradisi dengan menggunakan program shell pengguna dari file kata sandi untuk menjalankan perintah.

Artinya, kita dapat menyelesaikan ini tanpa melibatkan ssh konfigurasi dengan cara apa pun.

Jika Anda tidak ingin pengguna dapat memiliki akses shell, cukup ganti shell pengguna tersebut dengan skrip. Jika Anda melihat /etc/passwd Anda akan melihat bahwa ada bidang yang menetapkan juru bahasa perintah shell untuk setiap pengguna. Skrip digunakan sebagai shell keduanya untuk login interaktif mereka ssh [email protected] serta untuk perintah ssh [email protected] command arg ... .

Ini sebuah contoh. Saya membuat pengguna foo yang cangkangnya adalah skrip. Script mencetak pesan my arguments are: diikuti oleh argumennya (masing-masing pada baris terpisah dan dalam kurung sudut) dan diakhiri. Dalam kasus log in, tidak ada argumen. Inilah yang terjadi:

webserver:~# ssh [email protected]
[email protected]'s password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Jika pengguna mencoba menjalankan perintah, tampilannya seperti ini:

webserver:~# ssh [email protected] cat /etc/passwd
[email protected]'s password:
my arguments are:
<-c>
<cat /etc/passwd>

"Shell" kami menerima -c pemanggilan gaya, dengan seluruh perintah sebagai satu argumen, sama seperti /bin/sh akan menerimanya.

Jadi seperti yang Anda lihat, apa yang bisa kita lakukan sekarang adalah mengembangkan skrip lebih lanjut sehingga dapat mengenali kasus saat dipanggil dengan -c argumen, lalu mem-parsing string (katakanlah dengan pencocokan pola). String yang diizinkan dapat diteruskan ke shell asli dengan memanggil /bin/bash -c <string> secara rekursif . Kasus penolakan dapat mencetak pesan kesalahan dan mengakhiri (termasuk kasus ketika -c hilang).

Anda harus berhati-hati bagaimana Anda menulis ini. Saya merekomendasikan hanya menulis kecocokan positif yang hanya mengizinkan hal-hal yang sangat spesifik, dan melarang yang lainnya.

Catatan: jika Anda root , Anda masih dapat masuk ke akun ini dengan mengganti shell di su perintah, seperti su -s /bin/bash foo ini . (Pengganti shell pilihan.) Non-root tidak dapat melakukan ini.

Berikut ini contoh skrip:batasi pengguna agar hanya menggunakan ssh untuk git akses ke repositori di bawah /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"

Tentu saja, kami percaya bahwa program Git ini git-upload-pack dan git-receive-pack tidak memiliki lubang atau pintu keluar yang akan memberi pengguna akses ke sistem.

Itu melekat dalam skema pembatasan semacam ini. Pengguna diautentikasi untuk mengeksekusi kode dalam domain keamanan tertentu, dan kami memasukkan batasan untuk membatasi domain tersebut ke subdomain. Misalnya jika Anda mengizinkan pengguna untuk menjalankan vim perintah pada file tertentu untuk mengeditnya, pengguna cukup mendapatkan shell dengan :!sh[Enter] .


Linux
  1. Cara Mengatur Kunci SSH

  2. Bagaimana Cara Mengatur Variabel Lingkungan Pengguna? (secara permanen, Bukan Sesi)?

  3. Bagaimana Cara Memeriksa Apakah Shell Masuk/interaktif/batch?

  1. Bagaimana Cara Mengubah Cron Shell (sh ke Bash)?

  2. Lanjutkan Perintah Shell Setelah Terhubung ke Ssh?

  3. Cara Mengatur Kunci SSH di Ubuntu 18.04

  1. Cara Mengatur Tunneling SSH

  2. Cara Mengonfigurasi SSH untuk membatasi Pengguna/Grup dengan perintah izinkan dan tolak

  3. bagaimana cara menonaktifkan login SSH dengan kata sandi untuk beberapa pengguna?