estenrye.cis_ubuntu_2004
Ansible 角色: cis_ubuntu_2004 :computer:
用于应用 Ubuntu Linux 20.04 LTS 的CIS基准 的Ansible角色。
当前支持的版本有:
- Ubuntu Linux 20.04 LTS 的 CIS 基准 v1.1.0
- Ubuntu Linux 20.04 LTS 的 CIS 基准 v1.0.0
版本信息
下表列出了在 Ansible Galaxy 和 GitHub Releases 上可用的角色版本,以及对应的 CIS Ubuntu Linux 20.04 LTS 基准。
CIS Ubuntu 20.04 基准版本 | Ansible Galaxy 版本 | 仓库标签版本 |
---|---|---|
1.0.0 | 1.0.0, 1.0.1, 1.0.2 | 1.0.0, 1.0.1, 1.0.2 |
1.1.0 | 2.0.0, 2.0.1, 2.1.0, 3.0.0, 3.1.0 | 2.0.0, 2.0.1, 2.1.0, 3.0.0, 3.1.0 |
1. 安装/下载说明:
该角色可在 Ansible Galaxy 上使用。您可以通过以下几种方法从 Ansible Galaxy 或直接从仓库安装/下载 cis_ubuntu_2004
角色。
不使用 requirements.yml 文件:
安装/下载最新(默认)可用标签版本:
ansible-galaxy install darkwizard242.cis_ubuntu_2004
安装/下载特定可用标签版本(以 3.1.0 为例):
ansible-galaxy install darkwizard242.cis_ubuntu_2004,3.1.0
从仓库安装/下载特定可用分支版本(以
master
分支为例,master
始终符合最新可用版本的 CIS Ubuntu 20.04 基准):ansible-galaxy install darkwizard242.cis_ubuntu_2004,master
从仓库安装/下载特定可用分支版本(以
feature/cis_version_1.1.0
分支为例,符合 CIS Ubuntu 20.04 基准版本 v1.1.0 的最新更新):ansible-galaxy install darkwizard242.cis_ubuntu_2004,feature/cis_version_1.1.0
从仓库安装/下载特定可用分支版本(以
feature/cis_version_1.0.0
分支为例,符合 CIS Ubuntu 20.04 基准版本 v1.0.0 的最新更新):ansible-galaxy install darkwizard242.cis_ubuntu_2004,feature/cis_version_1.0.0
使用 requirements.yml 文件:
将其添加到现有的 requirements.yml 文件中,或创建一个新的文件来安装 cis_ubuntu_2004
。
从 Ansible Galaxy 下载最新版本。
- name: darkwizard242.cis_ubuntu_2004
从 Ansible Galaxy 下载特定版本。
- name: darkwizard242.cis_ubuntu_2004 version: 3.1.0
从仓库下载特定分支。
- name: cis_ubuntu_2004 src: https://github.com/darkwizard242/cis_ubuntu_2004 version: master
添加到 requirements.yml 后执行安装/下载:
ansible-galaxy install -r requirements.yml
注意: 如上所述安装角色仅下载该角色,以便在您的 ansible playbooks 中使用。您可以在 这里 阅读角色安装/下载说明。
2. 一些注意事项:
第1节 中有关 磁盘分区 及其 挂载点 的基准未在该角色中应用。原因很简单,因为每个个人/组织的系统架构和磁盘布局可能不同。我建议您自行应用这些内容。以下是这些基准的列表:
- 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 选项(手动)
第4节 中的以下基准也没有实现:
- 4.2.1.5 确保 rsyslog 配置为将日志发送到远程日志主机(自动化)
- 4.2.1.6 确保仅在指定的日志主机上接受远程 rsyslog 消息(手动)
- 4.3 确保配置了 logrotate (手动)
3. 要求
无。
4. 角色变量
在角色任务中使用的角色默认变量位于 defaults/main/
中。
defaults/main/main.yml 包含引用整个 CIS 部分的变量,如下所示,以及提到的一些影响系统的变量:
ubuntu_2004_cis_section1: true
ubuntu_2004_cis_section2: true
ubuntu_2004_cis_section3: true
ubuntu_2004_cis_section4: true
ubuntu_2004_cis_section5: true
ubuntu_2004_cis_section6: true
上述变量的目的是指示应该通过 cis_ubuntu_2004
角色应用所有与这些部分有关的任务。
每个部分的变量位于各自的文件中。
- 第1节的变量在 defaults/main/section_01.yml
- 第2节的变量在 defaults/main/section_02.yml
- 第3节的变量在 defaults/main/section_03.yml
- 第4节的变量在 defaults/main/section_04.yml
- 第5节的变量在 defaults/main/section_05.yml
- 第6节的变量在 defaults/main/section_06.yml
cis_ubuntu_2004
角色中所有内容的默认值可以通过在 playbook 中传递它们或其他 变量优先级方法 来覆盖。
重要变量
CIS Ubuntu 20.04 的强化基准要求清除许多可能被利用、存在已知漏洞、导致攻击面曝光或不需要的服务。根据基准,默认情况下,所有这些服务将被清除,并且其变量的值已设置为 false
。但是,如果您仍然需要出于任何原因使用这些服务,请将其值更改为 true
,以便在应用角色时,能够 跳过 清除这些服务的任务。
除了上述对一些变量的解释外,还有其他变量定义了特定服务是否需要在系统上存在(例如,SSH 守护进程)、各种工具的配置参数(例如,auditd)等。这些也可以在 playbook 中覆盖。
# 如果需要 IPv6,请设置为 `true`。
ubuntu_2004_cis_require_ipv6: false
# 如果需要无线,请设置为 `true`。
ubuntu_2004_cis_require_wireless: false
# 如果系统应充当路由器,请设置为 `true`。
ubuntu_2004_cis_require_router: false
# 如果不需要 SSH 守护进程,请设置为 `false`。
ubuntu_2004_cis_require_ssh_server: true
# 存储 SSH 守护进程的强加密算法的变量。
ubuntu_2004_cis_require_ssh_ciphers: [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
# 存储 SSH 守护进程的强 MAC 算法的变量。
ubuntu_2004_cis_require_ssh_macs: [email protected],[email protected],hmac-sha2-512,hmac-sha2-256
# 存储 SSH 守护进程的强密钥交换算法的变量。
ubuntu_2004_cis_require_ssh_kexalgorithms: curve25519-sha256,[email protected],diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
# 存储 SSH 守护进程的客户端存活间隔(以秒为单位)的变量。
ubuntu_2004_cis_require_ssh_clientaliveinterval: '300'
# 存储 SSH 守护进程的最大客户端存活计数的变量。
ubuntu_2004_cis_require_ssh_clientalivecountmax: '3'
# 存储 SSH 守护进程的登录宽限时间(以秒为单位)的变量。
ubuntu_2004_cis_require_ssh_logingracetime: '60'
# 存储 SSH 守护进程的允许用户变量。
ubuntu_2004_cis_require_ssh_allowusers: ubuntu vagrant
# 存储 SSH 守护进程的允许组变量。
ubuntu_2004_cis_require_ssh_allowgroups: ubuntu vagrant
# 存储 SSH 守护进程的拒绝用户变量。
ubuntu_2004_cis_require_ssh_denyusers: bogus dummy
# 存储 SSH 守护进程的拒绝组变量。
ubuntu_2004_cis_require_ssh_denygroups: bogus dummy
# 存储 pam 密码质量的最小长度和字符类别的变量。
ubuntu_2004_cis_require_pam_pwquality:
- key: 'minlen'
value: '14'
- key: 'minclass'
value: '4'
# 存储密码过期的 PASS_MAX_DAYS 的值的变量。
ubuntu_2004_cis_require_passmaxdays: '365'
# 存储密码更改的 PASS_MIN_DAYS 的值的变量。
ubuntu_2004_cis_require_passmindays: '1'
# 存储设置默认密码不活动期为 30 天的 INACTIVE 的值的变量。
ubuntu_2004_cis_require_passwarnage: '7'
# 存储设置密码过期警告的 PASS_WARN_AGE 变量(以天为单位)。
ubuntu_2004_cis_require_passinactive: '30'
# 存储 Shell 超时时间的值的变量(以秒为单位)。
ubuntu_2004_cis_require_shell_timeout: '900'
# 存储 su 执行所需的组名的变量。
ubuntu_2004_cis_require_su_group: sugroup
# 存储用于 cron 作业执行的审计系统文件权限(手动)任务的日志文件的变量以进行审核。
ubuntu_2004_cis_require_audit_system_file_permissions_logfile: /var/log/6_1_1_cis_audit_system.log
# 可以是 'iptables' 或 'nftables' 或 'ufw' 的其中之一。
ubuntu_2004_cis_firewall: ufw
# 如果使用 'ufw',设置为 'yes' 将允许配置和允许 UFW git 应用程序配置文件。
ubuntu_2004_cis_section3_rule_3_5_1_7_ufw_require_git_profile: yes
# 如果使用 'ufw',设置为 'yes' 将允许配置和允许 UFW HTTP 应用程序配置文件。
ubuntu_2004_cis_section3_rule_3_5_1_7_ufw_require_http_profile: yes
# 如果使用 'ufw',设置为 'yes' 将允许配置和允许 UFW HTTPS 应用程序配置文件。
ubuntu_2004_cis_section3_rule_3_5_1_7_ufw_require_https_profile: yes
# 如果使用 'ufw',设置为 'true' 将默认拒绝所有传入连接。功能与 `ufw default deny incoming` 相同。如果您不需要应用此设置,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_ufw_default_deny_incoming: true
# 如果使用 'ufw',设置为 'true' 将默认拒绝所有传出连接。功能与 `ufw default deny outgoing` 相同。如果您不需要应用此设置,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_ufw_default_deny_outgoing: true
# 如果使用 'ufw',设置为 'true' 将默认拒绝所有路由连接。功能与 `ufw default deny routed` 相同。如果您不需要应用此设置,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_ufw_default_deny_routed: true
# 如果使用 'nftables',设置为 'true' 将默认拒绝所有输入/转发/输出连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_3_5_2_8: true
# 如果使用 'iptables',设置为 'true' 将默认拒绝所有 IPv4 的传入连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_iptables_ipv4_default_deny_input: true
# 如果使用 'iptables',设置为 'true' 将默认拒绝所有 IPv4 的传出连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_iptables_ipv4_default_deny_output: true
# 如果使用 'iptables',设置为 'true' 将默认拒绝所有 IPv4 的转发连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_iptables_ipv4_default_deny_forward: true
# 如果使用 'iptables' 且启用了 IPv6,设置为 'true' 将默认拒绝所有 IPv4 的传入连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_iptables_ipv6_default_deny_input: true
# 如果使用 'iptables' 且启用了 IPv6,设置为 'true' 将默认拒绝所有 IPv4 的传出连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_iptables_ipv6_default_deny_output: true
# 如果使用 'iptables' 且启用了 IPv6,设置为 'true' 将默认拒绝所有 IPv4 的转发连接,导致系统无法访问。如果您不需要应用此设置或失去连接,请将其设置为 `false`。
ubuntu_2004_cis_section3_rule_iptables_ipv6_default_deny_forward: true
# 可以是 'ntp' 或 'chrony' 或 'systemd-timesyncd' 的其中之一。
ubuntu_2004_cis_time_synchronization: systemd-timesyncd
# 在启动时存储足够记录的审计d 回滚限制。
ubuntu_2004_cis_auditd_backloglimit: '8192'
# 审计d 日志的日志文件大小。按需设置。
ubuntu_2004_cis_auditd_maxlogfile: '25'
# 当审计d 日志达到最大大小时要采取的动作。按需设置。
ubuntu_2004_cis_auditd_maxlogfileaction: keep_logs
# 关于审计d 的低空间警报。按需设置。
ubuntu_2004_cis_auditd_spaceleftaction: email
# 谁需要发送审计d 邮件。按需设置。
ubuntu_2004_cis_auditd_actionmailacct: root
# 当审计日志满时可能要采取的操作。按需设置。
ubuntu_2004_cis_auditd_adminspaceleftaction: halt
# 允许调度 cron 作业的用户。
ubuntu_2004_cis_cron_allow_users:
- root
- ubuntu
# 允许使用 'at' 调度作业的用户。
ubuntu_2004_cis_at_allow_users:
- root
- ubuntu
# 如果需要 X Windows 系统,请设置为 `true`。
ubuntu_2004_cis_require_xwindows_system: false
# 如果需要 CUPS,请设置为 `true`。
ubuntu_2004_cis_require_cups: false
# 如果需要 DHCP 服务器,请设置为 `true`。
ubuntu_2004_cis_require_dhcp_server: false
# 如果需要 LDAP 服务器,请设置为 `true`。
ubuntu_2004_cis_require_ldap_server: false
# 如果需要 NFS 服务器,请设置为 `true`。
ubuntu_2004_cis_require_nfs_server: false
# 如果需要 DNS 服务器,请设置为 `true`。
ubuntu_2004_cis_require_dns_server: false
# 如果需要 FTP 服务器,请设置为 `true`。
ubuntu_2004_cis_require_ftp_server: false
# 如果需要 HTTP (apache2) 服务器,请设置为 `true`。
ubuntu_2004_cis_require_http_server: false
# 如果需要 IMAP 和 POP3 服务器,请设置为 `true`。
ubuntu_2004_cis_require_imap_pop3_server: false
# 如果需要 Samba 守护进程,请设置为 `true`。
ubuntu_2004_cis_require_samba_server: false
# 如果需要 Squid 服务器,请设置为 `true`。
ubuntu_2004_cis_require_squid_server: false
# 如果需要 SNMP 服务器,请设置为 `true`。
ubuntu_2004_cis_require_snmp_server: false
# 为了避免设置 postfix 在本地模式下工作。如果需要 postfix 以本地模式工作,请定义为 `false`。
ubuntu_2004_cis_require_mail_server: true
# 如果需要 RSYNC,请设置为 `true`。
ubuntu_2004_cis_require_rsyncd_server: false
# 如果需要 NIS 服务器,请设置为 `true`。
ubuntu_2004_cis_require_nis_server: false
# 如果需要 NIS 客户端,请设置为 `true`。
ubuntu_2004_cis_require_nis_client: false
# 如果需要 RSH 客户端,请设置为 `true`。
ubuntu_2004_cis_require_rsh_client: false
# 如果需要 TALK 客户端,请设置为 `true`。
ubuntu_2004_cis_require_talk_client: false
# 如果需要 TELNET 客户端,请设置为 `true`。
ubuntu_2004_cis_require_telnet_client: false
# 如果需要 LDAP 客户端,请设置为 `true`。
ubuntu_2004_cis_require_ldap_client: false
# 如果需要 RPCBIND 客户端,请设置为 `true`。
ubuntu_2004_cis_require_rpcbind_client: false
5. 依赖关系
无
6. 示例 playbook:
示例 playbook 已提供在 playbook-examples 文件夹中。它包含带有默认和自定义要求的 playbook。
注意:考虑到某些关于网络的CIS控制可能会破坏系统并使用户无法重新登录系统。我建议您先使用 playbook-examples/playbook_with_custom_firewall_changes.yml playbook 进行实验。根据您的需要修改连接类型和主机。
应用示例:
如果您使用提供的任何示例 playbook,可以选择其中一个并运行以下命令来应用它们:
ansible-playbook playbook_with_defaults.yml
ansible-playbook playbook_with_custom_firewall_changes.yml
ansible-playbook playbook_with_ipv6.yml
ansible-playbook playbook_with_ufw.yml
假设您创建了自己的自定义 playbook,名为 myplaybook.yml,您可以简单地运行以下命令。
ansible-playbook myplaybook.yml
使用标签应用示例:
角色中的所有任务都根据 CIS 等级分配、规则编号和节编号分配了标签。默认情况下,将应用等级 1 和等级 2 的控制。因此,如果您希望运行针对特定等级、规则编号或节的自定义应用,可以使用以下示例:
仅应用等级 1 控件的示例:
ansible-playbook <playbook-name-here>.yml --tags "level_1"
仅应用等级 2 控件的示例:
ansible-playbook <playbook-name-here>.yml --tags "level_2"
应用特定节的控件(例如 CIS Ubuntu 20.04 基准的第 4 节)的示例:
ansible-playbook <playbook-name-here>.yml --tags "section4"
应用特定控制(例如 CIS Ubuntu 20.04 基准的控制 6.2.2)的示例:
ansible-playbook <playbook-name-here>.yml --tags "rule_6_2_2"
7. 本地开发和 CI/CD:
为了本地开发 cis_ubuntu_2004 角色,请执行以下操作:
克隆仓库。
本地克隆它。
在您的计算机上安装 Vagrant。安装说明可在 这里 找到,或者如果需要,您可以使用 darkwizard242.vagrant 角色进行安装 - 但请确认它是否支持您的操作系统。
在您的计算机上安装 Virtualbox。安装说明可在 这里 找到,或者如果需要,您可以使用 darkwizard242.virtualbox 角色进行安装 - 但请确认它是否支持您的操作系统。
使用以下命令安装所需模块:
# 在非根用户情况下全局安装 pip 模块。 sudo -H python3 -m pip install -U molecule ansible-lint flake8 pytest-testinfra molecule-vagrant
或者
# 在非根用户情况下在用户目录本地安装 pip 模块。 python3 -m pip install -U molecule ansible-lint flake8 pytest-testinfra molecule-vagrant
更改并运行
molecule test
或molecule converge
。
molecule test 命令将运行整个配置的分子测试序列。
molecule converge 命令仅会创建虚拟实例并应用角色中定义的所有操作。
当然,如果您不熟悉 molecule,您还可以简单地下载 cis_ubuntu_2004 角色的代码,进行更改并在测试机上通过 ansible-playbook 运行它。
当您创建拉取请求时,它会自动触发 这里 的 TravisCI 构建。TravisCI 构建的配置存在于 .travis.yml 中,这将执行多项任务,例如:
- 从拉取请求中克隆代码。
- 执行仓库缓存更新。
- 安装先决包。
- 安装 Vagrant 和 Virtualbox。
- 对整个仓库代码库执行 SonarCloud 代码质量检查。
- 运行分子测试(这将提供一个虚拟框,应用角色代码并运行 cis_ubuntu_2004 角色的 TestInfra 测试套件)。
8. 贡献:
欢迎贡献。有关贡献的说明,请参见 这里。
灵感
受到 Ansible 社区许多成员(如 Florian Utz 和 ansible-lockdown 等)的出色工作的启发。继续加油 :metal:
许可证
作者信息
该角色由 Ali Muhammad 创建。