Konfigurasi SFTP dengan chroot di dalam mesin easyengine

Pemanfaatan terhadap teknologi internet didefinisikan oleh protokol-protokol yang masing-masing memiliki tugas untuk menyediakan layanan yang berbeda-beda, yang sangat umum kita gunakan dan sudah hadir sejak awal internet lahir diantaranya adalah POP (Post Office Protocol), SMTP (Simple Mail Transfer Protocol), HTTP dan HTTPs (Hypertext Transfer Protocol – secured).

Termasuk ke dalam protokol yang sejak awal internet lahir sudah diadopsi dan dimanfaatkan adalah File Transfer Protocol yang menyediakan fasilitas transfer file antar server / komputer.

Tulisan ini menjabarkan sedikit konsep mengenai FTP dan SFTP serta memberikan panduang langkah demi langkah untuk melakukan konfigurasi SFTP dan chroot dalam sebuah mesin yang menggunakan easyengine sebagai server management framework.

SSH File Transfer Protocol Chroot
Implementasi SSH File Transfer Protocol dan Chroot

FTP dan SFTP

Fasilitas untuk melakukan transfer data dari dan ke arah server merupakan salah satu yang termasuk wajib untuk disediakan oleh sebuah web server. FTP atau File Transfer Protokol merupakan protokol yang hadir sejak lama demi keperluan perpindahan data antara mesin / server / komputer dan masih menjadi metoda utama yang dimanfaatkan oleh pengembang situs web untuk melakukan perubahan konten dari situs yang mereka kelola. FTP secara default berjalan di Port 21 dan umumnya diberikan oleh penyedia layanan web hosting kepada pengguna layanannya sebagai fasilitas standard/

Sementara itu SFTP atau SSH File Transfer Protocol atau Secure File Transfer Protokol merupakan protokol terpisah yang dikembangkan sebagai fasilitas tambahan dari Secured Shell Protocol versi 2 (SSH v2), dikembangkan untuk memberikan akses terhadap pengelolaan File System di dalam kondisi secured. SFTP dijalankan sebagai sub sytem service SSH dan secara otomatis berjalan di port yang sama dengan port yang digunakan oleh SSH, secara default di Port 22.

Dalam banyak kasus SFTP lebih menjadi pilihan dibandingkan FTP karena berjalan di atas service lebih secured. Selain itu, apabila dibandingkan dengan SCP (Secure Copy Protocol) pengembangan dari Protokol BSD RCP yang juga menyediakan akses ke fasilitas file transfer di atas service SSH, SFTP memiliki kemampuan lebih karena tidak hanya dapat digunakan untuk transfer file saja namun juga memiliki akses ke pengelolaan file system seperti ownership / permission, SFTP lebih cocok disebut sebagai sebuah Remote File System Protocol.

Persyaratan untuk memanfaatkan SFTP

Karena SFTP berjalan di atas service SSH, maka service SSH yang sudah berjalan dan aktif merupakan persyaratan utama untuk memungkinkan kita memanfaatkan SFTP sebagai metoda pengelolaan file di dalam server yang kita kelola.

Contoh di dalam tulisan ini merupakan setup Easyengine di dalam sebuah server yang menggunakan operating system Ubuntu 16.04.3 LTS 64 bit, untuk memastikan service ssh sudah berjalan dapat menggunakan command systemctl.

root@host:~# systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2017-08-27 19:41:18 WIB; 7h ago
Main PID: 20718 (sshd)
Tasks: 1
Memory: 3.6M
CPU: 24.136s
CGroup: /system.slice/ssh.service
└─20718 /usr/sbin/sshd -D

Berikut beberapa opsi perintah systemctl yang sering digunakan terkait dengan pengelolaan server linux, systemctl menyediakan interface bagi kita untuk melakukan query ataupun perintah kendali / control ke systemd. Sementara Systemd atau system daemon merupakan service yang bertugas mengatur service-service apa saja yang berjalan di dalam server terkait.

  • systemctl status namaservice : untuk memeriksa status dari service tertentu
  • systemctl reload / restart namaservice : untuk mengirimkan perintah reload ataupun restart ke service tertentu
  • systemctl start / stop namaservcie : untuk memulai ataupun menghentikan service tertentu
  • systemctl enable / disable nama service : untuk mengenable / disable service tertentu dijalankan dalam sequence bootup server
  • systemctl –helo untuk melihat opsi lain yang dapat dimanfaatkan untuk memeriksa ataupun mengatur service tertentu melalui perintah ini

Mempersiapkan user untuk login memanfaatkan SFTP

Hal ini terkait erat dengan setup server yang telah berjalan, pada kasus penggunaaan easyengine proses web server yang melayani service HTTP dan HTTPS dijalankan menggunakan user www-data melalui Nginx web server, demikian juga dengan php-fpm yang berjalan untuk menghandle request php dari nginx baik itu melalui interface php secara langsung maupun melalui hhvm juga berjalan menggunakan userr yang sama. Dengan demikian user yang akan kita siapkan minimal memiliki hak baca tulis ke dalam direktori yang terkait dengan website yang dilayani oleh server tersebut.

Pada server dengan setup easyengine direktori yang ingin kita berikan akses baca tulis melalui SFTP adalah direktori root www dari akun website yang terletak di /var/www/namadomain.com/htdocs, dengan demikian chroot untuk user tersebut berada di dalam root www satu web tertentu dengan asumsi satu buah web akan memiliki satu user akses SFTP atau apabila hanya membutuhkan satu user saja maka root direktorinya akan ke home direktori user tersebut. Namun demikian penting untuk tidak mengekspose /var/www/ yang merupakan home direktori dari user www-data.

Point dalam persiapan user yang harus dilakukan adalah sebagai berikut;

  • Add user baru dengan home direktori default di /home/namauser/, dan pastikan bahwa user tersebut tergabung ke dalam group www-data untuk memudahkan pemberian akses baca tulis ke folder htdocs
  • Buat direktori di dalam /home/namauser/ yang nantinya akan di mount ke /var/www/namadomain.com/htdocs
  • Sesuaikan permissions dan ownership dari masing-masing direktori
  • Lakukan mount direktori/var/www/namadomain.com/htdocs ke /home/namauser/namadomain-www dan masukkan perinta mount tersebut ke dalam /etc/rc.local agar dieksekusi pada saat server di reboot

Berikut adalah perintah yang dijalankan sesuai dengan point-point tersebut di atas;

root@sgp1-01:~# useradd -G www-data -ms /bin/false usersftp

-G untuk memasukkan user tersebut ke dalam group www-data, -s untuk menentukan login shell untuk user yang baru dicreate tersebut. Shell /bin/false diberikan untuk membatasi lingkup user tersebut sehingga hanya bisa melakukan login ke server melalui service SFTP dan tidak dapat login atau memiliki akses ke shell server.

Hasil dari perintah tersebut dicatat di /etc/passwd dan secara otomatis direktori di /home/ dicreate sebagai home direktori user.

root@sgp1-01:~# grep usersftp /etc/passwd
usersftp:x:1001:1001::/home/usersftp:/bin/false
root@sgp1-01:~# ls -liah /home/
total 16K
  2027 drwxr-xr-x  4 root     root     4.0K Aug 29 01:02 .
     2 drwxr-xr-x 23 root     root     4.0K Aug 28 21:36 ..
518809 drwxr-xr-x  2 usersftp usersftp 4.0K Aug 29 01:02 usersftp

Buat direktori yang akan dimount ke direktori /var/www, contohnya namadomain-www di dalam home direktori user dan ubah ownership direktori tersebut menjadi usersftp dan group www-data, kemudian lakukan modifikasi permission di folder /var/www/namadomain.com/htdocs agar user yang termasuk ke dalam group www-data memiliki hak penuh, serta tambahkan +s di group agar secara default file baru yang dicreate di dalam folder tersebut memilki nama group (www-data) sebagai group ownernua.

root@sgp1-01:~# mkdir /home/usersftp/namadomain-www
root@sgp1-01:~# chown usersftp.www-data /home/usersftp/namadomain-www/
root@sgp1-01:~# chown root.root /home/usersftp/
root@sgp1-01:~# chmod g+s /var/www/namadomain.com/htdocs/
root@sgp1-01:~# chmod 0775 /var/www/namadomain.com/htdocs/

Langkah terakhir di bagian ini adalah melakukan bind direktori usersftp dengan direktori htdocs serta memasukkan perintah bind tersebut ke dalam /etc/rc.local

root@sgp1-01:~# mount --bind /var/www/namadomain.com/htdocs/ /home/usersftp/namadomain-www/
root@sgp1-01:~# grep namadomain-www /proc/mounts
/dev/vda1 /home/usersftp/namadomain-www ext4 rw,relatime,data=ordered 0 0
root@sgp1-01:~# vim /etc/rc.local

# Masukkan command bind sebelum exit 0
mount --bind /var/www/namadomain.com/htdocs/ /home/usersftp/namadomain-www/
# save dan keluar dari vim :wq

Konfigurasi SFTP dan chroot

Konfigurasi untuk sftp dilakukan di file konfigurasi yang sama dengan konfigurasi untuk service ssh yaitu di dalam /etc/ssh/sshd_config, chroot dilakukan melalui direktif match yang dilakukan dengan pengecekan terhadap group dari user yang melakukan authentikasi melalui service sssh.

Chroot merupakan metoda untuk mengendalikan ruang gerak terhadap user tersebut, dalam kasus ini kita membatasi ruang gerak usersftp hanya ke dalam home direktorinya, namun karena home direktori tersebut ownership user dan groupnya adalah root maka usersftp otomatis hanya memiliki hak tulis di dalam mount folder htdocs (namadomain-www).

Buka file konfigurasi sshd dan ubah serta tambahkan direktif sebagai berikut;

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

# Tambahkan direktif match di bagian bawah file
Match group www-data
X11Forwarding no
ChrootDirectory %h
AllowTcpForwarding no
ForceCommand internal-sftp

Restart service ssh untuk mengaktifkan perubahan konfigurasi yang kita lakukan. Dapat diperhatikan lebih lanjut mengenai rule Match group www-data yang kita tambahkan, direktif di bawah Match adalah aturan yang diberlakukan kepada user yang terkena direktif Match tersebut, dalam hal ini apabila user terkait merupakan anggota dari group www-data. Salah satu rule pentingnya adalah ChrootDirectory yang ditentukan kepada %h yang membuat root direktori dari user tersebut adalah di dalam home direktori user (%h) dan secara desain tidak memiliki hak apapun ataupun informasi apapun di luar direktori tersebut.

Link Terkait

Berikut beberapa link yang berisi informasi kurang lebih serupa ataupun informasi lebih detil yang dapat dipelajari lebih lanjut apabila anda ingin melakukan konfigurasi lebih dari yang dijabarkan di dalam tulisan ini.

Leave a Reply

%d bloggers like this: