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 GalaxyGitHub 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 角色应用所有与这些部分有关的任务。

每个部分的变量位于各自的文件中。

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 testmolecule 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 Utzansible-lockdown 等)的出色工作的启发。继续加油 :metal:

许可证

MIT

作者信息

该角色由 Ali Muhammad 创建。

关于项目

Role to apply CIS Benchmark for Ubuntu Linux 20.04 LTS.

安装
ansible-galaxy install estenrye.cis_ubuntu_2004
许可证
mit
下载
7k
拥有者