关于Linux服务器安全加固处于之前网站被攻击和对服务器安全方面不够重视的原因,发现监控有多条异常告警信息,对异常进一步排查,查看服务进程状态和异常日志消除隐患,尝试对网站访问没有问题,后逐步加...

关于Linux服务器安全加固

关于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 = 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                                   # 只使用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 docker

2. 数据库安全(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配置
备份策略自动备份已配置

1e47ba0480dc7b4977a33ca841509d0.png


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

文章附件
  • 暂无附件
希望可以帮助到你
微信赞赏二维码

希望本文内容对您有帮助

支付宝赞赏二维码

支付宝赞赏

留言