" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

服务器 基线/安全 检查

PySuper
2021-11-17 / 0 评论 / 0 点赞 / 15 阅读 / 10976 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

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 账号锁定策略

  1. 执行系统命令 passwd -S nginx 来查看锁定状态 出现 Password locked 证明锁定成功 , 如:nginx LK … (Password locked.) 或 nginx L …

  2. 默认符合,修改后才有(默认已符合)

  3. 执行系统命令 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_tokensserver_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) 配置

禁用符号链接以防止各种安全风险

  • 编辑 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 范围。

  1. 登录数据库,执行 use mysql;
  2. 执行语句 select user,Host from user where Host='%'; 查看 HOST 为通配符的用户;
  3. 删除用户或者修改用户 host 字段
    1. 删除语句:DROP USER 'user_name'@'%';
    2. 更新语句:update user set host = <new_host> where host = '%';
  4. 执行 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
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区