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/Ubuntusudo yum update -y # CentOS/RHELsudo dnf update -y # Fedora/CentOS 8+# 设置自动安全更新(可忽略)sudo apt install unattended-upgrades # Ubuntusudo dpkg-reconfigure unattended-upgrades# 或使用定时任务sudo crontab -e# 每天凌晨3点0分执行更新软件包列表并升级所有可升级的软件包# 添加:0 3 * * * apt update && apt upgrade -y
2. 用户和权限管理
# 创建普通用户(避免使用root)sudo adduser yourusernamesudo 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 # Ubuntusudo yum install libpwquality # CentOS# 编辑密码策略sudo nano /etc/security/pwquality.conf# 修改:# minlen = 12# minclass = 3# maxrepeat = 2
3. SSH安全加固
# 备份原始配置sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup# 编辑SSH配置sudo nano /etc/ssh/sshd_config# 建议配置:Port 22222 # 非默认端口Protocol 2 # 只使用SSHv2PermitRootLogin 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 enablesudo ufw default deny incomingsudo ufw default allow outgoingsudo ufw allow 23456/tcp # SSHsudo ufw allow 80,443/tcp # Web服务sudo ufw limit 23456/tcp # 限制SSH连接频率# firewalld (CentOS)sudo firewall-cmd --permanent --add-port=23456/tcpsudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --permanent --remove-service=ssh # 移除默认SSHsudo firewall-cmd --reloadsudo firewall-cmd --list-all# 使用iptables(通用)sudo iptables -A INPUT -p tcp --dport 23456 -m state --state NEW -m recent --setsudo 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/passwdsudo chmod 600 /etc/shadowsudo chmod 644 /etc/groupsudo chmod 750 /var/log# 检查敏感文件权限脚本sudo tee /usr/local/bin/check_perms.sh << 'EOF'#!/bin/bashecho "=== 关键文件权限检查 ==="for file in /etc/passwd /etc/shadow /etc/group /etc/sudoers; doif [ -f "$file" ]; thenls -l "$file"fidoneEOFsudo chmod +x /usr/local/bin/check_perms.sh
2. 文件完整性监控
# 安装AIDE(高级入侵检测环境)sudo apt install aide aide-common # Ubuntusudo yum install aide # CentOS# 初始化数据库sudo aideinitsudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db# 每日检查(添加到cron)sudo crontab -e# 添加:0 2 * * * /usr/bin/aide --check# 或使用tripwiresudo apt install tripwire # Ubuntu
三、网络安全加固
1. 内核参数调优
# 编辑sysctl配置sudo nano /etc/sysctl.conf# 添加以下安全设置:# 禁用IP转发(如果不是路由器)net.ipv4.ip_forward = 0net.ipv6.conf.all.forwarding = 0# 禁用ICMP重定向net.ipv4.conf.all.accept_redirects = 0net.ipv6.conf.all.accept_redirects = 0# 禁用源路由net.ipv4.conf.all.accept_source_route = 0net.ipv6.conf.all.accept_source_route = 0# 启用反向路径过滤net.ipv4.conf.all.rp_filter = 1net.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 = 30net.ipv4.tcp_max_tw_buckets = 5000# 限制连接数net.ipv4.tcp_max_syn_backlog = 2048net.ipv4.tcp_synack_retries = 2# 应用配置sudo sysctl -p
2. 安装和配置Fail2ban
# 安装sudo apt install fail2ban # Ubuntusudo yum install fail2ban # CentOS# 创建本地配置sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# 编辑配置sudo nano /etc/fail2ban/jail.local# 添加以下配置:[DEFAULT]bantime = 3600findtime = 600maxretry = 3[sshd]enabled = trueport = 23456 # 修改为您的SSH端口filter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 86400[nginx-http-auth]enabled = truefilter = nginx-authlogpath = /var/log/nginx/error.logmaxretry = 3bantime = 3600# 重启服务sudo systemctl restart fail2bansudo systemctl enable fail2ban# 查看状态sudo fail2ban-client statussudo 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 -tulpnsudo 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;# 重启Nginxsudo systemctl restart nginx
五、日志和监控
1. 配置日志轮转
# 安装logrotatesudo apt install logrotate # Ubuntu(通常已安装)sudo yum install logrotate # CentOS# 配置sudo nano /etc/logrotate.conf# 添加安全相关配置:/var/log/auth.log {dailymissingokrotate 7compressdelaycompressnotifemptycreate 640 root admsharedscriptspostrotate/usr/lib/rsyslog/rsyslog-rotateendscript}
2. 安装监控工具
# 安装net-tools和监控工具sudo apt install net-tools htop iotop iftop nload # Ubuntusudo yum install net-tools htop iotop iftop nload # CentOS# 安装Lynis安全审计工具sudo apt install lynis # Ubuntusudo yum install lynis # CentOS# 运行安全审计sudo lynis audit system# 安装rkhunter(Rootkit检测)sudo apt install rkhunter # Ubuntusudo yum install rkhunter # CentOS# 更新并扫描sudo rkhunter --updatesudo 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# 重启Dockersudo systemctl restart docker
2. 数据库安全(MySQL/MariaDB)
# 运行安全安装脚本sudo mysql_secure_installation# 移除匿名用户# 禁用远程root登录# 移除测试数据库# 创建专用用户mysql -u root -pCREATE 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 apparmorsudo systemctl start apparmor
2. 配置入侵检测系统(IDS)
# 安装Suricata(网络IDS)sudo apt install suricata # Ubuntusudo yum install suricata # CentOS# 配置规则sudo suricata-updatesudo systemctl start suricatasudo systemctl enable suricata# 或安装Snortsudo apt install snort # Ubuntu
3. 配置端口敲门(Port Knocking)
# 安装knockdsudo apt install knockd # Ubuntusudo yum install knockd # CentOS# 配置sudo nano /etc/knockd.conf# 示例配置:[options]UseSyslog[openSSH]sequence = 7000,8000,9000seq_timeout = 5command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 23456 -j ACCEPTtcpflags = syn[closeSSH]sequence = 9000,8000,7000seq_timeout = 5command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 23456 -j ACCEPTtcpflags = syn
八、自动化加固脚本
1. 综合加固脚本
#!/bin/bash# 服务器综合安全加固脚本set -eLOG_FILE="/var/log/security_hardening.log"echo "开始服务器安全加固..." | tee -a $LOG_FILE# 1. 更新系统echo "更新系统..." | tee -a $LOG_FILEapt update && apt upgrade -y 2>&1 | tee -a $LOG_FILE# 2. 创建普通用户read -p "输入要创建的用户名: " NEW_USERadduser $NEW_USERusermod -aG sudo $NEW_USERecho "创建用户 $NEW_USER 完成" | tee -a $LOG_FILE# 3. SSH加固echo "加固SSH..." | tee -a $LOG_FILESSH_PORT=$(shuf -i 20000-65000 -n 1)cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backupcat > /etc/ssh/sshd_config << EOFPort $SSH_PORTProtocol 2PermitRootLogin noPasswordAuthentication noPubkeyAuthentication yesAllowUsers $NEW_USERMaxAuthTries 3ClientAliveInterval 300ClientAliveCountMax 2X11Forwarding noUsePAM yesEOFsystemctl restart sshdecho "SSH端口改为: $SSH_PORT" | tee -a $LOG_FILE# 4. 防火墙配置echo "配置防火墙..." | tee -a $LOG_FILEufw --force enableufw default deny incomingufw default allow outgoingufw allow $SSH_PORT/tcpufw allow 80/tcpufw allow 443/tcp# 5. 安装安全工具echo "安装安全工具..." | tee -a $LOG_FILEapt install -y fail2ban rkhunter lynis aide 2>&1 | tee -a $LOG_FILE# 6. 配置fail2bancp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localsed -i "s/port.*= ssh/port = $SSH_PORT/" /etc/fail2ban/jail.localsystemctl restart fail2banecho "加固完成!" | tee -a $LOG_FILEecho "请记录以下信息:" | tee -a $LOG_FILEecho "1. SSH端口: $SSH_PORT" | tee -a $LOG_FILEecho "2. 用户名: $NEW_USER" | tee -a $LOG_FILEecho "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_DIRecho "=== 每日安全检查报告 - $(date) ===" > $LOG_FILEecho "" >> $LOG_FILE# 1. 检查失败登录echo "1. 失败登录尝试:" >> $LOG_FILEgrep "Failed password" /var/log/auth.log | tail -20 >> $LOG_FILEecho "" >> $LOG_FILE# 2. 检查SSH登录echo "2. 成功SSH登录:" >> $LOG_FILEgrep "Accepted password\|Accepted publickey" /var/log/auth.log | tail -10 >> $LOG_FILEecho "" >> $LOG_FILE# 3. 检查root登录echo "3. Root登录记录:" >> $LOG_FILEgrep "root" /var/log/auth.log | grep -i "login\|su" | tail -10 >> $LOG_FILEecho "" >> $LOG_FILE# 4. 检查磁盘使用echo "4. 磁盘使用情况:" >> $LOG_FILEdf -h >> $LOG_FILEecho "" >> $LOG_FILE# 5. 检查内存使用echo "5. 内存使用情况:" >> $LOG_FILEfree -h >> $LOG_FILEecho "" >> $LOG_FILE# 6. 检查运行进程echo "6. TOP进程:" >> $LOG_FILEps aux --sort=-%cpu | head -10 >> $LOG_FILEecho "" >> $LOG_FILE# 7. 检查开放端口echo "7. 开放端口:" >> $LOG_FILEnetstat -tulpn | grep LISTEN >> $LOG_FILEecho "" >> $LOG_FILE# 8. 检查计划任务echo "8. Root计划任务:" >> $LOG_FILEcrontab -l 2>/dev/null >> $LOG_FILEecho "" >> $LOG_FILEecho "检查完成,日志保存在: $LOG_FILE"
九、安全审计和合规
1. 使用OpenSCAP
# 安装OpenSCAPsudo apt install libopenscap8 scap-security-guide ssg-debian # Ubuntusudo 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 # Ubuntusudo 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/bashecho "=== 应急响应检查 ==="echo "1. 当前连接:"netstat -antpecho "2. 运行进程:"ps auxfecho "3. 最近登录:"last -20echo "4. 计划任务:"ls -la /etc/cron.*/echo "5. 检查后门:"find / -name "*.php" -type f -exec grep -l "eval\|base64_decode\|shell_exec" {} \; 2>/dev/nullEOFsudo chmod +x /usr/local/bin/emergency_response.sh
本次加固检查清单如下:
| 类 | 检查项目 |
| 系统更新 | 是否最新 |
| SSH安全 | 端口、密钥、root登录 |
| 防火墙 | 是否启用,规则配置 |
| 用户管理 | 弱密码、多余账户 |
| 文件权限 | 关键文件权限 |
| 日志监控 | 日志配置、轮转 |
| 服务管理 | 不必要服务已关闭 |
| 内核安全 | sysctl参数优化 |
| 入侵检测 | Fail2ban配置 |
| 备份策略 | 自动备份已配置 |
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



