Linux 系统安全详解:从基础加固到高级防护
Linux 凭借其开源、稳定和高度可定制的特性,广泛应用于服务器、嵌入式设备、云计算乃至关键基础设施中。然而,“开源”不意味着“天生安全”——默认配置的 Linux 系统往往存在诸多安全隐患,例如开放不必要的端口、弱密码策略、未及时修复的漏洞等。攻击者常利用这些漏洞进行权限提升、数据窃取或服务拒绝攻击。
本文将系统梳理 Linux 安全加固的核心领域,涵盖系统硬ening、用户权限管理、网络防护、文件系统安全、漏洞管理、监控审计及内核级安全配置等内容。通过“通用实践”与“最佳实践”的对比,结合具体操作示例,帮助读者从零开始构建一个安全的 Linux 环境。无论是个人服务器管理员还是企业运维人员,都能从中获取可落地的安全策略。
目录#
- 系统基础加固
- 1.1 最小化安装与组件精简
- 1.2 系统更新与补丁管理
- 1.3 禁用不必要服务与自启动项
- 用户与权限管理
- 2.1 强密码策略与密码管理
- 2.2 最小权限原则与 sudo 配置
- 2.3 禁用或锁定高危账户
- 网络安全防护
- 3.1 防火墙配置(UFW/iptables)
- 3.2 SSH 服务安全加固
- 3.3 端口与服务暴露控制
- 文件系统安全
- 4.1 文件权限与访问控制(DAC/ACL)
- 4.2 文件系统加密(LUKS)
- 4.3 关键文件保护(不可变属性)
- 漏洞管理与合规性
- 5.1 漏洞扫描工具与实践
- 5.2 安全基线与合规检查
- 安全监控与审计
- 6.1 日志收集与分析(auditd/rsyslog)
- 6.2 入侵检测与防御(Fail2ban)
- 高级安全配置
- 7.1 内核参数优化(sysctl)
- 7.2 强制访问控制(SELinux/AppArmor)
- 参考资料
1. 系统基础加固#
系统基础加固是安全的第一道防线,目标是通过减少攻击面、修复已知漏洞,构建一个“最小化”且“更新及时”的运行环境。
1.1 最小化安装与组件精简#
通用实践#
- 安装时选择“默认安装”,包含大量不必要组件(如图形界面、开发工具)。
最佳实践#
- 最小化安装:仅安装核心组件(如
server-minimal包组),避免预装非必要服务(如邮件服务器、FTP 等)。 - 定期清理冗余软件:移除未使用的包,减少潜在漏洞载体。
示例用法#
# 查看已安装的包(Debian/Ubuntu)
dpkg -l | grep -v "ii " # 过滤已安装包
# 移除冗余包(如 telnet 客户端,非必要)
sudo apt purge telnet -y
# 清理依赖残留
sudo apt autoremove -y1.2 系统更新与补丁管理#
通用实践#
- 不定期更新,或仅更新“重要”漏洞补丁。
最佳实践#
- 自动化更新:配置自动安全更新,确保关键漏洞(如 CVE 高危漏洞)及时修复。
- 测试后再应用:生产环境建议先在测试机验证补丁兼容性,避免业务中断。
示例用法#
# Debian/Ubuntu 配置自动安全更新
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades # 交互式启用安全更新
# 手动检查并安装安全更新(CentOS/RHEL)
sudo yum update --security -y1.3 禁用不必要服务与自启动项#
通用实践#
- 保留默认启动的服务(如
cups打印服务、avahi-daemon网络发现),即使未使用。
最佳实践#
- 禁用非必要服务:通过
systemd或sysvinit关闭不需要的服务,减少暴露端口。 - 禁用自启动:防止服务重启后自动运行。
示例用法#
# 查看当前运行的服务(systemd 系统)
sudo systemctl list-unit-files --type=service --state=enabled
# 禁用并停止 cups 服务(打印服务,非服务器必要)
sudo systemctl stop cups
sudo systemctl disable cups
# 永久屏蔽服务(防止被其他服务激活)
sudo systemctl mask cups2. 用户与权限管理#
Linux 基于“多用户”设计,权限管理不当是最常见的安全漏洞来源(如弱密码、过度授权)。
2.1 强密码策略与密码管理#
通用实践#
- 使用简单密码(如
123456、password),或长期不更换密码。
最佳实践#
- 强密码策略:强制密码长度(≥12 位)、复杂度(大小写+数字+特殊字符)、定期更换(如 90 天)。
- 使用密码哈希与盐值:确保
/etc/shadow中密码以强哈希算法(如 SHA-512)存储(现代 Linux 默认已支持)。
示例用法#
# 配置密码策略(Debian/Ubuntu,编辑 /etc/pam.d/common-password)
sudo vim /etc/pam.d/common-password
# 添加以下行(最小长度 12,复杂度检查)
password requisite pam_pwquality.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
# 设置用户密码过期时间(90 天)
sudo chage -M 90 username # username 替换为实际用户名
# 查看用户密码信息
sudo chage -l username2.2 最小权限原则与 sudo 配置#
通用实践#
- 直接使用
root账户操作,或授予普通用户sudo无密码权限(username ALL=(ALL) NOPASSWD: ALL)。
最佳实践#
- 禁止直接使用 root:通过普通用户+
sudo执行特权操作,记录所有sudo行为。 - 精细化 sudo 权限:仅授予用户必要权限(如允许
apt但禁止rm -rf /)。
示例用法#
# 安全配置 sudoers(必须使用 visudo,防止语法错误导致锁死)
sudo visudo
# 添加以下行(允许 user1 仅执行 apt 和 systemctl 命令)
user1 ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl restart nginx
# 记录 sudo 操作到日志(默认已开启,日志路径 /var/log/auth.log)
grep sudo /var/log/auth.log # 查看 sudo 执行记录2.3 禁用或锁定高危账户#
最佳实践#
- 禁用 root 远程登录:通过 SSH 配置禁止
root直接登录(见 3.2 节)。 - 锁定冗余账户:如
ftp、games等默认账户,防止被利用。
示例用法#
# 锁定账户(禁止登录,但保留数据)
sudo passwd -l ftp
# 禁用账户(无法登录,且无法通过 su 切换)
sudo usermod -L games
# 删除无用账户(如不再使用的测试账户)
sudo userdel -r testuser # -r 同时删除家目录3. 网络安全防护#
网络是攻击的主要入口,需通过防火墙、端口控制和服务加固限制外部访问。
3.1 防火墙配置(UFW/iptables)#
通用实践#
- 关闭防火墙(
ufw disable或iptables -F),或仅开放所有端口(ufw allow all)。
最佳实践#
- 默认拒绝所有流量:仅开放必要端口(如 80/443 Web 服务、22 SSH)。
- 使用 UFW 简化配置:对新手友好;高级场景可用
iptables精细化规则。
示例用法#
# UFW 基础配置(默认拒绝入站,允许出站)
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH 端口(假设默认 22,建议修改,见 3.2 节)
sudo ufw allow 22/tcp
# 允许 Web 服务端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 启用防火墙并查看状态
sudo ufw enable
sudo ufw status numbered # 显示规则编号,便于删除3.2 SSH 服务安全加固#
SSH 是远程管理的主要工具,也是攻击者的重点目标(如暴力破解)。
通用实践#
- 使用默认端口(22)、密码认证、允许 root 登录。
最佳实践#
- 修改默认端口:避免被端口扫描工具直接发现。
- 禁用密码认证:强制使用 SSH 密钥登录,密钥文件权限设置为
600。 - 限制登录源 IP:仅允许指定 IP 段访问 SSH。
示例用法#
# 编辑 SSH 配置文件
sudo vim /etc/ssh/sshd_config
# 修改以下配置(去掉注释并修改值)
Port 2222 # 非默认端口(1024-65535 之间,避免冲突)
PermitRootLogin no # 禁止 root 登录
PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes # 启用密钥认证
AllowUsers [email protected]/24 # 仅允许 user1 从 192.168.1.x 网段登录
# 重启 SSH 服务生效
sudo systemctl restart sshd # Debian/Ubuntu
# 或
sudo systemctl restart sshd.service # CentOS/RHEL密钥登录配置:
# 客户端生成密钥对(本地执行)
ssh-keygen -t ed25519 -C "[email protected]" # 推荐 ed25519 算法,比 RSA 更安全
# 上传公钥到服务器
ssh-copy-id -p 2222 user1@server_ip # 2222 为修改后的 SSH 端口3.3 端口与服务暴露控制#
最佳实践#
- 绑定服务到本地回环地址:非公开服务(如数据库、Redis)仅监听
127.0.0.1,避免外部访问。 - 使用工具检查暴露端口:定期扫描开放端口,确认无异常。
示例用法#
# 查看本地监听端口(仅 IPv4)
sudo ss -tuln4 # t:TCP, u:UDP, l:监听, n:数字端口
# 配置服务绑定本地地址(如 Redis,编辑 /etc/redis/redis.conf)
bind 127.0.0.1 # 仅允许本地访问
# 外部扫描工具(如 nmap,在另一台机器执行)
nmap -p 1-65535 server_ip # 扫描服务器所有端口4. 文件系统安全#
文件系统是数据存储核心,需通过权限控制、加密和不可变属性防止未授权访问或篡改。
4.1 文件权限与访问控制(DAC/ACL)#
通用实践#
- 文件权限过松(如
777),或关键文件(如/etc/passwd)允许普通用户写入。
最佳实践#
- 遵循最小权限原则:文件默认权限
644(用户读写,组读,其他读),目录755。 - 使用 ACL 精细化控制:当传统权限(UGO)不足时,通过 ACL 授予特定用户/组访问权。
示例用法#
# 修复关键文件权限(/etc/shadow 仅 root 可读写)
sudo chmod 600 /etc/shadow
sudo chown root:root /etc/shadow
# 使用 ACL 授予用户 user2 访问 /data/shared 的权限
sudo setfacl -m u:user2:rwx /data/shared
# 查看 ACL
getfacl /data/shared4.2 文件系统加密(LUKS)#
最佳实践#
- 加密敏感数据分区:如
/data分区,防止物理设备丢失后数据泄露。
示例用法#
# 安装 cryptsetup(LUKS 工具)
sudo apt install cryptsetup -y
# 加密分区(/dev/sdb1 为目标分区,操作前备份数据!)
sudo cryptsetup luksFormat /dev/sdb1 # 输入 YES 并设置加密密码
# 打开加密分区(映射为 /dev/mapper/mydata)
sudo cryptsetup open /dev/sdb1 mydata
# 格式化并挂载
sudo mkfs.ext4 /dev/mapper/mydata
sudo mount /dev/mapper/mydata /data
# 设置开机自动挂载(编辑 /etc/crypttab 和 /etc/fstab)
echo "mydata /dev/sdb1 none luks" | sudo tee -a /etc/crypttab
echo "/dev/mapper/mydata /data ext4 defaults 0 2" | sudo tee -a /etc/fstab4.3 关键文件保护(不可变属性)#
最佳实践#
- 设置不可变属性:防止关键系统文件(如
/etc/resolv.conf、/etc/hosts)被篡改。
示例用法#
# 设置文件不可变(仅 root 可解除)
sudo chattr +i /etc/resolv.conf
# 查看属性
lsattr /etc/resolv.conf # 显示 "i" 表示不可变
# 解除不可变属性(需要时)
sudo chattr -i /etc/resolv.conf5. 漏洞管理与合规性#
即使系统已加固,仍需定期扫描漏洞并确保符合安全基线。
5.1 漏洞扫描工具与实践#
最佳实践#
- 定期漏洞扫描:使用工具检测系统中未修复的漏洞(如
debsecan、openvas)。
示例用法#
# Debian/Ubuntu 漏洞扫描工具 debsecan
sudo apt install debsecan -y
sudo debsecan --format brief # 显示系统中存在的漏洞及修复状态
# 开源漏洞扫描器 OpenVAS(需单独部署,适合企业环境)
# 安装后通过 Web 界面扫描目标服务器,生成漏洞报告5.2 安全基线与合规检查#
最佳实践#
- 遵循行业基线:如 CIS 基准(CIS Benchmark)、等保 2.0 标准,通过工具(如
lynis)自动化检查。
示例用法#
# 安装 Lynis(系统安全审计工具)
sudo apt install lynis -y
# 执行安全审计(非侵入式,生成报告)
sudo lynis audit system
# 查看报告关键问题(搜索 "Suggestion" 或 "Warning")6. 安全监控与审计#
安全不是一次性工作,需持续监控异常行为,及时发现入侵。
6.1 日志收集与分析(auditd/rsyslog)#
最佳实践#
- 监控关键文件变更:如
/etc/passwd(用户账户变更)、/usr/bin/sudo(权限工具)。 - 集中日志管理:生产环境建议将日志发送到中央服务器(如 ELK Stack)。
示例用法#
# 安装 auditd(Linux 审计框架)
sudo apt install auditd -y
# 添加审计规则(监控 /etc/passwd 变更)
sudo auditctl -w /etc/passwd -p wa -k passwd_changes # w:监控, p:write/append, k:标签
# 查看审计日志(搜索标签 passwd_changes)
sudo ausearch -k passwd_changes6.2 入侵检测与防御(Fail2ban)#
最佳实践#
- 防御暴力破解:通过
fail2ban自动封禁多次失败登录的 IP。
示例用法#
# 安装 fail2ban
sudo apt install fail2ban -y
# 配置 SSH 防护(编辑 /etc/fail2ban/jail.local)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 复制默认配置
sudo vim /etc/fail2ban/jail.local
# 修改 [sshd] 部分
[sshd]
enabled = true
port = 2222 # 替换为实际 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 3 次失败后封禁
bantime = 3600 # 封禁 1 小时(秒)
# 重启 fail2ban 生效
sudo systemctl restart fail2ban
# 查看封禁状态
sudo fail2ban-client status sshd7. 高级安全配置#
针对高安全需求场景,需启用内核级防护与强制访问控制。
7.1 内核参数优化(sysctl)#
最佳实践#
- 加固内核网络栈:防御 SYN 洪水、IP 欺骗等攻击。
示例用法#
# 编辑 /etc/sysctl.conf,添加以下参数
sudo vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 # 防御 SYN 洪水
net.ipv4.conf.all.rp_filter = 1 # 启用反向路径过滤(防 IP 欺骗)
net.ipv4.conf.all.forwarding = 0 # 禁用 IP 转发(非路由器时)
net.ipv4.icmp_echo_ignore_all = 1 # 禁止 ICMP 回显(禁止 ping)
# 应用配置
sudo sysctl -p7.2 强制访问控制(SELinux/AppArmor)#
最佳实践#
- 启用 MAC 机制:SELinux(RedHat 系默认)或 AppArmor(Debian/Ubuntu 默认),限制进程权限。
示例用法(AppArmor)#
# 查看 AppArmor 状态
sudo aa-status
# 为 Nginx 启用 AppArmor 配置文件(限制其仅访问必要文件)
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
# 查看配置文件内容(定义允许的路径和操作)
cat /etc/apparmor.d/usr.sbin.nginx