Linux 系统安全加固完全指南:从基础到进阶实践
Linux 凭借其稳定性、开源性和灵活性,广泛应用于服务器、嵌入式设备乃至关键基础设施中。然而,默认安装的 Linux 系统并非为高安全性场景设计——它们通常优先考虑易用性和兼容性,这意味着存在诸多潜在安全风险(如开放不必要的端口、弱密码策略、缺乏访问控制等)。系统安全加固(Hardening)的核心目标是通过减少攻击面、强化配置和实施防御措施,提升系统抵抗恶意攻击的能力。
本文将从用户账户、文件权限、网络防护、内核安全等多个维度,详细介绍 Linux 系统安全加固的核心实践、最佳方法及具体操作示例,帮助读者构建一个“坚不可摧”的 Linux 环境。
目录#
- 用户账户安全:从源头控制访问权限
- 1.1 密码策略强化
- 1.2 禁用 root 直接登录
- 1.3 SSH 密钥认证替代密码登录
- 1.4 sudo 权限精细化管理
- 1.5 账户锁定与防暴力破解
- 文件系统权限控制:最小权限原则实践
- 2.1 关键文件/目录权限加固
- 2.2 设置合理的 umask 值
- 2.3 禁用不必要的 SUID/SGID 文件
- 服务与进程管理:关闭“后门”服务
- 网络安全防护:构建网络层面的“防火墙”
- 4.1 配置防火墙(UFW/iptables)
- 4.2 SSH 服务深度安全加固
- 4.3 禁用不必要的网络协议与端口
- 内核安全强化:从底层抵御攻击
- 日志与监控:构建安全“监控网”
- 6.1 日志收集与集中管理
- 6.2 文件完整性监控(FIM)
- 6.3 防暴力破解工具:fail2ban
- 漏洞管理:及时修补“安全漏洞”
- 7.1 定期系统更新与补丁管理
- 7.2 漏洞扫描与风险评估
- 物理安全:防御“最后一道防线”
- 8.1 磁盘加密(LUKS)
- 8.2 启动过程安全加固
- 安全加固最佳实践总结
- 参考资料
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 提权操作。
实践步骤:#
-
先创建一个具备 sudo 权限的普通用户(如
admin):sudo useradd -m admin # 创建用户并生成家目录 sudo passwd admin # 设置密码 sudo usermod -aG sudo admin # 添加到 sudo 组 -
编辑 SSH 配置文件
/etc/ssh/sshd_config,禁用 root 登录:PermitRootLogin no # 禁止 root 直接登录 AllowUsers admin # 仅允许 admin 用户登录(可选,进一步限制登录用户) -
重启 SSH 服务使配置生效:
# Debian/Ubuntu sudo systemctl restart sshd # RHEL/CentOS sudo systemctl restart sshd
1.3 SSH 密钥认证替代密码登录#
常见问题:密码登录易遭受暴力破解(攻击者通过自动化工具尝试大量密码组合)。
最佳实践:使用 SSH 密钥对认证——私钥存储在客户端,公钥存于服务器,安全性远高于密码。
实践步骤:#
-
客户端生成密钥对(以 Linux/macOS 为例):
ssh-keygen -t ed25519 -C "[email protected]" # 生成 ED25519 算法密钥(比 RSA 更安全) # 按提示输入密钥存储路径(默认 ~/.ssh/id_ed25519)和密码(可选,增强私钥安全性) -
上传公钥到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@your_server_ip -
服务器端禁用密码登录: 编辑
/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 --reset2. 文件系统权限控制:最小权限原则实践#
文件系统权限是 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 # 移除 SGID3. 服务与进程管理:关闭“后门”服务#
默认安装的 Linux 系统可能运行大量不必要的服务(如 cups 打印服务、telnet 等),这些服务会增加攻击面(如存在未修复漏洞)。
3.1 识别并禁用无用服务#
实践步骤:#
-
列出所有运行中的服务:
# systemd 系统(主流 Linux 发行版) sudo systemctl list-unit-files --type=service --state=enabled # 查看监听端口的服务(结合 netstat/ss) sudo ss -tulpn -
禁用不必要的服务(以
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 nginx4. 网络安全防护:构建网络层面的“防火墙”#
网络是攻击者入侵的主要途径,需通过防火墙、端口限制等措施控制网络流量,仅允许必要的连接。
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 numberediptables(适合高级用户,功能更强大):#
示例:仅允许 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.v44.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 sshd4.3 禁用不必要的网络协议与端口#
常见风险:IPv6、ICMP(ping)等协议可能被用于网络探测或攻击(如 IPv6 配置不当导致绕过防火墙)。
实践步骤:#
-
禁用 IPv6(若无需使用): 编辑
/etc/sysctl.conf添加:net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1加载配置:
sudo sysctl -p。 -
限制 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 -p5.2 启用强制访问控制(AppArmor/SELinux)#
强制访问控制(MAC) 是一种比传统 DAC(自主访问控制)更严格的安全机制,通过预定义策略限制进程的行为(如禁止 Web 服务读写 /etc/shadow)。
AppArmor(Debian/Ubuntu 默认启用,配置简单):#
-
查看 AppArmor 状态:
sudo aa-status -
启用预定义配置文件(如 Apache):
sudo aa-enforce /etc/apparmor.d/usr.sbin.apache2 -
创建自定义配置文件(以限制
/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
delaycompress6.2 文件完整性监控(FIM)#
FIM 工具用于检测关键文件是否被篡改(如 /etc/passwd、/bin/bash),常用工具包括 auditd(内置)、AIDE 等。
auditd(Linux 审计系统):#
-
安装并启动 auditd:
sudo apt install auditd sudo systemctl start auditd -
添加监控规则(监控
/etc/passwd的修改):sudo auditctl -w /etc/passwd -p wa -k passwd_change # -w:监控路径;-p wa:写/属性修改;-k:关键词 -
查看审计日志:
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 sshd7. 漏洞管理:及时修补“安全漏洞”#
系统漏洞是攻击者入侵的主要利用途径,需通过定期更新、漏洞扫描确保系统无已知高危漏洞。
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-upgradesRHEL/CentOS:#
# 安装安全更新插件
sudo yum install yum-plugin-security
# 仅安装安全更新
sudo yum update --security7.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-grub9. 安全加固最佳实践总结#
安全加固是一个持续过程,需遵循以下原则:
- 纵深防御:多层防护(如防火墙 + 密码策略 + 日志监控),即使一层被突破,其他层仍能防御。
- 最小权限:用户、服务、进程仅授予必要权限,减少攻击影响范围。
- 定期审计:通过
lynis、auditd等工具定期检查配置是否被篡改,漏洞是否修复。 - 自动化:使用 Ansible、SaltStack 等工具自动化加固流程(如统一配置
sshd_config、sysctl参数)。 - 文档化:记录所有加固操作,便于追溯和复现。
10. 参考资料#
- Linux Security HOWTO(TLDP 安全指南)
- Red Hat Enterprise Linux 安全指南
- CIS 基准(Center for Internet Security Benchmarks)(权威的系统安全配置标准)
- NIST SP 800-123(美国国家标准与技术研究院的服务器安全指南)
- AppArmor 官方文档
- SELinux 项目文档