2024-01-23
23 阅读
想着提升下服务器安全策略,学习下开启及配置防火墙, Debian的防火墙是 ufw。
1. 安装 ufw
apt update
# 安装 ufw
apt install ufw
# 查看
ufw status
# Status: inactive 未运行
# Status: active 正常运行
2. 初始化
# 重置所有规则并关闭服务(可选,但推荐以确保干净)
ufw reset
# 设置默认禁止入站
ufw default deny incoming
# 设置默认允许出站(服务器主动访问外部,如 apt update, pip install 等需要)
ufw default allow outgoing
3. 增加所需规则
# 运行 SSH
ufw allow 22/tcp comment '默认ssh端口'
# 允许 HTTP
ufw allow 80/tcp comment 'HTTP 80'
# 允许 HTTPS
ufw allow 443/tcp comment 'HTTPS 443'
# 允许指定 IP 访问 指定端口
ufw allow from 192.168.1.222 to any port 3306
# 其它自定义端口
ufw allow 6666/tcp comment '程序 TCP 6666'
ufw allow 8888/udp comment '程序 UDP 8888'
4. 启动 ufw
# 开启服务
ufw enable
# 禁用服务
# ufw disable
5. 查看状态
# 查看状态及规则
ufw status
# 查看默认的传入/传出策略以及日志级别
ufw status verbose
# Status: active
# Logging: on (low)
# Default: deny (incoming), allow (outgoing), disabled (routed)
# New profiles: skip
#
# To Action From
# -- ------ ----
# 18022/tcp ALLOW IN Anywhere # SSH 22
# 80/tcp ALLOW IN Anywhere # HTTP 80
# 443/tcp ALLOW IN Anywhere # HTTPS 443
# ……
6. 调整删除规则
# 查看规则编号
ufw status numbered
# Status: active
# To Action From
# -- ------ ----
# [ 1] 18022/tcp ALLOW IN Anywhere # SSH 22
# [ 2] 80/tcp ALLOW IN Anywhere # HTTP 80
# [ 3] 443/tcp ALLOW IN Anywhere # HTTPS 443
# ……
# 上述 [1][2][3] 即为规则编号
# 若要删除编号为 3 的规则,运行
ufw delete 3
OK,完成常规防火墙配置,完成服务器部分安全策略提升。
2024-01-10
28 阅读
没事干看了下日志,发现UWSGI里好多 NOT FOUND 的空路径,说是被漏扫记录啥的,感觉这些日志都没啥必要记录,想着完善下。
1. 定义匹配规则
# 定义恶意路径匹配规则 (大小写不敏感)
# 如果 URI 匹配到以下任意正则,$block_scanner 变为 1,否则为 0
map $request_uri $block_scanner {
default 0;
# 常见后台/管理路径
~*^/(wp-admin|wp-login|administrator|phpmyadmin|pma|mysql|webadmin|shell|cmd|console|manager|login|signin|auth) 1;
# 常见敏感文件/备份
~*^/.(php|git|svn|htaccess|htpasswd|env|config|bak|backup|sql|tar|gz|zip|rar|7z) 1;
# 常见漏洞利用路径 (ThinkPHP, Struts2, Log4j, Shellshock 等特征)
~*^/(index.php)/?(\?s=|\\x00) 1;
~*^/(solr|actuator|eureka|swagger|api-docs) 1;
~*^/(cgi-bin|scripts|bin|tmp) 1;
~*\.(asp|aspx|jsp|jspx|php5|phtml|pl|py|rb|sh|exe|bat|cmd)$ 1;
# 特定漏洞探测字符串
~*\$(\{|%24\{) 1; # Log4j JNDI 特征
~*union.*select 1; # 基础 SQL 注入探测 (注意:复杂SQL注入建议由WAF处理,此处仅做简单特征)
~*(\.\.\/|\.\.%2f|\%2e\%2e\/|\%2e\%2e\%2f) 1; # 目录遍历
}
2. 配置 main 日志格式,要不然后续配置检查会报错
# /etc/nginx/nginx.conf
http {
……
# 定义名为 "main" 的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
……
}
3. 引用规则及配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name domain.cn;
# 拦截恶意扫描路径
if ($block_scanner) {
return 444; # 444表示直接关闭连接,不返回任何响应,也可返回 403、404
}
# 限制 HTTP 方法 (只允许常用方法)
if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH)$) {
return 405;
}
# 如果 block_scanner=1,记录日志,其它不记录
access_log /srv/log/codenotes.access.log main if=$block_scanner=0;
……
}
4. 检查并重启,完成相应安全强化
# 检查配置
nginx -t
# 重启 nginx
nginx -s reload
OK,完成…
2024-01-05
38 阅读
HTTP 报文是以明文形式传输的,会被各种浏览器标记为不安全。
HTTPS 则提供了一个加密传输的通道,相比较更为安全可靠。但专业的证书要钱,不过有个免费的Let's Encrypt,使用 Certbot 方便快捷,记录下大致的过程。
1. 安装必要工具
sudo apt update
# Certbot 是 Let's Encrypt 提供的证书管理工具
sudo apt install certbot
# python3-certbot-nginx 是专门针对 Nginx 的插件,其可以自动修改 Nginx 配置文件
sudo apt install python3-certbot-nginx
2. 获取并安装证书
# 如果多个域名,可以执行多次,或直接在后面增加 -d 域名,但会被归属到第一个 -d 的域名中,实际不影响任何安全
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# 执行上述语句后,会有交互确认:
# 1. 邮箱输入:输入你的邮箱用于过期提醒。
# 2. 服务条款:同意即可。Y
# 3. 重定向 HTTP 到 HTTPS:Certbot 会询问是否将 HTTP 流量重定向到 HTTPS。 选择 2 (Redirect) 或 Yes(强烈推荐)。这会让 Nginx 自动把所有 http:// 请求转为 https://
# 执行成功后,Certbot 会在 /etc/letsencrypt/live/yourdomain.com/ 下生成相应的证书文件,并自动修改 Nginx 配置文件,添加 SSL 监听端口和证书路径。
# 可自行查看 Nginx 相关配置文件并确认重载。
3. 查看所有证书
sudo certbot certificates
# 一般会显示证书名称、域名信息、过期时间、证书路径等信息
# Saving debug log to /var/log/letsencrypt/letsencrypt.log
#
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Found the following certs:
# Certificate Name: yourdomain.com
# Domains: yourdomain.com www.yourdomain.com
# Expiry Date: 2024-01-05 12:00:00+00:00 (VALID: 89 days)
# Certificate Path: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
# Private Key Path: /etc/letsencrypt/live/yourdomain.com/privkey.pem
# Certificate Name: another-domain.com
# Domains: another-domain.com
# Expiry Date: 2024-01-05 08:30:00+00:00 (VALID: 64 days)
# Certificate Path: /etc/letsencrypt/live/another-domain.com/fullchain.pem
# Private Key Path: /etc/letsencrypt/live/another-domain.com/privkey.pem
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4. 测试自动续期
# Let's Encrypt 证书有效期为 90 天。
sudo certbot renew --dry-run
# 如果输出显示 "Congratulations, all renewals succeeded",则自动续期配置正常。
5. 删除证书
# 推荐,交互式删除,根据列出的信息,选择需要删除的证书即可。
sudo certbot delete
6. Django 安全强化配置(参考)
# settings.py
# 强制所有请求使用 HTTPS
SECURE_SSL_REDIRECT = True
# 如果 Django 运行在反向代理(如 Nginx)后面,需要信任代理的 Header
# 否则 Django 无法识别请求原本是 HTTP 还是 HTTPS
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# 设置 HSTS (HTTP Strict Transport Security),增强安全性
# 单位是秒,例如 31536000 表示一年
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# 确保 Session ID 和 CSRF Token 只在 HTTPS 下传输
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# 防止 JavaScript 访问 Cookie (防 XSS)
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True
2023-12-18
36 阅读
1. 更新
# Debian系统中,已有shadowsocks应用,直接更新安装即可
sudo apt update
# 安装
sudo apt install shadowsocks-libev
2. 修改完善相关配置
# 配置文件路径
vim /etc/shadowsocks-libev/config.json
# 修改相关配置
{
# 任意IP访问
"server":["0.0.0.0"],
"mode":"tcp_and_udp",
# 服务器端口,默认为8288
"server_port":8288,
# 本地端口,默认为1080
"local_port":1080,
# 密码,根据个人喜好修改
"password":"loveqiqi",
# 连接超时(单位:秒)
"timeout":36000,
# 加密方式
"method":"chacha20-ietf-poly1305"
}
3. 客户端下载
https://github.com/shadowsocks
2023-12-15
26 阅读
1. 更新下载MySQL资源仓库
https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb
2. 安装更新
sudo dpkg -i mysql-apt-config_0.8.36-1_all.deb
3. 更新升级
sudo apt update
sudo apt upgrade
4. 安装MySQL
sudu apt install mysql-server
# 期间会提示输入密码, 并确认密码
5. 修改完善MySQL相关配置
# 配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 允许远程访问
bind-address = 0.0.0.0
# 修改端口号
port = 13306
# 保留 7 天的 binlog
binlog_expire_logs_seconds = 604800
# 内存优化,按需
performance_schema = off
# 进入MySQL后,执行相关语句允许远程访问(MySQL 5.7.40版本后)
> CREATE USER 'root'@'%' IDENTIFIED BY '密码';
> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
# 进入MySQL后,执行相关语句允许远程访问(5.7.38版本之前)
> GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
# 查看端口
netstat -tulnp | grep mysql