Lewati ke isi

Server & Infrastruktur

Cara Membuat User SFTP yang Hanya Bisa Akses Satu Folder

Langkah membuat user SFTP terkunci di satu folder dengan ChrootDirectory OpenSSH: grup khusus, izin folder, konfigurasi sshd, dan cara mengujinya.

Terbit 6 menit baca

Jawaban singkat

Buat grup khusus SFTP, siapkan folder chroot milik root, lalu tambahkan blok Match Group di sshd_config dengan ChrootDirectory dan ForceCommand internal-sftp. User dalam grup itu hanya bisa mengunggah file ke folder yang ditentukan, tanpa shell dan tanpa melihat isi server lain.

Daftar isi
  1. Kenapa folder chroot harus milik root?
  2. Langkah membuat user SFTP terkunci
  3. 1. Buat grup khusus SFTP
  4. 2. Buat user tanpa akses shell
  5. 3. Siapkan folder dengan izin yang benar
  6. 4. Tambahkan aturan di sshd_config
  7. 5. Uji konfigurasi dan muat ulang SSH
  8. 6. Uji dari komputer lain
  9. Menambah user SFTP berikutnya
  10. Bagaimana kalau file harus masuk ke folder website?
  11. Pertanyaan yang sering diajukan

Perlu memberi akses upload file ke desainer, vendor, atau klien, tapi tidak ingin mereka bisa membuka folder lain atau menjalankan perintah di server? Jawabannya adalah user SFTP yang dikurung (chroot) di satu folder. OpenSSH sudah punya fitur ini bawaan, jadi kamu tidak perlu memasang server FTP terpisah.

Hasil akhirnya: user bisa login dengan FileZilla, WinSCP, atau perintah sftp, melihat satu folder sebagai "akar", dan tidak bisa naik ke folder di atasnya. Login SSH biasa ditolak. Panduan ini memakai Ubuntu 24.04, tapi langkahnya sama di Debian dan AlmaLinux dengan sedikit beda nama layanan.

Kenapa folder chroot harus milik root?

Ini aturan yang paling sering membuat percobaan pertama gagal. Dokumentasi sshd_config menyebut folder yang dipakai sebagai ChrootDirectory, dan semua folder di atasnya, harus dimiliki root dan tidak boleh bisa ditulis oleh user atau grup lain. Kalau aturan ini dilanggar, sshd menolak login dengan pesan "bad ownership or modes for chroot directory" di log.

Akibatnya, user tidak bisa menulis langsung di folder akar chroot. Solusinya, buat subfolder di dalamnya yang dimiliki user tersebut, misalnya upload. Struktur yang akan kita buat:

PathPemilikIzinFungsi
/srv/sftproot:root755Folder induk semua user SFTP
/srv/sftp/klien1root:root755Akar chroot, terlihat sebagai / oleh user
/srv/sftp/klien1/uploadklien1:sftpusers750Tempat user menaruh file

Langkah membuat user SFTP terkunci

1. Buat grup khusus SFTP

sudo groupadd sftpusers

Semua user yang ingin dikurung cukup dimasukkan ke grup ini. Satu aturan di sshd berlaku untuk semuanya.

2. Buat user tanpa akses shell

sudo useradd -g sftpusers -d /upload -s /usr/sbin/nologin klien1
sudo passwd klien1

Home /upload sengaja ditulis relatif terhadap chroot, sehingga setelah login user langsung berada di folder upload. Shell nologin memastikan user tidak bisa membuka terminal.

Lebih aman lagi bila memakai SSH key. Untuk itu kamu perlu menaruh authorized_keys di lokasi yang bisa dibaca sshd, misalnya dengan opsi AuthorizedKeysFile di blok Match. Untuk kebutuhan sederhana dengan klien yang belum terbiasa key, password yang panjang dan unik masih bisa dipakai, ditambah Fail2ban untuk menahan tebakan.

3. Siapkan folder dengan izin yang benar

sudo mkdir -p /srv/sftp/klien1/upload
sudo chown root:root /srv/sftp /srv/sftp/klien1
sudo chmod 755 /srv/sftp /srv/sftp/klien1
sudo chown klien1:sftpusers /srv/sftp/klien1/upload
sudo chmod 750 /srv/sftp/klien1/upload

Kalau penjelasan angka izin di atas masih membingungkan, lihat panduan chmod dan chown.

4. Tambahkan aturan di sshd_config

Buka /etc/ssh/sshd_config. Pastikan baris Subsystem memakai internal-sftp, karena program sftp-server eksternal tidak tersedia di dalam chroot:

Subsystem sftp internal-sftp

Lalu tambahkan blok ini di paling akhir file. Blok Match berlaku sampai akhir file atau sampai ada Match berikutnya, jadi pengaturan umum yang ditulis di bawahnya akan ikut terkena.

Match Group sftpusers
    ChrootDirectory /srv/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no

%u diganti otomatis dengan nama user, sehingga setiap user punya chroot sendiri. ForceCommand internal-sftp memaksa sesi apa pun menjadi SFTP, sehingga perintah shell tidak bisa dijalankan meski user mencoba.

5. Uji konfigurasi dan muat ulang SSH

Jangan me-restart SSH sebelum konfigurasi dicek, karena kesalahan ketik bisa membuat kamu sendiri terkunci:

sudo sshd -t
sudo systemctl restart ssh

Di AlmaLinux dan Rocky Linux, nama layanannya sshd. Biarkan sesi SSH yang sedang terbuka tetap hidup sampai pengujian selesai.

6. Uji dari komputer lain

sftp klien1@IP-SERVER

Setelah masuk, coba pwd (harus /upload), cd .. lalu ls (hanya melihat folder upload), dan put sebuah file. Lalu coba ssh klien1@IP-SERVER, koneksi harus ditolak atau langsung tertutup.

Kalau login gagal, baca log SSH:

sudo journalctl -u ssh -n 50

Pesan soal "ownership or modes" berarti izin folder chroot belum sesuai langkah 3.

Menambah user SFTP berikutnya

Setelah aturan Match terpasang, menambah user baru tidak perlu menyentuh sshd lagi. Cukup ulangi langkah 2 dan 3 dengan nama berbeda:

sudo useradd -g sftpusers -d /upload -s /usr/sbin/nologin klien2
sudo passwd klien2
sudo mkdir -p /srv/sftp/klien2/upload
sudo chown root:root /srv/sftp/klien2
sudo chmod 755 /srv/sftp/klien2
sudo chown klien2:sftpusers /srv/sftp/klien2/upload
sudo chmod 750 /srv/sftp/klien2/upload

Karena sshd membaca keanggotaan grup saat user login, user baru langsung terkena aturan chroot tanpa restart. Simpan perintah di atas sebagai skrip kecil bila kamu sering menambah klien.

Bagaimana kalau file harus masuk ke folder website?

Sering kali file yang diunggah klien sebenarnya perlu muncul di folder website, misalnya /var/www/situs/wp-content/uploads. Jangan menjadikan folder website sebagai chroot, karena aturan kepemilikan root akan bentrok dengan kebutuhan web server.

Cara yang lebih rapi adalah bind mount. Folder website "ditempelkan" ke dalam folder chroot:

sudo mkdir -p /srv/sftp/klien1/website
sudo mount --bind /var/www/situs/aset /srv/sftp/klien1/website

Agar bertahan setelah reboot, tambahkan baris bind ke /etc/fstab. Atur izin folder tujuan supaya user SFTP dan user web server sama-sama punya akses sesuai kebutuhan, misalnya lewat grup bersama.

Pertanyaan yang sering diajukan

Apakah user SFTP chroot bisa melihat folder user lain?

Tidak. Dengan ChrootDirectory /srv/sftp/%u, setiap user hanya melihat isi foldernya sendiri dan tidak bisa naik ke /srv/sftp.

Bisakah memakai FileZilla untuk user ini?

Bisa. Pilih protokol SFTP, bukan FTP, dengan port SSH server kamu. FileZilla akan langsung membuka folder upload.

Bagaimana mencatat file apa saja yang diunggah?

Tambahkan opsi log ke ForceCommand, misalnya ForceCommand internal-sftp -l INFO. Aktivitas seperti membuka dan menulis file akan tercatat di log autentikasi sistem. Bila tidak muncul, cek dulu tingkat log dan fasilitas yang dipakai sshd di servermu.

Bagaimana mencabut akses user ini?

Kunci akunnya dengan sudo usermod -L klien1 dan matikan sesi yang aktif, atau hapus user dengan userdel bila tidak dibutuhkan lagi. Folder datanya bisa disimpan atau dihapus terpisah.

Checklist sebelum memberikan akses:

  • Folder chroot dan induknya milik root, izin 755
  • Subfolder upload milik user SFTP
  • Blok Match ada di akhir sshd_config
  • sshd -t lolos sebelum restart
  • Login SSH biasa ditolak, upload SFTP berhasil

Sumber & referensi

Baca juga