smith193_cruk.cis_ubuntu_20_04_ansible
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 加固工具允许你选择锁定级别(Level 1 或 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 基准
v1.0.0 - 2020年7月21日
检查示例目录
要求
在运行此剧本之前,请仔细阅读任务,以确保这些更改不会破坏您的系统。
你可以从这个链接下载免费的 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 仅限授权用户使用
allowed_hosts: "ALL: 0.0.0.0/0.0.0.0, 192.168.2.0/255.255.255.0"
#5.2.17 确保 SSH 访问受限
allowed_users: root # 输入 None 或以空格分隔的用户列表
如果需要更改文件模板,可以在 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 已安装,那么在运行时会出错。
角色表:
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 确保禁用了 prelink(自动化)
- 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 确保本地登录警告横幅设置正确 - (自动化)
- 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 确保默认拒绝防火墙策略(自动化)
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 LogLevel 合适(自动化)
- 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 LoginGraceTime 设置为一分钟或更少 - (自动化)
- 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 确保影子组为空(自动化)
许可证
BSD
作者信息
在为此仓库做出贡献时,请先通过 GitHub 问题、电子邮件或其他渠道与我讨论您希望进行的更改 :)
ansible-galaxy install smith193_cruk.cis_ubuntu_20_04_ansible