面向初学者的 Linux 服务器加固指南 🐧

🛡️ 前言

在这个数字化时代,服务器安全成为了至关重要的议题。Linux 系统由于其开放性和灵活性,广泛用于服务器领域。但是,仅仅依赖默认配置往往是不够的。本指南旨在介绍如何加固你的 Linux 服务器,提高其安全性。

🎯 要点

  1. 更新操作系统和软件包
  2. 设置防火墙规则
  3. 最小化安装的软件
  4. 管理用户权限
  5. 配置 SSH 安全选项
  6. 安装安全监控工具

🛠️ 加固步骤

1️⃣ 更新操作系统和软件包

  • 步骤1: 使用以下命令更新系统。

    bash 复制代码
    sudo apt update && sudo apt upgrade
  • 步骤2: 定期检查更新。 建议每周至少检查一次系统更新。

2️⃣ 设置防火墙规则

  • 步骤1: 使用 ufw 来简化防火墙设置。

    bash 复制代码
    sudo apt install ufw
  • 步骤2: 启动并设置基础规则。

    bash 复制代码
    sudo ufw enable
    sudo ufw allow ssh

3️⃣ 最小化安装的软件

  • 步骤1: 使用 dpkgapt 查看已安装的软件包。

    bash 复制代码
    dpkg -l
  • 步骤2: 卸载不必要的软件包。

    bash 复制代码
    sudo apt remove <package-name>

4️⃣ 管理用户权限

  • 步骤1: 创建一个普通用户,并使用 sudo 提供管理员权限。

    bash 复制代码
    sudo adduser <username>
    sudo usermod -aG sudo <username>
  • 步骤2: 禁用 root 登录。

    bash 复制代码
    sudo passwd -l root

5️⃣ 配置 SSH 安全选项

  • 步骤1: 编辑 SSH 配置文件。

    bash 复制代码
    sudo nano /etc/ssh/sshd_config
  • 步骤2: 更改以下几个设置。

    • 禁用 root 登录:PermitRootLogin no
    • 更改默认端口:Port <new-port>
    • 使用密钥认证:PasswordAuthentication no

6️⃣ 安装安全监控工具

  • 步骤1: 安装 Fail2ban。

    bash 复制代码
    sudo apt install fail2ban
  • 步骤2: 启动并配置 Fail2ban。

    bash 复制代码
    sudo 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...

相关推荐
冰水°4 小时前
2.5_XXE(XML外部实体注入)
xml·安全·网络安全·xml外部实体注入·外部实体注入·xml漏洞
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
IPdodo全球网络5 小时前
如何利用静态住宅IP优化Facebook商城的网络稳定性与运营效率
运维·服务器
a1denzzz6 小时前
Linux系统的网络设置
linux·服务器·网络
黑客K-ing7 小时前
网络安全名词解释
开发语言·网络·安全·网络安全·php
无情啦少7 小时前
shodan 【2】(泷羽sec)
安全·web安全·网络安全
zyp2468107 小时前
Linux之DNS服务器
linux·运维·服务器
wdxylb7 小时前
将C++搭建的简单HTTP服务器升级为 HTTPS 服务器
运维·服务器·https
dxzhkj8888888 小时前
智能井盖监测终端的构成与工作流程
安全