🛡️ 前言
在这个数字化时代,服务器安全成为了至关重要的议题。Linux 系统由于其开放性和灵活性,广泛用于服务器领域。但是,仅仅依赖默认配置往往是不够的。本指南旨在介绍如何加固你的 Linux 服务器,提高其安全性。
🎯 要点
- 更新操作系统和软件包
- 设置防火墙规则
- 最小化安装的软件
- 管理用户权限
- 配置 SSH 安全选项
- 安装安全监控工具
🛠️ 加固步骤
1️⃣ 更新操作系统和软件包
-
步骤1: 使用以下命令更新系统。
bashsudo apt update && sudo apt upgrade
-
步骤2: 定期检查更新。 建议每周至少检查一次系统更新。
2️⃣ 设置防火墙规则
-
步骤1: 使用
ufw
来简化防火墙设置。bashsudo apt install ufw
-
步骤2: 启动并设置基础规则。
bashsudo ufw enable sudo ufw allow ssh
3️⃣ 最小化安装的软件
-
步骤1: 使用
dpkg
或apt
查看已安装的软件包。bashdpkg -l
-
步骤2: 卸载不必要的软件包。
bashsudo apt remove <package-name>
4️⃣ 管理用户权限
-
步骤1: 创建一个普通用户,并使用
sudo
提供管理员权限。bashsudo adduser <username> sudo usermod -aG sudo <username>
-
步骤2: 禁用 root 登录。
bashsudo passwd -l root
5️⃣ 配置 SSH 安全选项
-
步骤1: 编辑 SSH 配置文件。
bashsudo nano /etc/ssh/sshd_config
-
步骤2: 更改以下几个设置。
- 禁用 root 登录:
PermitRootLogin no
- 更改默认端口:
Port <new-port>
- 使用密钥认证:
PasswordAuthentication no
- 禁用 root 登录:
6️⃣ 安装安全监控工具
-
步骤1: 安装 Fail2ban。
bashsudo apt install fail2ban
-
步骤2: 启动并配置 Fail2ban。
bashsudo systemctl start fail2ban
这些步骤只是加固 Linux 服务器的基础,随着安全需求的变化,可能需要进一步的配置和审计。接下来,我们编写一个自动执行服务器加固的脚本。
📜 自动化脚本
bash
#!/bin/bash
# 退出脚本,如果任何语句的执行结果是非零
set -e
# 设置 umask 为 077,仅当前用户有权操作新生成的文件
umask 077
# 自定义字段(UDF),用于从用户输入获取参数
# UDF 用于获取 WireGuard IP 地址
# <UDF name="WG_IP" label="该节点的 WireGuard IP 地址" example="CIDR 标记法,例如 192.168.50.2/24" />
# UDF 用于获取 WireGuard 对等节点的公钥
# <UDF name="WG_PEER_PUBLIC_KEY" label="WireGuard 对等体的公钥" example="iupfsx9fgp4erSmjmByPEjAoZPdqNat2Zgq1c5qPwig=" />
# UDF 用于获取 WireGuard 对等节点的允许的 IPs 设置
# <UDF name="WG_PEER_ALLOWED_IPS" label="WireGuard 对等体的允许 IP 设置" example="192.168.50.1/32" />
# UDF 用于获取管理员用户
# <UDF name="ADMIN_USER" label="管理员用户名" default="user" example="这是你登录以管理主机的用户" />
# 更新 apt 包列表并安装必要软件
apt-get update
apt-get upgrade -y
apt-get install -y acl wireguard ufw
# 把 umask 设置加入到系统配置
echo -e "\numask 077" >> /etc/profile
# 创建管理用户,赋予 root 权限
useradd -m -s /bin/bash \
-G users,sudo \
-p $(awk -F: '/^root:/ { print $2 }' /etc/shadow) \
$ADMIN_USER
# 禁用 root 用户 SSH 登录
passwd -l root
cat >/etc/ssh/sshd_config.d/01-disable-root.conf <<EOF
PermitRootLogin no
EOF
# 仅允许 root 用户管理 SSH 密钥
mkdir -p /etc/ssh/authorized_keys
chmod 0711 /etc/ssh/authorized_keys
cat >/etc/ssh/sshd_config.d/02-system-managed-keys.conf <<EOF
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
EOF
# 禁用 SSH 密码登录(如果存在 authorized_keys)
if [ -e "$HOME/.ssh/authorized_keys" ]; then
mv "$HOME/.ssh/authorized_keys" /etc/ssh/authorized_keys/$ADMIN_USER
chown root:root /etc/ssh/authorized_keys/$ADMIN_USER
setfacl -m u:$ADMIN_USER:r /etc/ssh/authorized_keys/$ADMIN_USER
cat >/etc/ssh/sshd_config.d/03-no-passwords.conf <<EOF
PasswordAuthentication no
EOF
fi
# 重新启动 SSH 服务以应用更改
systemctl restart ssh
# 随机生成 WireGuard 的监听端口
WG_PORT=$((($SRANDOM % 55535)+10000))
# 生成 WireGuard 密钥对
mkdir -p /etc/wireguard
wg genkey | tee /etc/wireguard/private_key | wg pubkey > /etc/wireguard/public_key
# 配置 WireGuard 接口
cat >/etc/wireguard/wg0.conf <<EOF
[Interface]
Address = $WG_IP
PrivateKey = $(cat /etc/wireguard/private_key)
ListenPort = $WG_PORT
[Peer]
PublicKey = $WG_PEER_PUBLIC_KEY
AllowedIPs = $WG_PEER_ALLOWED_IPS
EOF
# 启动并使 WireGuard 持久化
systemctl start wg-quick@wg0
systemctl enable wg-quick@wg0
# 将 WireGuard 的连接信息输出至 /etc/issue
cat >>/etc/issue <<EOF
[Peer]
PublicKey = $(cat /etc/wireguard/public_key)
AllowedIPs = $(echo $WG_IP | sed 's#/.*#/32#')
Endpoint = $(hostname -I | awk '{ print $1 }'):$WG_PORT
EOF
# 配置防火墙规则
ufw allow in on eth0 to any port $WG_PORT proto udp
ufw allow in on wg0 to any port 22 proto tcp
ufw enable
GitHub 上还有一些脚本,可以参考:github.com/WeiyiGeek/S...