文章目录
- 一、系统安全基线
-
- 1.1 系统登录弱口令
- 1.2 确保root是唯一的UID为0的帐户
- 1.3 开启地址空间布局随机化
- 1.4 设置用户权限配置文件的权限
- 1.5 访问控制配置文件的权限设置
- 1.6 确保SSH LogLevel设置为INFO
- 1.7 确保rsyslog服务已启用安全审计
- 1.8 确保SSH MaxAuthTries设置为3到6之间
- 1.9 确保密码到期警告天数为7或更多
- 1.10 禁止SSH空密码用户登录 SSH服务配置
- 1.11 检查系统空密码账户
- 1.12 检查密码重用是否受限制
- 1.13 密码复杂度检查
- 1.14 设置SSH空闲超时退出时间
- 1.15 设置密码修改最小间隔时间
- 1.16 设置密码失效时间
- 二、Nginx安全基线
- 三、Redis安全基线
- 四、ZooKeeper安全基线
- 五、MySQL安全基线
- 六、Tomcat安全基线
- 七、Docker安全基线
- 八、Elasticsearch安全基线
一、系统安全基线
1.1 系统登录弱口令
描述
若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复。
加固建议
执行命令 passwd [<user>]
,然后根据提示输入新口令完成修改,其中 <user>
为用户名,如果不输入则修改的是当前用户的口令。
口令应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等
1.2 确保root是唯一的UID为0的帐户
描述
除root
以外其他UID
为0
的用户都应该删除,或者为其分配新的UID
加固建议
除root
以外其他UID
为0
的用户,都应该删除,或者为其分配新的UID
查看命令:
cat /etc/passwd | awk -F: '($3 == 0) { print $1 }'|grep -v '^root$'
1.3 开启地址空间布局随机化
描述
它将进程的内存空间地址随机化来增大入侵者预测目的地址难度,从而降低进程被成功入侵的风险
加固建议
在/etc/sysctl.conf
或/etc/sysctl.d/*
文件中设置以下参数:
kernel.randomize_va_space = 2
执行命令: sysctl -w kernel.randomize_va_space=2
1.4 设置用户权限配置文件的权限
描述
设置用户权限配置文件的权限
加固建议
执行以下5条命令
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow
chmod 0644 /etc/group
chmod 0644 /etc/passwd
chmod 0400 /etc/shadow
chmod 0400 /etc/gshadow
1.5 访问控制配置文件的权限设置
描述
访问控制配置文件的权限设置
加固建议
运行以下4条命令:
chown root:root /etc/hosts.allow
chown root:root /etc/hosts.deny
chmod 644 /etc/hosts.deny
chmod 644 /etc/hosts.allow
如果您是redhat8
用户
chown root:root /etc/ssh/sshd_config
chmod 600 /etc/ssh/sshd_config
1.6 确保SSH LogLevel设置为INFO
描述
确保SSH LogLevel
设置为INFO
,记录登录和注销活动
加固建议
编辑 /etc/ssh/sshd_config
文件以按如下方式设置参数(取消注释):
LogLevel INFO
1.7 确保rsyslog服务已启用安全审计
描述
确保rsyslog
服务已启用,记录日志用于审计
加固建议
运行以下命令启用rsyslog
服务:
systemctl enable rsyslog
systemctl start rsyslog
1.8 确保SSH MaxAuthTries设置为3到6之间
描述
设置较低的Max AuthTrimes
参数将降低SSH
服务器被暴力攻击成功的风险。
加固建议
在/etc/ssh/sshd_config
中取消MaxAuthTries
注释符号#
,设置最大密码尝试失败次数3-6
,建议为4
:
MaxAuthTries 4
1.9 确保密码到期警告天数为7或更多
描述
确保密码到期警告天数为7
或更多
加固建议
在 /etc/login.defs
中将 PASS_WARN_AGE
参数设置为7-14
之间,建议为7
:
PASS_WARN_AGE 7
同时执行命令使root
用户设置生效:
chage --warndays 7 root
1.10 禁止SSH空密码用户登录 SSH服务配置
描述
禁止SSH
空密码用户登录
加固建议
编辑文件/etc/ssh/sshd_config
,将PermitEmptyPasswords
配置为no
:
PermitEmptyPasswords no
1.11 检查系统空密码账户
描述
检查系统空密码账户
加固建议
为用户设置一个非空密码,或者执行passwd -l <username>
锁定用户
1.12 检查密码重用是否受限制
描述
强制用户不重用最近使用的密码,降低密码猜测攻击风险
加固建议
在/etc/pam.d/password-auth
和/etc/pam.d/system-auth
中password sufficient pam_unix.so
这行的末尾配置remember
参数为5-24
之间,原来的内容不用更改,只在末尾加了remember=5
。
1.13 密码复杂度检查
描述
检查密码长度和密码是否使用多种字符类型
加固建议
编辑/etc/security/pwquality.conf
,把minlen
(密码最小长度)设置为8-32
位,把minclass
(至少包含小写字母、大写字母、数字、特殊字符等4
类字符中等3
类或4
类)设置为3
或4
。如:
minlen=10
minclass=3
1.14 设置SSH空闲超时退出时间
描述
设置SSH
空闲超时退出时间,可降低未授权用户访问其他用户ssh
会话的风险
加固建议
编辑/etc/ssh/sshd_config
,将ClientAliveInterval
设置为300
到900
,即5-15
分钟,将ClientAliveCountMax
设置为0-3
之间。
ClientAliveInterval 600
ClientAliveCountMax 2
1.15 设置密码修改最小间隔时间
描述
设置密码修改最小间隔时间,限制密码更改过于频繁
加固建议
在 /etc/login.defs
中将 PASS_MIN_DAYS
参数设置为7-14
之间,建议为7
:
PASS_MIN_DAYS 7
需同时执行命令为root用户设置:
chage --mindays 7 root
1.16 设置密码失效时间
描述
设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项。
加固建议
使用非密码登陆方式如密钥对,请忽略此项。
在 /etc/login.defs
中将 PASS_MAX_DAYS
参数设置为 60-180
之间,如:
PASS_MAX_DAYS 90
需同时执行命令设置root密码失效时间:
chage --maxdays 90 root
二、Nginx安全基线
2.1 确保已禁用自动索引模块
描述
自动索引模块处理以斜杠字符结尾的请求。此功能启用目录列表,这在攻击者侦察中可能很有用,因此应将其禁用。
加固建议
执行以下操作以禁用自动索引模块:
搜索 NGINX 配置文件( nginx.conf 和任何包含的配置文件)以查找 autoindex
指令。
egrep -i '^\s*autoindex\s+' <main_config_path> egrep -i '^\s*autoindex\s+' <sub_config_path>
在 location
下删除或者修改为 autoindex off;
2.2 针对Nginx SSL协议进行安全加固
描述
Nginx SSL 协议的加密策略进行加固
加固建议
Nginx SSL 协议采用 TLSv1.2:
打开 conf/nginx.conf
配置文件(或主配置文件中的 inlude
文件);
server {
...
ssl_protocols TLSv1.2;
...
}
备注:配置此项请确认 nginx 支持 OpenSSL
,运行 nginx -V
如果返回中包含 built with OpenSSL
则表示支持 OpenSSL
。 如不支持,可能需要增加配置 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
如果尚未配置 ssl 协议,请尽快配置(参考连接https://www.nginx.cn/doc/optional/ssl.html)
2.3 确保NGINX配置文件权限为644
描述
把控配置文件权限以抵御外来攻击
加固建议
修改 Nginx 配置文件权限: 执行 chmod 644 <conf_path>
来限制 Nginx 配置文件的权限;
(<conf_path>
为配置文件的路径,如默认 /安装目录/conf/nginx.conf
或者 /etc/nginx/nginx.conf
,或用户自定义,请 自行查找)
2.4 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
项或配置为适当值
2.5 隐藏Nginx服务的Banner
描述
Nginx 服务的 Banner 隐藏状态
加固建议
Nginx 后端服务指定的 Header 隐藏状态隐藏 Nginx 服务 Banner 的状态:
1、打开 conf/nginx.conf
配置文件;
2、在 server
栏目下,配置 server_tokens
项 server_tokens off;
如出现多项不支持,执行 ln <conf_path> /etc/nginx/nginx.conf
2.6 Nginx后端服务指定的Header隐藏状态
描述
隐藏 Nginx 后端服务 X-Powered-By
头
加固建议
隐藏 Nginx 后端服务指定Header的状态:
1、打开 conf/nginx.conf
配置文件;
2、在 http 下配置 proxy_hide_header
项;
增加或修改为 proxy_hide_header X-Powered-By;
proxy_hide_header Server;
2.7 检查Nginx进程启动账号
描述
Nginx 进程启动账号状态,降低被攻击概率
加固建议
修改 Nginx 进程启动账号:
1、打开 conf/nginx.conf
配置文件;
2、查看配置文件的 user
配置项,确认是非 root
启动的;
3、如果是 root
启动,修改成 nobody
或者 nginx
账号;
备注: 4、修改完配置文件之后需要重新启动 Nginx。
2.8 检查是否配置Nginx账号锁定策略
描述
1.执行系统命令 passwd -S nginx
来查看锁定状态
出现 Password locked
证明锁定成功
如:nginx LK 2020-12-29 -1 -1 -1 -1 (Password locked.)
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
用户,可忽略该项(或添加白名单)
三、Redis安全基线
3.1 Redis未授权访问高危风险
描述
Redis 端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。
加固建议
可以使用以下方法修复:
1、为 Redis 服务配置认证,在配置文件 redis.conf
中 requirepass
配置复杂密码,然后重启 redis
。
2、在 Redis 的配置文件 redis.conf
中配置如下: bind 127.0.0.1
,只允许本机访问,然后重启 redis
3.2 开启redis密码认证,并设置高复杂度密码
描述
redis
在 redis.conf
配置文件中,设置配置项 requirepass
, 开户密码认证。
redis
因查询效率高,auth
这种命令每秒能处理9w次以上,简单的redis
的密码极容易为攻击者暴破。
加固建议
打开 redis.conf
,找到 requirepass
所在的地方,修改为指定的密码,密码应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等
再去掉前面的#号注释符,然后重启 redis
3.3 修改默认6379端口
描述
避免使用熟知的端口,降低被初级扫描的风险
加固建议
编辑文件 redis
的配置文件 redis.conf
,找到包含 port
的行,将默认的 6379
修改为自定义的端口号,然后重启 redis
3.4 打开保护模式
描述
redis
默认开启保护模式。要是配置里没有指定 bind
和 密码,开启该参数后,redis
只能本地访问,拒绝外部访问。
加固建议
redis.conf
安全设置: # 打开保护模式 protected-mode yes
3.5 禁用或者重命名危险命令
描述
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
3.6 限制redis 配置文件访问权限
描述
因为 redis
密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis
配置文件权限为600
加固建议
执行以下命令修改配置文件权限:
chmod 600 /<filepath>/redis.conf
3.7 禁止使用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 &
3.8 禁止监听在公网
描述
Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。
加固建议
在redis
的配置文件redis.conf
中配置如下: bind 127.0.0.1
或者内网IP
,然后重启redis
四、ZooKeeper安全基线
4.1 ZooKeeper未授权访问
描述
ZooKeeper 在未设置访问控制情况下,攻击者可通过执行 envi
命令获得系统大量的敏感信息,任务用户或者客户端不需要认证就可以连上 zk
的服务端,并且可以对 znode
进行增删等操作,非常不安全的,极易被攻击和篡改。
加固建议
可以使用以下方法修复
限制 Zookeeper 直接暴露在公网,将端口绑定地址改为127.0.0.1
设置访问控制
- 增加一个认证用户
addauth digest
用户名:密码明文 - 设置访问控制权限
setAcl /path auth
:用户名:密码明文:权限
例如给根目录设置权限:setAcl / auth:user1:password1:cdrwa
设置 IP 白名单访问控制 如给192.168.0.0/24
网段设置白名单,在设置IP白名单时,将本机ip 127.0.0.1
也加上,让本机也可以访问及修改
setAcl / ip:127.0.0.1:cdrwa,ip:192.168.0.1/24:cdrwa
五、MySQL安全基线
5.1 禁用symbolic-links选项
描述
禁用符号链接以防止各种安全风险
加固建议
编辑 Mysql 配置文件 <conf_path>/my.cnf
,在 mysqld
段落中配置 symbolic-links=0
,5.6及以上版本应该配置为 skip_symbolic_links=yes
,并重启 mysql
服务。
5.2 匿名登录检查
描述
检查 MySQL 服务是否允许匿名登录
加固建议
登录 MySQL 数据库,执行以下命令删除匿名账户:
delete from user where user='';
flush privileges;
5.3 确保log-raw选项没有配置为ON
描述
当 log-raw
记录启用时,有权访问日志文件的人可能会看到纯文本密码。
加固建议
编辑 Mysql 配置文件 <conf_path>/my.cnf
,删除 log-raw
参数,并重启 mysql
服务
5.4 确保配置了log-error选项
描述
启用错误日志可以提高检测针对 mysql
和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略。
加固建议
编辑 Mysql 配置文件 <conf_path>/my.cnf
,在 mysqld_safe
段落中配置 log-error
参数,<log_path>
代表存放日志文件路径,如:/var/log/mysqld.log
,并重启 mysql
服务:
log-error=<log_path>
5.5 删除’test’数据库
描述
测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少 MySQL
服务器的攻击面。
加固建议
登录数据库执行以下SQL语句删除 test
数据库:
DROP DATABASE test;
flush privileges;
5.6 禁止使用–skip-grant-tables选项启动MySQL服务
描述
使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。
加固建议
编辑 Mysql 配置文件 <conf_path>/my.cnf
,删除 skip-grant-tables
参数,并重启 mysql
服务
5.7 为MySQL服务使用专用的最低特权账户
描述
使用最低权限账户运行服务可减小 MySQL 天生漏洞的影响。受限账户将无法访问与 MySQL 无关的资源,例如操作系统配置。
加固建议
使用非 root
和非 sudo
权限用户启动 MySQL
服务
5.8 修改默认3306端口
描述
避免使用熟知的端口,降低被初级扫描的风险
加固建议
编辑 <conf_path>/my.cnf 文件,mysqld 段落中配置新的端口参数,并重启 MySQL 服务:
port=3506
5.9 确保MYSQL_PWD环境变量未设置
描述
MYSQL_PWD
环境变量的使用意味着 MYSQL
凭证的明文存储,极大增加 MySQL
凭据泄露风险。
加固建议
删除系统环境变量中 MySQL 密码(MYSQL_PWD
)配置
5.10 确保没有用户配置了通配符主机名
描述
避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网
加固建议
执行 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;
5.11 禁用local-infile选项
描述
禁用 local_infile
选项会降低攻击者通过 SQL
注入漏洞器读取敏感文件的能力
加固建议
编辑 Mysql 配置文件 <conf_path>/my.cnf
,在 mysqld
段落中配置 local-infile
参数为 0
,并重启 mysql
服务:
local-infile=0
5.12 数据库登录弱口令
描述
若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复。
加固建议
登录 mysql 数据库;
查看数据库用户密码信息:
SELECT user, host, authentication_string FROM user;
部分版本查询命令为:
SELECT user, host, password FROM user;
根据查询结果及弱密码告警信息修改具体用户的密码:
SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');
执行刷新命令:
flush privileges;
新口令应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等
六、Tomcat安全基线
6.1 限制服务器平台信息泄漏
描述
限制服务器平台信息泄漏会使攻击者更难确定哪些漏洞会影响服务器平台。
加固建议
- 进入Tomcat安装主目录的
lib
目录下,比如cd /usr/local/tomcat7/lib
- 执行:
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
修改文件 ServerInfo.properties
中的 server.info
和 server.number
的值,如分别改为:Apache/11.0.92
、11.0.92.0
- 执行:
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
- 重启Tomcat服务
6.2 避免为tomcat配置manager-gui弱口令
描述
tomcat-manger是Tomcat提供的web应用热部署功能,该功能具有较高权限,会直接控制Tomcat应用,应尽量避免使用此功能。如有特殊需求,请务必确保为该功能配置了强口令
加固建议
编辑 Tomcat 根目录下的配置文件 conf/tomcat-user.xml
,修改 user
节点的 password
属性值为复杂密码, 密码应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱密码,如:abcd.1234 、admin@123等
6.3 删除项目无关文件和目录
描述
Tomcat 安装提供了示例应用程序、文档和其他可能不用于生产程序及目录,存在极大安全风险,建议移除
加固建议
请删除 Tomcat 示例程序和目录、管理控制台等,即从 Tomcat
根目录的 webapps
目录,移出或删除 docs
、examples
、host-manager
、manager
目录。
6.4 禁止Tomcat显示目录文件列表
描述
Tomcat 允许显示目录文件列表会引发目录遍历漏洞
加固建议
修改 Tomcat
跟目录下的配置文件 conf/web.xml
,将 listings
的值设置为 false
。
<param-name>listings</param-name>
<param-value>false</param-value>
6.5 开启日志记录
描述
Tomcat 需要保存输出日志,以便于排除错误和发生安全事件时,进行分析和定位
加固建议
1、修改 Tomcat 根目录下的 conf/server.xml
文件。
2、取消 Host
节点下 Valve
节点的注释(如没有则添加)。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
3、重新启动Tomcat
6.6 禁止显示异常调试信息
描述
当请求处理期间发生运行时错误时,ApacheTomcat 将向请求者显示调试信息。建议不要向请求者提供此类调试信息。
加固建议
在 Tomcat 根目录下的 conf/web.xml
文件里面的 web-app
添加子节点:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
在 webapps
目录下创建 error.jsp
,定义自定义错误信息
6.7 Tomcat进程运行权限检测
描述
在运行 Internet
服务时,最好尽可能避免使用 root
用户运行,降低攻击者拿到服务器控制权限的机会。
加固建议
创建低权限的账号运行 Tomcat
,操作步骤如下:
1.新增tomcat用户
useradd tomcat
2.将tomcat目录owner改为tomcat
chown -R tomcat:tomcat /opt/tomcat
3.停止原来的tomcat服务
4.切换到tomcat用户
su - tomcat
5.重新启动tomcat
/opt/tomcat/bin/startup.sh
6.8 Tomcat目录权限检测
描述
在运行Tomcat服务时,避免使用root用户运行,tomcat目录(catalina.home、 catalina.base目录)所有者应改为非root的运行用户
加固建议
使用 chown -R <Tomcat启动用户所属组>:<Tomcat启动用户> <Tomcat目录>
修改 tomcat
目录文件所有者,如
chown -R tomcat:tomcat /usr/local/tomcat
6.9 禁止自动部署
描述
配置自动部署,容易被部署恶意或未经测试的应用程序,应将其禁用
加固建议
修改 Tomcat
根目录下的配置文件 conf/server.xml
,将 host
节点的 autoDeploy
属性设置为 “false”
,如果 host
的deployOnStartup
属性(如没有deployOnStartup
配置可以忽略)为“true”
,则也将其更改为“false”
七、Docker安全基线
7.1 确保docker.sock不被挂载
描述
docker.sock
挂载的容器容易被获取特殊权限,一旦危险进入到docker
中,严重影响了宿主机的安全
加固建议
按照提示<image name><container name>
查找启动的docker容器 , 以非docker
挂载docker.sock
的形式重新启动容器
docker stop <container name>
docker run [OPTIONS] <image name>或docker run [OPTIONS] <image id>
7.2 不共享主机的进程名称空间
描述
进程ID(PID)
命名空间隔离了进程ID
号空间,这意味着不同PID
命名空间中的进程可以具有相同的PID
。 这是容器和主机之间的进程级别隔离。
PID
名称空间提供了流程分离。 PID
命名空间删除了系统进程的视图,并允许进程ID
重复使用,包括PID1
。如果主机的PID
命名空间与容器共享,则它将基本上允许容器内的进程查看主机上的所有进程。 系统。 这破坏了主机和容器之间的进程级别隔离的好处。 有权访问容器的人最终可以知道主机系统上正在运行的所有进程,甚至可以从容器内部杀死主机系统进程。 这可能是灾难性的。 因此,请勿与容器共享主机的进程名称空间。
加固建议
不要使用--pid = host
参数启动容器。
7.3 不要使用特权容器
描述
使用--privileged
标志将所有Linux
内核功能赋予容器,从而覆盖--cap-add
和--cap-drop
标志。 确保不使用它。
--privileged
标志为容器提供了所有功能,并且还解除了设备cgroup
控制器强制执行的所有限制。
换句话说,容器可以完成主机可以做的几乎所有事情。 存在此标志是为了允许特殊用例,例如在Docker
中运行Docker
加固建议
不要使用--privileged
标志运行容器
7.4 不要使用aufs存储驱动程序
描述
“aufs”
存储驱动程序是最早的存储驱动程序。 它基于Linux
内核补丁集,该补丁集不太可能合并到主要Linux
内核中。 还已知“aufs”
驱动程序会导致一些严重的内核崩溃。 'aufs'
刚刚获得了Docker的支持。 最重要的是,许多使用最新Linux
内核的Linux
发行版都不支持'aufs'
驱动程序。
加固建议
不要明确使用“aufs”
作为存储驱动程序。 例如,请勿按以下方式启动Docker
守护程序:
若以systemctl
管理docker
服务则需要编辑/usr/lib/systemd/system/docker.service
的ExecStart
参数删除--storage-driver aufs
重启docker
服务
systemctl daemon-reload
systemctl restart docker
7.5 允许Docker对iptables进行更改
描述
iptables
用于在Linux内核中设置,维护和检查IP
数据包过滤器规则表。 允许Docker
守护程序对iptables
进行更改。
如果您选择这样做,Docker
将永远不会对您的系统iptables
规则进行更改。 如果允许,Docker
服务器将根据您为容器选择网络选项的方式自动对iptables
进行所需的更改。 建议让Docker
服务器自动对iptables
进行更改,以避免网络配置错误,这可能会妨碍容器之间以及与外界的通信。 此外,每次选择运行容器或修改网络选项时,它都可以避免更新iptables
的麻烦。
加固建议
不使用--iptables = false
参数运行Docker
守护程序。
若以systemctl
管理docker
服务则需要编辑/usr/lib/systemd/system/docker.service
的ExecStart
参数删除--iptables = false
, 重启docker
服务
systemctl daemon-reload
systemctl restart docker
7.6 设置日志记录级别
描述
设置适当的日志级别,将Docker
守护程序配置为记录您以后想要查看的事件。 基本日志级别为“info
”及更高版本将捕获除调试日志以外的所有日志。 直到且除非有必要,否则您不应在“debug
”日志级别运行Docker
守护程序
加固建议
运行Docker
守护程序,如下所示:
dockerd --log-level=info
若以systemctl
管理docker服务则需要编辑/usr/lib/systemd/system/docker.service
的ExecStart
参数添加--log-level="info"
,并重启docker
systemctl stop docker
systemctl start docker
7.7 确认docker相关的文件具有合适的权限
描述
确保可能包含敏感参数的文件和目录的安全对确保Docker
守护程序的正确和安全运行至关重要
加固建议
执行以下命令为docker
相关文件配置权限:
chown root:root /usr/lib/systemd/system/docker.service
chmod 644 /usr/lib/systemd/system/docker.service
chown root:root /usr/lib/systemd/system/docker.socket
chmod 644 /usr/lib/systemd/system/docker.socket
chown root:root /etc/docker
chmod 755 /etc/docker
若文件路径与实际系统中不同可以使用以下命令获取文件路径:
systemctl show -p FragmentPath docker.socket
systemctl show -p FragmentPath docker.service
7.8 将容器的根文件系统挂载为只读
描述
容器的根文件系统应被视为“黄金映像”,并且应避免对根文件系统的任何写操作。 您应该显式定义用于写入的容器卷。
您不应该在容器中写入数据。 属于容器的数据量应明确定义和管理。 在管理员控制他们希望开发人员在何处写入文件和错误的许多情况下,这很有用。
加固建议
添加“ --read-only
”标志,以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用,以强制容器的过程仅写入要保留的位置。 您应该按以下方式运行容器:
docker run --interactive --tty --read-only --volume <writable-volume> <Container Image Name or ID> <Command>
如果您是k8s
或其他容器编排软件编排的容器,请按照相应的安全策略配置或忽略。
7.9 为Docker启用内容信任
描述
默认情况下禁用内容信任。 您应该启用它。
内容信任提供了将数字签名用于发送到远程Docker
注册表和从远程Docker
注册表接收的数据的功能。 这些签名允许客户端验证特定图像标签的完整性和发布者。 这确保了容器图像的出处
加固建议
要在bash shell
中启用内容信任,请输入以下命令:
export DOCKER_CONTENT_TRUST=1
或者,在您的配置文件中设置此环境变量,以便在每次登录时启用内容信任。 内容信任目前仅适用于公共Docker Hub
的用户。 当前不适用于Docker Trusted Registry
或私有注册表。
7.10 限制容器的内存使用量
描述
默认情况下,Docker
主机上的所有容器均等地共享资源。 通过使用Docker
主机的资源管理功能(例如内存限制),您可以控制容器可能消耗的内存量。
默认情况下,容器可以使用主机上的所有内存。 您可以使用内存限制机制来防止由于一个容器消耗主机的所有资源而导致的服务拒绝,从而使同一主机上的其他容器无法执行其预期的功能。 对内存没有限制可能会导致一个问题,即一个容器很容易使整个系统不稳定并因此无法使用。
加固建议
仅使用所需的内存来运行容器。 始终使用--memory
参数运行容器。 您应该按以下方式启动容器:
docker run --interactive --tty --memory 256m <Container Image Name or ID>
7.11 不要在容器上挂载敏感的主机系统目录
描述
不允许将以下敏感的主机系统目录作为容器卷挂载,尤其是在读写模式下。
/boot
/dev
/etc
/lib
/proc
/sys
/usr
如果敏感目录以读写模式挂载,则可以对那些敏感目录中的文件进行更改。 这些更改可能会降低安全隐患或不必要的更改,这些更改可能会使Docker主机处于受损状态。
如果您是k8s或其他容器编排软件编排的容器,请依照相应的安全策略配置或忽略。
加固建议
不要在容器上挂载主机敏感目录,尤其是在读写模式下
7.12 限制容器之间的网络流量
描述
默认情况下,同一主机上的容器之间允许所有网络通信。 如果不需要,请限制所有容器间的通信。 将需要相互通信的特定容器链接在一起。默认情况下,同一主机上所有容器之间都启用了不受限制的网络流量。 因此,每个容器都有可能读取同一主机上整个容器网络上的所有数据包。 这可能会导致意外和不必要的信息泄露给其他容器。 因此,限制容器间的通信。
加固建议
在守护程序模式下运行docker
并传递--icc = false
作为参数。 例如,
/usr/bin/dockerd --icc=false
若使用systemctl
管理docker
服务则需要编辑
/usr/lib/systemd/system/docker.service
文件中的ExecStart
参数添加 --icc=false
选项 然后重启docker
服务
systemctl daemon-reload
systemctl restart docker
7.13 审核Docker文件和目录
描述
除了审核常规的Linux
文件系统和系统调用之外,还审核所有与Docker
相关的文件和目录。 Docker
守护程序以“ root
”特权运行。 其行为取决于某些关键文件和目录。如 /var/lib/docker
、/etc/docker
、docker.service
、 docker.socket
、/usr/bin/docker-containerd
、/usr/bin/docker-runc
等文件和目录
加固建议
在/etc/audit/audit.rules
与/etc/audit/rules.d/audit.rules
文件中添加以下行:
-w /var/lib/docker -k docker
-w /etc/docker -k docker
-w /usr/lib/systemd/system/docker.service -k docker
-w /usr/lib/systemd/system/docker.socket -k docker
-w /usr/bin/docker-containerd -k docker
-w /usr/bin/docker-runc -k docker
然后,重新启动audit
程序。 例如
service auditd restart
八、Elasticsearch安全基线
8.1 ES未授权访问
描述
ElasticSearch是一款Java编写的企业级搜索服务,未加固情况下启动服务存在未授权访问风险,可被非法查询或操作数据,需立即修复加固。
加固建议
限制http
端口的IP
访问,不对公网开放
修改主目录下 config/elasticsearch.yml
配置文件,将network.host
配置为内网地址或者127.0.0.1
network.host: 127.0.0.1
使用x-pack
插件为Elasticsearch
访问增加登录验证
- 在主目录下运行
bin/elasticsearch-plugin install x-pack
安装x-pack插件 config/elasticsearch.yml
配置文件增加以下配置
xpack.security.enabled: True
xpack.ml.enabled: true
运行命令
bin/x-pack/setup-passwords interactive
为ES
服务设置密码,重启ES
服务