Langkah - Lagkah Setup FTP User Di Ubuntu 18.04
Introduction
FTP, kependekan dari File Transfer Protocol, adalah protokol jaringan yang pernah digunakan secara luas untuk memindahkan file antara klien dan server. Sejak itu telah digantikan oleh cara pengiriman file yang lebih cepat, lebih aman, dan lebih nyaman. Banyak user Internet biasa berharap untuk mengunduh langsung dari browser web mereka dengan https, dan user baris perintah lebih cenderung menggunakan protokol aman seperti scp atau SFTP.
FTP masih digunakan untuk mendukung aplikasi lama dan alur kerja dengan kebutuhan yang sangat spesifik. Jika Anda memiliki pilihan protokol apa yang akan digunakan, pertimbangkan untuk menjelajahi opsi yang lebih modern. Namun, ketika Anda membutuhkan FTP, vsftpd adalah pilihan yang sangat baik. Dioptimalkan untuk keamanan, kinerja, dan stabilitas, vsftpd menawarkan perlindungan yang kuat terhadap banyak masalah keamanan yang ditemukan di server FTP lain dan merupakan default untuk banyak distribusi Linux.
Dalam tutorial ini, Anda akan mengonfigurasi vsftpd untuk mengizinkan user mengunggah file ke direktori rumahnya menggunakan FTP dengan kredensial masuk yang diamankan oleh SSL/TLS.
Prasyarat
Untuk mengikuti tutorial ini, Anda memerlukan:
- Server Ubuntu 18.04, dan user non-root dengan hak istimewa sudo: Anda dapat mempelajari lebih lanjut tentang cara menyiapkan user dengan hak istimewa ini di Panduan Penyiapan Server Awal kami dengan Ubuntu 18.04.
Langkah 1 — Memasang vsftpd
Mari kita mulai dengan memperbarui daftar paket kami dan menginstal daemon vsftpd:
$ sudo apt update
$ sudo apt install vsftpd
Setelah penginstalan selesai, mari salin file konfigurasi sehingga kita dapat memulai dengan konfigurasi kosong, menyimpan yang asli sebagai cadangan:
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Dengan cadangan konfigurasi, kami siap mengonfigurasi firewall.
Langkah 2 — Membuka Firewall
Mari kita periksa status firewall untuk melihat apakah sudah diaktifkan. Jika ya, kami akan memastikan bahwa lalu lintas FTP diizinkan sehingga aturan firewall tidak memblokir pengujian kami.
Periksa status firewall:
$ sudo ufw status
Dalam hal ini, hanya SSH yang diizinkan melalui:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Anda mungkin memiliki aturan lain atau tidak ada aturan firewall sama sekali. Karena hanya lalu lintas SSH yang diizinkan dalam kasus ini, kami perlu menambahkan aturan untuk lalu lintas FTP.
Mari buka port 20 dan 21 untuk FTP, port 990 untuk saat kita mengaktifkan TLS, dan port 40000-50000 untuk rentang port pasif yang akan kita atur di file konfigurasi:
$ sudo ufw allow 20/tcp
$ sudo ufw allow 21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 40000:50000/tcp
$ sudo ufw status
Aturan firewall kami sekarang akan terlihat seperti ini:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
Dengan vsftpd terinstal dan port yang diperlukan terbuka, mari beralih ke membuat user FTP khusus.
Langkah 3 — Mempersiapkan Direktori user
Kami akan membuat user FTP khusus, tetapi Anda mungkin sudah memiliki user yang membutuhkan akses FTP. Kami akan berhati-hati untuk mempertahankan akses user yang ada ke data mereka dalam petunjuk berikut. Meski begitu, kami menyarankan Anda memulai dengan user baru hingga Anda selesai mengonfigurasi dan menguji penyiapan Anda.
Pertama, tambahkan test user:
$ sudo adduser sammy
Tetapkan kata sandi saat diminta. Jangan ragu untuk menekan ENTER melalui petunjuk lainnya.
FTP umumnya lebih aman ketika user dibatasi ke direktori tertentu. vsftpd menyelesaikan ini dengan chroot jails. Ketika chroot diaktifkan untuk user lokal, mereka dibatasi ke direktori home mereka secara default. Namun, karena cara vsftpd mengamankan direktori, itu tidak boleh ditulis oleh user. Ini bagus untuk user baru yang seharusnya hanya terhubung melalui FTP, tetapi user yang sudah ada mungkin perlu menulis ke folder rumah mereka jika mereka juga memiliki akses shell.
Dalam contoh ini, daripada menghapus hak tulis dari direktori home, mari buat direktori ftp untuk berfungsi sebagai chroot dan direktori file yang dapat ditulisi untuk menyimpan file yang sebenarnya.
Buat folder ftp:
$ sudo mkdir /home/sammy/ftp
Tetapkan kepemilikannya:
$ sudo chown nobody:nogroup /home/sammy/ftp
Hapus izin menulis:
$ sudo chmod a-w /home/sammy/ftp
Verifikasi izin:
$ sudo ls -la /home/sammy/ftp
Output
total 8
4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x 3 sammy sammy 4096 Aug 24 21:29 ..
Selanjutnya, mari buat direktori untuk unggahan file dan berikan kepemilikan kepada user:
$ sudo mkdir /home/sammy/ftp/files
sudo chown sammy:sammy /home/sammy/ftp/files
Pemeriksaan izin pada direktori ftp harus mengembalikan yang berikut ini:
$ sudo ls -la /home/sammy/ftp
Output
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy sammy 4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy sammy 4096 Aug 26 14:01 files
Terakhir, mari tambahkan file test.txt untuk digunakan saat kita menguji:
$ echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt
Sekarang kita telah mengamankan direktori ftp dan mengizinkan akses user ke direktori file, mari ubah konfigurasi kita.
Langkah 4 — Mengonfigurasi Akses FTP
Kami berencana mengizinkan satu user dengan akun shell lokal untuk terhubung dengan FTP. Dua pengaturan utama untuk ini sudah diatur di vsftpd.conf. Mulailah dengan membuka file konfigurasi untuk memverifikasi bahwa pengaturan di konfigurasi Anda cocok dengan yang di bawah ini:
$ sudo nano /etc/vsftpd.conf
. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .
Selanjutnya, mari aktifkan user untuk mengunggah file dengan menghapus komentar pada pengaturan write_enable:
. . .
write_enable=YES
. . .
Kami juga akan membatalkan komentar pada chroot untuk mencegah user yang terhubung dengan FTP mengakses file atau perintah apa pun di luar pohon direktori:
. . .
chroot_local_user=YES
. . .
Mari tambahkan juga user_sub_token untuk memasukkan nama user di jalur direktori local_root kita sehingga konfigurasi kita akan berfungsi untuk user ini dan user tambahan lainnya di masa mendatang. Tambahkan pengaturan ini di mana saja dalam file:
. . .
user_sub_token=$USER
local_root=/home/$USER/ftp
Mari kita juga membatasi jangkauan port yang dapat digunakan untuk FTP pasif untuk memastikan koneksi yang cukup tersedia:
. . .
pasv_min_port=40000
pasv_max_port=50000
Catatan: Pada langkah 2, kami membuka port yang kami atur di sini untuk jangkauan port pasif. Jika Anda mengubah nilainya, pastikan untuk memperbarui pengaturan firewall Anda.
Untuk mengizinkan akses FTP berdasarkan kasus per kasus, mari atur konfigurasi sehingga user hanya memiliki akses saat mereka ditambahkan secara eksplisit ke daftar, bukan secara default:
. . .
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
userlist_deny matikan logika: Ketika diatur ke YA, user pada daftar ditolak akses FTP. Jika disetel ke TIDAK, hanya user dalam daftar yang diizinkan mengakses.
Setelah selesai melakukan perubahan, simpan file dan keluar dari editor.
Terakhir, mari tambahkan user kita ke /etc/vsftpd.userlist. Gunakan flag -a untuk menambahkan file:
$ echo "sammy" | sudo tee -a /etc/vsftpd.userlist
Periksa apakah itu ditambahkan seperti yang Anda harapkan:
$ cat /etc/vsftpd.userlist
Output
sammy
Mulai ulang daemon untuk memuat perubahan konfigurasi:
$ sudo systemctl restart vsftpd
Dengan konfigurasi di tempat, mari beralih ke pengujian akses FTP.
Langkah 5 — Menguji Akses FTP
Kami telah mengonfigurasi server untuk mengizinkan hanya sammy user yang terhubung melalui FTP. Mari pastikan ini berfungsi seperti yang diharapkan.
user anonim harus gagal terhubung: Kami telah menonaktifkan akses anonim. Mari kita uji dengan mencoba terhubung secara anonim. Jika konfigurasi kami diatur dengan benar, izin user anonim harus ditolak. Buka jendela terminal lain dan jalankan perintah berikut. Pastikan untuk mengganti 203.0.113.0 dengan alamat IP publik server Anda:
$ ftp -p 203.0.113.0
Output
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>
Tutup koneksi:
ftp> bye
user selain sammy harus gagal terhubung: Selanjutnya, mari kita coba menghubungkan sebagai user sudo kita. Mereka juga harus ditolak aksesnya, dan itu harus terjadi sebelum mereka diizinkan memasukkan kata sandi mereka:
$ ftp -p 203.0.113.0
Output
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
Tutup koneksi:
ftp> bye
Sammy user harus dapat menghubungkan, membaca, dan menulis file: Mari pastikan bahwa user yang ditunjuk dapat terhubung:
$ ftp -p 203.0.113.0
Output
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Mari ubah ke direktori files dan gunakan perintah get untuk mentransfer file pengujian yang kita buat sebelumnya ke mesin lokal kita:
ftp> cd files
ftp> get test.txt
Output
227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (16 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (1588 bytes/s)
ftp>
Selanjutnya, mari unggah file dengan nama baru untuk menguji izin menulis:
ftp> put test.txt upload.txt
Output
227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
16 bytes sent in 0.000894 seconds (17897 bytes/s)
Tutup koneksi:
ftp> bye
Sekarang setelah kami menguji konfigurasi kami, mari ambil langkah-langkah untuk lebih mengamankan server kami.
Langkah 6 — Mengamankan Transaksi
Karena FTP tidak mengenkripsi data apa pun saat transit, termasuk kredensial user, kami akan mengaktifkan TLS/SSL untuk menyediakan enkripsi tersebut. Langkah pertama adalah membuat sertifikat SSL untuk digunakan dengan vsftpd.
Mari gunakan openssl untuk membuat sertifikat baru dan gunakan flag -days untuk membuatnya valid selama satu tahun. Dalam perintah yang sama, kami akan menambahkan kunci RSA 2048-bit pribadi. Dengan menyetel flag -keyout dan -out ke nilai yang sama, kunci privat dan sertifikat akan ditempatkan di file yang sama:
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Anda akan diminta memberikan informasi alamat untuk sertifikat Anda. Gantikan informasi Anda sendiri untuk nilai yang disorot di bawah ini:
$ Output
Generating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:NY
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: your_server_ip
Email Address []:
Untuk informasi lebih detail tentang bendera sertifikat, lihat OpenSSL Essentials: Bekerja dengan Sertifikat SSL, Kunci Pribadi, dan CSR
Setelah Anda membuat sertifikat, buka lagi file konfigurasi vsftpd:
$ sudo nano /etc/vsftpd.conf
Di bagian bawah file, Anda akan melihat dua baris yang dimulai dengan rsa_. Komentari mereka sehingga terlihat seperti ini:
$ . . .
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
. . .
Di bawahnya, tambahkan baris berikut yang mengarah ke sertifikat dan kunci pribadi yang baru saja kita buat:
. . .
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
. .
Setelah itu, kami akan memaksa useran SSL, yang akan mencegah klien yang tidak dapat menangani TLS untuk terhubung. Hal ini diperlukan untuk memastikan bahwa semua lalu lintas dienkripsi, tetapi mungkin memaksa user FTP Anda untuk mengubah klien. Ubah ssl_enable menjadi YA:
. . .
ssl_enable=YES
. . .
Setelah itu, tambahkan baris berikut untuk secara eksplisit menolak koneksi anonim melalui SSL dan meminta SSL untuk transfer data dan login:
. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .
Setelah ini, konfigurasikan server untuk menggunakan TLS, pengganti SSL yang lebih disukai, dengan menambahkan baris berikut:
. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .
Terakhir, kami akan menambahkan dua opsi lagi. Pertama, kami tidak akan meminta useran ulang SSL karena dapat merusak banyak klien FTP. Kami akan memerlukan cipher suite enkripsi "tinggi", yang saat ini berarti panjang kunci sama dengan atau lebih besar dari 128 bit:
. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .
Bagian file yang sudah selesai akan terlihat seperti ini:
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
Setelah selesai, simpan dan tutup file.
Mulai ulang server agar perubahan diterapkan:
$ sudo systemctl restart vsftpd
Pada titik ini, kita tidak lagi dapat terhubung dengan klien baris perintah yang tidak aman. Jika kami mencoba, kami akan melihat sesuatu seperti:
Output
ftp -p 203.0.113.0
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp>
Selanjutnya, mari verifikasi bahwa kita dapat terhubung menggunakan klien yang mendukung TLS.
Langkah 7 — Menguji TLS dengan FileZilla
Sebagian besar klien FTP modern dapat dikonfigurasi untuk menggunakan enkripsi TLS. Kami akan mendemonstrasikan cara terhubung dengan FileZilla karena dukungan lintas platformnya. Konsultasikan dokumentasi untuk klien lain.
Saat pertama kali membuka FileZilla, temukan ikon Pengelola Situs tepat di atas kata Host, ikon paling kiri di baris atas. Klik itu:
Window baru akan terbuka. Klik tombol New Site di pojok kanan bawah:
Di bawah My Sites, ikon baru dengan kata-kata New Site akan muncul. Anda dapat menamainya sekarang atau kembali lagi nanti dan menggunakan tombol Rename.
Isi kolom Host dengan nama atau alamat IP. Di bawah menu tarik-turun Enkripsi, pilih Require explicit FTP over TLS.
Untuk Logon Type, pilih Ask for password. Isi user FTP Anda di USer field:
Klik Hubungkan di bagian bawah antarmuka. Anda akan dimintai kata sandi user:
Klik OK untuk terhubung. Anda sekarang harus terhubung dengan server Anda dengan enkripsi TLS/SSL.
Setelah berhasil, Anda akan diberikan sertifikat server yang terlihat seperti ini:
Saat Anda menerima sertifikat, klik dua kali folder file dan seret upload.txt ke kiri untuk mengonfirmasi bahwa Anda dapat mendownload file:
Setelah Anda selesai melakukannya, klik kanan pada salinan lokal, ganti namanya menjadi upload-tls.txt dan seret kembali ke server untuk mengonfirmasi bahwa Anda dapat mengunggah file:
Anda sekarang telah mengonfirmasi bahwa Anda dapat mentransfer file dengan aman dan berhasil dengan mengaktifkan SSL/TLS.
Langkah 8 — Menonaktifkan Akses Shell (Opsional)
Jika Anda tidak dapat menggunakan TLS karena persyaratan klien, Anda dapat memperoleh keamanan dengan menonaktifkan kemampuan user FTP untuk masuk dengan cara lain. Salah satu cara yang relatif mudah untuk mencegahnya adalah dengan membuat shell khusus. Ini tidak akan memberikan enkripsi apa pun, tetapi akan membatasi akses akun yang disusupi ke file yang dapat diakses oleh FTP.
Pertama, buka file bernama ftponly di direktori bin:
$ sudo nano /bin/ftponly
Tambahkan pesan yang memberi tahu user mengapa mereka tidak dapat masuk:
#!/bin/sh
echo "This account is limited to FTP access only."
Simpan file dan keluar dari editor Anda.
Ubah izin untuk membuat file dapat dieksekusi:
$ sudo chmod a+x /bin/ftponly
Buka daftar shell yang valid:
$ sudo nano /etc/shells
Tambahkan di bagian bawah :
Perbarui shell user dengan perintah berikut:
$ sudo usermod sammy -s /bin/ftponly
Sekarang coba masuk ke server Anda sebagai sammy:
$ ssh sammy@your_server_ip
Anda akan melihat sesuatu seperti:
Output
This account is limited to FTP access only.
Connection to 203.0.113.0 closed.
Ini menegaskan bahwa user tidak dapat lagi melakukan ssh ke server dan dibatasi hanya untuk akses FTP.
Kesimpulan
Dalam tutorial ini kita membahas pengaturan FTP untuk user dengan akun lokal. Jika Anda perlu menggunakan sumber autentikasi eksternal, Anda mungkin ingin melihat dukungan vsftpd untuk user virtual. Ini menawarkan serangkaian opsi yang kaya melalui useran PAM, Pluggable Authentication Modules, dan merupakan pilihan yang baik jika Anda mengelola user di sistem lain seperti LDAP atau Kerberos.