关于Linux服务器安全加固
处于之前网站被攻击和对服务器安全方面不够重视的原因,发现监控有多条异常告警信息,对异常进一步排查,查看服务进程状态和异常日志消除隐患,尝试对网站访问没有问题,后逐步加强对服务器的安全加固和监控。下面这套加固方案覆盖了Linux服务器的各个方面。使用时根据具体需求配置,可以选择性地实施这些措施。建议从基础加固开始,逐步实施更高级的安全措施。这里以主要以Ubuntu为例,CentOS可参考,未在CentOS服务器验证。
加固注意事项:
1、不要在生产环境直接运行脚本,先在测试环境验证
2、保持至少一个活跃的管理会话,避免被锁
3、记录所有更改,便于回滚和审计
4、考虑业务连续性,确保加固不影响正常服务
5、定期复查,安全是一个持续的过程
实施措施建议:
1、分步实施:不要一次性应用所有加固措施
2、测试验证:每项更改后测试服务是否正常
3、备份先行:每次修改前备份配置文件
4、监控日志:加固后密切关注系统日志
5、定期审查:每月运行安全审计脚本
6、保持更新:定期更新系统和安全规则
一、基础安全加固
1. 系统更新和补丁管理
# 更新所有软件包 sudo apt update && sudo apt upgrade -y # Debian/Ubuntu sudo yum update -y # CentOS/RHEL sudo dnf update -y # Fedora/CentOS 8+ # 设置自动安全更新(可忽略) sudo apt install unattended-upgrades # Ubuntu sudo dpkg-reconfigure unattended-upgrades # 或使用定时任务 sudo crontab -e # 每天凌晨3点0分执行更新软件包列表并升级所有可升级的软件包 # 添加:0 3 * * * apt update && apt upgrade -y
2. 用户和权限管理
# 创建普通用户(避免使用root)
sudo adduser yourusername
sudo usermod -aG sudo yourusername # 给予sudo权限
# 更新所有软件包
sudo awk -F: '($2 == "") {print $1}' /etc/shadow
# 检查UID为0的用户(除了root不应有其他)
sudo awk -F: '($3 == 0) {print $1}' /etc/passwd
# 设置密码策略
sudo apt install libpam-pwquality # Ubuntu
sudo yum install libpwquality # CentOS
# 编辑密码策略
sudo nano /etc/security/pwquality.conf
# 修改:
# minlen = 12
# minclass = 3
# maxrepeat = 23. SSH安全加固
# 备份原始配置 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup # 编辑SSH配置 sudo nano /etc/ssh/sshd_config # 建议配置: Port 22222 # 非默认端口 Protocol 2 # 只使用SSHv2 PermitRootLogin no # 禁止root登录 PasswordAuthentication no # 禁用密码登录 PubkeyAuthentication yes # 启用密钥登录 AllowUsers yourusername # 只允许特定用户 MaxAuthTries 3 # 最大尝试次数 ClientAliveInterval 300 # 客户端活动间隔 ClientAliveCountMax 2 # 客户端活动计数 X11Forwarding no # 禁用X11转发 UsePAM yes # 使用PAM认证 PrintMotd no # 禁用欢迎信息
注意:修改SSH默认的22端口是防止容易被外部扫描到,如果默认22端修改端口后,原本的外部SSH登陆会断开,需要重新编辑登陆窗口修改原本的登陆端口。开启使用密钥登陆需要保存密钥并且下载密钥,否则外部无法使用密码进行登录,将密钥保存到本地,在进行SSH登陆时重新选择使用key/密钥,将下载的密钥导入,可以使用putty工具远程登陆。
4. 防火墙配置
# UFW (Ubuntu) sudo ufw enable sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 23456/tcp # SSH sudo ufw allow 80,443/tcp # Web服务 sudo ufw limit 23456/tcp # 限制SSH连接频率 # firewalld (CentOS) sudo firewall-cmd --permanent --add-port=23456/tcp sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --permanent --remove-service=ssh # 移除默认SSH sudo firewall-cmd --reload sudo firewall-cmd --list-all # 使用iptables(通用) sudo iptables -A INPUT -p tcp --dport 23456 -m state --state NEW -m recent --set sudo iptables -A INPUT -p tcp --dport 23456 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
二、文件系统安全
1. 文件和目录权限
# 检查关键文件权限 sudo find / -type f -perm /4000 -o -perm /2000 # 查找SUID/SGID文件 sudo find / -nouser -o -nogroup # 查找无主文件 # 设置关键目录权限 sudo chmod 750 /home/* sudo chmod 644 /etc/passwd sudo chmod 600 /etc/shadow sudo chmod 644 /etc/group sudo chmod 750 /var/log # 检查敏感文件权限脚本 sudo tee /usr/local/bin/check_perms.sh << 'EOF' #!/bin/bash echo "=== 关键文件权限检查 ===" for file in /etc/passwd /etc/shadow /etc/group /etc/sudoers; do if [ -f "$file" ]; then ls -l "$file" fi done EOF sudo chmod +x /usr/local/bin/check_perms.sh
2. 文件完整性监控
# 安装AIDE(高级入侵检测环境) sudo apt install aide aide-common # Ubuntu sudo yum install aide # CentOS # 初始化数据库 sudo aideinit sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db # 每日检查(添加到cron) sudo crontab -e # 添加:0 2 * * * /usr/bin/aide --check # 或使用tripwire sudo apt install tripwire # Ubuntu
三、网络安全加固
1. 内核参数调优
# 编辑sysctl配置 sudo nano /etc/sysctl.conf # 添加以下安全设置: # 禁用IP转发(如果不是路由器) net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # 禁用ICMP重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # 禁用源路由 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 # 启用反向路径过滤 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 记录可疑数据包 net.ipv4.conf.all.log_martians = 1 # 禁用ICMP广播请求 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略虚假ICMP响应 net.ipv4.icmp_ignore_bogus_error_responses = 1 # 启用SYN洪水保护 net.ipv4.tcp_syncookies = 1 # 减少time_wait连接 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_tw_buckets = 5000 # 限制连接数 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 # 应用配置 sudo sysctl -p
2. 安装和配置Fail2ban
# 安装 sudo apt install fail2ban # Ubuntu sudo yum install fail2ban # CentOS # 创建本地配置 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑配置 sudo nano /etc/fail2ban/jail.local # 添加以下配置: [DEFAULT] bantime = 3600 findtime = 600 maxretry = 3 [sshd] enabled = true port = 23456 # 修改为您的SSH端口 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 86400 [nginx-http-auth] enabled = true filter = nginx-auth logpath = /var/log/nginx/error.log maxretry = 3 bantime = 3600 # 重启服务 sudo systemctl restart fail2ban sudo systemctl enable fail2ban # 查看状态 sudo fail2ban-client status sudo fail2ban-client status sshd
四、服务安全
1. 禁用不必要的服务
# 查看所有服务 sudo systemctl list-unit-files --type=service # 禁用不需要的服务(根据实际情况) sudo systemctl disable avahi-daemon # 服务发现 sudo systemctl disable cups # 打印服务 sudo systemctl disable rpcbind # RPC绑定 sudo systemctl disable postfix # 邮件服务(如不需要) sudo systemctl disable bluetooth # 蓝牙 # 查看监听端口 sudo netstat -tulpn sudo ss -tulpn # 关闭不必要的端口 sudo systemctl stop [service-name] sudo systemctl disable [service-name]
2. Web服务器安全(以Nginx为例)
# 隐藏Nginx版本信息 sudo nano /etc/nginx/nginx.conf # 在http块中添加: server_tokens off; # 限制请求大小 client_max_body_size 10m; # 安全头部 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; # SSL配置(如果有) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; # 重启Nginx sudo systemctl restart nginx
五、日志和监控
1. 配置日志轮转
# 安装logrotate
sudo apt install logrotate # Ubuntu(通常已安装)
sudo yum install logrotate # CentOS
# 配置
sudo nano /etc/logrotate.conf
# 添加安全相关配置:
/var/log/auth.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}2. 安装监控工具
# 安装net-tools和监控工具 sudo apt install net-tools htop iotop iftop nload # Ubuntu sudo yum install net-tools htop iotop iftop nload # CentOS # 安装Lynis安全审计工具 sudo apt install lynis # Ubuntu sudo yum install lynis # CentOS # 运行安全审计 sudo lynis audit system # 安装rkhunter(Rootkit检测) sudo apt install rkhunter # Ubuntu sudo yum install rkhunter # CentOS # 更新并扫描 sudo rkhunter --update sudo rkhunter --check
六、应用安全
1. Docker安全
# 创建docker用户组(如果不存在)
sudo groupadd docker
# 将用户添加到docker组(谨慎操作)
sudo usermod -aG docker $USER
# 配置Docker守护进程
sudo tee /etc/docker/daemon.json << EOF
{
"icc": false,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true
}
EOF
# 重启Docker
sudo systemctl restart docker2. 数据库安全(MySQL/MariaDB)
# 运行安全安装脚本 sudo mysql_secure_installation # 移除匿名用户 # 禁用远程root登录 # 移除测试数据库 # 创建专用用户 mysql -u root -p CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!'; GRANT SELECT, INSERT, UPDATE, DELETE ON database.* TO 'appuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
七、高级安全配置
1. SELinux/AppArmor配置
# 对于CentOS/RHEL(SELinux) sudo sestatus # 查看状态 sudo setenforce 1 # 临时启用 sudo nano /etc/selinux/config # 永久启用 # 对于Ubuntu(AppArmor) sudo aa-status # 查看状态 sudo systemctl enable apparmor sudo systemctl start apparmor
2. 配置入侵检测系统(IDS)
# 安装Suricata(网络IDS) sudo apt install suricata # Ubuntu sudo yum install suricata # CentOS # 配置规则 sudo suricata-update sudo systemctl start suricata sudo systemctl enable suricata # 或安装Snort sudo apt install snort # Ubuntu
3. 配置端口敲门(Port Knocking)
# 安装knockd sudo apt install knockd # Ubuntu sudo yum install knockd # CentOS # 配置 sudo nano /etc/knockd.conf # 示例配置: [options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %%IP%% -p tcp --dport 23456 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %%IP%% -p tcp --dport 23456 -j ACCEPT tcpflags = syn
八、自动化加固脚本
1. 综合加固脚本
#!/bin/bash # 服务器综合安全加固脚本 set -e LOG_FILE="/var/log/security_hardening.log" echo "开始服务器安全加固..." | tee -a $LOG_FILE # 1. 更新系统 echo "更新系统..." | tee -a $LOG_FILE apt update && apt upgrade -y 2>&1 | tee -a $LOG_FILE # 2. 创建普通用户 read -p "输入要创建的用户名: " NEW_USER adduser $NEW_USER usermod -aG sudo $NEW_USER echo "创建用户 $NEW_USER 完成" | tee -a $LOG_FILE # 3. SSH加固 echo "加固SSH..." | tee -a $LOG_FILE SSH_PORT=$(shuf -i 20000-65000 -n 1) cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup cat > /etc/ssh/sshd_config << EOF Port $SSH_PORT Protocol 2 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AllowUsers $NEW_USER MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 X11Forwarding no UsePAM yes EOF systemctl restart sshd echo "SSH端口改为: $SSH_PORT" | tee -a $LOG_FILE # 4. 防火墙配置 echo "配置防火墙..." | tee -a $LOG_FILE ufw --force enable ufw default deny incoming ufw default allow outgoing ufw allow $SSH_PORT/tcp ufw allow 80/tcp ufw allow 443/tcp # 5. 安装安全工具 echo "安装安全工具..." | tee -a $LOG_FILE apt install -y fail2ban rkhunter lynis aide 2>&1 | tee -a $LOG_FILE # 6. 配置fail2ban cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sed -i "s/port.*= ssh/port = $SSH_PORT/" /etc/fail2ban/jail.local systemctl restart fail2ban echo "加固完成!" | tee -a $LOG_FILE echo "请记录以下信息:" | tee -a $LOG_FILE echo "1. SSH端口: $SSH_PORT" | tee -a $LOG_FILE echo "2. 用户名: $NEW_USER" | tee -a $LOG_FILE echo "3. 请配置SSH密钥登录" | tee -a $LOG_FILE
2. 每日安全检查脚本
#!/bin/bash # 每日安全检查脚本 DATE=$(date +%%Y%%m%%d) LOG_DIR="/var/log/security_checks" LOG_FILE="$LOG_DIR/check_$DATE.log" mkdir -p $LOG_DIR echo "=== 每日安全检查报告 - $(date) ===" > $LOG_FILE echo "" >> $LOG_FILE # 1. 检查失败登录 echo "1. 失败登录尝试:" >> $LOG_FILE grep "Failed password" /var/log/auth.log | tail -20 >> $LOG_FILE echo "" >> $LOG_FILE # 2. 检查SSH登录 echo "2. 成功SSH登录:" >> $LOG_FILE grep "Accepted password\|Accepted publickey" /var/log/auth.log | tail -10 >> $LOG_FILE echo "" >> $LOG_FILE # 3. 检查root登录 echo "3. Root登录记录:" >> $LOG_FILE grep "root" /var/log/auth.log | grep -i "login\|su" | tail -10 >> $LOG_FILE echo "" >> $LOG_FILE # 4. 检查磁盘使用 echo "4. 磁盘使用情况:" >> $LOG_FILE df -h >> $LOG_FILE echo "" >> $LOG_FILE # 5. 检查内存使用 echo "5. 内存使用情况:" >> $LOG_FILE free -h >> $LOG_FILE echo "" >> $LOG_FILE # 6. 检查运行进程 echo "6. TOP进程:" >> $LOG_FILE ps aux --sort=-%%cpu | head -10 >> $LOG_FILE echo "" >> $LOG_FILE # 7. 检查开放端口 echo "7. 开放端口:" >> $LOG_FILE netstat -tulpn | grep LISTEN >> $LOG_FILE echo "" >> $LOG_FILE # 8. 检查计划任务 echo "8. Root计划任务:" >> $LOG_FILE crontab -l 2>/dev/null >> $LOG_FILE echo "" >> $LOG_FILE echo "检查完成,日志保存在: $LOG_FILE"
九、安全审计和合规
1. 使用OpenSCAP
# 安装OpenSCAP sudo apt install libopenscap8 scap-security-guide ssg-debian # Ubuntu sudo yum install openscap-scanner scap-security-guide # CentOS # 运行扫描 sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_standard \ --results scan-results.xml \ --report scan-report.html \ /usr/share/xml/scap/ssg/content/ssg-debian11-ds.xml
2. 定期安全扫描
# 使用Nmap扫描自己 sudo apt install nmap # Ubuntu sudo yum install nmap # CentOS # 扫描本地端口 sudo nmap -sS -p- localhost # 从外部扫描(使用另一台机器) # nmap -sS -p- 服务器IP
十、备份和恢复策略
1. 配置自动备份
#!/bin/bash # 自动备份脚本 BACKUP_DIR="/backup" DATE=$(date +%%Y%%m%%d_%%H%%M%%S) # 创建备份目录 mkdir -p $BACKUP_DIR/$DATE # 备份重要配置文件 cp -r /etc $BACKUP_DIR/$DATE/ cp -r /home $BACKUP_DIR/$DATE/ cp -r /var/www $BACKUP_DIR/$DATE/ # 这条是对有网站而言,没有可忽略 # 备份数据库(如果有) mysqldump -u root -p数据库密码 --all-databases > $BACKUP_DIR/$DATE/alldb.sql # 压缩备份 tar -czf $BACKUP_DIR/server_backup_$DATE.tar.gz $BACKUP_DIR/$DATE # 保留最近7天备份 find $BACKUP_DIR -name "server_backup_*.tar.gz" -mtime +7 -delete # 上传到远程(可选) # rsync -avz $BACKUP_DIR/server_backup_$DATE.tar.gz user@backup-server:/backup/
十一、应急响应准备
1. 创建应急响应工具包
# 安装应急工具
sudo apt install busybox-static strace lsof tcpdump auditd audispd-plugins # Ubuntu
# 创建应急脚本
sudo tee /usr/local/bin/emergency_response.sh << 'EOF'
#!/bin/bash
echo "=== 应急响应检查 ==="
echo "1. 当前连接:"
netstat -antp
echo "2. 运行进程:"
ps auxf
echo "3. 最近登录:"
last -20
echo "4. 计划任务:"
ls -la /etc/cron.*/
echo "5. 检查后门:"
find / -name "*.php" -type f -exec grep -l "eval\|base64_decode\|shell_exec" {} \; 2>/dev/null
EOF
sudo chmod +x /usr/local/bin/emergency_response.sh加固检查清单
类 | 检查项目 |
| 系统更新 | 是否最新 |
| SSH安全 | 端口、密钥、root登录 |
| 防火墙 | 是否启用,规则配置 |
| 用户管理 | 弱密码、多余账户 |
| 文件权限 | 关键文件权限 |
| 日志监控 | 日志配置、轮转 |
| 服务管理 | 不必要服务已关闭 |
| 内核安全 | sysctl参数优化 |
| 入侵检测 | Fail2ban配置 |
| 备份策略 | 自动备份已配置 |

本文最后更新时间 2026-01-08
文章链接地址:https://xzlo.blog/index.php/archives/101/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处