Saya memiliki server yang menjalankan Ubuntu dan daemon OpenSSH. Sebut saja S1.
Saya menggunakan server ini dari mesin klien (sebut saja salah satunya C1) untuk melakukan reverse tunnel SSH dengan menggunakan penerusan port jarak jauh, misalnya:
ssh -R 1234:localhost:23 login@S1
Pada S1, saya menggunakan file sshd_config default. Dari apa yang saya lihat, siapa pun yang memiliki kredensial yang tepat {login, pwd} pada S1 dapat login ke S1 dan melakukan penerusan port jarak jauh dan penerusan port lokal. Kredensial semacam itu bisa menjadi sertifikat di masa depan, jadi menurut saya, siapa pun yang meraih sertifikat dapat masuk ke S1 dari tempat lain (tidak harus C1) dan karenanya membuat penerusan pelabuhan lokal.
Bagi saya, mengizinkan penerusan porta lokal terlalu berbahaya, karena memungkinkan untuk membuat semacam proxy publik. Saya mencari cara untuk menonaktifkan hanya penerusan -L.
Saya mencoba yang berikut ini, tetapi ini menonaktifkan penerusan lokal dan jarak jauh:
AllowTcpForwarding No
Saya juga mencoba yang berikut ini, ini hanya akan memungkinkan -L ke SX: 1. Ini lebih baik daripada tidak sama sekali, tetapi tetap bukan yang saya butuhkan, yang merupakan opsi "tidak ada".
PermitOpen SX:1
Jadi saya bertanya-tanya apakah ada cara, sehingga saya bisa melarang semua port lokal ke depan untuk menulis sesuatu seperti:
PermitOpen none:none
Apakah mengikuti ide yang bagus?
PermitOpen localhost:1
Jawaban:
siapa pun dengan kredensial masuk dapat memunculkan instance sshd mereka sendiri, berjalan pada port acak dan mengizinkan apa pun yang mereka inginkan, termasuk -L penerusan lokal:
jika Anda tidak mempercayai pengguna untuk melakukan sesuatu dengan mesin Anda, maka Anda seharusnya tidak mengizinkan mereka untuk masuk terlebih dahulu.
(Btw, flag -D juga "proxy-problematic")
sumber
command="/sbin/nologin"
. Ini seharusnya mencegah mereka menjalankan perintah apa pun di server.ssh
dapat digunakan untuk terhubung ke akun yang memiliki shell login yang sangat terbatas yang tidak mengizinkan ini. Port forwarding adalah lubang keamanan dalam cangkang yang dibatasi. Selain menjalankan perintah yang diizinkan, pengguna dapat membuat terowongan.sshd_config
halaman manual: Perhatikan bahwa menonaktifkan penerusan TCP tidak meningkatkan keamanan kecuali jika pengguna juga tidak diberi akses shell , karena mereka selalu dapat menginstal penerusan mereka sendiri. (Penekanan milikku).Solusi lain adalah dengan hanya mengizinkan penerusan port ke pengguna tertentu:
Dari SSH: Panduan definitif
Port forwarding dapat diaktifkan atau dinonaktifkan secara global di sshd. Ini dilakukan dengan kata kunci konfigurasi seluruh server AllowTcpForwarding di / etc / sshd_config. Kata kunci tersebut mungkin memiliki nilai ya (default, memungkinkan penerusan) atau tidak (menonaktifkan penerusan):
Selain itu, SSH2 memiliki opsi berikut:
Sintaksnya sama dengan opsi AllowUsers dan AllowGroups. [Bagian 5.5.2.1, "Kontrol akses akun"] Mereka menentukan daftar pengguna atau grup yang diizinkan menggunakan penerusan porta; server menolak untuk menghormati permintaan penerusan port untuk orang lain. Perhatikan bahwa ini merujuk ke akun target sesi SSH, bukan nama pengguna klien (yang sering tidak diketahui).
...
Penting untuk menyadari bahwa arahan dalam bagian ini tidak benar-benar mencegah penerusan port, kecuali jika Anda juga menonaktifkan login interaktif dan membatasi program apa yang mungkin dijalankan di sisi jarak jauh. Jika tidak, pengguna yang berpengetahuan hanya dapat menjalankan aplikasi penerusan porta sendiri selama sesi SSH. Pengaturan ini saja mungkin merupakan pencegah yang cukup dalam komunitas nonteknis, tetapi mereka tidak akan menghentikan seseorang yang tahu apa yang dia lakukan.
sumber
AllowTcpForwardingForUsers
mengungkapkan bahwa itu dikonfigurasikan dalamsshd2_config
, yang digunakan dalam beberapa program komersial. Lihat salah satu jawaban untuk: superuser.com/questions/384643/…Match
blok dalam konfigurasi. Anda dapatMatch
pada pengguna dan grup, dan melampirkan bagianAllowTcpForwarding
dalamnya.Sekarang ada opsi untuk hanya memungkinkan penerusan lokal / jarak jauh.
AllowTcpForwarding Menentukan apakah penerusan TCP diizinkan. Opsi yang tersedia adalah "ya" atau "semua" untuk memungkinkan penerusan TCP, "tidak" untuk mencegah semua penerusan TCP, "lokal" untuk mengizinkan penerusan lokal (dari perspektif ssh (1)) saja atau "jarak jauh" untuk memungkinkan jarak jauh hanya meneruskan . Standarnya adalah "ya". Perhatikan bahwa menonaktifkan penerusan TCP tidak meningkatkan keamanan kecuali jika pengguna juga tidak diberi akses shell, karena mereka selalu dapat menginstal penerusan mereka sendiri.
Jadi, seperti yang sudah disebutkan, Anda harus mengatur shell ke nologin juga.
sumber
Solusi saya untuk masalah ini adalah menambahkan: PermitOpen fo.local: 80 di bagian utama sshd_config.
Ini hanya menolak permintaan penerusan lokal selain fo.local: 80.
sumber
Jika saya mengerti Anda dengan benar, pengguna Anda memiliki akses shell penuh, tetapi Anda tidak ingin mereka dapat membuka koneksi ke internet.
"Port forwarding lokal" yang diizinkan oleh SSH hanyalah salah satu cara yang mungkin untuk melakukan itu. Lainnya termasuk meluncurkan sebuah instance dari
socat
,netcat
, atau nomor lain dari alat.Cara terbaik untuk mengontrol koneksi keluar dan masuk di Linux adalah Netfilter, alias IPTables.
Ini memiliki modul khusus yang disebut pemilik (
ipt_owner
) yang memungkinkan Anda untuk mencocokkan berbagai karakteristik pembuat paket, untuk paket yang dihasilkan secara lokal. Ini berlaku diOUTPUT
danPOSTROUTING
rantai.Anda dapat menggunakannya untuk menolak paket keluar yang dihasilkan oleh kelompok pengguna tertentu, sehingga melarang segala jenis penerusan porta, bukan hanya
-L
opsi SSH.sumber