Pertanyaan Bagaimana cara membuat pengguna SSH yang dibatasi untuk penerusan port?


ændrük menyarankan koneksi terbalik untuk mendapatkan koneksi SSH yang mudah dengan orang lain (untuk bantuan jarak jauh). Untuk itu untuk bekerja, seorang pengguna tambahan diperlukan untuk menerima koneksi. Pengguna ini harus dapat meneruskan portnya melalui server (server bertindak sebagai proxy).

Bagaimana cara saya membuat pengguna terbatas yang tidak dapat melakukan apa pun selain yang dijelaskan di atas?

Pengguna baru harus tidak mampu untuk:

  • jalankan perintah shell
  • mengakses file atau mengunggah file ke server
  • gunakan server sebagai proxy (mis. webproxy)
  • mengakses layanan lokal yang sebaliknya tidak dapat diakses publik karena firewall
  • membunuh server

Diringkas, bagaimana cara membuat pengguna SSH terbatas yang hanya dapat terhubung ke server SSH tanpa hak istimewa, sehingga saya dapat terhubung melalui koneksi itu dengan komputernya?


90
2018-06-10 20:04


asal




Jawaban:


TL; DR - pergi ke bagian bawah jawaban, "Menerapkan batasan"

Menambahkan pengguna terbatas terdiri dari dua bagian: 1. Membuat pengguna 2. Mengkonfigurasi daemon SSH (sshd)

Mengkonfigurasi sshd

Tempat terbaik untuk mengetahui kemungkinan SSH adalah dengan membaca halaman manual terkait:

Di mana klien SSH dapat melakukan tindakan?

Sebelum Anda dapat membatasi sesuatu, Anda perlu mengetahui fitur SSH. Meludah melalui hasil halaman manual:

  • Eksekusi perintah shell
  • Unggah file melalui sftp
  • Penerusan port
    • Klien meneruskan port (un) yang digunakan ke server
    • Server meneruskan portnya ke klien
    • Server meneruskan port dari host lain ke klien (proxy-ish)
  • X11 forwarding (penerusan tampilan)
  • Penerusan agen otentikasi
  • Meneruskan perangkat terowongan

Dari Otentikasi bagian dari halaman manual sshd (8):

Jika klien berhasil mengautentikasi sendiri, dialog untuk mempersiapkan   sesi dimasukkan. Saat ini klien dapat meminta hal-hal seperti    mengalokasikan koneksi X11 pseudo-tty, forwarding, meneruskan TCP   koneksi, atau meneruskan koneksi agen otentikasi di atas   saluran aman.

Setelah ini, klien juga meminta shell atau eksekusi perintah.   Sisi-sisinya kemudian masuk ke mode sesi. Dalam mode ini, kedua sisi dapat mengirim   data setiap saat, dan data tersebut diteruskan ke / dari shell atau perintah   di sisi server, dan terminal pengguna di sisi klien.

Pilihan untuk membatasi fitur SSH

File dan opsi mereka yang mengubah perilaku adalah:

  • ~/.ssh/authorized_keys - berisi kunci yang diizinkan untuk dihubungkan yang dapat diberikan opsi:
    • command="command" - Perintah yang diberikan oleh pengguna (jika ada) diabaikan. Perhatikan bahwa klien dapat menentukan penerusan TCP dan / atau X11 kecuali mereka secara eksplisit dilarang. Perhatikan bahwa opsi ini berlaku untuk eksekusi shell, command atau subsystem.
    • no-agent-forwarding - Melarang agen otentikasi meneruskan ketika kunci ini digunakan untuk otentikasi.
    • no-port-forwarding - Forbids TCP forwarding ketika kunci ini digunakan untuk otentikasi
    • no-X11-forwarding - "Forbids X11 forwarding ketika kunci ini digunakan untuk otentikasi."
    • permitopen="host:port" - Batasi local 'ssh -L' port forwarding sedemikian rupa sehingga hanya dapat terhubung ke host dan port yang ditentukan.
  • ~/.ssh/environment - File ini dibaca ke lingkungan saat login (jika ada). Pemrosesan lingkungan dinonaktifkan secara default dan dikontrol melalui opsi PermitUserEnvironment
  • ~/.ssh/rc - Berisi rutinitas inisialisasi yang harus dijalankan sebelum direktori home pengguna menjadi dapat diakses.
  • /etc/ssh/sshd_config - file konfigurasi sistem-lebar
    • AllowAgentForwarding - Menentukan apakah ssh-agent (1) penerusan diizinkan.
    • AllowTcpForwarding
    • ForceCommand - "Memaksa eksekusi perintah yang ditentukan oleh ForceCommand, mengabaikan perintah apa pun yang diberikan oleh klien dan ~ / .ssh / rc jika ada. Perintah ini dipanggil dengan menggunakan shell login pengguna dengan opsi -c."
    • GatewayPorts - "Menentukan apakah host jarak jauh diizinkan untuk menyambung ke port yang diteruskan untuk klien. Secara default, sshd (8) mengikat penerusan port jauh ke alamat loopback. Hal ini mencegah host jarak jauh lainnya menyambung ke port yang diteruskan. GatewayPorts dapat digunakan untuk menentukan bahwa sshd harus mengizinkan penerusan port jauh untuk mengikat ke alamat non-loopback, sehingga memungkinkan host lain untuk terhubung. "
    • PermitOpen:

Menentukan tujuan pengalihan port TCP   diizinkan. Spesifikasi penerusan harus menjadi salah satu dari   formulir berikut:

PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port

Beberapa maju dapat ditentukan dengan memisahkan mereka dengan   ruang putih. Argumen 'any' dapat digunakan untuk menghapus semua   pembatasan dan mengizinkan setiap permintaan penerusan. Secara default semua   permintaan penerusan port diizinkan.


142
2018-06-22 09:11



Agar ini berfungsi, akun ditambahkan oleh useradd harus dibuka kuncinya. Itu bisa dilakukan dengan mengganti kata sandi /etc/shadow oleh asteric (*) atau dengan menetapkan kata sandi menggunakan sudo passwd limited-user. - Lekensteyn
SFTP berfungsi karena server SSH menjalankan sftp-server perintah. Dengan ForceCommand, perintah ini tidak akan dieksekusi lagi. - Lekensteyn
Juga bermanfaat adalah from= opsi dalam authorized_keys. Ini memungkinkan Anda membatasi penggunaan kunci ke sumber dengan alamat IP atau nama host tertentu. Contoh, from="1.1.1.1" atau from="10.0.0.?,*.example.com". Lihat bagian "AUTHORIZED_KEYS FILE FORMAT" di halaman manual (linux.die.net/man/8/sshd) untuk semua opsi authorized_keys. - Donn Lee
"AllowTcpForwarding local" melarang penerusan jarak jauh. (Saya tidak tahu apakah itu ada ketika jawaban ini ditulis.) - Simon Sapin
Perhatikan bahwa ini rusak oleh koneksi ssh persisten, jadi Anda tidak akan memiliki sesuatu seperti Host * ControlMaster auto di dalam kamu ~/.ssh/config file saat terhubung dengan ssh -N. Jika Anda membutuhkannya, gunakan ssh -N -o ControlMaster=no - nh2


Saya yakin ada banyak solusi untuk ini, dan banyak yang lebih kuat daripada yang saya usulkan. Namun, ini mungkin cukup untuk kebutuhan Anda. Untuk melakukannya, saya mengasumsikan pengguna telah mampu melakukan otentikasi berbasis kunci ssh (dempul atau unix ssh harus mendukung ini).

  • Tambahkan pengguna seperti biasa ('adduser' atau alat lainnya)

  • Buat pengguna .ssh dir dan .ssh / authorized_keys

your_user $ sudo -Hu ssh_forwarder /bin/bash

ssh_forwarder $ cd ~
ssh_forwarder $ mkdir .ssh
ssh_forwarder $ ( umask 066 && cat > .ssh/authorized_keys ) <<EOF
no-agent-forwarding,no-X11-forwarding,command="read a; exit" ssh-rsa AAAB3NzaC1y....2cD/VN3NtHw== smoser@brickies
EOF
  • Nonaktifkan akses kata sandi ke akun ini.
your_user $ sudo usermod --lock ssh_forwarder

Sekarang, satu-satunya cara agar pengguna dapat masuk ke sistem Anda adalah melalui akses ke kunci ssh yang tepat, dan ssh akan menjalankan "/ bin / bash -c 'untuk membaca' 'untuk mereka, tidak peduli apa pun yang mereka coba jalankan. 'read a' hanya akan membaca sampai baris baru, dan kemudian shell akan keluar, sehingga pengguna hanya perlu menekan 'enter' untuk mematikan koneksi.

Ada banyak hal lain yang bisa Anda lakukan di 'command ='. Lihat man authorized_keys dan cari 'perintah' untuk informasi lebih lanjut.

Jika Anda tidak suka fakta bahwa memukul masuk membunuh koneksi, Anda bisa menggunakan sesuatu seperti berikut untuk entri 'command =':

command="f=./.fifo.$$ && mkfifo $f && trap \"rm -f $f\" EXIT && read a <$f && echo $a; exit;"

Ini hanya membuat fifo sementara di direktori home pengguna, dan kemudian mencoba untuk membacanya. Tidak ada yang akan menulis ke file itu, jadi ini akan menggantung tanpa batas. Selain itu, jika Anda ingin mengakhiri koneksi secara paksa, Anda dapat melakukan sesuatu seperti:

 your_user$ echo GOODBYE | sudo tee ~ssh_forwarder/.fifo.*

Ini harus menggunakan sumber daya yang sangat sedikit, dan tidak ada yang bisa salah dalam skrip itu yang tidak akan berakhir pada penghentian shell.

sleep 1h; echo You have been here too long. Good bye.

Saya tidak melihat dari tangan bagaimana Anda bisa membiarkan pengguna untuk maju jauh (ssh -R) tetapi batas (ssh -L). Mungkin 'permitopen' bisa digunakan. Googling tidak sangat membantu. Tampaknya sesuatu seperti 'no-port-forwarding, permitremoteopen = 10001' akan berguna untuk memungkinkan ssh -R 6901:localhost:6901.

Ini adalah Sebuah larutan. Hal ini dapat diperbaiki, dan setiap pembukaan port jarak jauh harus diteliti. Jika tujuan saya adalah mengizinkan Nenek saya untuk terhubung ke LAN saya sehingga saya dapat menggunakan vnc untuk melihat layarnya, dan akses ke kunci itu terbatas padanya, saya pribadi akan merasa cukup aman. Jika ini untuk sebuah perusahaan, penyelidikan yang lebih menyeluruh akan diperlukan. Satu hal yang harus diperhatikan adalah ssh -N tidak meminta shell sama sekali, sehingga 'command =' code tidak dieksekusi.

Mekanisme lain yang mungkin lebih aman mungkin termasuk membuat shell kustom untuk pengguna, dan bahkan mengunci yang turun dengan apparmour.


2
2018-06-21 13:09



Ini terlihat sangat peretas, bahkan tidak perlu memiliki shell karena tidak ada perintah yang perlu dijalankan. Lihat halaman manual ssh Untuk -N pilihan. Harus ada cara yang lebih bersih untuk mencapai ini. - Lekensteyn
Itu benar. Saya berharap untuk melihat solusi yang lebih bersih juga. Saya berpikir bahwa authorized_keys dalam hubungannya dengan no-port-forwarding akan menjadi solusi yang bagus jika ada opsi 'permitremoteopen'. - smoser
Saya melakukan beberapa researcg (lihat di atas). Sejak ssh -N tidak menjalankan perintah sama sekali, tidak masalah itu command="something" menutup sesi. - Lekensteyn