Linux 系统安全加固完全指南:从基础到进阶实践

Linux 凭借其稳定性、开源性和灵活性,广泛应用于服务器、嵌入式设备乃至关键基础设施中。然而,默认安装的 Linux 系统并非为高安全性场景设计——它们通常优先考虑易用性和兼容性,这意味着存在诸多潜在安全风险(如开放不必要的端口、弱密码策略、缺乏访问控制等)。系统安全加固(Hardening)的核心目标是通过减少攻击面、强化配置和实施防御措施,提升系统抵抗恶意攻击的能力。

本文将从用户账户、文件权限、网络防护、内核安全等多个维度,详细介绍 Linux 系统安全加固的核心实践、最佳方法及具体操作示例,帮助读者构建一个“坚不可摧”的 Linux 环境。

目录#

  1. 用户账户安全:从源头控制访问权限
  2. 文件系统权限控制:最小权限原则实践
  3. 服务与进程管理:关闭“后门”服务
  4. 网络安全防护:构建网络层面的“防火墙”
  5. 内核安全强化:从底层抵御攻击
  6. 日志与监控:构建安全“监控网”
  7. 漏洞管理:及时修补“安全漏洞”
  8. 物理安全:防御“最后一道防线”
  9. 安全加固最佳实践总结
  10. 参考资料

1. 用户账户安全:从源头控制访问权限#

用户账户是攻击者入侵系统的“第一道门”。加固账户安全的核心是确保只有授权用户能访问系统,且权限严格受控。

1.1 密码策略强化#

常见问题:默认配置下,Linux 对密码复杂度(长度、字符类型)、有效期无强制要求,易导致弱密码风险。
加固目标:强制使用复杂密码,定期更换,并防止重复使用旧密码。

实践步骤:#

通过 PAM(Pluggable Authentication Modules,可插拔认证模块)配置密码策略,编辑 /etc/pam.d/common-password(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS):

# 安装密码复杂度检查模块(Debian/Ubuntu)
sudo apt install libpam-cracklib
 
# 编辑 PAM 配置文件
sudo vim /etc/pam.d/common-password

添加以下规则(配置密码长度至少 10 位,包含大小写字母、数字和特殊字符,拒绝最近 5 次使用过的密码):

# 密码复杂度检查(最小长度 10,至少 1 个大写、1 个小写、1 个数字、1 个特殊字符)
password    requisite     pam_cracklib.so minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
# 拒绝重复使用最近 5 个密码
password    sufficient    pam_unix.so sha512 shadow remember=5

同时,编辑 /etc/login.defs 设置密码有效期:

PASS_MAX_DAYS   90   # 密码最长使用天数
PASS_MIN_DAYS   7    # 密码修改间隔天数
PASS_WARN_AGE   14   # 密码过期前 14 天提醒

1.2 禁用 root 直接登录#

常见问题:直接使用 root 账户登录会放大安全风险(一旦密码泄露,攻击者将获得系统最高权限)。
最佳实践:禁用 root 直接登录,通过普通用户 + sudo 提权操作。

实践步骤:#

  1. 先创建一个具备 sudo 权限的普通用户(如 admin):

    sudo useradd -m admin  # 创建用户并生成家目录
    sudo passwd admin      # 设置密码
    sudo usermod -aG sudo admin  # 添加到 sudo 组
  2. 编辑 SSH 配置文件 /etc/ssh/sshd_config,禁用 root 登录:

    PermitRootLogin no  # 禁止 root 直接登录
    AllowUsers admin    # 仅允许 admin 用户登录(可选,进一步限制登录用户)
  3. 重启 SSH 服务使配置生效:

    # Debian/Ubuntu
    sudo systemctl restart sshd
    # RHEL/CentOS
    sudo systemctl restart sshd

1.3 SSH 密钥认证替代密码登录#

常见问题:密码登录易遭受暴力破解(攻击者通过自动化工具尝试大量密码组合)。
最佳实践:使用 SSH 密钥对认证——私钥存储在客户端,公钥存于服务器,安全性远高于密码。

实践步骤:#

  1. 客户端生成密钥对(以 Linux/macOS 为例):

    ssh-keygen -t ed25519 -C "[email protected]"  # 生成 ED25519 算法密钥(比 RSA 更安全)
    # 按提示输入密钥存储路径(默认 ~/.ssh/id_ed25519)和密码(可选,增强私钥安全性)
  2. 上传公钥到服务器:

    ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@your_server_ip
  3. 服务器端禁用密码登录: 编辑 /etc/ssh/sshd_config:

    PasswordAuthentication no      # 禁用密码登录
    PubkeyAuthentication yes       # 启用密钥认证
    AuthorizedKeysFile .ssh/authorized_keys  # 指定公钥文件路径

    重启 SSH 服务:sudo systemctl restart sshd。

1.4 sudo 权限精细化管理#

常见问题:sudo 权限配置不当(如允许普通用户执行所有命令 ALL=(ALL:ALL) ALL)可能导致权限滥用。
最佳实践:遵循“最小权限原则”,仅授予用户完成工作所需的最小 sudo 权限。

实践步骤:#

编辑 sudoers 文件(必须使用 visudo 命令,避免语法错误导致无法提权):

sudo visudo

示例:允许用户 admin 仅执行 /usr/bin/apt 和 /usr/bin/systemctl 命令(无需输入密码):

admin  ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/systemctl

安全提示:避免使用 NOPASSWD(除非必要),并通过 sudo -l 检查用户实际拥有的 sudo 权限。

1.5 账户锁定与防暴力破解#

常见问题:攻击者可能通过暴力破解工具(如 Hydra)尝试猜测用户密码。
最佳实践:配置账户锁定机制,当连续登录失败次数达到阈值时自动锁定账户。

实践步骤:#

通过 PAM 的 pam_faillock 模块实现账户锁定,编辑 /etc/pam.d/common-auth:

sudo vim /etc/pam.d/common-auth

添加以下规则(连续 5 次失败登录后锁定账户 10 分钟):

# 账户锁定配置
auth    required    pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth    [success=1 default=ignore]    pam_unix.so
auth    [default=die]    pam_faillock.so authfail audit deny=5 unlock_time=600

查看锁定状态或手动解锁账户:

# 查看用户锁定状态
faillock --user admin
# 手动解锁用户
faillock --user admin --reset

2. 文件系统权限控制:最小权限原则实践#

文件系统权限是 Linux 安全的基础——每个文件/目录仅授予必要的访问权限,可有效防止非授权读写或执行。

2.1 关键文件/目录权限加固#

常见风险: /etc/passwd(用户信息)、/etc/shadow(密码哈希)、/etc/sudoers(sudo 权限)等关键文件若权限过松(如全局可写),可能被篡改。

实践步骤:#

检查并修复关键文件权限:

# /etc/passwd:仅 root 可写,其他用户只读
sudo chmod 644 /etc/passwd
sudo chown root:root /etc/passwd
 
# /etc/shadow:仅 root 可读可写(普通用户不可访问)
sudo chmod 000 /etc/shadow  # 或 600,确保无其他用户权限
sudo chown root:root /etc/shadow
 
# /etc/sudoers:仅 root 可写,其他用户只读
sudo chmod 440 /etc/sudoers
sudo chown root:root /etc/sudoers

进阶操作:使用 chattr 设置文件为“不可修改”(即使 root 也需解锁才能修改):

sudo chattr +i /etc/passwd /etc/shadow  # 添加不可修改属性
sudo chattr -i /etc/passwd /etc/shadow  # 移除不可修改属性(需修改时)

2.2 设置合理的 umask 值#

umask 决定新建文件/目录的默认权限(默认值通常为 002 或 022,可能导致权限过松)。
加固目标:限制默认权限,例如禁止其他用户访问新创建的文件。

实践步骤:#

编辑全局 umask 配置(/etc/profile 或 /etc/bash.bashrc):

sudo vim /etc/profile

添加以下行(设置 umask 为 077,即新建文件权限 600,目录权限 700):

umask 077

注意:对服务进程(如 Apache、Nginx)需单独调整 umask,避免权限不足导致服务异常。

2.3 禁用不必要的 SUID/SGID 文件#

SUID/SGID 文件:允许用户以文件所有者(通常是 root)的权限执行程序,若被滥用可能提权。
加固目标:清理非必要的 SUID/SGID 文件。

实践步骤:#

查找系统中的 SUID/SGID 文件并审查:

# 查找 SUID 文件
find / -perm -4000 -ls 2>/dev/null
# 查找 SGID 文件
find / -perm -2000 -ls 2>/dev/null

安全操作:对非必要的 SUID/SGID 文件(如 ping 以外的工具),移除其 SUID/SGID 权限:

sudo chmod u-s /path/to/unnecessary-suid-file  # 移除 SUID
sudo chmod g-s /path/to/unnecessary-sgid-file  # 移除 SGID

3. 服务与进程管理:关闭“后门”服务#

默认安装的 Linux 系统可能运行大量不必要的服务(如 cups 打印服务、telnet 等),这些服务会增加攻击面(如存在未修复漏洞)。

3.1 识别并禁用无用服务#

实践步骤:#

  1. 列出所有运行中的服务:

    # systemd 系统(主流 Linux 发行版)
    sudo systemctl list-unit-files --type=service --state=enabled
    # 查看监听端口的服务(结合 netstat/ss)
    sudo ss -tulpn
  2. 禁用不必要的服务(以 cups 为例):

    sudo systemctl stop cups          # 停止服务
    sudo systemctl disable cups       # 禁止开机自启
    sudo systemctl mask cups          # 彻底屏蔽服务(防止被意外启动)

常见需禁用的服务:cups(打印服务)、telnet(明文传输,用 SSH 替代)、rsh(远程 shell,不安全)、avahi-daemon(本地网络发现,服务器端非必需)。

3.2 限制服务运行权限#

常见风险:服务默认以 root 权限运行(如早期 Apache),若服务被入侵,攻击者可直接获取 root 权限。
最佳实践:为服务创建专用低权限用户,并以该用户身份运行服务。

实践步骤:#

以 Nginx 为例,修改服务配置文件 /etc/systemd/system/nginx.service:

[Service]
User=nginx          # 运行用户
Group=nginx         # 运行组
PrivateTmp=true     # 为服务分配独立临时目录(隔离性)
NoNewPrivileges=yes # 禁止服务通过 SUID 等方式提权

重启服务使配置生效:

sudo systemctl daemon-reload
sudo systemctl restart nginx

4. 网络安全防护:构建网络层面的“防火墙”#

网络是攻击者入侵的主要途径,需通过防火墙、端口限制等措施控制网络流量,仅允许必要的连接。

4.1 配置防火墙(UFW/iptables)#

防火墙是网络安全的第一道防线,用于过滤进出系统的网络流量。推荐使用 ufw(简单)或 iptables(灵活)。

UFW(Uncomplicated Firewall,适合新手):#

# 安装 UFW(Debian/Ubuntu 默认已安装)
sudo apt install ufw
 
# 默认策略:拒绝所有入站流量,允许所有出站流量
sudo ufw default deny incoming
sudo ufw default allow outgoing
 
# 允许必要端口(如 SSH 22 端口、HTTP 80 端口)
sudo ufw allow 22/tcp comment "允许 SSH 访问"
sudo ufw allow 80/tcp comment "允许 HTTP 访问"
 
# 启用防火墙(生产环境前务必确保允许 SSH 端口,避免断连!)
sudo ufw enable
# 查看规则
sudo ufw status numbered

iptables(适合高级用户,功能更强大):#

示例:仅允许 SSH(22)、HTTP(80)、HTTPS(443)入站流量,拒绝其他所有连接:

# 清空现有规则
sudo iptables -F
# 默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH/HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 保存规则(Debian/Ubuntu)
sudo iptables-save > /etc/iptables/rules.v4

4.2 SSH 服务深度安全加固#

SSH 是远程管理的主要工具,其安全性至关重要。除了禁用密码登录(1.3 节),还需进一步加固:

编辑 /etc/ssh/sshd_config:

sudo vim /etc/ssh/sshd_config

关键配置项(建议修改):

Port 2222                # 修改默认 SSH 端口(减少扫描风险)
Protocol 2               # 仅使用 SSH v2(v1 存在安全漏洞)
LoginGraceTime 30        # 登录超时时间(30 秒无操作断开)
MaxAuthTries 3           # 最大认证尝试次数(防止暴力破解)
AllowUsers admin         # 仅允许指定用户登录(白名单)
DenyUsers root           # 明确拒绝 root 登录
PermitEmptyPasswords no  # 禁止空密码登录
X11Forwarding no         # 禁用 X11 转发(减少攻击面)
Banner /etc/ssh/banner   # 配置登录警告横幅(法律提示)

创建登录警告横幅 /etc/ssh/banner:

警告:未经授权访问本系统将被依法追究法律责任!

重启 SSH 服务:

sudo systemctl restart sshd

4.3 禁用不必要的网络协议与端口#

常见风险:IPv6、ICMP(ping)等协议可能被用于网络探测或攻击(如 IPv6 配置不当导致绕过防火墙)。

实践步骤:#

  1. 禁用 IPv6(若无需使用): 编辑 /etc/sysctl.conf 添加:

    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1

    加载配置:sudo sysctl -p。

  2. 限制 ICMP 响应(防止 ping 扫描): 通过 iptables 禁止 ICMP echo 请求:

    sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

5. 内核安全强化:从底层抵御攻击#

内核是 Linux 系统的核心,通过优化内核参数、启用访问控制机制,可大幅提升系统对漏洞利用的抵抗能力。

5.1 sysctl 参数优化#

sysctl 用于动态调整内核参数,通过修改 /etc/sysctl.conf 可加固网络栈、内存保护等功能。

关键 sysctl 配置(编辑 /etc/sysctl.conf):#

# 网络安全
net.ipv4.conf.all.rp_filter = 1          # 启用反向路径过滤(防 IP 欺骗)
net.ipv4.tcp_syncookies = 1              # 启用 SYN Cookie(防 SYN 洪水攻击)
net.ipv4.tcp_max_syn_backlog = 2048      # 增加 SYN 队列长度
net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略广播 ICMP(防 Smurf 攻击)
 
# 内存保护
kernel.randomize_va_space = 2            # 启用地址空间随机化(ASLR,防缓冲区溢出)
vm.mmap_min_addr = 65536                 # 限制低地址内存映射(防 NULL 指针解引用攻击)
 
# 转发与源路由
net.ipv4.ip_forward = 0                  # 禁用 IP 转发(非路由器无需开启)
net.ipv4.conf.all.accept_source_route = 0 # 禁止源路由(防 IP 欺骗)

加载配置:

sudo sysctl -p

5.2 启用强制访问控制(AppArmor/SELinux)#

强制访问控制(MAC) 是一种比传统 DAC(自主访问控制)更严格的安全机制,通过预定义策略限制进程的行为(如禁止 Web 服务读写 /etc/shadow)。

AppArmor(Debian/Ubuntu 默认启用,配置简单):#

  1. 查看 AppArmor 状态:

    sudo aa-status
  2. 启用预定义配置文件(如 Apache):

    sudo aa-enforce /etc/apparmor.d/usr.sbin.apache2
  3. 创建自定义配置文件(以限制 /usr/bin/wget 仅访问 /tmp 目录为例):

    sudo aa-genprof /usr/bin/wget  # 生成基础配置文件
    sudo vim /etc/apparmor.d/usr.bin.wget  # 编辑规则(添加 `/{,**} rw` 允许读写 /tmp)
    sudo apparmor_parser -r /etc/apparmor.d/usr.bin.wget  # 重新加载配置

SELinux(RHEL/CentOS 默认启用,功能强大但复杂):#

SELinux 有三种模式:Enforcing(强制)、Permissive(日志模式)、Disabled(禁用)。推荐设为 Enforcing:

# 查看 SELinux 状态
sestatus
# 设置为 Enforcing 模式(需重启)
sudo setenforce 1  # 临时生效
sudo vim /etc/selinux/config  # 永久生效:SELINUX=enforcing

注意:SELinux 策略复杂,建议先在 Permissive 模式下测试,通过 /var/log/audit/audit.log 排查权限问题。

6. 日志与监控:构建安全“监控网”#

日志是事后追溯攻击的关键依据,监控则能实时发现异常行为,二者结合可及时响应安全事件。

6.1 日志收集与集中管理#

常见问题:默认日志分散存储(如 /var/log/syslog、/var/log/auth.log),且可能被攻击者篡改。
最佳实践:集中收集日志(如发送至远程日志服务器),并配置日志轮转防止磁盘占满。

配置 rsyslog 发送日志到远程服务器:#

编辑 /etc/rsyslog.conf,添加远程服务器地址:

*.* @logserver.example.com:514  # UDP 协议(简单)
# 或使用 TCP(更可靠):*.* @@logserver.example.com:514

重启 rsyslog:

sudo systemctl restart rsyslog

日志轮转(编辑 /etc/logrotate.conf):#

# 日志保留 4 周,每周轮转一次,压缩旧日志
weekly
rotate 4
compress
delaycompress

6.2 文件完整性监控(FIM)#

FIM 工具用于检测关键文件是否被篡改(如 /etc/passwd、/bin/bash),常用工具包括 auditd(内置)、AIDE 等。

auditd(Linux 审计系统):#

  1. 安装并启动 auditd:

    sudo apt install auditd
    sudo systemctl start auditd
  2. 添加监控规则(监控 /etc/passwd 的修改):

    sudo auditctl -w /etc/passwd -p wa -k passwd_change  # -w:监控路径;-p wa:写/属性修改;-k:关键词
  3. 查看审计日志:

    sudo ausearch -k passwd_change  # 按关键词搜索

6.3 防暴力破解工具:fail2ban#

fail2ban 通过监控日志(如 SSH 登录日志),自动封禁多次失败登录的 IP,有效防御暴力破解。

安装与配置 fail2ban:#

# 安装
sudo apt install fail2ban
 
# 复制默认配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
 
# 编辑配置(/etc/fail2ban/jail.local)
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5          # 5 次失败登录
bantime = 3600        # 封禁 1 小时(秒)
ignoreip = 192.168.1.0/24  # 白名单 IP(如本地网段)

重启 fail2ban:

sudo systemctl restart fail2ban

查看封禁状态:

sudo fail2ban-client status sshd

7. 漏洞管理:及时修补“安全漏洞”#

系统漏洞是攻击者入侵的主要利用途径,需通过定期更新、漏洞扫描确保系统无已知高危漏洞。

7.1 定期系统更新与补丁管理#

更新是修复漏洞的最直接方式,需建立自动化更新机制(但生产环境需测试后再更新)。

Debian/Ubuntu:#

# 安装安全更新工具
sudo apt install unattended-upgrades
 
# 配置自动更新(编辑 /etc/apt/apt.conf.d/50unattended-upgrades)
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";  # 仅更新安全补丁
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";  # 自动修复中断的包安装
 
# 启用自动更新
sudo dpkg-reconfigure -plow unattended-upgrades

RHEL/CentOS:#

# 安装安全更新插件
sudo yum install yum-plugin-security
 
# 仅安装安全更新
sudo yum update --security

7.2 漏洞扫描与风险评估#

通过漏洞扫描工具可主动发现系统中存在的漏洞(如未修复的 CVE 漏洞)。

常用工具:#

  • OpenVAS:开源漏洞扫描器,支持全面的漏洞检测。
  • lynis:轻量级系统审计工具,适合快速检查配置问题。
  • CIS-CAT:基于 CIS 基准的合规性扫描工具。

lynis 示例:#

# 安装 lynis
sudo apt install lynis
 
# 执行系统审计
sudo lynis audit system

审计报告将列出高风险项(如“[!] 未启用 AppArmor”),可按提示逐一加固。

8. 物理安全:防御“最后一道防线”#

若攻击者能物理接触服务器,软件层面的防护可能失效,需通过磁盘加密、启动保护等措施防止物理入侵。

8.1 磁盘加密(LUKS)#

磁盘加密可防止攻击者通过拆卸硬盘获取数据,推荐使用 LUKS(Linux Unified Key Setup)。

加密现有分区(以 /dev/sdb1 为例):#

# 安装 cryptsetup
sudo apt install cryptsetup
 
# 初始化 LUKS 加密(会格式化分区,需备份数据!)
sudo cryptsetup luksFormat /dev/sdb1
 
# 打开加密分区(映射为 /dev/mapper/encrypted_disk)
sudo cryptsetup open /dev/sdb1 encrypted_disk
 
# 格式化加密分区
sudo mkfs.ext4 /dev/mapper/encrypted_disk
 
# 挂载使用
sudo mount /dev/mapper/encrypted_disk /mnt/encrypted

自动挂载:编辑 /etc/crypttab 和 /etc/fstab(需输入加密密码,或配置密钥文件)。

8.2 启动过程安全加固#

启动过程若被篡改(如替换内核),整个系统安全将失效,需加固 BIOS、GRUB 等环节。

1. BIOS/UEFI 密码:#

进入 BIOS 设置,设置管理员密码,禁用 USB/CD-ROM 启动(防止通过 live CD 入侵)。

2. GRUB 密码保护:#

防止攻击者通过 GRUB 修改启动参数(如添加 single 进入单用户模式)。

# 生成 GRUB 密码哈希
sudo grub-mkpasswd-pbkdf2  # 按提示输入密码,复制生成的哈希
 
# 编辑 GRUB 配置(/etc/grub.d/40_custom)
cat << EOF
set superusers="grubadmin"
password_pbkdf2 grubadmin 哈希值  # 粘贴上述哈希
EOF
 
# 更新 GRUB
sudo update-grub

9. 安全加固最佳实践总结#

安全加固是一个持续过程,需遵循以下原则:

  1. 纵深防御:多层防护(如防火墙 + 密码策略 + 日志监控),即使一层被突破,其他层仍能防御。
  2. 最小权限:用户、服务、进程仅授予必要权限,减少攻击影响范围。
  3. 定期审计:通过 lynis、auditd 等工具定期检查配置是否被篡改,漏洞是否修复。
  4. 自动化:使用 Ansible、SaltStack 等工具自动化加固流程(如统一配置 sshd_config、sysctl 参数)。
  5. 文档化:记录所有加固操作,便于追溯和复现。

10. 参考资料#