Saya telah mencari jawaban yang layak untuk pertanyaan ini, dan sebagian besar jawabannya termasuk saran mengapa tidak melakukannya. Namun, inilah skenarionya, dan apa yang membuatnya perlu:
Saya memiliki aplikasi konsol, dan di masing-masing pengguna. Profil, ada perintah startup untuk aplikasi, dan langsung setelah perintah yang memulai, ada perintah "keluar", yang mengeluarkan mereka dari sistem. Saya hanya ingin mereka dapat mengakses aplikasi konsol ini melalui antarmuka yang disediakan olehnya. Saat memulai, aplikasi menyajikan daftar klien kepada pengguna yang dapat diakses melalui aplikasi, dengan setiap klien memiliki direktori data mereka sendiri. Pengguna diberikan akses ke hanya klien yang membutuhkan akses.
Sekarang inilah masalahnya: Jika saya memberi para pengguna akses SSH, mereka juga akan dapat masuk menggunakan klien SFTP, yang akan memberi mereka akses langsung ke direktori data untuk aplikasi, yang SANGAT tidak diinginkan, karena itu juga akan memberikan mereka mengakses direktori data yang seharusnya tidak mereka akses.
Ini adalah hal yang sangat sederhana untuk dilakukan ketika menggunakan kombinasi telnet / FTP, tetapi sekarang saya ingin memberi pengguna akses dari mana saja di internet, saya belum dapat menemukan cara untuk menutup mereka dari SFTP, sementara masih memungkinkan mereka akses ke shell di mana mereka dapat menjalankan aplikasi.
.profile
untuk itu terdengar seperti solusi yang salah. Saya percaya pengaturan pengguna dengan shell alternatif akan jauh lebih masuk akal..profile
trik untuk membatasi akses, karena itu sepele untuk memotong. (lihat jawaban saya untuk lebih jelasnya)Jawaban:
Edit:
Jika tidak jelas, jawaban berikut tidak dimaksudkan sebagai metode aman untuk mencegah SFTP digunakan oleh siapa pun yang memiliki akses shell ke server. Itu hanya jawaban yang menjelaskan cara menonaktifkannya dari visibilitas eksternal. Untuk diskusi tentang keamanan tingkat pengguna, lihat jawaban dari @cpast dan @Aleksi Torhamo. Jika keamanan adalah fokus Anda, jawaban ini bukan jawaban yang tepat. Jika visibiliy layanan sederhana adalah fokus Anda, maka ini adalah jawaban Anda.
Kami sekarang melanjutkan ke jawaban awal:
Komentari dukungan sftp di sshd_config (dan tentu saja restart
sshd
):#Subsystem sftp /usr/lib/openssh/sftp-server
sumber
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/sftp-server
Tapi itu berhasil. Terima kasih banyakssh user@host command
, karena.profile
tidak akan berjalan sama sekali jika Anda melakukannya, dan dengan demikian aplikasi Anda tidak akan memulai sama sekali. Mereka bisa mendapatkan akses shell penuh hanya dengan mengatakanssh -t user@host bash
. Coba saja dan Anda akan melihat. Subsistem hanyalah sebuah alias perintah; jika mereka dapat menggunakan sftp sebelumnya, mereka masih dapat menggunakannya - dan perintah lain yang mereka inginkan. Baca jawaban saya di bawah ini..profile
karena tidak dimaksudkan untuk keamanan dan mudah dilewati. Dalam jawaban saya, saya mendaftar tiga metode berbeda untuk melakukannya dengan ssh. Singkatnya, pindahkan saja permohonan aplikasi Anda.profile
ke skrip shell dan 1) tetapkan skrip shell sebagai shell pengguna 2) tetapkan skrip shell sebagai (cocok dengan benar)ForceCommand
dalamsshd_config
3) beralih ke otentikasi kunci publik dan atur skrip shell seperticommand
pada.ssh/authorized_keys
. (Juga, Anda harus menggunakan @nama sehingga orang mendapat pemberitahuan tentang komentar)Seperti yang disebutkan orang lain, penonaktifan
sftp
tidak cukup dekat - pengguna denganssh
akses tidak terbatas dapat melihat file apa pun yang memiliki izin untuk dilihat oleh akun mereka, dapat memodifikasi apa saja yang mereka izin untuk modifikasi, dan dapat dengan mudah mengunduh apa saja yang dapat mereka baca untuk dibaca sendiri. mesin. Satu-satunya cara untuk menghentikan mereka melakukan ini adalah dengan benar-benar membatasi akses mereka. Ini juga tidak ideal untuk bergantung pada.profile
membatasi pengguna, karena itu bukan untuk apa (Edit: Seperti yang disebutkan dalam jawaban Aleksi, itu sebenarnya sepele untuk memotong.profile
; hal tentang.profile
itu untuk kenyamanan, bukan keamanan, jadi bukan dimaksudkan untuk membatasi pengguna. Gunakan hal-hal yang dirancang untuk keamanan, seperti hal-hal di bawah ini, untuk memberikan keamanan).Ada dua cara dasar untuk melakukan ini: Anda bisa membatasi mereka melalui izin file, atau memaksa mereka untuk hanya menjalankan aplikasi konsol Anda. Cara kedua lebih baik: Tetapkan pengguna yang harus dibatasi ke aplikasi konsol ke grup (mis.
customers
); lalu, dalamsshd_config
, tambahkan baris berikut:Apa yang dilakukan adalah membuatnya agar semua koneksi dari pengguna dalam grup itu membuka aplikasi konsol; mereka tidak dapat memulai hal lain, termasuk
sftp
alat server. Ini juga menghentikan mereka dari melakukan hal lain dengan sistem, dan tidak seperti itu.profile
, menggunakan server SSH itu sendiri (.profile
membatasi mereka di shell,ForceCommand
juga mencegah melakukan hal-hal lain yang tidak melibatkan memulai shell). Juga tidak seperti.profile
, ini dirancang sebagai hal keamanan; itu dibuat khusus untuk menolak pengguna jahat yang menghindarinya.Alternatif (mungkin lebih rendah) akan melibatkan pembuatan pengguna baru untuk menjalankan aplikasi konsol. Anda kemudian akan membatasi direktori data untuk pengguna itu, mengatur aplikasi konsol yang dimiliki oleh pengguna itu, dan mengatur
u+s
pada program. Inisetuid
sedikit; itu berarti seseorang yang menjalankan program konsol melakukannya dengan izin dari pemilik program. Dengan begitu, pengguna sendiri tidak memiliki akses ke direktori, mereka hanya mendapatkannya melalui program. Namun, Anda mungkin harus menggunakan sajaForceCommand
, karena itu membatasi semua akses ke "jalankan saja program ini".sumber
ForceCommand
tidak mencegah penerusan port SSH..profile
lebih dari "tidak ideal"; mudah dilewati (lihat jawaban saya untuk detail) dan dengan demikian tidak memberikan perlindungan apa pun, hanya rasa aman yang salah.Jangan mencoba melakukan ini dengan
.profile
karena tidak memberikan keamanan apa pun dan tidak membatasi apa pun!Tidak peduli apa yang Anda masukkan ke dalam
.profile
, karena Anda bisa memotong itu dengan hanya memberikan perintah untuk menjalankan pada baris perintah ssh, seperti ini:ssh user@host command
. Anda masih bisa mendapatkan akses shell normal dengan melakukanssh -t user@host bash
.Menonaktifkan subsistem sftp, seperti disebutkan dalam jawaban lain, tidak membantu sama sekali. Subsistem pada dasarnya hanya alias untuk perintah, dan Anda masih dapat menggunakan sftp secara normal dengan melakukan
sftp -s /path/to/sftp-executable user@host
.Seperti cpast dan beberapa komentator katakan, Anda harus menggunakan mekanisme yang tepat untuk membatasi akses. Itu adalah,
ForceCommand
dalamsshd_config
command="..."
masuk.ssh/authorized_keys
Catatan:
command="..."
hanya berlaku untuk satu kunci, sehingga tidak membatasi login ssh untuk pengguna menggunakan kata sandi atau kunci lainAllowTcpForwarding
dll disshd_config
no-port-forwarding
dll di.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
ForceCommand
dancommand="..."
menjalankan perintah melalui shell pengguna, sehingga mereka tidak berfungsi jika shell pengguna diatur ke mis./bin/false
atau/sbin/nologin
Penafian: Saya bukan ahli dalam masalah ini dengan cara apa pun, jadi sementara saya bisa mengatakan bahwa
.profile
masalahnya tidak aman, saya tidak bisa menjanjikan tidak ada "gotcha" dengan metode lain yang tidak saya ketahui tentang. Mereka aman sejauh yang saya tahu, tetapi saya tidak akan menjadi orang pertama yang salah di internet.sumber
ForceCommand
dan memaksa masuk tanpa password dengancommand=
diauthorized_keys
, sementara itu telah dilewati sebelumnya, bahwa ini karena bug di server: itu dimaksudkan untuk menjadi aman terhadap pengguna berbahaya, dan pengguna melewati itu dianggap sebagai kerentanan serius di server SSH (dan karenanya merupakan perbaikan prioritas). Seperti yang Anda tunjukkan,.profile
bypassable by design: karena ini tidak dianggap sebagai fitur keamanan, pengguna yang mem-bypassnya tidak apa-apa dari sudut pandang pengembang shell.ForceCommand
untuk membatasi akses, dan memiliki daemon yang hanya mendengarkan koneksi secara lokal dan tidak melakukan otentikasi, pengguna ssh masih dapat mengakses daemon. Fitur yang saya daftarkan adalah yang misalnya. solusi git hosting biasanya dinonaktifkan, dan saya belum melihat ada yang "jahat" di halaman manual, tetapi saya belum menemukan jenis resmi "ini adalah cara Anda menggunakanForceCommand
dengan aman" -dokumen, juga.~/.profile
apakah pengguna dapat diedit dan tidak membantu untuk keamanan, tetapi bisakah Anda membuat teknik cpast bermakna dengan memasukkannya/etc/profile
? Anda dapat memeriksa UID untuk membatasinya ke pengguna yang tepat.ssh user@host
, tetapi jika Anda memberitahu ssh untuk menjalankan perintah - yaitu.ssh user@host command
- Anda tidak lagi mendapatkan shell login dan file tidak tersentuh sama sekali. Jadi, Anda dapat dengan mudah mem-bypass pembatasan apa pun yang dicoba dibuat oleh seseorang dengan file hanya dengan memberikan argumen tambahan ke ssh..profile
, ia menggunakansshd_config
dan harus aman. Dia hanya menyebutkan.profile
sebagai metode yang tidak boleh Anda gunakan untuk melakukan ini.Dimungkinkan untuk mengaktifkan SSH dan menonaktifkan SFTP baik secara global maupun per pengguna / grup.
Saya pribadi memerlukan ini karena saya ingin memberikan akses ke beberapa repositori git melalui SSH, dan saya suka menonaktifkan sistem yang tidak diperlukan. Dalam hal ini SFTP tidak diperlukan.
Secara global
Anda dapat menonaktifkan SFTP untuk semua pengguna dalam beberapa cara.
Subsistem yang hilang
Daemon SFTP yang digunakan oleh SSH dapat dikonfigurasi melalui
Subsystem
kata kunci. Darisshd_config(5)
manual:Baris terakhir menyarankan bahwa itu harus cukup untuk tidak mendefinisikan subsistem untuk "sftp".
Kebohongan palsu
Anda juga dapat menonaktifkan SFTP dengan mengatur daemon SFTP yang digunakan oleh SSH ke sesuatu yang tidak dapat digunakan. Misalnya, konfigurasikan subsistem "sftp" ke
/bin/false
:Ketika sesuatu mencoba masuk melalui SFTP, daemon SSH akan mencoba menelurkan "sftp daemon"
/bin/false
. The/bin/false
Program tidak hanya satu hal, dan itu adalah untuk mengembalikan kode kesalahan. Upaya koneksi SFTP ditolak secara efektif.Per pengguna / grup
Dimungkinkan juga untuk menonaktifkan SFTP per pengguna, grup, atau beberapa kriteria lainnya.
Ini tidak berfungsi jika Anda ingin pengguna Anda mendapatkan prompt shell biasa. Juga tidak masuk akal, karena Anda bisa mengelak dari banyak hal jika Anda memiliki akses shell. Ini hanya akan berfungsi jika Anda hanya ingin memberikan akses ke program tertentu.
Sesuai
Untuk mencocokkan sekelompok pengguna, Anda dapat mengonfigurasi SSH dengan
Match
kata kunci. Darisshd_config(5)
manual:Beberapa contoh:
Match User eva
cocok dengan pengguna "eva"Match User stephen,maria
cocok dengan pengguna "stephen" dan "maria"Match Group wheel,adams,simpsons
cocok dengan grup "roda", "adams", "simpsons"Jika Anda ingin informasi lebih lanjut, ada banyak di
sshd_config(5)
manual.Perintah paksa
Biasanya Anda mendapatkan shell login pengguna ketika Anda terhubung melalui SSH, tetapi SSH dapat dikonfigurasi untuk memaksa perintah tertentu. Perintah dipaksa untuk koneksi SSH, termasuk SFTP, dan dengan demikian Anda mungkin memiliki opsi untuk memaksa perintah yang Anda inginkan.
Perintah untuk memaksa dapat dikonfigurasi dengan
ForceCommand
kata kunci. Darisshd_config(5)
manual:Jadi Anda bisa memaksa perintah terbatas yang ingin Anda gunakan
ForceCommand <your command>
. Sebagai contoh:Contoh
Dalam kasus saya di mana saya ingin memberikan akses git, saya hanya perlu pengguna untuk memiliki akses
git-shell
. Ini adalah bagian yang menonaktifkan SFTP untuk pengguna git saya, bersama dengan beberapa opsi keamanan:sumber