返回文章列表
服务器

Linux服务器安全加固注意事项及方法

筱筱
2026-01-07
1周前
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; do    if [ -f "$file" ]; then        ls -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 {    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        # 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,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 -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配置
    备份策略自动备份已配置


    本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

    分享文章
    合作伙伴

    本站所有广告均是第三方投放,详情请查询本站用户协议