最后活跃于 1 month ago

arch_hardening_script.sh 原始文件
1#!/usr/bin/env bash
2set -euo pipefail
3
4# =========================
5# Config
6# =========================
7NEW_USER="${1:-dev}"
8SSH_PORT="${2:-22}"
9DISABLE_PASSWORD_LOGIN="${3:-false}"
10PUBKEY="${4:-}" # optional public key
11
12# =========================
13# UI
14# =========================
15
16log(){ echo -e "\033[1;32m[INFO]\033[0m $1"; }
17warn(){ echo -e "\033[1;33m[WARN]\033[0m $1"; }
18err(){ echo -e "\033[1;31m[ERROR]\033[0m $1"; }
19
20confirm(){
21 read -rp "$1 [y/N]: " ans
22 [[ "$ans" == "y" || "$ans" == "Y" ]]
23}
24
25pause(){
26 read -rp "Press Enter to continue..."
27}
28
29# =========================
30# System Detect
31# =========================
32
33detect_os(){
34 if [[ -f /etc/arch-release ]]; then
35 OS="arch"
36 elif grep -qi "debian\|ubuntu" /etc/os-release; then
37 OS="debian"
38 else
39 err "Unsupported OS"
40 exit 1
41 fi
42 log "Detected OS: $OS"
43}
44
45pkg_install(){
46 case "$OS" in
47 arch) pacman -Sy --noconfirm "$@" ;;
48 debian) apt-get update && apt-get install -y "$@" ;;
49 esac
50}
51
52# =========================
53# User
54# =========================
55
56create_user(){
57 if id "$NEW_USER" &>/dev/null; then
58 warn "User exists"
59 else
60 useradd -m -s /bin/bash "$NEW_USER"
61 passwd "$NEW_USER"
62 fi
63 usermod -aG sudo "$NEW_USER" 2>/dev/null || usermod -aG wheel "$NEW_USER"
64}
65
66setup_ssh_key(){
67 mkdir -p /home/$NEW_USER/.ssh
68 chmod 700 /home/$NEW_USER/.ssh
69
70 if [[ -n "$PUBKEY" ]]; then
71 log "Adding provided public key"
72 echo "$PUBKEY" > /home/$NEW_USER/.ssh/authorized_keys
73 else
74 warn "No public key provided, please paste one"
75 read -rp "Paste your SSH public key: " key
76 echo "$key" > /home/$NEW_USER/.ssh/authorized_keys
77 fi
78
79 chmod 600 /home/$NEW_USER/.ssh/authorized_keys
80 chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh
81}
82
83# =========================
84# SSH Hardening
85# =========================
86
87set_ssh(){
88 local key="$1"
89 local val="$2"
90
91 if grep -q "^#\?$key" /etc/ssh/sshd_config; then
92 sed -i "s/^#\?$key.*/$key $val/" /etc/ssh/sshd_config
93 else
94 echo "$key $val" >> /etc/ssh/sshd_config
95 fi
96}
97
98config_ssh(){
99 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%s)
100
101 set_ssh "PermitRootLogin" "no"
102 set_ssh "PubkeyAuthentication" "yes"
103 set_ssh "Port" "$SSH_PORT"
104
105 if [[ "$DISABLE_PASSWORD_LOGIN" == "true" ]]; then
106 warn "Disabling password login"
107 confirm "Are you sure?" && set_ssh "PasswordAuthentication" "no"
108 else
109 set_ssh "PasswordAuthentication" "yes"
110 fi
111}
112
113restart_ssh(){
114 systemctl restart ssh 2>/dev/null || systemctl restart sshd
115}
116
117# =========================
118# Firewall (UFW)
119# =========================
120
121setup_ufw(){
122 log "Setting up UFW firewall"
123
124 pkg_install ufw
125
126 ufw allow "$SSH_PORT"/tcp
127 ufw allow 80/tcp
128 ufw allow 443/tcp
129
130 ufw --force enable
131}
132
133# =========================
134# Fail2ban
135# =========================
136
137setup_fail2ban(){
138 log "Installing fail2ban"
139
140 pkg_install fail2ban
141
142 cat > /etc/fail2ban/jail.local <<EOF
143[sshd]
144enabled = true
145port = $SSH_PORT
146maxretry = 5
147bantime = 1h
148EOF
149
150 systemctl enable fail2ban
151 systemctl restart fail2ban
152}
153
154# =========================
155# Main
156# =========================
157
158main(){
159 if [[ $EUID -ne 0 ]]; then
160 err "Run as root"
161 exit 1
162 fi
163
164 detect_os
165
166 echo "================================="
167 echo "User: $NEW_USER"
168 echo "Port: $SSH_PORT"
169 echo "Disable Password: $DISABLE_PASSWORD_LOGIN"
170 echo "================================="
171
172 confirm "Start?" || exit 0
173
174 pause
175 log "Create user"
176 create_user
177 setup_ssh_key
178
179 pause
180 log "Configure SSH"
181 config_ssh
182
183 pause
184 log "Setup Firewall"
185 setup_ufw
186
187 pause
188 log "Setup Fail2ban"
189 setup_fail2ban
190
191 pause
192 log "Restart SSH"
193 restart_ssh
194
195 echo "================================="
196 log "DONE"
197 echo "Test SSH BEFORE exit!"
198}
199
200main "$@"
201