#!/usr/bin/env bash
set -euo pipefail
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
SSHD="/etc/ssh/sshd_config"
BACKUP="${SSHD}.backup.${TIMESTAMP}"
REVERT_SCRIPT="/root/sshd_config_revert_${TIMESTAMP}.sh"
FALLBACK_USER="recovery"
if [ "$(id -u)" -ne 0 ]; then
echo "Script harus dijalankan sebagai root atau via sudo. Mengulangi dengan sudo..."
exec sudo bash "$0" "$@"
fi
echo "=== Backup konfigurasi SSH ke: $BACKUP ==="
cp -a "$SSHD" "$BACKUP" || { echo "Gagal backup $SSHD"; exit 1; }
# minta password root
while true; do
read -s -p "Masukkan password baru untuk root: " ROOTPW
echo
read -s -p "Konfirmasi password root: " ROOTPW2
echo
[ "$ROOTPW" = "$ROOTPW2" ] && break
echo "Password tidak cocok — coba lagi."
done
# juga buat fallback user untuk mencegah terkunci
if id "$FALLBACK_USER" >/dev/null 2>&1; then
echo "User fallback '$FALLBACK_USER' sudah ada. Tidak akan dibuat ulang."
USE_FALLBACK=false
else
USE_FALLBACK=true
echo "Membuat user fallback: $FALLBACK_USER (dengan password yang sama seperti root)"
fi
# tulis revert script (agar mudah kembali)
cat > "$REVERT_SCRIPT" <> "$file"
fi
}
echo "Mengubah konfigurasi SSH..."
replace_or_add "PermitRootLogin" "yes" "$SSHD"
replace_or_add "PasswordAuthentication" "yes" "$SSHD"
replace_or_add "ChallengeResponseAuthentication" "no" "$SSHD"
# biarkan PubkeyAuthentication tetap ada — supaya key tetap bisa dipakai
replace_or_add "PubkeyAuthentication" "yes" "$SSHD"
# pastikan shell root tidak disable
if passwd -S root 2>/dev/null | grep -q "L"; then
passwd -u root || true
fi
# set password root
echo "root:${ROOTPW}" | chpasswd
echo "Password root di-set."
# buat fallback user (jika perlu) dan tambahkan ke sudo
if [ "$USE_FALLBACK" = true ]; then
useradd -m -s /bin/bash "$FALLBACK_USER" || true
echo "${FALLBACK_USER}:${ROOTPW}" | chpasswd
# tambahkan ke sudoers jika ada grup sudo/wheel
if getent group sudo >/dev/null 2>&1; then
usermod -aG sudo "$FALLBACK_USER" || true
elif getent group wheel >/dev/null 2>&1; then
usermod -aG wheel "$FALLBACK_USER" || true
else
echo "Tidak menemukan grup sudo/wheel; fallback user mungkin tidak punya sudo."
fi
echo "Fallback user '${FALLBACK_USER}' dibuat dengan password yang sama seperti root."
echo "Login test: ssh ${FALLBACK_USER}@"
fi
# restart ssh dengan deteksi systemctl/service
echo "Mere-start layanan SSH..."
if command -v systemctl >/dev/null 2>&1; then
systemctl restart ssh || systemctl restart sshd || true
else
service ssh restart || service sshd restart || true
fi
echo
echo "Selesai. Sekarang kamu seharusnya bisa login sebagai root via:"
echo " ssh root@IP-VPS"
echo
echo "Catatan penting:"
echo " - Jangan tutup sesi SSH yang sedang aktif sampai kamu berhasil login root di sesi baru."
echo " - Jika terjadi masalah, jalankan revert: sudo $REVERT_SCRIPT"
echo " - Setelah berhasil, pertimbangkan untuk menonaktifkan Login root via password untuk keamanan:"
echo " sudo sed -ri 's|^PermitRootLogin.*|PermitRootLogin prohibit-password|' $SSHD && sudo systemctl restart ssh || sudo service ssh restart"