服务器到手,如何安全加固?老运维的全方位实战指南
服务器到手,如何安全加固?老运维的全方位实战指南
在互联网安全事故频发的今天,服务器安全已经成为每位运维工程师必须面对的头等大事。前几天刚接手一批新服务器,想到很多朋友经常问我:"新服务器应该如何进行安全加固?"今天就借这个机会,和大家分享一下我十多年运维生涯中总结的服务器安全加固实战经验。无论你是刚入行的新手,还是有经验的运维人员,这篇文章都能帮你构建一个更加安全的服务器环境。
一、系统基础安全
1. 系统更新与补丁管理
系统漏洞是黑客入侵的首选目标。记得去年某金融客户因为没及时打补丁,结果被勒索软件攻击,损失惨重。所以,拿到新服务器的第一件事就是更新系统:
CentOS/RHEL系统:
# 查看可更新的包
yum check-update
# 更新所有包
yum update -y
# 只更新安全补丁
yum update --security
Ubuntu/Debian系统:
# 更新软件包列表
apt update
# 升级所有已安装的包
apt upgrade -y
# 智能升级(处理依赖关系)
apt dist-upgrade -y
别忘了设置自动更新,但要注意生产环境中先在测试环境验证补丁的稳定性。
2. 最小化安装原则
上个月帮一个客户排查安全问题时,发现他们服务器上装了一堆用不到的服务,每一个都是潜在的安全风险。记住:不需要的服务就是风险。
# 列出所有已安装的包
rpm -qa # RHEL/CentOS
dpkg -l # Debian/Ubuntu
# 删除不必要的服务
yum remove <package_name> # RHEL/CentOS
apt purge <package_name> # Debian/Ubuntu
常见可移除的服务:
- telnet、rsh、rlogin(使用SSH替代)
- 不必要的打印服务如CUPS
- 不使用的代理服务、邮件服务等
3. 禁用不必要的启动服务
# 列出所有启动的服务
systemctl list-unit-files --state=enabled
# 禁用不需要的服务
systemctl disable <service_name>
systemctl mask <service_name> # 彻底禁用
二、用户账户安全
1. 加固root账户
root账户是黑客的首要攻击目标。前段时间一个朋友的服务器被入侵,就是因为root密码太简单被暴力破解。
# 设置强密码
passwd root
# 禁止root远程登录(编辑/etc/ssh/sshd_config)
PermitRootLogin no
# 重启SSH服务
systemctl restart sshd
2. 创建管理员账户
# 创建管理员用户
useradd -m admin
passwd admin
# 赋予sudo权限
usermod -aG wheel admin # CentOS/RHEL
usermod -aG sudo admin # Ubuntu/Debian
3. 密码策略加固
在/etc/login.defs
和/etc/security/pwquality.conf
中设置密码复杂度要求:
PASS_MAX_DAYS 90 # 密码最长有效期
PASS_MIN_DAYS 7 # 两次修改密码的最小间隔
PASS_MIN_LEN 12 # 最小密码长度
PASS_WARN_AGE 7 # 过期前警告天数
# 密码复杂度
minlen = 12
minclass = 3
maxrepeat = 3
别忘了配置PAM模块强制执行这些策略:
# 编辑/etc/pam.d/system-auth(CentOS)或/etc/pam.d/common-password(Ubuntu)
password requisite pam_pwquality.so retry=3
三、SSH安全加固
SSH是运维人员的必备工具,但也是黑客重点攻击的服务之一。
1. 修改默认端口
# 编辑/etc/ssh/sshd_config
Port 2222 # 使用非标准端口
# 如果使用SELinux,需要设置
semanage port -a -t ssh_port_t -p tcp 2222
2. 密钥认证替代密码
# 客户端生成密钥对
ssh-keygen -t ed25519 -C "admin@example.com"
# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@server_ip
# 禁用密码认证(编辑/etc/ssh/sshd_config)
PasswordAuthentication no
ChallengeResponseAuthentication no
3. 其他SSH加固措施
编辑/etc/ssh/sshd_config
:
Protocol 2 # 只使用SSH v2协议
MaxAuthTries 3 # 最大认证尝试次数
MaxSessions 5 # 最大会话数
LoginGraceTime 60 # 登录超时时间
ClientAliveInterval 300 # 客户端活跃检测间隔
ClientAliveCountMax 2 # 客户端活跃检测次数
AllowUsers admin # 只允许特定用户登录
重启SSH服务生效:
systemctl restart sshd
四、防火墙配置
1. 配置iptables/firewalld
# 使用firewalld(CentOS 7+/RHEL 7+)
systemctl enable firewalld
systemctl start firewalld
# 只开放必要端口
firewall-cmd --permanent --add-port=2222/tcp # SSH
firewall-cmd --permanent --add-port=80/tcp # HTTP
firewall-cmd --permanent --add-port=443/tcp # HTTPS
firewall-cmd --reload
或者使用传统iptables:
# 基本iptables规则
iptables -F
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
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 保存规则
service iptables save
2. 防DDoS配置
# 限制SYN洪水
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 限制ICMP请求
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
五、文件系统安全
1. 分区与挂载选项
合理的分区策略可以有效防止某些攻击。去年一个客户因为/tmp目录和根目录在同一分区,被黑客利用填满磁盘导致系统崩溃。在/etc/fstab
中添加安全挂载选项:
/dev/sda1 /boot ext4 defaults,nosuid,nodev,noexec 1 2
/dev/sda2 /tmp ext4 defaults,nosuid,nodev,noexec 1 2
/dev/sda3 /var ext4 defaults,nosuid 1 2
/home /home ext4 defaults,nosuid,nodev 1 2
这些选项的作用:
- nosuid: 禁止SUID/SGID位生效
- nodev: 禁止解释设备文件
- noexec: 禁止执行二进制文件
2. 文件权限审计与修复
# 设置关键文件的正确权限
chmod 644 /etc/passwd
chmod 000 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
# 查找并修复危险的SUID/SGID文件
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \;
# 查找世界可写文件
find / -type f -perm -o+w -not -path "/proc/*" -not -path "/sys/*" -exec ls -l {} \;
3. 文件完整性检查
安装AIDE(Advanced Intrusion Detection Environment)进行文件完整性监控:
# 安装AIDE
yum install aide # CentOS/RHEL
apt install aide # Ubuntu/Debian
# 初始化数据库
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 设置定期检查
echo "0 4 * * * root /usr/sbin/aide --check | mail -s 'AIDE检查报告' admin@example.com" > /etc/cron.d/aide
六、系统审计与日志
1. 配置集中日志
最近一个客户因为没有保存足够的日志,黑客入侵后无法追溯攻击路径。配置rsyslog将日志发送到集中服务器:
# 编辑/etc/rsyslog.conf
*.* @logserver.example.com:514 # UDP
*.* @@logserver.example.com:514 # TCP+TLS
# 重启服务
systemctl restart rsyslog
2. 配置Auditd审计系统
# 安装auditd
yum install audit # CentOS/RHEL
apt install auditd # Ubuntu/Debian
# 启用并配置
systemctl enable auditd
systemctl start auditd
# 编辑/etc/audit/auditd.conf
max_log_file = 50
max_log_file_action = rotate
num_logs = 10
space_left_action = email
action_mail_acct = root
admin_space_left_action = halt
添加关键审计规则(/etc/audit/rules.d/audit.rules):
# 监控/etc目录变更
-w /etc/ -p wa -k etc_changes
# 监控用户/组变更
-w /etc/passwd -p wa -k user_modification
-w /etc/shadow -p wa -k user_modification
-w /etc/group -p wa -k user_modification
-w /etc/gshadow -p wa -k user_modification
# 监控sudo使用
-w /usr/bin/sudo -p x -k sudo_usage
# 监控失败的访问尝试
-a always,exit -F arch=b64 -S open -F exit=-EACCES -k file_access
-a always,exit -F arch=b64 -S open -F exit=-EPERM -k file_access
3. 日志轮转与保留
配置logrotate确保日志不会占满磁盘:
# 编辑/etc/logrotate.conf
rotate 90 # 保留90天
daily # 每天轮转
compress # 压缩旧日志
dateext # 使用日期扩展名
七、入侵检测与防御
1. 安装配置Fail2ban
Fail2ban可以自动封禁尝试暴力破解的IP:
# 安装Fail2ban
yum install epel-release && yum install fail2ban # CentOS/RHEL
apt install fail2ban # Ubuntu/Debian
# 配置SSH防护
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF
# 启动服务
systemctl enable fail2ban
systemctl start fail2ban
2. 安装配置rootkit检测工具
# 安装rkhunter
yum install rkhunter # CentOS/RHEL
apt install rkhunter # Ubuntu/Debian
# 更新数据库
rkhunter --update
rkhunter --propupd
# 设置定期扫描
echo "0 3 * * * root /usr/bin/rkhunter --check --skip-keypress --report-warnings-only" > /etc/cron.d/rkhunter
3. 配置文件监控
使用osquery进行高级监控:
# 安装osquery
# 从官网下载并安装对应系统的包
# 配置文件监控
cat > /etc/osquery/osquery.conf << EOF
{
"schedule": {
"file_events": {
"query": "SELECT * FROM file_events;",
"interval": 60
},
"process_events": {
"query": "SELECT * FROM process_events;",
"interval": 60
}
},
"file_paths": {
"etc": ["/etc/%%"],
"bin": ["/bin/%%", "/sbin/%%", "/usr/bin/%%", "/usr/sbin/%%"]
}
}
EOF
# 启动服务
systemctl enable osqueryd
systemctl start osqueryd
八、网络安全加固
1. 内核参数优化
编辑/etc/sysctl.conf
:
# 防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁止IP源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 启用反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 记录可疑包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
应用配置:
sysctl -p
2. 网络服务加固
对于Web服务器,配置TLS/SSL:
# 生成强密钥和CSR
openssl req -new -newkey rsa:4096 -nodes -keyout server.key -out server.csr
# 在Nginx中配置安全参数
server {
listen 443 ssl http2;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=63072000" always;
}
3. 配置网络访问控制
使用TCP Wrappers限制服务访问:
# 编辑/etc/hosts.allow
sshd: 192.168.1.0/24 10.0.0.0/8
# 编辑/etc/hosts.deny
ALL: ALL
九、定期安全检查
1. 创建安全基线检查脚本
#!/bin/bash
# security_check.sh - 定期安全检查脚本
echo "=== 系统信息 ==="
hostname
date
uname -a
echo -e "\n=== 用户登录检查 ==="
last | head -20
echo -e "\n=== 当前登录用户 ==="
w
echo -e "\n=== 失败的登录尝试 ==="
grep "Failed password" /var/log/auth.log | tail -20
echo -e "\n=== 特权用户列表 ==="
grep -v -E "^#|^$" /etc/sudoers
echo -e "\n=== SUID/SGID文件检查 ==="
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; 2>/dev/null
echo -e "\n=== 开放端口检查 ==="
ss -tuln
echo -e "\n=== 系统服务检查 ==="
systemctl list-units --type=service --state=running
echo -e "\n=== 防火墙规则检查 ==="
if command -v firewall-cmd &> /dev/null; then
firewall-cmd --list-all
elif command -v iptables &> /dev/null; then
iptables -L -n
fi
echo -e "\n=== 系统更新状态 ==="
if command -v yum &> /dev/null; then
yum check-update --security | head -20
elif command -v apt &> /dev/null; then
apt list --upgradable | head -20
fi
echo -e "\n=== 磁盘空间使用情况 ==="
df -h
echo -e "\n=== 大文件检查 ==="
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | head -20
echo -e "\n=== 检查可疑的cron任务 ==="
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u $user -l 2>/dev/null | grep -v "^#"
done
echo -e "\n=== 异常进程检查 ==="
ps aux --sort=-%cpu | head -20
echo -e "\n=== 检查最近修改的系统文件 ==="
find /etc -type f -mtime -7 -exec ls -la {} \; 2>/dev/null
echo -e "\n=== 检查网络连接 ==="
netstat -antup | grep ESTABLISHED | head -20
echo -e "\n=== 检查登录失败记录 ==="
lastb | head -20
echo -e "\n=== 安全检查完成 ==="
将此脚本设置为每周运行:
chmod +x /usr/local/bin/security_check.sh
echo "0 8 * * 1 root /usr/local/bin/security_check.sh | mail -s 'Weekly Security Check Report' admin@example.com" > /etc/cron.d/security_check
2. 使用Lynis进行安全审计
Lynis是一个强大的安全审计工具:
# 安装Lynis
wget https://downloads.cisofy.com/lynis/lynis-3.0.8.tar.gz
tar xzf lynis-3.0.8.tar.gz
cd lynis
# 运行审计
./lynis audit system
# 查看报告
cat /var/log/lynis.log
cat /var/log/lynis-report.dat
设置定期审计:
echo "0 2 * * 7 root cd /path/to/lynis && ./lynis audit system --cronjob" > /etc/cron.d/lynis
3. 漏洞扫描
使用OpenVAS或Nessus定期扫描服务器漏洞,或者使用更轻量级的工具如Vuls:
# 安装Vuls(简化版安装步骤)
# 详细安装步骤请参考官方文档
# 配置扫描目标
cat > config.toml << EOF
[servers]
[servers.localhost]
host = "localhost"
port = "local"
EOF
# 运行扫描
vuls scan
vuls report -format-json
十、应急响应准备
1. 创建应急响应计划
为服务器创建应急响应计划文档,包括:
- 紧急联系人列表
- 事件分类和响应程序
- 证据收集指南
- 恢复程序
- 事后分析模板
2. 配置系统快照和备份
# 安装并配置备份工具(例如rsnapshot)
yum install rsnapshot # CentOS/RHEL
apt install rsnapshot # Ubuntu/Debian
# 配置备份(编辑/etc/rsnapshot.conf)
snapshot_root /backup/
retain daily 7
retain weekly 4
retain monthly 6
backup /etc/ localhost/
backup /home/ localhost/
backup /var/www/ localhost/
backup /var/log/ localhost/
backup /usr/local/ localhost/
# 设置定期备份
echo "0 1 * * * root /usr/bin/rsnapshot daily" > /etc/cron.d/rsnapshot
echo "0 2 * * 7 root /usr/bin/rsnapshot weekly" >> /etc/cron.d/rsnapshot
echo "0 3 1 * * root /usr/bin/rsnapshot monthly" >> /etc/cron.d/rsnapshot
3. 创建紧急恢复工具包
准备一个紧急恢复USB驱动器,包含:
- 系统安装介质
- 关键配置文件备份
- 恢复指南文档
- 取证工具(如CAINE、Kali Linux)
- 密码重置工具
总结
经过多年的运维经验,我发现服务器安全不是一次性工作,而是持续的过程。这里是一些最佳实践:
定期更新和审计:每周至少检查一次系统更新,每月进行一次全面安全审计。
最小权限原则:只授予用户完成工作所需的最小权限。
深度防御策略:不要依赖单一安全措施,而是构建多层次防御体系。
监控和警报:设置全面的监控系统,确保异常行为能够及时触发警报。
文档和培训:记录所有安全配置,并确保团队成员了解安全策略。
定期测试:进行定期渗透测试和灾难恢复演练。
保持简单:复杂的系统更难以维护和审计,尽量保持简单明了。
记住,服务器安全是一场持久战。黑客只需找到一个漏洞,而我们必须防御所有可能的攻击。通过实施本文提到的安全加固措施,你的服务器将能够抵御大多数常见的攻击,但安全工作永远不会结束。
希望这份全方位的服务器安全加固指南对你有所帮助。如果你有任何问题或需要进一步的建议,欢迎在评论区留言交流!
你有没有遇到过服务器安全问题?你通常会采取哪些措施来保护你的服务器?欢迎在评论区分享你的经验和想法!