1 用户安全策略调整
1.1 限制root登陆和 SSH登陆超时设置
1 | # 创建用户 |
1.2 普通用户口令锁定策略
1 | # 密码锁定策略/etc/pam.d/sshd |
1.3 口令生存周期(维护人员使用的账号)
1 | # 表示将此用户的密码最长使用天数设为180,最短使用天数设为0,过期前15天警告用户。 |
1.4 口令重复次数限制
1 | # /etc/pam.d/system-auth |
1.5 空密码账号
1 | # 空密码账号检查 |
1.6 无关账号删除或禁用
1.7 关闭telnet服务,默认没装
2 服务安全漏洞修复
2.1系统ssl+ssh
TLS protocol中间人攻击漏洞(CVE-2015-4000)
处理方案
升级openssl版本3.0.3
1 | # 安装gcc |
OpenSSH用户枚举(CVE-2018-15473)【POC】
OpenSSH <7.5
OpenSSH sshd拒绝服务漏洞(CVE-2016-10708)
OpenSSH设计漏洞(CVE-2017-15906)
OpenSSH用户枚举漏洞(CNVD-2018-20962)(CVE-2018-15919)
OpenSSH 命令注入漏洞
OpenSSH CBC模式信息泄露漏洞(CVE-2008-5161)
处理方案
升级openssh到8.9p1版本
1 | # 备注:先升级openssl再升级openssh |
启用 SSH 弱密钥交换算法
SSH SHA-1 HMAC 算法已启用
处理方案
1 | # sshd_config添加如下配置 |
2.2 nginx
HTTP/2实现安全漏洞(CVE-2019-9516)
nginx拒绝服务漏洞(CNVD-2016-00982)(CVE-2016-0746)
HTTP/2实现安全漏洞(CVE-2019-9511)
nginx拒绝服务漏洞(CNVD-2018-22805)(CVE-2018-16843)
HTTP/2实现安全漏洞(CVE-2019-9513)
nginx 安全漏洞(CVE-2021-23017)
nginx拒绝服务漏洞(CVE-2016-0747)
nginx ngx_http_mp4_module组件内存泄露漏洞(CVE-2018-16845)
Nginx 环境问题漏洞(CVE-2019-20372)
处理方案
升级nginx到1.21.6版本
Web服务器错误页面信息泄露
Web服务器HTTP头信息公开
处理方案
1 | # nginx配置 |
HTTP响应头使用X-XSS-Protection
处理方案
1 | # nginx.conf添加如下配置 |
HTTP响应头部使用X-Frame-Options
HTTP响应头X-Content-Options:nosniff
处理方案
1 | # nginx.conf配置添加 |
2.3 docker
Docker Remote API 未授权访问漏洞【POC】
处理方案:
1 | # docker启动命令配置修改只允许本机访问 |
2.4 tomcat
Apache Tomcat 代码问题漏洞(CVE-2020-9484)
Apache Tomcat 8.5.38 < 8.5.79 安全漏洞
Apache Tomcat 安全漏洞(CVE-2020-13943)
Apache Tomcat servlet / JSP容器默认文件
Apache Tomcat 8.5.0 < 8.5.68 漏洞
Apache Tomcat HTTP / 2请求标头混淆漏洞(CVE-2020-17527 )
更新到8.5.81版本
Apache ServerToken的信息披露
Apache HTTP Server版本
https://blog.51cto.com/meiling/2069452
https://wenku.baidu.com/view/0792e11e463610661ed9ad51f01dc281e53a56b1.html
1 | 在tomcat部署⽬录下lib中新建⽂件夹 |
2.5 mysal
暂不处理
2.6 apache
Apache HTTP Server 安全漏洞(CVE-2021-33193)
Apache 2.4.x < 2.4.47 多个漏洞
Apache 2.4.x < 2.4.53 多个漏洞
Apache HTTP Server 代码问题漏洞(CVE-2021-40438)
升级到2.4.54版本
隐藏版本信息
2.7 consul
Hashicorp Consul Web UI和API访问
处理方案:
容器禁止端口暴漏,通过容器名连接。
2.8 mapserv
不存在的页面(404)物理路径披露
jQuery跨站脚本漏洞(CNVD-2019-11839)(CVE-2019-11358)
更新gdw.lua
移除mapdata/client目录
2.9 redis
Redis服务器不受密码认证的保护【POC】
配置redis密码验证。
3 日志审计
3.1 postgresql开启日志审计
1、审计清单说明
1 | logging_collector # 是否开启日志收集开关,默认off,推荐on |
2、推荐的设置参数
1 | logging_collector = on |
1 | # 查看日志目录和日志文件名 |
3、参数修改方法
直接修改配置文件
postgresql.conf默认位于$PGDATA目录下。
vim /usr/data/pgsql/data/postgresql.conf
用超级用户运行:postgres=# SELECT pg_reload_conf();
show命令可以查询当前状态
4、 参考文档
http://t.zoukankan.com/tiandi-p-13568675.html
3.2 postgresql设置密码复杂度校验
3.2.1 默认密码校验策略
在PG中可以使用passwordcheck.so
模块实现密码复杂度校验的功能,不过这个工具的默认要求很低,只可用于简单的密码复杂度校验,默认检查规则如下:
- 密码长度大于8位
- 密码不能与用户名相同
- 密码必须包括字母和数字
3.2.1.1 passwordcheck密码校验
安装完PostgreSQL之后,默认是没有开启密码复杂度,为了数据库安全以及应对等保测评等要求,有时我们需要设置密码复杂度。
PostgreSQL支持通过动态库的方式扩展PG的功能,pg在使用这些功能时需要预加载相关的共享库。而密码复杂度可以通过预加载passwordcheck.so模块实现。
有几种设置可用于将共享库预加载到服务器中,如下:
- local_preload_libraries (string)
- session_preload_libraries (string)
- shared_preload_libraries (string)
下面介绍shared_preload_libraries (string)方式加载passwordcheck.so
模块,此模块可以检查密码,如果密码太弱,他会拒绝连接;创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用例如密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串。
3.2.1.2 shared_preload_libraries 方式启用passwordcheck.so模块
在PG库的数据目录下(centos默认路径为:/var/lib/pgsql/11/data
,windows默认路径为:D:\PostgreSQL\11\data
)找到postgresql.conf
文件,修改
修改内容行为:shared_preload_libraries = 'passwordcheck' # (change requires restart)。
修改完成后重启服务服务生效(systemctl restart postgresql-11
)。
3.2.1.3 验证
1 | # 提示密码太短 |
3.2.2 增强密码校验策略
通过修改源代码实现。本文记录如何通过修改源码passwordcheck.c
达到增强复杂度检验的目的,修改后验证规则如下:
- 密码长度大于8位
- 密码不能与用户名相同
- 密码必须包括字母
- 密码必须包括数字
- 密码必须包括特殊字符
3.2.2.1 步骤
3.2.2.1.1 实验环境
实验环境:CentOS7.6 + PG11.8 source code
源码下载地址: https://www.postgresql.org/ftp/source/v11.8/postgresql-11.8.tar.gz
源码安装文档:https://www.postgresql.org/docs/11/install-short.htm
3.2.2.1.2 使用方式
- 替换目录 ../postgresql-11.4/contrib/passwordcheck 下的 passwordcheck.c
- 编译安装 make && make install
- postgresql配置文件内修改 (postgresql.conf)
- shared_preload_libraries = ‘passwordcheck’
- passwordcheck.level = ‘true’
3.2.2.1.3 效果
当密码长度足够,不符合规则的时候,无法新建用户
3.2.2.1.4 源码修改
将下载后的源码解压缩, 找到postgresql-11.8/contrib/passwordcheck/passwordcheck.c
源文件,修改后保存退出。
1 | /*------------------------------------------------------------------------- |
3.2.2.1.5 编译
1 | ##编译安装pg server |
3.2.2.3 验证
首先开启passwordcheck验证, 修改参数文件postgresql.conf
1 | # 修改如下 |
重启实例生效
1 | pg_ctl restart |
测试
1 | # 提示密码太短 |
4.2.2.3 问题
警告
这里还存在个问题,就是通过\password
命令修改的话,可以输入不满足长度的密码,原因是使用\password
时passwordcheck
检查的是加密后的口令,官方文档提到过,检查md5
加密后的口令是很困难的,所以当passwordcheck
检查加密的口令时,只检查密码是否与用户名相同这一项,实际上是将用户名通过md5
加密后与数据库中的md5
密码做比较,如果相同,则报错口令不能与用户名相同。
1 | postgres=#\password bert |
3.2.2.4 参考
https://www.modb.pro/db/171257
https://www.cnblogs.com/Luckyness/p/11996834.html
https://github.com/Luckyness/passwordcheck/blob/master/passwordcheck.c