Shell Scripting : SFTP (Secure FTP)

Buat file baru dengan nama sftp.sh
nano sftp.sh
isikan script berikut ini :
#!/bin/bash
# Script SFTP Setup untuk Debian 12
# Hak akses: chmod +x sftp-setup.sh
# Fungsi untuk menampilkan header
show_header() {
echo "================================================"
echo " SFTP SETUP SCRIPT FOR DEBIAN 12"
echo "================================================"
echo
}
# Fungsi untuk memeriksa apakah user www-data ada
check_www_data() {
if ! id "www-data" &>/dev/null; then
echo "❌ ERROR: User www-data tidak ditemukan!"
echo "Ini menunjukkan bahwa webserver mungkin belum terinstall."
echo
read -p "Apakah Anda ingin menginstall webserver (Apache2) sekarang? (y/n): " install_choice
if [[ $install_choice == "y" || $install_choice == "Y" ]]; then
echo "Menginstall Apache2..."
apt update
apt install -y apache2
if [ $? -eq 0 ]; then
echo "✅ Apache2 berhasil diinstall"
else
echo "❌ Gagal menginstall Apache2"
exit 1
fi
else
echo "Silakan install webserver terlebih dahulu sebelum melanjutkan."
echo "Anda dapat menjalankan: apt install apache2"
exit 1
fi
else
echo "✅ User www-data ditemukan"
fi
}
# Fungsi untuk membuat grup SFTP
create_sftp_group() {
echo
echo "--- Membuat Grup SFTP ---"
read -p "Masukkan nama grup SFTP yang ingin dibuat: " sftp_group
# Validasi nama grup
if [[ -z "$sftp_group" ]]; then
echo "❌ Nama grup tidak boleh kosong!"
exit 1
fi
# Cek apakah grup sudah ada
if grep -q "^$sftp_group:" /etc/group; then
echo "⚠️ Grup $sftp_group sudah ada"
else
groupadd $sftp_group
if [ $? -eq 0 ]; then
echo "✅ Grup $sftp_group berhasil dibuat"
else
echo "❌ Gagal membuat grup $sftp_group"
exit 1
fi
fi
# Tambah www-data ke grup SFTP
usermod -a -G $sftp_group www-data
if [ $? -eq 0 ]; then
echo "✅ User www-data berhasil ditambahkan ke grup $sftp_group"
else
echo "❌ Gagal menambahkan www-data ke grup $sftp_group"
exit 1
fi
}
# Fungsi untuk membuat user SFTP
create_sftp_user() {
echo
echo "--- Membuat User SFTP ---"
read -p "Masukkan nama domain (contoh: smktkj.net): " domain_name
# Validasi nama domain
if [[ -z "$domain_name" ]]; then
echo "❌ Nama domain tidak boleh kosong!"
exit 1
fi
read -p "Masukkan username SFTP untuk domain $domain_name: " sftp_username
# Validasi username
if [[ -z "$sftp_username" ]]; then
echo "❌ Username tidak boleh kosong!"
exit 1
fi
# Cek apakah user sudah ada
if id "$sftp_username" &>/dev/null; then
echo "⚠️ User $sftp_username sudah ada"
read -p "Apakah Anda ingin melanjutkan dengan user yang sudah ada? (y/n): " continue_choice
if [[ $continue_choice != "y" && $continue_choice != "Y" ]]; then
exit 1
fi
else
# Buat direktori jika belum ada
mkdir -p /var/www/$domain_name
# Buat user baru
useradd -g www-data -G $sftp_group -d /var/www/$domain_name -s /usr/sbin/nologin $sftp_username
if [ $? -eq 0 ]; then
echo "✅ User $sftp_username berhasil dibuat"
else
echo "❌ Gagal membuat user $sftp_username"
exit 1
fi
fi
# Set password untuk user
echo
echo "--- Mengatur Password ---"
passwd $sftp_username
if [ $? -ne 0 ]; then
echo "❌ Gagal mengatur password untuk $sftp_username"
exit 1
fi
}
# Fungsi untuk mengatur hak akses
setup_permissions() {
echo
echo "--- Mengatur Hak Akses ---"
# Atur hak akses direktori /var/www
chown root:root /var/www
chmod 755 /var/www
# Atur hak akses untuk direktori domain
chown -R $sftp_username:www-data /var/www/$domain_name
chmod -R 755 /var/www/$domain_name
chown -R $sftp_username:www-data /var/www/$domain_name/
chmod -R 755 /var/www/$domain_name/
echo "✅ Hak akses berhasil diatur:"
echo " - /var/www : root:root (755)"
echo " - /var/www/$domain_name : $sftp_username:www-data (755)"
}
# Fungsi untuk konfigurasi SSH
setup_ssh_config() {
echo
echo "--- Konfigurasi SSH ---"
# Backup file sshd_config
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d%H%M%S)
echo "✅ Backup sshd_config dibuat"
# Hapus konfigurasi Match Group yang sudah ada untuk grup ini
sed -i '/Match Group '"$sftp_group"'/,/X11Forwarding no/d' /etc/ssh/sshd_config
# Tambahkan konfigurasi SFTP baru
cat >> /etc/ssh/sshd_config << EOF
# SFTP Configuration for $sftp_group
Match Group $sftp_group
ChrootDirectory /var/www
ForceCommand internal-sftp
PasswordAuthentication yes
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
EOF
echo "✅ Konfigurasi SSH untuk grup $sftp_group berhasil ditambahkan"
# Validasi konfigurasi SSH
echo "Memvalidasi konfigurasi SSH..."
sshd -t
if [ $? -eq 0 ]; then
echo "✅ Konfigurasi SSH valid"
# Restart SSH service
systemctl restart ssh
if [ $? -eq 0 ]; then
echo "✅ SSH service berhasil di-restart"
else
echo "⚠️ Gagal restart SSH service, silakan restart manual: systemctl restart ssh"
fi
else
echo "❌ Konfigurasi SSH tidak valid, memulihkan backup..."
cp /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
echo "✅ Konfigurasi dipulihkan dari backup"
fi
}
# Fungsi untuk menampilkan summary
show_summary() {
echo
echo "================================================"
echo " SETUP SFTP BERHASIL"
echo "================================================"
echo "Grup SFTP : $sftp_group"
echo "Username SFTP : $sftp_username"
echo "Domain : $domain_name"
echo "Direktori Chroot : /var/www/$domain_name"
echo
echo "📍 Informasi Login SFTP:"
echo " Host : $(hostname -I | awk '{print $1}')"
echo " Username : $sftp_username"
echo " Port : 22"
echo " Directory: /$domain_name"
echo
echo "⚠️ Catatan Penting:"
echo " - User hanya dapat mengakses direktori /var/www/$domain_name/"
echo " - Pastikan firewall mengizinkan koneksi SSH (port 22)"
echo " - File konfigurasi SSH backup: /etc/ssh/sshd_config.backup.*"
echo
}
# Main execution
main() {
# Pastikan script dijalankan sebagai root
if [[ $EUID -ne 0 ]]; then
echo "❌ Script ini harus dijalankan sebagai root!"
echo "Gunakan: sudo $0"
exit 1
fi
show_header
# Langkah 1: Periksa www-data
check_www_data
# Langkah 2: Buat grup SFTP
create_sftp_group
# Langkah 3: Buat user SFTP
create_sftp_user
# Langkah 4: Atur hak akses
setup_permissions
# Langkah 5: Konfigurasi SSH
setup_ssh_config
# Tampilkan summary
show_summary
}
# Jalankan main function
main "$@"
Simpan script tersebut. beri hak akses eksekusi
chmod +x sftp.sh
Jika script tidak jalan, jalankan perintah berikut
sed -i 's/\r$//' sftp.sh
jalankan script
./sftp.sh