服务器基线安全-阿里云标准

文章目录

一、系统安全基线

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以外其他UID0的用户都应该删除,或者为其分配新的UID

加固建议

root以外其他UID0的用户,都应该删除,或者为其分配新的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-authpassword sufficient pam_unix.so 这行的末尾配置remember参数为5-24之间,原来的内容不用更改,只在末尾加了remember=5

1.13 密码复杂度检查

描述

检查密码长度和密码是否使用多种字符类型

加固建议

编辑/etc/security/pwquality.conf,把minlen(密码最小长度)设置为8-32位,把minclass(至少包含小写字母、大写字母、数字、特殊字符等4类字符中等3类或4类)设置为34。如:

minlen=10
minclass=3

1.14 设置SSH空闲超时退出时间

描述

设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险

加固建议

编辑/etc/ssh/sshd_config,将ClientAliveInterval 设置为300900,即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_logaccess_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_tokensserver_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 用户(如nginxnobody)启动,并且确保启动用户的状态为锁定状态。
可执行 passwd -l <Nginx启动用户>passwd -l nginx 来锁定 Nginx 服务的启动用户。
命令 passwd -S <用户>passwd -S nginx 可查看用户状态。
修改配置文件中的 nginx 启动用户修改为 nginxnobody

如: user nobody;

如果您是 docker 用户,可忽略该项(或添加白名单)

三、Redis安全基线

3.1 Redis未授权访问高危风险

描述

Redis 端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。

加固建议

可以使用以下方法修复:
1、为 Redis 服务配置认证,在配置文件 redis.confrequirepass 配置复杂密码,然后重启 redis
2、在 Redis 的配置文件 redis.conf 中配置如下: bind 127.0.0.1,只允许本机访问,然后重启 redis

3.2 开启redis密码认证,并设置高复杂度密码

描述

redisredis.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 权限去运行网络服务是比较有风险的(nginxapache都是有独立的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
设置访问控制

  1. 增加一个认证用户
    addauth digest 用户名:密码明文
  2. 设置访问控制权限
    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 范围。

  1. 登录数据库,执行
use mysql;
  1. 执行语句
select user,Host from user where Host='%';

查看 HOST 为通配符的用户;

  1. 删除用户或者修改用户 host 字段

删除语句:

DROP USER 'user_name'@'%'; 

更新语句:

update user set host = <new_host> where host = '%';
  1. 执行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 限制服务器平台信息泄漏

描述

限制服务器平台信息泄漏会使攻击者更难确定哪些漏洞会影响服务器平台。

加固建议

  1. 进入Tomcat安装主目录的 lib 目录下,比如 cd /usr/local/tomcat7/lib
  2. 执行:
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties

修改文件 ServerInfo.properties 中的 server.infoserver.number 的值,如分别改为:Apache/11.0.9211.0.92.0

  1. 执行:
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
  1. 重启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 目录,移出或删除 docsexampleshost-managermanager目录。

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 &quot;%r&quot; %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”,如果 hostdeployOnStartup属性(如没有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.serviceExecStart参数删除--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.serviceExecStart参数删除--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.serviceExecStart参数添加--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/dockerdocker.servicedocker.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访问增加登录验证

  1. 在主目录下运行 bin/elasticsearch-plugin install x-pack 安装x-pack插件
  2. config/elasticsearch.yml 配置文件增加以下配置
xpack.security.enabled: True
xpack.ml.enabled: true

运行命令

bin/x-pack/setup-passwords interactive

ES服务设置密码,重启ES服务

猜你喜欢

转载自blog.csdn.net/qq_39680564/article/details/115161155