Redis
开启 redis 密码认证
redis 在 redis.conf 配置文件中,设置配置项 requirepass, 开户密码认证
redis 因查询效率高,auth 这种命令每秒能处理 9w 次以上,简单的 redis 的密码极容易为攻击者暴破
打开 redis.conf,找到 requirepass 所在的地方,修改为指定的密码
密码应符合复杂性要求:
- 长度8位以上
- 包含以下四类字符中的三类字符:
- 英文大写字母(A 到 Z)
- 英文小写字母(a 到 z)
- 10 个基本数字(0 到 9)
- 非字母字符(例如 !、$、#、%、@、^、&)
- 避免使用已公开的弱口令,如:abcd.1234 、admin@123等
再去掉前面的 #号注释符,然后重启 redis
禁止使用 root 用户启动
使用 root 权限去运行网络服务是比较有风险的(nginx 和 apache 都是有独立的 work 用户,而 redis 没有)
redis crackit 漏洞就是利用 root 用户的权限来替换或者增加 authorized_keys,来获取 root 登录权限的
使用 root 切换到 redis 用户启动服务:
useradd -s /sbin/nolog -M redis
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &
禁止监听在公网
Redis 监听在 0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。
- 在 redis 的配置文件 redis.conf 中配置如下:
- bind 127.0.0.1 或者内网 IP
- 重启 redis
限制 redis 配置文件访问权限
因为 redis 密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置 redis 配置文件权限为 600
执行以下命令修改配置文件权限:
chmod 600 /<filepath>/redis.conf
修改默认 6379 端口
避免使用熟知的端口,降低被初级扫描的风险
- 编辑文件 redis 的配置文件 redis.conf
- 找到包含 port 的行,将默认的 6379 修改为自定义的端口号
- 重启 redis
禁用或者重命名危险命令
Redis 中线上使用 keys * 命令,也是非常危险的
因此线上的 Redis 必须考虑禁用一些危险的命令,或者尽量避免谁都可以使用这些命令
Redis 没有完整的管理系统,但是也提供了一些方案
修改 redis.conf 文件,添加
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""
然后重启 redis
重命名为 “” 代表禁用命令
如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC
打开保护模式
redis 默认开启保护模式。要是配置里没有指定 bind 和密码,开启该参数后,redis 只能本地访问,拒绝外部访问
redis.conf 安全设置:
protected-mode yes # 打开保护模式
Nginx
确保已禁用自动索引模块
自动索引模块处理以斜杠字符结尾的请求。此功能启用目录列表,这在攻击者侦察中可能很有用,因此应将其禁用。
执行以下操作以禁用自动索引模块: 搜索 NGINX 配置文件(NGINX.conf 和任何包含的配置文件)以查找 autoindex 指令。
egrep -i '^\s*autoindex\s+' <main_config_path> egrep -i '^\s*autoindex\s+' <sub_config_path>
在 location 下删除或者修改为 autoindex off;
针对 Nginx SSL 协议进行安全加固
Nginx SSL 协议的加密策略进行加固
Nginx SSL 协议采用 TLSv1.2:
- 1、打开
conf/nginx.conf
配置文件(或主配置文件中的 inlude 文件) - 2、配置
server {
...
ssl_protocols TLSv1.2;
...
}
备注:配置此项请确认 nginx 支持 OpenSSL,运行 nginx -V
如果返回中包含 built with OpenSSL
则表示支持 OpenSSL。
如不支持,可能需要增加配置 ssl_protocols TLSv1 TLSv1.1 TLSv1.2
确保 NGINX 配置文件权限为 644
把控配置文件权限以抵御外来攻击
修改 Nginx 配置文件权限:
- 执行
chmod 644 <conf_path>
来限制 Nginx 配置文件的权限 - <conf_path> 为配置文件的路径,如默认:/ 安装目录 /conf/nginx.conf 或者 /etc/nginx/nginx.conf
- 或用户自定义,请自行查找
Nginx 的 WEB 访问日志记录状态
应为每个核心站点启用 access_log 指令。默认情况下启用。
开启 Nginx 的 WEB 访问日志记录:
- 1、打开
conf/nginx.conf
配置文件,含主配置文件中 include 项包含的子配置文件; - 2、在 http 下配置
access_log
项:access_log logs/host.access.log main;
- 3、并在主配置文件,及主配置文件下的 include 文件中 删除
off
项或配置为适当值
检查 Nginx 进程启动账号
Nginx 进程启动账号状态,降低被攻击概率
修改 Nginx 进程启动账号:
- 1、打开
conf/nginx.conf
配置文件 - 2、查看配置文件的 user 配置项,确认是非 root 启动的
- 3、如果是
root
启动,修改成nobody
或者nginx账号
- 4、修改完配置文件之后需要重新启动 Nginx
检查是否配置 Nginx 账号锁定策略
执行系统命令 passwd -S nginx 来查看锁定状态 出现 Password locked 证明锁定成功 , 如:nginx LK … (Password locked.) 或 nginx L …
默认符合,修改后才有(默认已符合)
执行系统命令 passwd -l nginx 进行锁定
配置 Nginx 账号登录锁定策略:
- Nginx 服务建议使用非 root 用户 (如 nginx,nobody) 启动,并且确保启动用户的状态为锁定状态。
- 可执行 passwd -l <Nginx 启动用户 > 如
passwd -l nginx
来锁定 Nginx 服务的启动用户 - 命令
passwd -S <用户>
如passwd -S nginx
可查看用户状态 - 修改配置文件中的 nginx 启动用户修改为 nginx 或 nobody,如:
user nobody;
- 如果您是 docker 用户,可忽略该项(或添加白名单)
隐藏 Nginx 服务的 Banner
Nginx 服务的 Banner 隐藏状态
Nginx 后端服务指定的 Header 隐藏状态隐藏 Nginx 服务 Banner 的状态:
- 打开
conf/nginx.conf
配置文件 - 在 server 栏目下,配置
server_tokens
项server_tokens off
- 如出现多项不支持,执行
ln <conf_path> /etc/nginx/nginx.conf
Nginx 后端服务指定的 Header 隐藏状态
隐藏 Nginx 后端服务 X-Powered-By 头
隐藏 Nginx 后端服务指定 Header 的状态:
- 打开
conf/nginx.conf
配置文件 - 在
http
下配置proxy_hide_header
项 - 增加或修改为
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
MySQL
确保 MYSQL_PWD 环境变量未设置
MYSQL_PWD 环境变量的使用意味着 MYSQL 凭证的明文存储,极大增加 MySQL 凭据泄露风险。
删除系统环境变量中 MySQL 密码 (MYSQL_PWD) 配置
禁用 symbolic-links 选项
禁用符号链接以防止各种安全风险
- 编辑 Mysql 配置文件 <conf_path>/my.cnf,在 [mysqld] 段落中配置
symbolic-links=0
- 5.6 及以上版本应该配置为
skip_symbolic_links=yes
,并重启 mysql 服务
匿名登录检查
检查 MySQL 服务是否允许匿名登录
登录 MySQL 数据库,执行以下命令删除匿名账户:
delete from user where user='';
flush privileges;
确保没有用户配置了通配符主机名
避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网
执行 SQL 更新语句,为每个用户指定允许连接的 host 范围。
- 登录数据库,执行
use mysql;
; - 执行语句
select user,Host from user where Host='%';
查看 HOST 为通配符的用户; - 删除用户或者修改用户 host 字段
- 删除语句:
DROP USER 'user_name'@'%';
- 更新语句:
update user set host = <new_host> where host = '%';
。
- 删除语句:
- 执行 SQL 语句:
OPTIMIZE TABLE user;
flush privileges;
确保 log-raw 选项没有配置为 ON
当 log-raw 记录启用时,有权访问日志文件的人可能会看到纯文本密码。
编辑 Mysql 配置文件 <conf_path>/my.cnf,删除 log-raw 参数,并重启 mysql 服务
确保配置了 log-error 选项
启用错误日志可以提高检测针对 mysql 和其他关键消息的恶意尝试的能力
例如,如果错误日志未启用,则连接错误可能会被忽略
-
编辑 Mysql 配置文件 <conf_path>/my.cnf
-
在 [mysqld_safe] 段落中配置 log-error 参数,<log_path > 代表存放日志文件路径
-
如:/var/log/mysqld.log,并重启 mysql 服务:
log-error=<log_path>
删除 ‘test’ 数据库
测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少 MySQL 服务器的攻击面。
登录数据库执行以下 SQL 语句删除 test 数据库
DROP DATABASE test;
flush privileges;
禁止 --skip-grant-tables 启动 MySQL
使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。
编辑 Mysql 配置文件 <conf_path>/my.cnf,删除 skip-grant-tables 参数,并重启 mysql 服务
为 MySQL 使用专用的最低特权账户
使用最低权限账户运行服务可减小 MySQL 天生漏洞的影响
受限账户将无法访问与 MySQL 无关的资源,例如操作系统配置
使用非 root 和非 sudo 权限用户启动 MySQL 服务
修改默认 3306 端口
避免使用熟知的端口,降低被初级扫描的风险
-
编辑 <conf_path>/my.cnf 文件
-
[mysqld] 段落中配置新的端口参数,并重启 MySQL 服务:
port=3506
禁用 local-infile 选项
禁用 local_infile 选项会降低攻击者通过 SQL 注入漏洞器读取敏感文件的能力
- 编辑 Mysql 配置文件 <conf_path>/my.cnf
- 在 [mysqld] 段落中配置 local-infile 参数为 0,并重启 mysql 服务:
local-infile=0
评论区