一、准备阶段:核心防护清单梳理
先做基础梳理,避免漏项,所有防护点围绕中小网站高频漏洞(SQL注入、XSS、CSRF、暴力破解、弱口令)制定,覆盖基础设施层、应用层、数据层、监控层:
- 基础设施层:服务器端口管控、SSH/远程桌面加固、文件权限控制
- 应用层:代码静态扫描前置、Web应用防火墙(WAF)基础部署、常见漏洞补丁
- 数据层:数据库权限隔离、核心数据加密、定期备份验证
- 监控层:异常登录/访问监控、磁盘/CPU/内存预警、日志留存归档
二、基础设施层:72小时内搞定服务器硬防护
2.1 仅开放必要端口,禁用高危端口
用系统自带防火墙就行,以CentOS 7/8/9通用的firewalld、Ubuntu 20.04+的ufw为例:
CentOS操作
- 查看当前开放端口:
firewall-cmd --list-all
- 开启核心端口(HTTP80、HTTPS443、自定义SSH端口如22222):
```
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=22222/tcp
```
- 关闭SSH默认22端口:
firewall-cmd --permanent --remove-port=22/tcp
- 重启防火墙生效:
firewall-cmd --reload
Ubuntu操作
- 启用防火墙:
sudo ufw enable
- 开启核心端口:
```
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22222/tcp
```
- 关闭SSH默认22端口:
sudo ufw delete allow 22/tcp
2.2 彻底加固SSH远程登录
两个核心动作:禁用root直接登录、设置密钥对登录+密码二次验证(如果必须保留密码,密码长度≥16位,含大小写、数字、特殊字符):
- 生成SSH密钥对(本地Windows用Git Bash、Mac/Linux用终端执行):
```
ssh-keygen -t rsa -b 4096 -f ~/.ssh/site_rsa
连续回车跳过密码设置(本地保存好私钥)
```
- 上传公钥到服务器(替换root@your_server_ip为实际服务器):
```
ssh-copy-id -i ~/.ssh/site_rsa.pub -p 22 your_server_ip
输入旧root密码
```
- 修改服务器SSH配置(vim /etc/ssh/sshd_config),找到并修改/新增以下行:
```
Port 22222
Protocol 2
PermitRootLogin no
PasswordAuthentication yes 先保留,确保密钥登录成功后再禁用
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
```
- 重启SSH服务生效:
```
CentOS
systemctl restart sshd
Ubuntu
sudo systemctl restart ssh
```
- 验证:本地打开新终端测试密钥登录(替换site_admin为后续创建的普通管理员):
```
ssh -i ~/.ssh/site_rsa site_admin@your_server_ip -p 22222
成功后,将sshd_config中的PasswordAuthentication改为no,再次重启SSH
```
- 创建普通管理员并授予sudo权限:
```
CentOS/Ubuntu通用
useradd site_admin
passwd site_admin 设置≥16位强密码
usermod -aG wheel site_admin CentOS
usermod -aG sudo site_admin Ubuntu
```
2.3 严格控制文件权限
以Nginx/Apache常见站点目录/var/www/html为例:
- 目录权限设为750:
find /var/www/html -type d -exec chmod 750 {} \;
- 文件权限设为640:
find /var/www/html -type f -exec chmod 640 {} \;
- 将目录所有者设为Web服务用户(Nginx通常是nginx、Apache通常是apache或www-data):
```
Nginx
chown -R nginx:nginx /var/www/html
Apache
chown -R www-data:www-data /var/www/html
```
三、应用层:部署免费开源轻量防护组件
3.1 部署免费开源WAF:Naxsi(搭配Nginx)

以CentOS 8为例,直接用yum安装预编译包,避免编译卡壳:
- 添加EPEL和Naxsi源:
```
yum install -y epel-release
yum install -y https://extras.getpagespeed.com/release-latest.rpm
```
- 安装Nginx+Naxsi:
yum install -y nginx-module-naxsi
- 加载Naxsi模块:编辑vim /etc/nginx/nginx.conf,在http块开头添加:
```
load_module modules/ngx_http_naxsi_module.so;
```
- 引入Naxsi核心规则:在http块内添加:
```
include /etc/nginx/naxsi_core.rules;
```
- 配置站点WAF(以默认站点/etc/nginx/conf.d/default.conf为例):
```
server {
listen 80;
server_name your_domain.com www.your_domain.com;
root /var/www/html;
index index.php index.html index.htm;
开启Naxsi,默认拦截模式
SecRulesEnabled;
开启学习模式,3-7天后关闭,避免误拦截
LearningMode;
学习模式生成的白名单规则保存路径
LibInjectionSql; 可选,增强SQL注入检测
LibInjectionXss; 可选,增强XSS检测
DeniedUrl "/RequestDenied";
检查规则(必须)
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
```
- 重启Nginx:
systemctl restart nginx
3.2 代码静态扫描前置:安装免费开源工具SonarQube社区版的Docker简化版
中小网站用Docker部署,不用配置Java、数据库:
- 先安装Docker(官方一键脚本):
```
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl start docker
systemctl enable docker
```
- 启动SonarQube:
```
docker run -d --name sonarqube -p 9000:9000 \
-e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true \
sonarqube:lts-community
```
- 访问http://your_server_ip:9000,默认账号密码admin/admin,登录后修改密码,创建项目获取token,按提示安装本地扫描器(下载地址:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856.zip,解压到本地C盘或/usr/local/bin),在项目根目录创建sonar-project.properties文件:
```
sonar.projectKey=your_site_key
sonar.projectName=your_site_name
sonar.projectVersion=1.0
sonar.sources=.
sonar.host.url=http://your_server_ip:9000
sonar.login=your_token
```
- 本地执行扫描:
```
Windows
C:\sonar-scanner-cli-4.8.0.2856\bin\sonar-scanner.bat
Mac/Linux
sonar-scanner
```
四、数据层:最简单但最核心的防护
- 数据库权限隔离:新建数据库用户,仅授予对应库的增删改查权限,禁止授予ALL PRIVILEGES,以MySQL为例:
```
CREATE USER 'site_db_user'@'localhost' IDENTIFIED BY '≥16位强密码';
GRANT SELECT,INSERT,UPDATE,DELETE ON site_db. TO 'site_db_user'@'localhost';
FLUSH PRIVILEGES;
```
- 核心数据加密:用户密码用PHP的password_hash()/password_verify(),Java的BCrypt,不要用MD5/SHA1;手机号/身份证等敏感数据用AES-256-CBC加密,PHP示例:
```php
// 加密
function encrypt($data, $key, $iv) {
return openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);
}
// 解密
function decrypt($data, $key, $iv) {
return openssl_decrypt($data, 'AES-256-CBC', $key, 0, $iv);
}
// 生成随机密钥和IV(保存到服务器环境变量,不要写在代码里)
$key = bin2hex(random_bytes(32));
$iv = random_bytes(openssl_cipher_iv_length('AES-256-CBC'));
```
- 定期备份验证:用crontab每天凌晨3点备份MySQL数据库和站点文件,保存到本地+阿里云OSS免费额度(验证时每周随机下载1个备份解压/导入测试):
```
编辑crontab
crontab -e
添加以下内容
备份数据库(替换site_db_user、site_db、强密码、备份路径)
0 3 mysqldump -usite_db_user -p≥16位强密码 site_db | gzip > /home/site_backup/db_$(date +\%Y\%m\%d).sql.gz
备份站点文件
1 3 tar -zcvf /home/site_backup/html_$(date +\%Y\%m\%d).tar.gz /var/www/html
删除7天前的本地备份
2 3 find /home/site_backup -mtime +7 -name ".gz" -delete
```
五、监控层:用免费云监控+本地日志分析工具Fail2Ban
5.1 免费云监控覆盖基础资源
直接用阿里云、腾讯云、华为云的免费云监控额度,配置CPU≥80%、内存≥90%、磁盘≥95%、SSH暴力破解≥5次/分钟的短信/邮件预警。
5.2 Fail2Ban拦截SSH/HTTP暴力破解
以CentOS 8为例:
- 安装Fail2Ban:
yum install -y fail2ban
- 复制配置模板:
```
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
```
- 编辑vim /etc/fail2ban/jail.local,修改[DEFAULT]和[sshd]块:
```
[DEFAULT]
bantime = 3600 封禁1小时
findtime = 600 10分钟内
maxretry = 5 尝试5次失败就封禁
banaction = firewallcmd-ipset CentOS用这个
Ubuntu用banaction = ufw
[sshd]
enabled = true
port = 22222 自定义SSH端口
logpath = %(sshd_log)s
[nginx-http-auth]
enabled = true
port = http,https
logpath = %(nginx_access_log)s
```
- 重启Fail2Ban:
systemctl restart fail2ban