Utoljára aktív 1788253041

Debian Post Installation

debian-post-install.sh Eredeti
1#!/bin/bash
2#
3# debian-post-install.sh
4#
5# Bootstrap Debian fresh install:
6# - sudo + add user to sudo group
7# - vnStat
8# - Vim
9# - sync global .bashrc / shell prompt / Fastfetch config
10# - UFW firewall
11# - Fail2ban for SSH
12#
13# Jalankan sebagai root setelah:
14# su -
15#
16# Contoh:
17# chmod +x bootstrap-debian.sh
18# ./debian-post-install.sh
19#
20# Aman dijalankan ulang (idempotent).
21
22set -Eeuo pipefail
23
24# ---------------------------------------------------------------------------
25# Configuration
26# ---------------------------------------------------------------------------
27
28ADMIN_USER="${ADMIN_USER:-darto}"
29
30SYNC_BASHRC_URL="https://gist.darto.id/dartokloning/82f93f1f0a294d55bd5f1a0abcb7f63f/download/HEAD/sync-bashrc-all.sh"
31SYNC_BASHRC_FILE="/usr/local/sbin/sync-bashrc-all.sh"
32
33FAIL2BAN_JAIL="/etc/fail2ban/jail.d/sshd.local"
34
35# Port web yang biasa dibuka.
36ALLOW_HTTP="${ALLOW_HTTP:-yes}"
37ALLOW_HTTPS="${ALLOW_HTTPS:-yes}"
38
39# ---------------------------------------------------------------------------
40# Helpers
41# ---------------------------------------------------------------------------
42
43log() {
44 printf '\n== %s ==\n' "$*"
45}
46
47ok() {
48 printf ' -> %s\n' "$*"
49}
50
51die() {
52 printf 'ERROR: %s\n' "$*" >&2
53 exit 1
54}
55
56if [[ "$(id -u)" -ne 0 ]]; then
57 die "Jalankan script ini sebagai root. Gunakan: su -"
58fi
59
60if [[ ! -r /etc/os-release ]]; then
61 die "/etc/os-release tidak ditemukan."
62fi
63
64. /etc/os-release
65
66if [[ "${ID:-}" != "debian" ]]; then
67 die "Script ini khusus Debian. Sistem terdeteksi: ${PRETTY_NAME:-unknown}"
68fi
69
70if ! id "$ADMIN_USER" >/dev/null 2>&1; then
71 die "User '$ADMIN_USER' tidak ditemukan."
72fi
73
74export DEBIAN_FRONTEND=noninteractive
75
76# ---------------------------------------------------------------------------
77# 1. Update + packages
78# ---------------------------------------------------------------------------
79
80log "1. Update repository dan install paket dasar"
81
82apt-get update
83
84apt-get install -y \
85 sudo \
86 curl \
87 ca-certificates \
88 vnstat \
89 vim \
90 vim-common \
91 ufw \
92 fail2ban
93
94ok "Paket dasar sudah terinstall."
95
96# ---------------------------------------------------------------------------
97# 2. Sudo access
98# ---------------------------------------------------------------------------
99
100log "2. Pastikan $ADMIN_USER masuk group sudo"
101
102if id -nG "$ADMIN_USER" | tr ' ' '\n' | grep -qx sudo; then
103 ok "$ADMIN_USER sudah menjadi anggota group sudo."
104else
105 usermod -aG sudo "$ADMIN_USER"
106 ok "$ADMIN_USER ditambahkan ke group sudo."
107fi
108
109printf ' -> Group %s: %s\n' "$ADMIN_USER" "$(id -nG "$ADMIN_USER")"
110
111# ---------------------------------------------------------------------------
112# 3. vnStat
113# ---------------------------------------------------------------------------
114
115log "3. Aktifkan vnStat"
116
117systemctl enable --now vnstat
118systemctl is-active --quiet vnstat \
119 && ok "vnstat aktif." \
120 || die "vnstat gagal aktif."
121
122# ---------------------------------------------------------------------------
123# 4. Vim
124# ---------------------------------------------------------------------------
125
126log "4. Verifikasi Vim"
127
128if command -v vim >/dev/null 2>&1; then
129 ok "Vim tersedia: $(vim --version | head -n1)"
130else
131 die "Vim tidak ditemukan setelah instalasi."
132fi
133
134# ---------------------------------------------------------------------------
135# 5. Sync .bashrc / prompt / Fastfetch
136# ---------------------------------------------------------------------------
137
138log "5. Download dan jalankan sync-bashrc-all.sh"
139
140tmp_sync="$(mktemp)"
141trap 'rm -f "$tmp_sync"' EXIT
142
143curl -fL --silent --show-error "$SYNC_BASHRC_URL" -o "$tmp_sync"
144
145if [[ ! -s "$tmp_sync" ]]; then
146 die "sync-bashrc-all.sh hasil download kosong."
147fi
148
149install -o root -g root -m 0755 "$tmp_sync" "$SYNC_BASHRC_FILE"
150
151ok "sync-bashrc-all.sh disimpan di $SYNC_BASHRC_FILE"
152
153"$SYNC_BASHRC_FILE"
154
155ok "Konfigurasi Bash/Fastfetch selesai disinkronkan."
156
157# ---------------------------------------------------------------------------
158# 6. Detect SSH port
159# ---------------------------------------------------------------------------
160
161log "6. Deteksi port SSH"
162
163SSH_PORT="22"
164
165if command -v sshd >/dev/null 2>&1; then
166 detected_port="$(sshd -T 2>/dev/null | awk '$1=="port" {print $2; exit}' || true)"
167 if [[ "$detected_port" =~ ^[0-9]+$ ]]; then
168 SSH_PORT="$detected_port"
169 fi
170fi
171
172ok "Port SSH terdeteksi: $SSH_PORT/tcp"
173
174# ---------------------------------------------------------------------------
175# 7. UFW
176# ---------------------------------------------------------------------------
177
178log "7. Konfigurasi UFW"
179
180# Jangan reset UFW agar rule custom yang mungkin sudah ada tidak hilang.
181ufw allow "${SSH_PORT}/tcp" comment 'SSH'
182
183if [[ "$ALLOW_HTTP" == "yes" ]]; then
184 ufw allow 80/tcp comment 'HTTP'
185fi
186
187if [[ "$ALLOW_HTTPS" == "yes" ]]; then
188 ufw allow 443/tcp comment 'HTTPS'
189fi
190
191# ufw --force enable aman untuk noninteractive.
192ufw --force enable
193systemctl enable --now ufw
194
195ok "UFW aktif."
196
197ufw status verbose
198
199# ---------------------------------------------------------------------------
200# 8. Fail2ban
201# ---------------------------------------------------------------------------
202
203log "8. Konfigurasi Fail2ban"
204
205mkdir -p /etc/fail2ban/jail.d
206
207cat > "$FAIL2BAN_JAIL" <<EOF
208[sshd]
209enabled = true
210backend = systemd
211port = ${SSH_PORT}
212bantime = 4w
213maxretry = 2
214banaction = ufw
215EOF
216
217chmod 0644 "$FAIL2BAN_JAIL"
218
219ok "Konfigurasi dibuat: $FAIL2BAN_JAIL"
220
221# Validasi konfigurasi sebelum restart.
222if ! fail2ban-client -t; then
223 die "Validasi konfigurasi Fail2ban gagal."
224fi
225
226systemctl enable --now fail2ban
227systemctl restart fail2ban
228
229sleep 1
230
231systemctl is-active --quiet fail2ban \
232 && ok "Fail2ban aktif." \
233 || die "Fail2ban gagal aktif."
234
235# ---------------------------------------------------------------------------
236# 9. Summary
237# ---------------------------------------------------------------------------
238
239log "9. Ringkasan"
240
241printf 'User admin : %s\n' "$ADMIN_USER"
242printf 'Group : %s\n' "$(id -nG "$ADMIN_USER")"
243printf 'SSH port : %s/tcp\n' "$SSH_PORT"
244printf 'vnStat : %s\n' "$(systemctl is-active vnstat || true)"
245printf 'UFW : %s\n' "$(systemctl is-active ufw || true)"
246printf 'Fail2ban : %s\n' "$(systemctl is-active fail2ban || true)"
247printf 'Fail2ban jail : %s\n' "$FAIL2BAN_JAIL"
248printf 'Bash sync : %s\n' "$SYNC_BASHRC_FILE"
249
250echo
251echo "Fail2ban SSH jail:"
252fail2ban-client status sshd 2>/dev/null || true
253
254echo
255echo "============================================================"
256echo "BOOTSTRAP DEBIAN SELESAI"
257echo "============================================================"
258echo
259echo "PENTING:"
260echo "User '$ADMIN_USER' baru memperoleh group sudo pada login session berikutnya."
261echo "Disconnect SSH lalu login kembali sebagai '$ADMIN_USER'."
262echo
263echo "Setelah login ulang, cek:"
264echo " sudo -v"
265echo " groups"
266echo " fastfetch --config /etc/fastfetch/config.jsonc"
267echo " sudo ufw status verbose"
268echo " sudo fail2ban-client status sshd"
269echo
270