# 保持系统更新
sudo apt update && sudo apt upgrade -y # Debian/Ubuntu
sudo yum update -y # CentOS/RHEL
# 移除不必要的软件包
sudo apt autoremove --purge
sudo yum autoremove
# 使用UFW (Ubuntu)
sudo ufw enable
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
# 使用firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# 编辑SSH配置
sudo nano /etc/ssh/sshd_config
# 推荐设置:
Port 2222 # 更改默认端口
PermitRootLogin no # 禁止root登录
PasswordAuthentication no # 仅允许密钥认证
MaxAuthTries 3 # 最大尝试次数
ClientAliveInterval 300 # 超时设置
AllowUsers your_username # 只允许特定用户
# 重启SSH服务
sudo systemctl restart sshd
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
# SSL配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全头部
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.example.com;";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# 其他安全设置
server_tokens off;
client_max_body_size 10M;
location / {
# 应用特定的安全设置
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 限制HTTP方法
limit_except GET POST PUT DELETE {
deny all;
}
}
# 禁止访问敏感文件
location ~ /\.(?!well-known) {
deny all;
}
location ~* \.(log|sql|conf|ini|bak|swp)$ {
deny all;
}
}
<VirtualHost *:80>
ServerName yourdomain.com
Redirect permanent / https://yourdomain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
ServerSignature Off
TraceEnable Off
<Directory /var/www/html>
Options -Indexes
AllowOverride None
Require all granted
<LimitExcept GET POST PUT DELETE>
Deny from all
</LimitExcept>
</Directory>
<FilesMatch "\.(log|sql|conf|ini|bak|swp)$">
Require all denied
</FilesMatch>
</VirtualHost>
# Python示例 - 使用Flask
from flask import Flask, request, abort
import re
app = Flask(__name__)
@app.route('/api/user', methods=['POST'])
def create_user():
username = request.form.get('username')
# 输入验证
if not username or not re.match(r'^[a-zA-Z0-9_-]{3,20}$', username):
abort(400, description="Invalid username")
# 处理逻辑...
# 使用参数化查询
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
// Express.js示例
const session = require('express-session');
const helmet = require('helmet');
app.use(helmet());
app.use(session({
secret: 'complex_secret_key',
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // 仅HTTPS
httpOnly: true, // 防止XSS
sameSite: 'strict', // 防止CSRF
maxAge: 24 * 60 * 60 * 1000 // 24小时
}
}));
# 设置日志轮转
sudo nano /etc/logrotate.d/yourapp
# 示例配置
/var/log/yourapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
systemctl reload yourapp > /dev/null
endscript
}
# 安装和配置fail2ban
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑配置文件
sudo nano /etc/fail2ban/jail.local
# 添加Web应用保护
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 86400
# 安装Lynis进行安全审计
sudo apt install lynis
sudo lynis audit system
# 使用OpenVAS进行漏洞扫描
sudo apt install openvas
sudo gvm-setup
# 示例备份脚本
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/backups"
MYSQL_USER="backup_user"
MYSQL_PASS="secure_password"
# 备份数据库
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# 备份应用数据
tar -czf $BACKUP_DIR/app_$DATE.tar.gz /var/www/html
# 保留最近7天备份
find $BACKUP_DIR -type f -mtime +7 -delete
通过实施以上措施,您可以显著提高Linux服务器上Web接口应用程序的安全性。请记住,安全是一个持续的过程,需要定期审查和更新安全策略。