Bagaimana saya bisa chroot hanya pengguna SSH sftp-saja ke rumah mereka?

124

Saya ingin memberikan akses klien ke server saya, tetapi saya ingin membatasi pengguna tersebut ke direktori home mereka. Saya akan mengikat-mount di file apa pun yang saya ingin mereka dapat melihatnya.

Saya telah membuat pengguna yang dipanggil bobdan menambahkannya ke grup baru bernama sftponly. Mereka memiliki direktori home di /home/bob. Saya telah mengubah shell mereka /bin/falseuntuk menghentikan login SSH. Inilah /etc/passwdbaris mereka :

bob:x:1001:1002::/home/bob:/bin/false

Saya juga mengubah /etc/ssh/sshd_configuntuk menyertakan yang berikut:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Ketika saya mencoba masuk sebagai mereka, inilah yang saya lihat

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Jika saya mengomentari ChrootDirectorybaris saya bisa SFTP di tetapi kemudian mereka memiliki kendali bebas atas server. Saya telah menemukan yang ChrootDirectory /homeberfungsi, tetapi masih memberi mereka akses ke direktori home. Saya sudah mencoba secara eksplisit ChrootDirectory /home/bobtetapi itu tidak berhasil.

Apa yang saya lakukan salah? Bagaimana saya bisa membatasi bobke /home/bob/?

----SUNTING-----

Oke jadi saya baru saja melihat /var/log/auth.logdan melihat ini:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

Saya tidak sepenuhnya yakin apa yang terjadi di sana, tetapi itu menunjukkan ada sesuatu yang salah dengan direktori pengguna. Berikut ls -h /homehasilnya:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob
Oli
sumber
2
Saya yakin ChrootDirectory /home/%ubisa diganti ChrootDirectory %h.
Franck Dernoncourt

Jawaban:

120

Semua rasa sakit ini berkat beberapa masalah keamanan seperti yang dijelaskan di sini . Pada dasarnya direktori chroot harus dimiliki oleh rootdan tidak dapat berupa akses tulis grup. Menyenangkan. Jadi pada dasarnya anda perlu untuk mengubah chroot Anda menjadi sel tahanan dan dalam yang Anda dapat memiliki konten diedit Anda.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

Dan bam, Anda dapat masuk dan menulis /writable.

Oli
sumber
3
Terima kasih sangat bermanfaat. Tapi ada dua masalah. 1.) Meskipun saya tidak dapat menulis, saya masih dapat menelusuri seluruh sistem file. 2.) Mengubah shell ke / bin / false mencegah SFTP sepenuhnya. Apakah saya melakukan sesuatu yang salah?
kim3er
1
Terima kasih! Banyak artikel lain tentang topik ini melewatkan detail ini, dan beberapa membuatnya sehingga server tidak dapat menerima koneksi ssh (jenis yang menyebalkan ketika Anda menggunakan EC2 dan ... itulah satu-satunya cara).
Tom Harrison Jr
4
kim3er: ini karena Anda perlu mengatur shell pengguna ke / sbin / nologin - / bin / false menonaktifkan segala jenis akses.
8
Saya juga ingin mencatat bahwa semua folder yang mengarah ke folder chroot Anda harus dimiliki oleh root. Dalam contoh ini, /homejuga harus dimiliki oleh root.
Shiki
2
Pada 14,04, saya juga harus mengubah Subsystem sftp /usr/lib/openssh/sftp-serverjalur Subsystem sftp internal-sftp -f AUTH -l VERBOSEsebelum ini bekerja.
penetapan
57

Untuk chroot direktori SFTP, Anda harus

  1. Buat pengguna dan paksa root untuk menjadi pemiliknya

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. Ubah lokasi subsistem di / etc / ssh / sshd_config:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    dan membuat bagian pengguna di akhir file (ssh dapat mati respawning jika ditempatkan setelah baris Subsistem):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    
Josircg
sumber
3
ini sepertinya tidak berhasil. dalam contoh Anda, pengguna johndikunci ke /home/johndirektori. Anda telah memberikan 755izin ke direktori. jadi pemilik telah membaca (4), menulis (2) dan mengeksekusi (1), dan grup telah membaca (4) dan mengeksekusi (1). Anda juga telah menetapkan pemilik dan grup sebagai root, jadi johnmilik lainnya. dia juga telah membaca dan mengeksekusi (4 +1 = 5) lalu. jadi Anda telah mengunci john ke direktori di mana ia tidak memiliki hak menulis. bagaimana cara memperbaikinya? mengubah hak istimewa 757atau bahkan 777memecah login. mengubah grup atau pemilik ke john juga memecah login.
Daniel
juga untuk dicatat: di / etc / ssh / sshd_config konfigurasi dibaca secara berurutan. Jadi, jika Anda memiliki aturan untuk pengguna secara umum dan Anda ingin menimpa salah satunya, cukup tempatkan aturan khusus pengguna di atas.
rwenz3l
Saya ingin chroot direktori SFTP di folder home beberapa pengguna lain. Saya memiliki userx di /home/userx/sftproot/uploadsdan sftpuser di / home / sftpuse. Saya telah mengatur chroot /home/usex/sftprootagar dimiliki oleh root: root dan chmod 755. /home/usex/sftproot/uploadsChown-ed oleh sftpuser: sftpuser. Saya mendapatkan kesalahan yang sama dengan pertanyaan awal di atas. Apakah chroot dan semua folder induk harus dimiliki oleh root: root agar sftp berfungsi?
Primoz Rome
6

Saya menghabiskan sepanjang hari mencoba untuk mendapatkan pangsa jaringan di raspberry saya. Saya ingin mengunci pengguna sehingga tidak akan dapat menavigasi seluruh sistem file, tidak ada akses login ssh dan saya ingin memiliki akses tulis ke berbagi jaringan.

Dan inilah cara saya membuatnya bekerja:

Pertama saya membuat pengguna:

sudo useradd netdrive

Kemudian diedit /etc/passwddan pastikan /bin/falseuntuk pengguna jadi barisnya adalah:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

Saya diedit /etc/ssh/sshd_configuntuk memasukkan:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Pemilik dan izin direktori home yang diubah:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Ok jadi setelah semua ini saya bisa terhubung menggunakan sshfstetapi dalam mode read only. Apa yang harus saya lakukan untuk mendapatkan folder yang dapat ditulis:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Itu dia, itu bekerja tanpa perubahan lebih lanjut. Perhatikan bahwa saya hanya memiliki izin yang dapat ditulisi kepada pengguna , bukan ke grup sebanyak solusi online lainnya. Saya dapat membuat / menghapus / mengedit / mengganti nama file / folder tanpa masalah.

Ketika mengakses menggunakan sshfsdengan pengguna netdrive karena konfigurasi chroot saya hanya akan melihat hal-hal yang tersimpan di dalam /home/netdrive/direktori server , sempurna. /home/netdrive/home/netdrive/Struktur direktori berulang adalah apa yang membuatnya bekerja untuk saya dalam memiliki solusi chroot ssh cleanable dapat ditulis .

Sekarang saya akan menjelaskan di bawah masalah yang saya miliki:

Anda mungkin tidak boleh menjalankan paragraf berikut :

Setelah melihat solusi di atas (dan banyak lainnya di internet yang bahkan menggunakan acl (daftar kontrol akses)) saya masih tidak bisa membuatnya berfungsi karena apa yang saya lakukan selanjutnya adalah:

Berikut ini TIDAK bekerja untuk saya:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Karena pengguna netdrive masih tidak dapat menulis di /home/netdrive/writable/direktori itu walaupun memiliki folder dan memiliki izin. Kemudian saya melakukannya: sudo chmod 775 / home / netdrive / writable / Dan sekarang saya dapat membuat direktori dan menghapusnya tetapi saya tidak dapat mengeditnya karena sedang dibuat tanpa izin grup yang dapat ditulis. Di sini dari apa yang saya lihat di internet yang digunakan orang acluntuk memperbaikinya. Tapi saya tidak senang dengan itu karena saya harus menginstal acl, kemudian mengkonfigurasi mount point, dll. Saya juga tidak tahu mengapa saya memerlukan izin grup untuk menulis ke folder yang dimiliki oleh pengguna yang sama.

Tampaknya karena alasan tertentu membuat /home/netdrive/home/netdrivedan memberikan kepemilikan ke netdrivefolder terakhir saya dapat membuat semuanya berfungsi tanpa mengacaukan izin grup .

mihai.ile
sumber
1

Saya mengikuti artikel ini tetapi tidak berhasil. Itu mulai bekerja setelah saya melakukan perubahan ini (disarankan dalam jawaban di atas):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Plus membuat direktori home root yang dapat dimiliki di mana saya memiliki sub direktori yang dapat ditulis pengguna (seperti yang dijelaskan di atas).

Hal baru dan berguna yang ingin saya tambahkan dengan jawaban ini adalah Anda dapat menyederhanakan konfigurasi hanya dengan menetapkan% h sebagai direktori home user:

ChrootDirectory %h

Saya telah menemukannya berkat tautan ini .

pengguna109764
sumber