Linux 服务器安全策略详解
服务器安全是一个持续的过程,而非一次性的任务,它遵循“纵深防御”(Defense in Depth)原则,即构建多层、多维度的安全防护体系,即使一层被突破,还有其他层可以阻止攻击。

第一部分:核心安全原则
在开始具体操作前,请务必理解以下核心原则:
- 最小权限原则:任何用户、程序或进程都只应拥有完成其任务所必需的最小权限,绝不使用
root用户进行日常操作。 - 纵深防御:不依赖单一的安全措施,在网络、主机、应用、数据等多个层面部署防护。
- 默认拒绝:防火墙和访问控制策略应默认拒绝所有流量,然后根据需要明确开放特定端口和服务。
- 已知安全:优先使用经过广泛审查和验证的开源软件,避免使用来源不明或未经审计的代码。
- 持续监控与审计:安全不是一劳永逸的,必须持续监控系统状态、日志和用户行为,以便及时发现异常。
- 及时更新:软件漏洞是攻击的主要入口,保持系统和所有软件包的最新状态是基本要求。
第二部分:系统基础加固
这是服务器安全的第一道防线,也是最关键的一步。
账户与访问控制
-
禁用或删除不必要的账户:
- 检查
/etc/passwd文件,禁用或删除测试账户、过期账户(如uucp,operator,games等)。 - 使用
userdel <username>删除不需要的用户。 - 使用
passwd -l <username>锁定不活跃但需要保留的账户。
- 检查
-
强化 root 账户:
(图片来源网络,侵删)- 禁止远程 root 登录:编辑
/etc/ssh/sshd_config,设置PermitRootLogin no,然后重启 SSH 服务:systemctl restart sshd。 - 为普通用户配置
sudo:创建一个普通管理员用户,并将其加入wheel或sudo组,通过visudo编辑/etc/sudoers文件,精细控制其可执行的命令。
- 禁止远程 root 登录:编辑
-
使用强密码策略:
- 强制复杂密码:在
/etc/login.defs中设置密码最小长度、最小使用天数等。 - 禁止弱密码:使用
cracklib或pam_pwquality等模块检查密码强度。 - 定期更换密码:设置密码过期策略。
- 强制复杂密码:在
-
配置 SSH 安全增强:
- 修改默认端口:将 SSH 端口从
22改为一个非标准端口(如2222),以防止自动化扫描。 - 禁用密码登录,启用密钥登录:这是最有效的安全措施之一。
- 在
sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。 - 确保客户端使用 SSH 密钥对进行登录。
- 在
- 限制允许登录的用户:在
sshd_config中使用AllowUsers或AllowGroups指令,只允许特定用户或组通过 SSH 登录。 - 禁用空密码:设置
PermitEmptyPasswords no。 - 设置登录超时:设置
ClientAliveInterval 60和ClientAliveCountMax 3,自动断开不活动的连接。
- 修改默认端口:将 SSH 端口从
文件系统与权限
-
文件权限:
- 定期使用
find命令查找和修复权限不当的文件,例如全局可写的文件 (find / -type f -perm -o=w) 或不应执行的配置文件。 - 使用
chown和chmod正确设置所有者和权限。
- 定期使用
-
重要目录和文件的权限:
(图片来源网络,侵删)- 确保
/etc/passwd,/etc/shadow,/etc/group等关键文件权限正确。 - 限制对用户主目录(
/home/)的访问。
- 确保
-
使用
chroot或容器技术:- 对于高风险服务(如 FTP, Web 服务器),考虑使用
chrootjail 或 Docker 等容器技术将其隔离在受限的环境中。
- 对于高风险服务(如 FTP, Web 服务器),考虑使用
系统更新与补丁管理
-
定期更新系统:
- 基于 Debian/Ubuntu:
sudo apt update && sudo apt upgrade -y - 基于 CentOS/RHEL/Fedora:
sudo yum update -y或sudo dnf update -y - 设置自动更新:对于生产环境,配置
unattended-upgrades(Debian/Ubuntu) 或yum-cron(CentOS/RHEL) 在非高峰期自动安装安全更新。
- 基于 Debian/Ubuntu:
-
订阅安全公告:关注您的发行版官方安全公告,了解最新的漏洞信息和补丁。
内核参数优化
-
使用
sysctl调整内核参数,增强系统安全性。 -
示例配置(通常在
/etc/sysctl.conf或/etc/sysctl.d/99-security.conf中):# 禁用 IP 转发,除非服务器需要作为路由器 net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # 防止 ICMP 重定向攻击 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # 启用 SYN Cookies,防御 SYN Flood 攻击 net.ipv4.tcp_syncookies = 1 # 忽略 ICMP 请求(ping),防止系统被网络发现 net.ipv4.icmp_echo_ignore_all = 1 # 防止源路由 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0
-
应用配置:
sysctl -p
第三部分:网络与防火墙配置
网络层是抵御外部攻击的前线。
配置防火墙
-
使用
iptables或nftables:-
iptables是经典工具,功能强大。 -
nftables是新一代工具,语法更简洁,性能更好。 -
核心策略:默认拒绝所有,然后按需开放。
-
示例
iptables规则:# 清空现有规则 iptables -F iptables -X iptables -t nat -F iptables -t nat -X # 设置默认策略为 DROP iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许本地回环 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接和相关的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许 SSH 连接(假设端口是 2222) iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # 允许 HTTP/HTTPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 保存规则 (CentOS/RHEL) service iptables save # 或 (Debian/Ubuntu) iptables-save > /etc/iptables/rules.v4
-
-
使用
firewalld(CentOS/RHEL 7+):firewalld提供了更友好的动态管理界面。-
# 启动并设置开机自启 systemctl start firewalld systemctl enable firewalld
添加永久的服务(如 SSH, HTTP)
firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https
重新加载防火墙规则
firewall-cmd --reload
查看开放的服务和端口
firewall-cmd --list-all
禁用不必要的服务
- 使用
systemctl或chkconfig检查并禁用所有不必要运行的服务,减少攻击面。systemctl list-units --type=service --state=runningsystemctl disable <service_name>- 如果服务器不提供邮件服务,禁用
postfix或sendmail。
第四部分:应用与服务安全
运行在服务器上的应用往往是攻击者的最终目标。
Web 服务器安全
- Nginx/Apache:
- 以低权限用户运行:配置 Web 服务器(如
www-data,nginx,apache)运行,而不是root。 - 定期更新:保持 Web 服务器软件及其模块(如 PHP, OpenSSL)的最新版本。
- 配置安全头:设置
Content-Security-Policy,X-Frame-Options,X-Content-Type-Options等 HTTP 响应头。 - 隐藏版本信息:在配置中关闭服务器版本号的显示。
- 禁用不必要的模块:移除未使用的模块以减少漏洞风险。
- 以低权限用户运行:配置 Web 服务器(如
数据库安全
- MySQL/MariaDB:
- 修改默认端口:将数据库端口从
3306改为其他端口。 - 禁止远程 root 登录:只允许
localhost连接,并创建一个具有特定权限的远程管理用户。 - 使用 SSL/TLS 加密连接。
- 定期备份数据,并确保备份文件安全。
- 修改默认端口:将数据库端口从
其他服务
- FTP:强烈建议使用 SFTP (基于 SSH) 或 FTPS (基于 SSL/TLS) 替代不安全的 FTP。
- DNS (Bind):运行在非特权端口,限制查询来源,使用 TSIG 进行服务器间认证。
- 邮件服务器:配置 SPF, DKIM, DMARC 以防止邮件欺骗和钓鱼。
第五部分:日志、监控与入侵检测
没有监控的安全是盲目的。
集中日志管理
- 配置日志:确保所有服务(
rsyslog或journald)都在记录日志。 - 日志级别:对于关键服务,设置为
info或debug级别。 - 防止日志篡改:
- 将日志发送到远程日志服务器(如 ELK Stack, Graylog, Syslog-ng)。
- 使用
logrotate管理日志文件,防止磁盘被写满。 - 设置日志文件权限为
root:root,并设置不可更改位(chattr +a)。
入侵检测系统
-
使用
fail2ban:fail2ban是一个强大的工具,它可以监控日志文件(如 SSH 登录失败日志),并自动调用防火墙规则来封禁恶意 IP 地址。- 示例
/etc/fail2ban/jail.local配置:[sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 # 封禁1小时
- 启动服务:
systemctl enable --now fail2ban
-
使用
AIDE(Advanced Intrusion Detection Environment):AIDE是一个文件完整性检查工具,它在首次运行时创建一个数据库,记录所有关键文件的属性(如大小、权限、哈希值),之后可以定期运行,对比当前状态和数据库,发现任何文件被篡改。
系统监控
- 使用
top,htop,nethogs等工具实时查看系统资源使用情况。 - 部署监控软件:如 Zabbix, Prometheus + Grafana,对服务器的 CPU、内存、磁盘、网络流量进行长期监控和告警。
第六部分:备份与应急响应
即使做了万全的准备,也要为最坏的情况做准备。
制定备份策略
- 3-2-1 原则:至少保存 3 份数据副本,存放在 2 种不同类型的存储介质上,其中至少有 1 份是离线或异地备份。
- :包括
/etc配置目录、网站数据、数据库、用户数据等。 - 备份周期:根据数据重要性,制定每日、每周的备份计划。
- 测试恢复:定期测试备份文件的可用性,确保能够成功恢复。
制定应急响应计划
- 准备:明确团队成员和职责,准备好应急工具和联系方式。
- 识别:通过监控和日志发现安全事件。
- 遏制:立即隔离受影响的主机,断开网络连接,防止攻击扩散。
- 根除:清除恶意软件、后门,修复漏洞。
- 恢复:从干净的备份恢复系统,并逐步恢复服务。
- 分析事件原因,改进安全策略,防止再次发生。
Linux 服务器安全是一个系统性工程,需要从物理、网络、系统、应用和管理等多个层面进行加固,本指南提供了一个全面的框架,您可以根据服务器的具体用途和风险等级,选择性地实施这些策略。
安全不是一蹴而就的,而是一个持续迭代、不断优化的过程。 定期审查、更新和演练您的安全策略,是保持服务器长期安全的关键。
