ShellScripting

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