Mengaktifkan SFTP Tanpa Akses Shell di Ubuntu 16.04

Bagus Aji Santoso 18 Desember 2017

Mengaktifkan SFTP Tanpa Akses Shell di Ubuntu 16.04

Pendahuluan

SFTP merupakan singkatan dari SSH File Transfer Protocol. Sesuai dengan namanya, SFTP merupakan sebuah teknik pengiriman data ke server melalui koneksi SSh yang terenkripsi. Meski namanya mirip, teknik ini merupakan protokol yang sama sekali beda dengan FTP (File Transfer Protocol), namun tetap didukung oleh banyak klien FTP modern.

SFTP tersedia tanpa konfigurasi apapun disebuah server yang akses SSH-nya telah aktif. Teknik ini mudah digunakan dan aman namun memiliki satu kekurangan: dipengaturan standar, SSH server memberikan akses file dan terminal pada seluruh user yang ada di sistem.

Dalam beberapa kasus, kita ingin hanya pengguna tertentu yang bisa mengirim data dan tidak memiliki akses SSH. Tutorial kali ini, kita akan mengatur SSH daemon untuk membatasi akses SFTP ke satu direktori tanpa ada akses SSH yang bisa dilakukan oleh user.

Tutorial Konfigurasi Nginx Sebagai Reverse Proxy Apache

Prasyarat

Untuk mengikuti tutorial ini pembaca perlu memiliki:

  • Sebuah server Ubuntu 16.04 yang memiliki user sudo non-root dan sebuah firewall.

Langkah 1 — Membuat User Baru

Pertama, kita membuat sebuah user baru yang akan diberikan hak akses untuk mengirim file ke server. Di sini, kita menggunakan username sammyfiles, namun pembaca bisa menggunakan username apa pun.

sudo adduser sammyfiles

Kita akan diminta memasukkan password yang diikuti dengan beberapa informasi tambahan. Informasi tambahan ini bisa dilewati dengan menekan ENTER.

Sekarang kita sudah memiliki user baru yang kana diberikan akses. Selanjutnya kita akan membuat direktori di mana user tadi bisa mengirim data dan mengatur hak akses direktori tersebut.

Langkah 2 — Membuat Direktori Untuk File Transfer

Untuk membatasi akses SFTP ke satu direktori, pertama kita harus memastikan direktori tersebut memiliki hak akses yang sesuai. Direktori tersebut dan direktori lain di atasnya yang ada di filesystem tree harus dimiliki oleh root dan tidak dapat ditulis oleh user lain. Karena hal tersebut, kita juga tidak bisa membuat direktori ini di direktori home user karena tidak dimiliki oleh root.

Catatan: Beberapa versi OpenSSH tidak memiliki syarat untuk struktur direktori dan hak miliknya, namun sebagian besar distribusi Linux (termasuk Ubuntu 16.04) mewajibkan.

Ada beberapa cara untuk menyelesaikan permasalahan hak milik direktori ini. Di tutorial ini, kita akan membuat dan mengunakan var/sftp/uploads sebagai direktori utama tempat mengunggah data. Direktori /var/sftp akan dimiliki oleh root dan tidak dapat ditulis oleh pengguna lain. Subdirektori di dalamnya /var/sftp/uploads akan dimiliki oleh sammyfiles, sehingga user ini dapat mengunggah data ke folder yang baru.

Pertama, buat direktorinya:

sudo mkdir -p /var/sftp/uploads

Atur pemilik direktori /var/sftp sebagai root.

sudo chown root:root /var/sftp

Beri root hak akses untuk menulis didirektori ini dan beri akses user lain hanya untuk membaca dan mengeksekusi file di dalamnya.

sudo chmod 755 /var/sftp

Ubah pemilik direktori uploads menjadi sammyfiles.

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

Sekarang setelah struktur direktori sudah sesuai, kita dapat mengatur server SSH-nya.

Langkah 3 — Membatasi Akses Ke Satu Direktori

Di langkah ini, kita akan memodifikasi konfigurasi server SSH untuk menolak akses terminal bagi sammyfiles tapi memperbolehkan transfer data.

Buka konfiruasi server SSH dengan nano atau editor lainnya.

sudo nano /etc/ssh/sshd_config

Scroll ke bagian paling bawah file ini lalu tambahkan:

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Simpan dan tutup file ini.

Berikut ini penjelasan tambahan kode di atas:

  • Match User memberitahu server SSh untuk mengaplikasikan perintah di bawahnya hanya untuk user khusus dalam hal ini sammyfiles.
  • ForceCommand internal-sftp memaksa server SSH untuk langsung menjalankan server SFTP saat login dan menolak akses shell.
  • PasswordAuthentication yes memperbolehkan otentikasi password untuk user ini.
  • ChrootDirectory /var/sftp/ memasukan user tidak diberikan akses untuk direktori lain selain /var/sftp. Pembaca bisa mempelajari dengan chroot di tutorial ini.
  • AllowAgentForwarding no, AllowTcpForwarding no. dan X11Forwarding no mendisable port forwarding, tunneling dan X11 forwarding untuk user ini.

Kumpulan perintah ini, dimulai dari Match User, dapat disalin dan ditulis ulang untuk user lain. Pastikan untuk mengubah username di baris Match User.

Catatan: Pembaca bisa mengabaikan baris PasswordAuthentication yes dan menyiapkan SSH key untuk memperkuat keamanan. Ikuti bagian Copying your Public SSH Key di SSH Essentials: Working with SSH Servers, Clients, and Keys untuk melakukannya. Pastikan sudah menjalankan hal ini sebelum mendisable akses shell untuk user.

Dilangkah berikutnya, kita akan menguji konfigurasi SSH lokal menggunakan akses password, tapi kalau SSH key sudah ada, kita akan memerlukan keypair untuk mengakses menggunakan SSH.

Untuk mengaplikasikan perubahan, restart service.

sudo systemctl restart sshd

Cara Mengamankan Apache Web Server dengan Let's Encrypt di Ubuntu 16.04

Langkah 4 — Periksa Konfigurasi

Mari kita pastikan bahwa user baru kita si sammyfiles hanya dapat mengirim file.

Login ke server sebagai sammfiles menggunakan akses shell sudah tidak dapat dilakukan. Mari kita coba:

ssh sammyfiles@localhost

Kita akan melihat pesan berikut saat kita mencoba menjalankan perintah di atas:

This service allows sftp connections only.
Connection to localhost closed.

Ini artinya sammyfiles sudah tidak memiliki akses ke server menggunakan SSH.

This means that sammyfiles can no longer can access the server shell using SSH.

Berikutnya, mari kita verifikasi jika user sudah dapat mengakses SFTP untuk melakukan file transfer.

sftp sammyfiles@localhost

Tidak seperti perintah sebelumnya yang memberikan pesan error, perintah ini akan menampilkan pesan login sukses dengan sebauh interactive prompt.

Connected to localhost.
sftp>

Kita dapat melihat isi direktori ini dengan perintah ls :

ls

Perintah di atas akan menampilkan direktori uploadsyang dibuat di langkah sebelumnya.

uploads

Untuk memastiakn bahwa user hanya memiliki akses untuk direktori ini dan tidak dapat mengakses direktori di atasnya, kita dapat mencoba perintah:

cd ..

Perintah ini tidak akan memberikan sebuah error, tapi kita dapat lihat bahwa konten yang ditampilkan masih sama, artinya user tidak dapat pindah ke parent directory.

Kita sudah memverifikasi bahwa sammyfiles sudah memiliki akses ke server hanya melalui protokol SFTP tanpa akses shell normal.

Kesimpulan

Kita sudah belajar bagaimana menyiapkan akses SFTP terbatas untuk satu direktori bagi seorang user disebuah server tanpa akses shell penuh. Meski tutorial ini hanya membahas bagaimana cara melalukannya untuk satu direktori dan satu user agar lebih ringkas, pembaca dapat mengembangkan sendiri contoh ini untuk user dan direktori lebih dari satu.

Server SSH memperbolehkan konfigurasi yang lebih kompleks termasuk membatasi akses untuk groups atau multiple user di saat yang bersamaan atau dengan membatasi berdasarkan IP address. Contoh tambahan lain dapat pembaca temukan di OpenSSH Cookbook. Jika pembaca mengalami permasalahan dengan SSH, debug dan selesaikan melalui seri tutorial troubleshooting SSH.

Diterjemahkan dari How To Enable SFTP Without Shell Access on Ubuntu 16.04 di bawah Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.