Aktifkan akses SSH shell tetapi nonaktifkan akses SFTP

21

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.

sosaisapunk
sumber
8
Saya lupa detailnya, tetapi saya pikir SSH memungkinkan Anda untuk membatasi pengguna untuk menjalankan satu perintah ketika mereka login. Mereka tidak mendapatkan akses shell penuh jika Anda mengatur ini. Mungkin bermanfaat untuk kasus penggunaan Anda. (Setelah semua itu dimungkinkan untuk meniru akses SFTP menggunakan SSHFS. Hanya menonaktifkan SFTP tidak akan menghentikan pengguna yang cukup bertekad untuk mendapatkan file apa pun yang dapat diakses oleh akun pengguna mereka.)
David Z
3
Selain itu Anda mungkin ingin mempertimbangkan "chroot" pengguna Anda. dan untuk akses data cadangan, sepertinya masalah desain
Dennis Nolte
2
Menggunakan .profileuntuk itu terdengar seperti solusi yang salah. Saya percaya pengaturan pengguna dengan shell alternatif akan jauh lebih masuk akal.
kasperd
3
Jangan mencoba menggunakan .profiletrik untuk membatasi akses, karena itu sepele untuk memotong. (lihat jawaban saya untuk lebih jelasnya)
Aleksi Torhamo

Jawaban:

22

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

Wesley
sumber
1
Terkadang antrean bisaSubsystem sftp internal-sftp
Kondybas
1
Saya telah Subsystem sftp /usr/libexec/sftp-server Tapi itu berhasil. Terima kasih banyak
sosaisapunk
16
Ini kedengarannya tidak masuk akal. Jika Anda dapat menjalankan perintah sewenang-wenang di server, Anda dapat menjalankan program sisi server sftp. Bahkan jika itu tidak diinstal Anda bisa mengimplementasikannya kembali sebagai perintah shell panjang dan minta klien sftp mengirim perintah ini, bukan sftp. Metode ini mungkin membuatnya kurang nyaman untuk menggunakan sftp tetapi tidak ada cara untuk mencegah pengguna yang dapat menjalankan perintah sewenang-wenang menggunakan perintah-perintah itu untuk melakukan transfer file.
R ..
1
@ sosaisapunk Itu tidak benar. Pengguna dapat menjalankan perintah apa pun yang mereka inginkan dengan menggunakan ssh user@host command, karena .profiletidak 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 mengatakan ssh -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.
Aleksi Torhamo
1
@ sosaisapunk: Tidak, intinya adalah Anda dapat melakukan ini dengan ssh, tetapi tidak dengan .profilekarena 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 .profileke skrip shell dan 1) tetapkan skrip shell sebagai shell pengguna 2) tetapkan skrip shell sebagai (cocok dengan benar) ForceCommanddalam sshd_config3) beralih ke otentikasi kunci publik dan atur skrip shell seperti commandpada .ssh/authorized_keys. (Juga, Anda harus menggunakan @nama sehingga orang mendapat pemberitahuan tentang komentar)
Aleksi Torhamo
28

Seperti yang disebutkan orang lain, penonaktifan sftptidak cukup dekat - pengguna dengan sshakses 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 .profilemembatasi pengguna, karena itu bukan untuk apa (Edit: Seperti yang disebutkan dalam jawaban Aleksi, itu sebenarnya sepele untuk memotong .profile; hal tentang .profileitu 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, dalam sshd_config, tambahkan baris berikut:

Match Group customers
ForceCommand /path/to/app

Apa yang dilakukan adalah membuatnya agar semua koneksi dari pengguna dalam grup itu membuka aplikasi konsol; mereka tidak dapat memulai hal lain, termasuk sftpalat server. Ini juga menghentikan mereka dari melakukan hal lain dengan sistem, dan tidak seperti itu .profile, menggunakan server SSH itu sendiri ( .profilemembatasi mereka di shell, ForceCommandjuga 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+spada program. Ini setuidsedikit; 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 saja ForceCommand, karena itu membatasi semua akses ke "jalankan saja program ini".

cpast
sumber
4
Saya ingin menambahkan itu ForceCommandtidak mencegah penerusan port SSH.
nyuszika7h
1
Sebenarnya, mengandalkan .profilelebih dari "tidak ideal"; mudah dilewati (lihat jawaban saya untuk detail) dan dengan demikian tidak memberikan perlindungan apa pun, hanya rasa aman yang salah.
Aleksi Torhamo
@AleksiTorhamo Ah. Saya curiga Anda dapat mem-bypassnya, tetapi tidak yakin bagaimana (saya biasanya menduga bahwa hal-hal yang tidak dimaksudkan untuk keamanan dapat dilewati). Terima kasih atas detailnya tentang caranya!
cpast
15

Jangan mencoba melakukan ini dengan .profilekarena 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 melakukan ssh -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,

  • Gunakan ForceCommanddalamsshd_config
  • Gunakan login tanpa kata sandi dan command="..."masuk.ssh/authorized_keys
  • Ubah shell pengguna menjadi sesuatu yang membatasi apa yang bisa dilakukan pengguna

Catatan:

  • command="..." hanya berlaku untuk satu kunci, sehingga tidak membatasi login ssh untuk pengguna menggunakan kata sandi atau kunci lain
  • Anda mungkin juga ingin membatasi penerusan port, dll. (Penerusan port, penerusan x11, penerusan agen dan alokasi pty adalah yang saya pernah dengar)
    • AllowTcpForwarding dll di sshd_config
    • no-port-forwarding dll di .ssh/authorized_keys
  • Jika Anda menjalankan daemon lain (seperti FTP), Anda harus memverifikasi bahwa mereka tidak mengizinkan pengguna masuk (Beberapa daemon membuat keputusan ini berdasarkan shell pengguna, jadi jika Anda mengubahnya, Anda mungkin ingin memeriksa kembali ini)
  • Anda dapat mengubah shell pengguna menjadi skrip yang melakukan apa yang Anda inginkan; bisa dijalankan tanpa argumen atau sukascript -c 'command-the-user-wanted-to-run'
  • Keduanya ForceCommanddan command="..."menjalankan perintah melalui shell pengguna, sehingga mereka tidak berfungsi jika shell pengguna diatur ke mis. /bin/falseatau/sbin/nologin

Penafian: Saya bukan ahli dalam masalah ini dengan cara apa pun, jadi sementara saya bisa mengatakan bahwa .profilemasalahnya 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.

Aleksi Torhamo
sumber
1
Tampaknya setidaknya untuk ForceCommanddan memaksa masuk tanpa password dengan command=di authorized_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, .profilebypassable by design: karena ini tidak dianggap sebagai fitur keamanan, pengguna yang mem-bypassnya tidak apa-apa dari sudut pandang pengembang shell.
cpast
1
@cpast: Ya, saya berpikir tentang keberadaan lebih banyak fitur seperti penerusan porta. Maksud saya, jika Anda tidak tahu bahwa ssh memungkinkan penerusan port dan hanya digunakan ForceCommanduntuk 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 menggunakan ForceCommanddengan aman" -dokumen, juga.
Aleksi Torhamo
Harus diakui ~/.profileapakah 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.
anak ayam
1
@chicks: Tidak, ia memiliki masalah yang sama persis. Masalahnya bukan bahwa file tersebut dapat diedit pengguna; Masalahnya adalah bahwa kedua file dapat dilewati seluruhnya. File-file ini hanya digunakan untuk shell login, yang Anda dapatkan jika Anda hanya mengatakan 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.
Aleksi Torhamo
2
@ Chicks: Juga, saya baru sadar bahwa Anda merujuk ke cpast; metode dalam jawaban cpast tidak digunakan .profile, ia menggunakan sshd_configdan harus aman. Dia hanya menyebutkan .profilesebagai metode yang tidak boleh Anda gunakan untuk melakukan ini.
Aleksi Torhamo
1

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 Subsystemkata kunci. Dari sshd_config(5)manual:

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

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:

Subsystem sftp /bin/false

Ketika sesuatu mencoba masuk melalui SFTP, daemon SSH akan mencoba menelurkan "sftp daemon" /bin/false. The /bin/falseProgram 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 Matchkata kunci. Dari sshd_config(5)manual:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

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 ForceCommandkata kunci. Dari sshd_config(5)manual:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Jadi Anda bisa memaksa perintah terbatas yang ingin Anda gunakan ForceCommand <your command>. Sebagai contoh:

Match User kim
        ForceCommand echo 'successful login man, congrats'

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:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no
aude
sumber
Dalam kasus saya, saya hanya ingin memperbolehkan akses MySQL (melarang akses SFTP dan terminal windows SSH) untuk kunci resmi tertentu (yaitu, tidak ada perubahan pada file sshd_config). Saya berhasil melakukan ini dengan opsi ~ / .ssh / otor_keys berikut untuk kunci tertentu: command = "/ usr / bin / echo 'Hanya akses MySQL yang diizinkan.'", Penerusan no-pty, no-X11, permitopen = "127.0.0.1:3306"
Martin_ATS