ssh tunneling only access

31

Apakah mungkin untuk mengkonfigurasi ssh (di linux) untuk memungkinkan akses untuk penerowongan saja? Yaitu pengguna dapat mengatur terowongan tetapi tidak bisa mendapatkan file shell / akses?

Kedua
sumber

Jawaban:

42

Ya, cukup gunakan /bin/falsesebagai shell dan instruksikan pengguna untuk memulai proses tunneling SSH tanpa mengeksekusi perintah remote (yaitu -Nflag untuk OpenSSH):

ssh -N -L 1234:target-host:5678 ssh-host
pangeran
sumber
Um, jika pengguna tidak menggunakan -N, mereka memiliki akses shell. Ini benar - benar tidak menyelesaikan masalah dan berbahaya.
mlissner
12
@mlissner: Tidak, jika Anda memiliki /bin/falseshell, Anda tidak akan memiliki akses shell, karena setiap sesi login akan segera berakhir.
Sven
10

Di file .ssh / official_keys pengguna, masukkan sesuatu seperti berikut ini:

permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...

Jadi, pada dasarnya, Anda kontrol akan berada di depan kunci publik ssh pengguna dipisahkan oleh spasi. Dalam contoh ini, koneksi yang menggunakan kunci publik tertentu akan diizinkan untuk melakukan penerusan port SSH hanya ke server MySQL 192.168.1.10 dan server web 10.0.0.16, dan tidak akan diberi shell (no-pty). Anda secara khusus bertanya tentang opsi "no-pty", tetapi yang lain juga mungkin berguna jika pengguna hanya perlu melakukan tunnel ke server tertentu.

Lihatlah halaman manual untuk sshd untuk opsi lebih lanjut untuk file Authorized_key .

Perhatikan bahwa pengalaman pengguna mungkin terlihat sedikit aneh: ketika mereka ssh in, itu akan terlihat seperti sesi menggantung (karena mereka tidak mendapatkan pty). Tidak apa-apa. Jika pengguna telah menentukan penerusan port dengan, misalnya, "-L3306: 192.168.1.10: 3306", penerusan port masih akan berlaku.

Bagaimanapun, cobalah.

cjc
sumber
6
Ini saran yang berbahaya ; no-ptytidak mencegah akses shell, itu hanya tidak memberi shell pty. Itu tidak menampilkan prompt (mis. "Tampaknya hang"), tetapi Anda masih dapat memberikan perintah dengan baik. Anda memerlukan command="..."opsi .ssh/authorized_keysjika Anda ingin membatasi akses shell dari sana.
Aleksi Torhamo
@AleksiTorhamo benar, tapi ini awal; Anda juga harus mengatur shell ke / usr / sbin / nologin atau / bin / false di / etc / passwd untuk sepenuhnya membatasi shell. Saya mengedit entri di atas untuk mencerminkan hal itu, bersama dengan saran Aleksi.
Jamieson Becker
4

Berikan pengguna shell yang hanya memungkinkan mereka untuk logout seperti /bin/press_to_exit.sh

#! / bin / bash
baca -n 1 -p "Tekan sembarang tombol untuk keluar"

Dengan cara ini dia bisa tetap masuk selama dia mau, dengan terowongan aktif, tetapi tidak menjalankan perintah apa pun. Ctrl-cmenutup koneksi.

Tinker Bell
sumber
3
Saya pikir setidaknya dalam teori, pengguna dapat menekan CTRL + C pada saat yang tepat (antara baris 1 dan 2) dan berakhir dengan bash shell penuh.
andreas-h
2

Tetapkan shell yang tidak membiarkan pengguna masuk.

misalnya

#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0

akan mencegah mereka mendapatkan shell prompt, dan memberi mereka batas waktu 60 detik - jika tidak ada koneksi yang aktif selama 60 detik maka itu akan keluar dan dengan demikian memutuskan sambungan mereka sepenuhnya (menambah jumlahnya sesuai dengan persyaratan).

Mereka juga tidak dapat menjalankan perintah jarak jauh, karena shell itu tidak akan membiarkannya.

jrg
sumber
4
Kebanyakan instalasi linux sudah dilengkapi dengan sesuatu untuk itu. / sbin / nologin, atau / bin / false atau serupa.
Rory
1
Apa yang akan dilakukan Ctrl-C pada contoh di atas?
Arjan
Arjan: Karena skrip digunakan sebagai shell, Ctrl-C akan memiliki efek yang sama dengan " logout" pada yang normal.
grawity
2
Saya sebenarnya menyukai respons earl, dengan opsi "-N", tetapi jika Anda ingin memberi pengguna Anda pesan yang membantu, ramah, informatif - dan menghentikan mereka meninggalkan koneksi SSH di semua tempat - maka skrip khusus bagus dan jelas tentang apa yang dilakukannya
jrg
2
@ jrg Diskusi ini sudah lama dan Anda mungkin telah berubah pikiran :) tapi IMHO berbahaya untuk keluar dengan skrip shell buatan tangan. Sudah ada /sbin/nologin, yang dapat Anda sesuaikan dengan pesan yang mudah digunakan di /etc/nologin.txt.
dr01
0

Solusi saya adalah menyediakan pengguna yang hanya melakukan tunneling, tanpa shell interaktif , untuk mengatur shell di / etc / passwd ke / usr / bin / tunnel_shell .

Cukup buat file executable / usr / bin / tunnel_shell dengan infinite loop .

Selain itu gunakan opsi AllowGroupsdan Match Group.

Dijelaskan sepenuhnya di sini: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Daniel W.
sumber
2
Pengguna mungkin bisa keluar dari executable dan melarikan diri shell. Apakah Anda sangat yakin bahwa executable Anda tidak akan memungkinkan untuk melakukan ini?
dr01
2
@ dr01 Sejujurnya, saya tidak yakin apakah ini 100% aman. Saya kira ketika Anda keluar dari executable, sesi SSH juga berhenti. Saya akan meneliti lebih lanjut dan mungkin berkomentar lagi di sini.
Daniel W.