ændrük menyarankan koneksi terbalik untuk mendapatkan koneksi SSH yang mudah dengan orang lain (untuk bantuan jarak jauh). Agar itu berfungsi, pengguna tambahan diperlukan untuk menerima koneksi. Pengguna ini harus dapat meneruskan porta melalui server (server bertindak sebagai proxy).
Bagaimana cara membuat pengguna terbatas yang tidak dapat melakukan lebih dari yang dijelaskan di atas?
Pengguna baru tidak boleh dapat:
- jalankan perintah shell
- mengakses file atau mengunggah file ke server
- gunakan server sebagai proxy (mis. webproxy)
- mengakses layanan lokal yang tidak dapat diakses publik karena firewall
- bunuh server
Ringkasnya, 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?
ssh
security
port-forwarding
Lekensteyn
sumber
sumber
Jawaban:
TL; DR - buka bagian bawah jawaban, "Menerapkan batasan"
Menambahkan pengguna terbatas terdiri dari dua bagian: 1. Membuat pengguna 2. Mengkonfigurasi daemon SSH (sshd)
Konfigurasi sshd
Tempat terbaik untuk mengetahui kemungkinan SSH adalah dengan membaca halaman buku panduan terkait:
Di mana klien SSH dapat melakukan tindakan?
Sebelum Anda dapat membatasi sesuatu, Anda perlu mengetahui fitur SSH. Meludah melalui halaman buku panduan menghasilkan:
Dari Otentikasi bagian dari halaman manual sshd (8) :
Opsi untuk membatasi fitur SSH
File dan opsinya yang mengubah perilaku adalah:
~/.ssh/authorized_keys
- berisi kunci yang diizinkan untuk terhubung 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 jika mereka secara eksplisit dilarang . Perhatikan bahwa opsi ini berlaku untuk eksekusi shell, perintah atau subsistem.no-agent-forwarding
- Melarang penerusan agen otentikasi ketika kunci ini digunakan untuk otentikasi.no-port-forwarding
- Melarang penerusan TCP saat kunci ini digunakan untuk otentikasino-X11-forwarding
- "Melarang penerusan X11 saat kunci ini digunakan untuk otentikasi."permitopen="host:port"
- Batasi penerusan port 'ssh -L' lokal 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 dikendalikan melalui opsi PermitUserEnvironment~/.ssh/rc
- Berisi rutin inisialisasi yang harus dijalankan sebelum direktori home pengguna menjadi dapat diakses./etc/ssh/sshd_config
- file konfigurasi seluruh sistemAllowAgentForwarding
- Menentukan apakah penerusan ssh-agent (1) diizinkan.AllowTcpForwarding
ForceCommand
- "Memaksa pelaksanaan perintah yang ditentukan oleh ForceCommand, mengabaikan perintah 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 terhubung ke port yang diteruskan untuk klien. Secara default, sshd (8) mengikat penerusan port jarak jauh ke alamat loopback. Ini mencegah host jarak jauh lain dari koneksi ke port yang diteruskan. GatewayPort dapat digunakan untuk menentukan sshd itu harus memungkinkan penerusan port jarak jauh untuk mengikat ke alamat non-loopback, sehingga memungkinkan penghuni lain untuk terhubung. "PermitOpen
:PermitTunnel
- Menentukan apakah tun (4) penerusan perangkat diizinkan. Standarnya adalah 'tidak'X11Forwarding
- Menentukan apakah penerusan X11 diizinkan. Standarnya adalah 'tidak'Menerapkan pembatasan
Memodifikasi file konfigurasi seluruh sistem
/etc/ssh/sshd_config
memungkinkan konfigurasi diterapkan bahkan jika otentikasi berbasis kata sandi diterapkan atau jika batasan dalam~/.ssh/authorized_keys
dihapus secara tidak sengaja. Jika Anda telah memodifikasi default global, Anda harus menghapus komentar opsi yang sesuai.Sekarang tambahkan pengguna:
Opsi
ForceCommand
dapat dihilangkan jika shell diatur ke non-shell seperti/bin/false
(atau/bin/true
) karena/bin/false -c [command]
tidak akan melakukan apa-apa.Sekarang klien hanya dapat terhubung ke port 62222 pada alamat loopback server melalui SSH (tidak akan mendengarkan alamat IP publik)
Menonaktifkan
AllowTcpForwarding
juga akan melarang penggunaan-R
, sehingga mengalahkan penggunaan akun terbatas tersebut untuk meneruskan satu port.PermitOpen localhost:62222
mengasumsikan bahwa port 62222 di server tidak pernah digunakan karena klien dengan senang hati dapat terhubung dan mendengarkannya juga.Jika penerusan TCP diizinkan dalam konfigurasi sistem dan otentikasi berbasis kata sandi yang dinonaktifkan, Anda dapat menggunakan pengaturan per-kunci juga. Edit
~/.ssh/authorized_keys
dan tambahkan opsi berikutnya sebelumssh-
(dengan spasi di antara opsi danssh-
):Memeriksa
Untuk memastikan bahwa itu berfungsi seperti yang diharapkan, beberapa kasus uji harus dijalankan. Dalam perintah di bawah ini,
host
harus diganti dengan login yang sebenarnya jika tidak diatur~/.ssh/config
. Di belakang perintah, ditampilkan perintah yang harus dijalankan pada klien atau server (sebagaimana ditentukan).Kesimpulan
Daftar periksa: Pengguna SSH seharusnya tidak dapat:
sumber
useradd
harus dibuka kuncinya. Itu bisa dilakukan dengan mengganti kata sandi/etc/shadow
dengan asterik (*
) atau dengan mengatur kata sandi menggunakansudo passwd limited-user
.sftp-server
perintah. DenganForceCommand
, perintah ini tidak akan dieksekusi lagi.from=
opsi diauthorized_keys
. Ini memungkinkan Anda membatasi penggunaan kunci untuk sumber dengan alamat IP atau nama host tertentu. Contoh,from="1.1.1.1"
ataufrom="10.0.0.?,*.example.com"
. Lihat bagian "FORMAT FILE AUTHORIZED_KEYS" di halaman manual ( linux.die.net/man/8/sshd ) untuk semua opsi Authorized_keys.Host * ControlMaster auto
di~/.ssh/config
file Anda saat terhubung denganssh -N
. Jika Anda benar-benar membutuhkannya, gunakanssh -N -o ControlMaster=no
Saya yakin ada banyak solusi untuk ini, dan banyak lagi yang lebih kuat daripada yang saya usulkan. Namun, ini mungkin cukup untuk kebutuhan Anda. Untuk melakukannya, saya berasumsi pengguna telah dapat melakukan otentikasi berbasis kunci ssh (dempul atau ssh unix harus mendukung ini).
Tambahkan pengguna seperti biasa ('adduser' atau alat lainnya)
Buat dir .ssh pengguna dan .ssh / berwenang_keys
Sekarang, satu-satunya cara pengguna dapat masuk ke sistem Anda adalah melalui akses ke kunci ssh yang tepat, dan ssh akan menjalankan "/ bin / bash -c 'read a'" untuk mereka, tidak peduli apa yang mereka coba jalankan. 'read a' hanya akan membaca hingga baris baru, dan kemudian shell akan keluar, sehingga pengguna hanya perlu menekan 'enter' untuk mematikan koneksi.
Ada banyak hal lain yang dapat Anda lakukan di 'command ='. Lihat
man authorized_keys
dan cari 'perintah' untuk informasi lebih lanjut.Jika Anda tidak menyukai kenyataan bahwa menekan enter membunuh koneksi, Anda bisa menggunakan sesuatu seperti berikut ini untuk entri 'command =':
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 memutuskan koneksi itu secara paksa, Anda dapat melakukan sesuatu seperti:
Ini harus menggunakan sumber daya yang sangat sedikit, dan tidak ada yang bisa salah dalam skrip yang tidak akan berakhir pada penghentian shell.
Saya tidak melihat secara langsung bagaimana Anda dapat memungkinkan pengguna untuk maju jauh (
ssh -R
) tetapi membatasi (ssh -L
). Mungkin 'permitopen' dapat digunakan. Googling tidak terlalu membantu. Tampaknya sesuatu seperti 'no-port-forwarding, permitremoteopen = 10001' akan berguna untuk memungkinkanssh -R 6901:localhost:6901
.Ini adalah sebuah solusi. Ini pasti dapat ditingkatkan, dan setiap pembukaan port jarak jauh harus diteliti. Jika tujuan saya adalah untuk memungkinkan Nenek saya terhubung ke LAN saya sehingga saya dapat menggunakan vnc untuk melihat layarnya, dan akses ke tombol-tombol itu terbatas padanya, saya pribadi akan merasa cukup aman. Jika ini untuk perusahaan, investigasi yang lebih menyeluruh akan diperlukan. Satu hal yang perlu diperhatikan adalah
ssh -N
tidak meminta shell sama sekali, jadi kode 'command =' tidak dapat dijalankan.Lainnya, mekanisme yang mungkin lebih aman mungkin termasuk membuat shell khusus untuk pengguna, dan bahkan menguncinya dengan apparmour.
sumber
ssh
untuk-N
opsi. Harus ada cara yang lebih bersih untuk mencapai ini.ssh -N
tidak menjalankan perintah sama sekali, tidak ada masalah yangcommand="something"
menutup sesi.chsh ssh_forwarder -s /bin/false
hanya itu yang diperlukan.