ryezone_labs.ansible_cis_ubuntu_2004

Ansible CIS Ubuntu 20.04 LTS 加固 
CIS 加固的 Ubuntu:为关键任务系统提供网络攻击和恶意软件防护 CIS 基准通过消除以下内容来锁定系统:
- 不安全的程序。
- 禁用未使用的文件系统。
- 禁用不必要的端口或服务。
- 审计特权操作。
- 限制管理权限。
CIS 基准推荐在公共和私人云中的虚拟机中采用。它们也用于确保本地部署的安全。对于某些行业,针对公开标准进行系统加固是审计人员寻找的标准。CIS 基准通常是审计员推荐的加固选择,适用于要求 PCI-DSS 和 HIPAA 合规的行业,比如银行、电信和医疗保健。 如果您试图获得针对行业认可的安全标准(如 PCI DSS、APRA 或 ISO 27001)的合规性,则需要证明您已在评估范围内的所有系统中应用了文档化的加固标准。
Ubuntu CIS 基准根据不同的配置文件组织,即 ‘Level 1’ 和 ‘Level 2’,分别适用于服务器和工作站环境。
Level 1 配置文件 旨在以实用且谨慎的方式保护系统,而不会对性能产生太大影响。
- 禁用不需要的文件系统,
- 限制用户对文件和目录的权限,
- 禁用不需要的服务。
- 配置网络防火墙。
Level 2 配置文件 用于安全性非常重要的地方,但可能会对系统性能产生负面影响。
- 创建独立的分区,
- 审计特权操作。
Ubuntu CIS 加固工具允许您针对配置文件(Level1 或 Level 2)和工作环境(服务器或工作站)选择所需的加固级别。 示例:
ansible-playbook -i inventory cis-ubuntu-20.yaml --tags="level_1_server"
您可以通过运行以下命令列出所有标签:
ansible-playbook -i host run.yaml --list-tags
我编写的所有角色基于
CIS Ubuntu Linux 20.04 LTS Benchmark
v1.0.0 - 2020年7月21日
查看示例目录
要求
在运行此剧本之前,您应仔细阅读任务,以确保这些更改不会破坏您的系统。
您可以从此 URL 下载免费 CIS 基准书 免费基准
要开始使用此角色,您只需安装 Ansible。 安装 Ansible
角色变量
在运行此剧本之前,您必须查看所有默认配置,许多角色变量在 defaults/main.yml 中定义。
- 如果您考虑将此角色应用于任何服务器,您应该对 CIS 基准有基本的了解,并理解它可能对系统产生的影响。
- 阅读并更改可配置的默认值。
应立即考虑排除的配置示例:
5.1.8 确保 cron 仅限授权用户使用 和 5.2.17 确保 SSH 访问受限,默认情况下有效地限制对主机的访问(包括通过 ssh)。
例如:
- CIS-Ubuntu-20.04-Ansible/defaults/main.yml
#部分 5
#5.1.8 确保 cron 仅限授权用户使用
allowd_hosts: "ALL: 0.0.0.0/0.0.0.0, 192.168.2.0/255.255.255.0"
# 5.2.17 确保 SSH 访问受限
allowed_users: ali saleh baker root # 如果没有,或者用户之间使用空格分隔用户列表
如果需要,您可以在 files/templates/*
中找到文件模板。
依赖项
- Ansible 版本 > 2.9
示例剧本
以下是一个剧本的例子
---
- hosts: host1
become: yes
remote_user: root
gather_facts: no
roles:
- { role: "CIS-Ubuntu-20.04-Ansible",}
运行所有
如果您想运行所有标签,请使用以下命令:
ansible-playbook -i [inventoryfile] [playbook].yaml
运行特定部分
ansible-playbook -i host run.yaml -t section2
运行多个部分
ansible-playbook -i host run.yaml -t section2 -t 6.1.1
注意: 运行单个任务时,请确保任务之间的依赖性,例如,如果您在运行 4.1.1.2 确保 auditd 服务启用 之前运行 4.1.1.1 确保 auditd 已安装,则在运行时会出错。
带有
波浪线的点尚未实现,目前我正在处理它。确保选择一次服务,对我来说我使用 ntp,但您可以根据
defaults/main.yaml
下的设置使用其他服务,如 [systemd-timesyncd
,ntp
,chrony
]。测试 2020年11月1日 测试在 AWS EC2 ubuntu 20.04 LTS [通过] 2020年11月1日 测试在本地 Ubuntu 20.04 LTS 服务器 [通过]
在运行之前,请确保在
defaults/main.yaml
下更新用户列表,list_of_os_users
+allowed_users
。确保
在defaults/main.yaml
中正确设置子网的allowd_hosts
。
角色表:
1 初始设置
- 1.1 文件系统配置
- 1.1.1 禁用未使用的文件系统
- 1.1.1.1 确保禁用 cramfs 文件系统的挂载(自动化)
- 1.1.1.2 确保禁用 freevxfs 文件系统的挂载 - (自动化)
- 1.1.1.3 确保禁用 jffs2 文件系统的挂载 (自动化)
- 1.1.1.4 确保禁用 hfs 文件系统的挂载 (自动化)
- 1.1.1.5 确保禁用 hfsplus 文件系统的挂载 - (自动化)
- 1.1.1.6 确保禁用 udf 文件系统的挂载 (自动化)
- 1.1.1.7 确保 FAT 文件系统的挂载受到限制(手动)
- 1.1.2 确保 /tmp 已配置(自动化)
- 1.1.3 确保 /tmp 分区上设置 nodev 选项(自动化)
- 1.1.4 确保 /tmp 分区上设置 nosuid 选项(自动化)
- 1.1.5 确保 /tmp 分区上设置 noexec 选项(自动化)
- 1.1.6 确保 /dev/shm 已配置(自动化)
- 1.1.7 确保 /dev/shm 分区上设置 nodev 选项(自动化)
- 1.1.8 确保 /dev/shm 分区上设置 nosuid 选项(自动化)
- 1.1.9 确保 /dev/shm 分区上设置 noexec 选项(自动化)
1.1.10 确保 /var 拥有单独的分区 (自动化)1.1.11 确保 /var/tmp 拥有单独的分区 (自动化)1.1.12 确保 /var/tmp 分区上设置 nodev 选项 (自动化)1.1.13 确保 /var/tmp 分区上设置 nosuid 选项 (自动化)1.1.14 确保 /var/tmp 分区上设置 noexec 选项 (自动化)1.1.15 确保 /var/log 拥有单独的分区 (自动化)1.1.16 确保 /var/log/audit 拥有单独的分区 - (自动化)1.1.17 确保 /home 拥有单独的分区 (自动化)1.1.18 确保 /home 分区上设置 nodev 选项 (自动化)1.1.19 确保可移动介质分区上设置 nodev 选项(手动)1.1.20 确保可移动介质分区上设置 nosuid 选项 - (手动)1.1.21 确保可移动介质分区上设置 noexec 选项 - (手动)- 1.1.22 确保所有可被写入世界的目录上设置 sticky bit - (自动化)
- 1.1.23 禁用自动挂载(自动化)
- 1.1.24 禁用 USB 存储(自动化)
1.2 配置软件更新
1.2.1 确保软件包管理器仓库已配置(手动)1.2.2 确保 GPG 密钥已配置(手动)
1.3 配置 sudo
- 1.3.1 确保已安装 sudo(自动化)
- 1.3.2 确保 sudo 命令使用 pty(自动化)
- 1.3.3 确保日志文件存在(自动化)
1.4 文件系统完整性检查
- 1.4.1 确保已安装 AIDE(自动化)
- 1.4.2 确保定期检查文件系统完整性(自动化)
1.5 安全启动设置
- 1.5.1 确保设置了引导加载程序密码(自动化)
- 1.5.2 确保引导加载程序配置上的权限已配置 - (自动化)
- 1.5.3 确保单用户模式需要身份验证(自动化)
1.6 额外的进程加固
- 1.6.1 确保启用 XD/NX 支持(自动化)
- 1.6.2 确保启用地址空间布局随机化(ASLR) - (自动化)
- 1.6.3 确保禁用预链接(自动化)
- 1.6.4 确保核心转储受到限制(自动化)
1.7 强制访问控制
- 1.7.1 配置 AppArmor
- 1.7.1.1 确保已安装 AppArmor(自动化)
- 1.7.1.2 确保在引导加载程序配置中启用 AppArmor - (自动化)
- 1.7.1.3 确保所有 AppArmor 配置文件处于强制或投诉模式 - (自动化)
- 1.7.1.4 确保所有 AppArmor 配置文件都在强制执行(自动化)
1.8 警告横幅
- 1.8.1 命令行警告横幅
- 1.8.1.1 确保日间消息正确配置(自动化)
- 1.8.1.2 确保本地登录警告横幅正确配置 - (自动化) 115
- 1.8.1.3 确保远程登录警告横幅正确配置 - (自动化)
- 1.8.1.4 确保 /etc/motd 上的权限已配置(自动化)
- 1.8.1.5 确保 /etc/issue 上的权限已配置(自动化)
- 1.8.1.6 确保 /etc/issue.net 上的权限已配置 - (自动化)
- 1.9 确保已安装更新、补丁和额外的安全软件(手动)
- 1.10 确保已删除 GDM 或进行登录配置(自动化)
2 服务
- 2.1 inetd 服务
- 2.1.1 确保未安装 xinetd(自动化)
- 2.1.2 确保未安装 openbsd-inetd (自动化)
- 2.2 特殊目的服务
- 2.2.1 时间同步
- 2.2.1.1 确保正在使用时间同步(自动化)
- 2.2.1.2 确保已配置 systemd-timesyncd(手动)
- 2.2.1.3 确保已配置 chrony(自动化)
- 2.2.1.4 确保已配置 ntp(自动化)
- 2.2.2 确保未安装 X 窗口系统(自动化)
- 2.2.3 确保未安装 Avahi 服务器(自动化)
- 2.2.4 确保未安装 CUPS(自动化)
- 2.2.5 确保未安装 DHCP 服务器(自动化)
- 2.2.6 确保未安装 LDAP 服务器(自动化)
- 2.2.7 确保未安装 NFS(自动化)
- 2.2.8 确保未安装 DNS 服务器(自动化)
- 2.2.9 确保未安装 FTP 服务器(自动化)
- 2.2.10 确保未安装 HTTP 服务器(自动化)
- 2.2.11 确保未安装 IMAP 和 POP3 服务器(自动化)
- 2.2.12 确保未安装 Samba(自动化)
- 2.2.13 确保未安装 HTTP 代理服务器(自动化)
- 2.2.14 确保未安装 SNMP 服务器(自动化)
- 2.2.15 确保邮件传输代理配置为本地模式 - (自动化)
- 2.2.16 确保未安装 rsync 服务(自动化)
- 2.2.17 确保未安装 NIS 服务器(自动化)
2.3 服务客户端
- 2.3.1 确保未安装 NIS 客户端(自动化)
- 2.3.2 确保未安装 rsh 客户端(自动化)
- 2.3.3 确保未安装 talk 客户端(自动化)
- 2.3.4 确保未安装 telnet 客户端(自动化)
- 2.3.5 确保未安装 LDAP 客户端(自动化)
- 2.3.6 确保未安装 RPC(自动化)
2.4 确保非必要服务已删除或屏蔽(手动)
3 网络配置
- 3.1 禁用未使用的网络协议和设备
- 3.1.1 禁用 IPv6(手动)
- 3.1.2 确保无线接口被禁用(自动化)
3.2 网络参数(仅主机)
- 3.2.1 确保禁用数据包重定向发送(自动化)
- 3.2.2 确保禁用 IP 转发(自动化)
3.3 网络参数(主机和路由器)
- 3.3.1 确保不接受源路由数据包(自动化)
- 3.3.2 确保不接受 ICMP 重定向(自动化)
- 3.3.3 确保不接受安全 ICMP 重定向(自动化)
- 3.3.4 确保记录可疑数据包(自动化)
- 3.3.5 确保忽略广播 ICMP 请求(自动化)
- 3.3.6 确保忽略伪造的 ICMP 响应(自动化)
- 3.3.7 确保启用反向路径过滤(自动化)
- 3.3.8 确保启用 TCP SYN Cookies(自动化)
- 3.3.9 确保不接受 IPv6 路由器广告(自动化)
3.4 不常用的网络协议
- 3.4.1 确保禁用 DCCP(自动化)
- 3.4.2 确保禁用 SCTP(自动化)
- 3.4.3 确保禁用 RDS(自动化)
- 3.4.4 确保禁用 TIPC(自动化)
3.5 防火墙配置
- 3.5.1 配置 简单防火墙
- 3.5.1.1 确保已安装 简单防火墙(自动化)
- 3.5.1.2 确保未安装 iptables-persistent(自动化)
- 3.5.1.3 确保 ufw 服务已启用(自动化)
- 3.5.1.4 确保配置环回流量(自动化)
- 3.5.1.5 确保配置出站连接(手动)
- 3.5.1.6 确保存在所有开放端口的防火墙规则(手动)
- 3.5.1.7 确保防火墙的默认拒绝策略(自动化)
3.5.2 配置 nftables3.5.2.1 确保已安装 nftables(自动化)3.5.2.2 确保未安装或禁用 简单防火墙 - (自动化)3.5.2.3 确保已冲洗 iptables(手动)3.5.2.4 确保存在一个表(自动化)3.5.2.5 确保存在基础链(自动化)3.5.2.6 确保配置环回流量(自动化)3.5.2.7 确保配置出站和已建立的连接 - (手动)2433.5.2.8 确保防火墙的默认拒绝策略(自动化)3.5.2.9 确保 nftables 服务已启用(自动化)3.5.2.10 确保 nftables 规则是永久性的(自动化)3.5.3 配置 iptables3.5.3.1.1 确保已安装 iptables 软件包(自动化)3.5.3.1.2 确保未安装 nftables(自动化)3.5.3.1.3 确保未安装或禁用 简单防火墙 - (自动化)3.5.3.2.1 确保防火墙的默认拒绝策略(自动化)3.5.3.2.2 确保配置环回流量(自动化)3.5.3.2.3 确保配置出站和已建立的连接 - (手动)3.5.3.2.4 确保存在所有开放端口的防火墙规则(自动化)3.5.3.3.1 确保 IPv6 防火墙的默认拒绝策略(自动化)3.5.3.3.2 确保配置 IPv6 环回流量(自动化)3.5.3.3.3 确保配置 IPv6 出站和已建立的连接(手动)3.5.3.3.4 确保对所有开放端口存在 IPv6 防火墙规则 - (手动)
4 日志记录和审计
- 4.1 配置系统审计(auditd)
- 4.1.1 确保启用审计
- 4.1.1.1 确保已安装 auditd(自动化)
- 4.1.1.2 确保 auditd 服务已启用(自动化)
- 4.1.1.3 确保 Auditd 启动之前的进程也启用审计(自动化)
- 4.1.1.4 确保 audit_backlog_limit 足够(自动化)
- 4.1.2 配置数据保留
- 4.1.2.1 确保配置了审计日志存储大小(自动化)
- 4.1.2.2 确保审计日志不被自动删除(自动化)
- 4.1.2.3 确保当审计日志满时系统被禁用 - (自动化)
- 4.1.3 确保收集修改日期和时间信息的事件(自动化)
- 4.1.4 确保收集修改用户/组信息的事件(自动化)
- 4.1.5 确保收集修改系统网络环境的事件(自动化)
- 4.1.6 确保收集修改系统强制访问控制的事件(自动化)
- 4.1.7 确保收集登录和注销事件(自动化)
- 4.1.8 确保收集会话启动信息(自动化)
- 4.1.9 确保收集自定义访问控制权限修改事件(自动化)
- 4.1.10 确保收集未成功的未授权文件访问尝试(自动化)
- 4.1.11 确保收集特权命令的使用(自动化)
- 4.1.12 确保收集成功的文件系统挂载(自动化)
- 4.1.13 确保收集用户的文件删除事件(自动化)
- 4.1.14 确保收集系统管理范围的更改(sudoers)(自动化)
- 4.1.15 确保收集系统管理员命令的执行(sudo)(自动化)
- 4.1.16 确保收集内核模块的加载和卸载(自动化)
- 4.1.17 确保审计配置不可变(自动化)
4.2 配置日志记录
- 4.2.1 配置 rsyslog
- 4.2.1.1 确保安装了 rsyslog(自动化)
- 4.2.1.2 确保启用 rsyslog 服务(自动化)
- 4.2.1.3 确保配置了日志记录(手动)
- 4.2.1.4 确保配置 rsyslog 的默认文件权限 - (自动化)
- 4.2.1.5 确保配置 rsyslog 将日志发送到远程日志主机(自动化)
- 4.2.1.6 确保仅接受指定日志主机的远程 rsyslog 消息(手动)
- 4.2.2 配置 journald
- 4.2.2.1 确保 journald 配置为将日志发送到 rsyslog - (自动化)
- 4.2.2.2 确保 journald 配置为压缩大型日志文件 - (自动化)
- 4.2.2.3 确保 journald 配置为将日志写入持久磁盘(自动化)
- 4.2.3 确保配置所有日志文件的权限(自动化)
- 4.3 确保配置 logrotate(手动)
- 4.4 确保 logrotate 赋予适当的权限(自动化)
5 访问、身份验证和授权
- 5.1 配置基于时间的作业调度
- 5.1.1 确保 cron 守护进程已启用并运行(自动化)
- 5.1.2 确保 /etc/crontab 的权限已配置(自动化)
- 5.1.3 确保 /etc/cron.hourly 的权限已配置 - (自动化)
- 5.1.4 确保 /etc/cron.daily 的权限已配置 - (自动化)
- 5.1.5 确保 /etc/cron.weekly 的权限已配置 - (自动化)
- 5.1.6 确保 /etc/cron.monthly 的权限已配置 - (自动化)
- 5.1.7 确保 /etc/cron.d 的权限已配置(自动化)
- 5.1.8 确保 cron 仅限授权用户使用(自动化)
- 5.1.9 确保 at 仅限授权用户使用(自动化)
5.2 配置 SSH 服务器
- 5.2.1 确保 /etc/ssh/sshd_config 的权限已配置 - (自动化)
- 5.2.2 确保 SSH 私钥文件的权限已配置(自动化)
- 5.2.3 确保 SSH 公钥文件的权限已配置 - (自动化)
- 5.2.4 确保 SSH 日志级别适当(自动化)
- 5.2.5 确保禁用 SSH X11 转发(自动化)
- 5.2.6 确保 SSH MaxAuthTries 设置为 4 或更少(自动化)
- 5.2.7 确保启用 SSH IgnoreRhosts(自动化)
- 5.2.8 确保禁用 SSH HostbasedAuthentication(自动化)
- 5.2.9 确保禁用 SSH root 登录(自动化)
- 5.2.10 确保禁用 SSH PermitEmptyPasswords(自动化)
- 5.2.11 确保禁用 SSH PermitUserEnvironment(自动化)
- 5.2.12 确保仅使用强加密算法(自动化)
- 5.2.13 确保仅使用强 MAC 算法(自动化)
- 5.2.14 确保仅使用强密钥交换算法 - (自动化)
- 5.2.15 确保配置 SSH 空闲超时间隔(自动化)
- 5.2.16 确保 SSH 登录宽限时间设置为一分钟或更少 - (自动化)
- 5.2.17 确保 SSH 访问受限(自动化)
- 5.2.18 确保配置 SSH 警告横幅(自动化)
- 5.2.19 确保启用 SSH PAM(自动化)
- 5.2.20 确保禁用 SSH AllowTcpForwarding(自动化)
- 5.2.21 确保配置 SSH MaxStartups(自动化)
- 5.2.22 确保限制 SSH MaxSessions(自动化)
5.3 配置 PAM
- 5.3.1 确保配置密码创建要求 - (自动化)
- 5.3.2 确保为密码失败尝试配置锁定 - (自动化)
- 5.3.3 确保限制密码重用(自动化)
- 5.3.4 确保密码哈希算法为 SHA-512(自动化)
5.4 用户帐户和环境
- 5.4.1 设置影子密码套件参数
- 5.4.1.1 确保密码过期为 365 天或更少(自动化)
- 5.4.1.2 确保密码更改之间的最少天数已配置 - (自动化)
- 5.4.1.3 确保密码过期警告天数为 7 天或更多 - (自动化)
- 5.4.1.4 确保不活动密码锁定为 30 天或更少(自动化)
- 5.4.1.5 确保所有用户的上次密码更改日期在过去 - (自动化)
- 5.4.2 确保系统帐户安全(自动化)
- 5.4.3 确保 root 账户的默认组为 GID 0(自动化)
- 5.4.4 确保默认用户 umask 为 027 或更严格 - (自动化)
- 5.4.5 确保默认用户 shell 超时为 900 秒或更少 - (自动化)
- 5.5 确保 root 登录仅限系统控制台(手动)
- 5.6 确保对 su 命令的访问受到限制(自动化)
6 系统维护
- 6.1 系统文件权限
6.1.1 审计系统文件权限(手动)- 6.1.2 确保 /etc/passwd 的权限已配置(自动化)
- 6.1.3 确保 /etc/gshadow- 的权限已配置(自动化)
- 6.1.4 确保 /etc/shadow 的权限已配置(自动化)
- 6.1.5 确保 /etc/group 的权限已配置(自动化)
- 6.1.6 确保 /etc/passwd- 的权限已配置(自动化)
- 6.1.7 确保 /etc/shadow- 的权限已配置(自动化)
- 6.1.8 确保 /etc/group- 的权限已配置(自动化)
- 6.1.9 确保 /etc/gshadow 的权限已配置(自动化)
- 6.1.10 确保不存在可被写入世界的文件(自动化)
- 6.1.11 确保不存在无人拥有的文件或目录(自动化)
- 6.1.12 确保不存在无组文件或目录(自动化)
6.1.13 审计 SUID 可执行文件(手动)6.1.14 审计 SGID 可执行文件(手动)
6.2 用户和组设置
- 6.2.1 确保密码字段不为空(自动化)
6.2.2 确保 root 是唯一的 UID 0 账户(自动化)6.2.3 确保 root PATH 的完整性(自动化)- 6.2.4 确保所有用户的主目录存在(自动化)
- 6.2.5 确保用户的主目录权限为 750 或更严格 - (自动化)
- 6.2.6 确保用户拥有他们的主目录(自动化)
- 6.2.7 确保用户的点文件不是组写或世界写入的 - (自动化)
6.2.8 确保没有用户有 .forward 文件(自动化)6.2.9 确保没有用户有 .netrc 文件(自动化)6.2.10 确保没有用户的 .netrc 文件是组或世界可访问的 - (自动化)6.2.11 确保没有用户有 .rhosts 文件(自动化)6.2.12 确保 /etc/passwd 中的所有组在 /etc/group 中存在 - (自动化)6.2.13 确保没有重复的 UID 存在(自动化)6.2.14 确保没有重复的 GID 存在(自动化)6.2.15 确保没有重复的用户名存在(自动化)6.2.16 确保没有重复的组名存在(自动化)6.2.17 确保阴影组是空的(自动化)
故障排除
- 如果您想在同一台机器上运行剧本,请确保将此添加到运行任务中:
- hosts: 127.0.0.1
connection: local
- 如果您遇到执行问题,请尝试在另一个路径中运行剧本,例如
/srv/
。 - 对于类似
stderr: chage: user 'ubuntu' does not exist in /etc/passwd
的错误,请确保更新CIS-Ubuntu-20.04-Ansible/defaults/main.yml
下的配置。
许可证
GNU 通用公共许可证
作者信息
该角色最初由 Ali Saleh Baker 开发。
在对该库进行贡献时,请先通过 GitHub 问题、电子邮件或其他渠道与我讨论您希望进行的更改 :)
ansible-galaxy install ryezone_labs.ansible_cis_ubuntu_2004