konstruktoid.hardening

服务器硬化的 Ansible 角色

这是一个旨在增强运行在 AlmaLinux、Debian 或 Ubuntu 上的服务器安全性的 Ansible 角色。

该角色专注于 systemd ,需要 Ansible 版本 2.15 或更高版本。

该角色支持以下操作系统:

对于使用 AWS 或 Azure 的用户,提供了经过硬化的 Ubuntu 亚马逊机器镜像 (AMIs) 和 Azure 虚拟机镜像。

这些镜像可在 konstruktoid/hardened-images 仓库中获取。 这些镜像是使用 Packer 构建的,并且使用这个 Ansible 角色进行配置。

注意 不要在未经过测试的环境中使用此角色。

注意 存在一个 SLSA 工件,可以在 slsa 动作工作流 中进行验证。

依赖关系

无。

示例

要求

---
roles:
  - name: konstruktoid.hardening
    version: v2.1.0
    src: https://github.com/konstruktoid/ansible-role-hardening.git
    scm: git

剧本

---
- name: 导入并使用硬化角色
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: 导入硬化角色
      ansible.builtin.import_role:
        name: konstruktoid.hardening
      vars:
        sshd_admin_net:
          - 10.0.2.0/24
          - 192.168.0.0/24
          - 192.168.1.0/24
        suid_sgid_permissions: false

使用 git 检出本地剧本

---
- name: 检出并配置 konstruktoid.hardening
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: 克隆硬化仓库
      become: true
      tags:
        - always
      block:
        - name: 安装 git
          ansible.builtin.package:
            name: git
            state: present

        - name: 检出 konstruktoid.hardening
          become: true
          ansible.builtin.git:
            repo: https://github.com/konstruktoid/ansible-role-hardening
            dest: /etc/ansible/roles/konstruktoid.hardening
            version: v2.1.0

        - name: 移除 git
          ansible.builtin.package:
            name: git
            state: absent

    - name: 包含硬化角色
      ansible.builtin.include_role:
        name: konstruktoid.hardening
      vars:
        sshd_allow_groups:
          - ubuntu
        sshd_login_grace_time: 60
        sshd_max_auth_tries: 10
        sshd_use_dns: false
        sshd_update_moduli: true

关于 UFW 规则的说明

该角色会删除每个没有包含 comment: ansible managed 任务参数和值的 ufw 规则,而不是每次运行时重置 ufw,以避免网络流量中断。

该角色还设置了默认的拒绝策略,这意味着在 sshd_portsufw_outgoing_traffic 变量中列出的端口以外的端口需要单独创建防火墙规则。

有关更多信息,请参见 ufw(8)

任务执行和结构

有关角色结构的详细信息,请参见 STRUCTURE.md

角色测试

请参见 TESTING.md

角色变量及其默认值

./defaults/main/aide.yml

manage_aide: true

aide_checksums: sha512
aide_dir_exclusions:
  - /var/lib/docker
  - /var/lib/lxcfs
  - /var/lib/private/systemd
  - /var/log/audit
  - /var/log/journal

如果 manage_aide: true,则会安装和配置 AIDE

aide_checksums 修改 AIDE 的 Checksums 变量。 请注意,根据发行版,Checksums 变量可能不存在。

aide_dir_exclusions 是将从 AIDE 数据库中排除的目录列表。

aide.conf(5)

./defaults/main/auditd.yml

manage_auditd: true

auditd_apply_audit_rules: true
auditd_action_mail_acct: root
auditd_admin_space_left_action: suspend
auditd_disk_error_action: suspend
auditd_disk_full_action: suspend
auditd_enable_flag: 2
auditd_flush: incremental_async
auditd_max_log_file: 20
auditd_max_log_file_action: rotate
auditd_mode: 1
auditd_num_logs: 5
auditd_space_left: 75
auditd_space_left_action: email
grub_audit_backlog_cmdline: audit_backlog_limit=8192
grub_audit_cmdline: audit=1

如果 manage_auditd: true,则会使用 GRUB 配置并启用 Linux 审计系统

auditd_apply_audit_rules: 'yes' 时,角色会应用来自包含的模板文件的 auditd 规则。

auditd_action_mail_acct 应该是一个有效的电子邮件地址或别名。

auditd_admin_space_left_action 定义了当系统检测到磁盘空间不足时应采取的操作。 suspend 将导致审计守护进程停止向磁盘写入记录。

auditd_enable_flag 设置启用标志。如果传入 0,则临时禁用审计。 1 将启用审计,2 将锁定审计配置。

auditd_flush: sync 指示审计守护进程在每次写入磁盘时保持数据和元数据完全同步。

auditd_max_log_file_action 设置当系统检测到达到最大文件大小限制时应采取的操作。例如,rotate 选项将导致审计守护进程旋转日志。 keep_logs 选项类似于 rotate,但不使用 num_logs 设置。这防止审计日志被覆盖。

auditd_space_left_action 告诉系统在检测到磁盘空间不足时应采取的操作。 email 意味着将向 action_mail_acct 中指定的电子邮件帐户发送警告,并将消息发送给 syslog。

auditd_mode 设置 auditd 失败模式,0=静默 1=打印 2=恐慌。

auditd.conf(5)

./defaults/main/automatic_updates.yml

automatic_updates:
  enabled: true
  reboot: false

如果启用 automatic_updates,则会安装和配置 dnf-automaticunattended-upgrades,具体取决于发行版。

如果将 reboot 选项设置为 true,如果需要,将重新启动系统,请参阅 Unattended-Upgrade::Automatic-Rebootdnf_automatic: reboot

./defaults/main/compilers.yml

manage_compilers: true

compilers:
  - as
  - cargo
  - cc
  - cc-[0-9]*
  - clang-[0-9]*
  - gcc
  - gcc-[0-9]*
  - go
  - make
  - rustc

如果 manage_compilers: true,则列表中的编译器将仅限于 root 用户。

./defaults/main/crypto_policies.yml

set_crypto_policy: true
crypto_policy: DEFAULT:NO-SHA1

如果存在 /etc/crypto-policies/configset_crypto_policy: true,则设置并使用 加密策略

./defaults/main/disablewireless.yml

disable_wireless: false

如果为 true,将关闭所有无线接口。

./defaults/main/dns.yml

manage_resolved: true

dns:
  - 1.1.1.2
  - 9.9.9.9
fallback_dns:
  - 1.0.0.2
  - 149.112.112.112
dnssec: allow-downgrade
dns_over_tls: opportunistic

如果 manage_resolved: true,则配置 systemd-resolved

IPv4 和 IPv6 地址将用作系统和备用 DNS 服务器。 如果将 dnssec 设置为 "allow-downgrade",则尝试验证 DNSSEC,但如果服务器不正确支持 DNSSEC,则 DNSSEC 模式将自动禁用。

如果 dns_over_tls 为 true,则所有到服务器的连接将在 DNS 服务器支持 DNS-over-TLS 且具有有效证书的情况下加密。

./defaults/main/ipv6.yml

disable_ipv6: false
sysctl_net_ipv6_conf_accept_ra_rtr_pref: 0

ipv6_disable_sysctl_settings:
  net.ipv6.conf.all.disable_ipv6: 1
  net.ipv6.conf.default.disable_ipv6: 1

ipv6_sysctl_settings:
  net.ipv6.conf.all.accept_ra: 0
  net.ipv6.conf.all.accept_redirects: 0
  net.ipv6.conf.all.accept_source_route: 0
  net.ipv6.conf.all.forwarding: 0
  net.ipv6.conf.all.use_tempaddr: 2
  net.ipv6.conf.default.accept_ra: 0
  net.ipv6.conf.default.accept_ra_defrtr: 0
  net.ipv6.conf.default.accept_ra_pinfo: 0
  net.ipv6.conf.default.accept_ra_rtr_pref: 0
  net.ipv6.conf.default.accept_redirects: 0
  net.ipv6.conf.default.accept_source_route: 0
  net.ipv6.conf.default.autoconf: 0
  net.ipv6.conf.default.dad_transmits: 0
  net.ipv6.conf.default.max_addresses: 1
  net.ipv6.conf.default.router_solicitations: 0
  net.ipv6.conf.default.use_tempaddr: 2

如果 disable_ipv6: true,将禁用 IPv6 并配置相关的 sysctl 设置。

ipv6_sysctl_settings 是主机使用 IPv6 时使用的 sysctl 配置。

sysctl.conf

./defaults/main/journal.yml

rsyslog_filecreatemode: "0640"

journald_compress: true
journald_forwardtosyslog: false
journald_storage: persistent

rsyslog_filecreatemode 设置 rsyslogd 创建新文件时的创建模式,参见 rsconf1_filecreatemode

journald_compress 可以取一个布尔值。如果启用(默认),则在写入文件系统之前会压缩数据对象。

journald_storage 控制存储日志数据的位置。可以是 volatilepersistentautonone 中的一个。

journald_forwardtosyslog 控制通过日志守护进程接收的日志消息是否应转发到传统的 syslog 守护进程。

有关更多信息,请参见 journald.conf

./defaults/main/kernel.yml

allow_virtual_system_calls: true
enable_page_poisoning: true
kernel_lockdown: false
page_table_isolation: true
slub_debugger_poisoning: false

allow_virtual_system_calls 将允许虚拟系统调用,如果为 false,则不会设置 vsyscall 映射,参见 CONFIG_LEGACY_VSYSCALL_NONE

enable_page_poisoning: true 将启用 CONFIG_PAGE_POISONING

kernel_lockdown 配置 内核锁定功能。有效值为 falsetrueintegrityconfidentiality。 如果设置为 true,则内核将在 integrity 模式下被锁定。

page_table_isolation 是针对共享用户/内核地址空间攻击的对策,参见 CONFIG_PAGE_TABLE_ISOLATION

slub_debugger_poisoning 如果设置为 true,可以防止许多类型的使用后释放漏洞,也防止数据泄露和检测损坏的内存。 参见 Short users guide for SLUB

./defaults/main/limits.yml

limit_nofile_hard: 1024
limit_nofile_soft: 512
limit_nproc_hard: 1024
limit_nproc_soft: 512

设置最大进程和打开文件数量,参见 limits.conf(5)

./defaults/main/misc.yml

reboot_ubuntu: false
redhat_signing_keys:
  - 567E347AD0044ADE55BA8A5F199E2F91FD431D51
  - 47DB287789B21722B6D95DDE5326810137017186
epel7_signing_keys:
  - 91E97D7C4A5E96F17F3E888F6A2FAEA2352C64E5
epel8_signing_keys:
  - 94E279EB8D8F25B21810ADF121EA45AB2F86D6A1
epel9_signing_keys:
  - FF8AD1344597106ECE813B918A3872BF3228467C

如果 reboot_ubuntu: true,则在需要时,Ubuntu 节点将重新启动。

redhat_signing_keysRedHat 产品签名密钥

epel7_signing_keysepel8_signing_keysepel9_signing_keys 是特定于发行版的 Fedora EPEL 签名密钥

./defaults/main/module_blocklists.yml

fs_modules_blocklist:
  - cramfs
  - freevxfs
  - hfs
  - hfsplus
  - jffs2
  - squashfs
  - udf

misc_modules_blocklist:
  - bluetooth
  - bnep
  - btusb
  - can
  - cpia2
  - firewire-core
  - floppy
  - ksmbd
  - n_hdlc
  - net-pf-31
  - pcspkr
  - soundcore
  - thunderbolt
  - usb-midi
  - usb-storage
  - uvcvideo
  - v4l2_common

net_modules_blocklist:
  - atm
  - dccp
  - sctp
  - rds
  - tipc

要禁用和 黑名单 的内核模块。

注意

禁用 usb-storage 模块将禁用所有 USB 存储设备。 如果需要使用此类设备,应该相应地配置 USBGuard 或类似工具。

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid 设置 /proc/<pid>/ 的访问模式。

process_group 设置被授权了解进程信息的组,否则将禁止该信息。

/proc 挂载选项

./defaults/main/ntp.yml

manage_timesyncd: true

fallback_ntp:
  - ntp.netnod.se
  - ntp.ubuntu.com
ntp:
  - 2.pool.ntp.org
  - time.nist.gov

如果 manage_timesyncd: true,则配置 systemd timesyncd,否则建议安装 NTP 客户端。

./defaults/main/packagemgmt.yml

apt_hardening_options:
  - Acquire::AllowDowngradeToInsecureRepositories "false";
  - Acquire::AllowInsecureRepositories "false";
  - Acquire::http::AllowRedirect "false";
  - APT::Get::AllowUnauthenticated "false";
  - APT::Get::AutomaticRemove "true";
  - APT::Install-Recommends "false";
  - APT::Install-Suggests "false";
  - APT::Periodic::AutocleanInterval "7";
  - APT::Sandbox::Seccomp "1";
  - Unattended-Upgrade::Remove-Unused-Dependencies "true";
  - Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

配置 APT 工具套件

./defaults/main/packages.yml

system_upgrade: true

packages_blocklist:
  - apport*
  - autofs
  - avahi*
  - avahi-*
  - beep
  - git
  - pastebinit
  - popularity-contest
  - prelink
  - rpcbind
  - rsh*
  - rsync
  - talk*
  - telnet*
  - tftp*
  - tuned
  - whoopsie
  - xinetd
  - yp-tools
  - ypbind

packages_debian:
  - acct
  - apparmor-profiles
  - apparmor-utils
  - apt-show-versions
  - audispd-plugins
  - auditd
  - cracklib-runtime
  - debsums
  - gnupg2
  - haveged
  - libpam-apparmor
  - libpam-cap
  - libpam-modules
  - libpam-pwquality
  - libpam-tmpdir
  - lsb-release
  - needrestart
  - openssh-server
  - postfix
  - rsyslog
  - sysstat
  - systemd-journal-remote
  - tcpd
  - vlock
  - wamerican

packages_redhat:
  - audispd-plugins
  - audit
  - cracklib
  - gnupg2
  - haveged
  - libpwquality
  - openssh-server
  - needrestart
  - postfix
  - psacct
  - python3-dnf-plugin-post-transaction-actions
  - rsyslog
  - rsyslog-gnutls
  - systemd-journal-remote
  - vlock
  - words

packages_ubuntu:
  - fwupd
  - secureboot-db
  - snapd

system_upgrade: true 将在需要时运行 apt upgradednf update

安装依赖于发行版的包,并且会移除 packages_blocklist 中的包。

./defaults/main/password.yml

manage_faillock: true

faillock:
  admin_group: []
  audit: true
  deny: 5
  dir: /var/run/faillock
  even_deny_root: true
  fail_interval: 900
  local_users_only: true
  no_log_info: false
  nodelay: true
  root_unlock_time: 600
  silent: false
  unlock_time: 600

login_defs:
  login_retries: 5
  login_timeout: 60
  pass_max_days: 60
  pass_min_days: 1
  pass_warn_age: 7

password_remember: 5

pwquality:
  dcredit: -1
  dictcheck: 1
  dictpath: ""
  difok: 8
  enforce_for_root: true
  enforcing: 1
  gecoscheck: 1
  lcredit: -1
  local_users_only: true
  maxclassrepeat: 4
  maxrepeat: 3
  minclass: 4
  minlen: 15
  ocredit: -1
  retry: 3
  ucredit: -1
  usercheck: 1
  usersubstr: 3

manage_faillock: true 将启用 faillock 库。

password_remember 设置用户不能重复使用的密码历史的大小。

变量 faillocklogin_defspwquality 用于配置 pam_faillocklogin.defslibpwquality

./defaults/main/rkhunter.yml

manage_rkhunter: true

rkhunter_allow_ssh_prot_v1: false
rkhunter_allow_ssh_root_user: false
rkhunter_mirrors_mode: "0"
rkhunter_update_mirrors: true
rkhunter_web_cmd: curl -fsSL

如果 manage_rkhunter: true,则配置 rkhunter

./defaults/main/sshd.yml

manage_ssh: true

sshd_accept_env: LANG LC_*
sshd_admin_net:
  - 192.168.0.0/24
  - 192.168.1.0/24
sshd_allow_agent_forwarding: false
sshd_allow_groups:
  - sudo
sshd_allow_tcp_forwarding: false
sshd_allow_users:
  - "{{ ansible_user | default(lookup('ansible.builtin.env', 'USER')) }}"
sshd_authentication_methods: any
sshd_authorized_principals_file: /etc/ssh/auth_principals/%u
sshd_banner: /etc/issue.net
sshd_ca_signature_algorithms:
  - ecdsa-sha2-nistp256
  - ecdsa-sha2-nistp384
  - ecdsa-sha2-nistp521
  - ssh-ed25519
  - rsa-sha2-256
  - rsa-sha2-512
  - ssh-rsa
sshd_kbd_interactive_authentication: false
sshd_ciphers:
  - [email protected]
  - [email protected]
  - aes256-ctr
sshd_client_alive_count_max: 1
sshd_client_alive_interval: 200
sshd_compression: false
sshd_config_d_force_clear: false
sshd_config_force_replace: false
sshd_debian_banner: false
sshd_deny_groups: []
sshd_deny_users: []
sshd_gssapi_authentication: false
sshd_host_key_algorithms:
  - [email protected]
  - [email protected]
  - ssh-ed25519
  - ssh-rsa
  - [email protected]
  - [email protected]
  - [email protected]
  - ecdsa-sha2-nistp521
  - ecdsa-sha2-nistp384
  - ecdsa-sha2-nistp256
sshd_host_keys_files: []
sshd_host_keys_group: root
sshd_host_keys_mode: "0600"
sshd_host_keys_owner: root
sshd_hostbased_authentication: false
sshd_ignore_rhosts: true
sshd_ignore_user_known_hosts: true
sshd_kerberos_authentication: false
sshd_kex_algorithms:
  - [email protected]
  - ecdh-sha2-nistp521
  - ecdh-sha2-nistp384
  - ecdh-sha2-nistp256
  - diffie-hellman-group-exchange-sha256
sshd_listen:
  - 0.0.0.0
sshd_log_level: VERBOSE
sshd_login_grace_time: 20
sshd_macs:
  - [email protected]
  - [email protected]
  - hmac-sha2-512
  - hmac-sha2-256
sshd_match_addresses: {}
sshd_match_groups: {}
sshd_match_local_ports: {}
sshd_match_users: {}
sshd_max_auth_tries: 3
sshd_max_sessions: 3
sshd_max_startups: 10:30:60
sshd_password_authentication: false
sshd_permit_empty_passwords: false
sshd_permit_root_login: false
sshd_permit_tunnel: false
sshd_permit_user_environment: false
sshd_ports:
  - 22
sshd_print_last_log: true
sshd_print_motd: false
sshd_print_pam_motd: false
sshd_rekey_limit: 512M 1h
sshd_required_ecdsa_size: 521
sshd_required_rsa_size: 4096
sshd_sftp_enabled: true
sshd_sftp_only_chroot: true
sshd_sftp_only_chroot_dir: "%h"
sshd_sftp_only_group: ""
sshd_sftp_subsystem: internal-sftp -f LOCAL6 -l INFO
sshd_strict_modes: true
sshd_syslog_facility: AUTH
sshd_tcp_keep_alive: false
sshd_trusted_user_ca_keys_base64: ""
sshd_trusted_user_ca_keys_file: /etc/ssh/trusted-user-ca-keys.pem
sshd_update_moduli: false
sshd_use_dns: false
sshd_use_pam: true
sshd_use_privilege_separation: sandbox
sshd_x11_forwarding: false

如果 manage_ssh: true,将配置 SSH 客户端和 SSH 守护进程。

注意

如果存在 /etc/crypto-policies/configset_crypto_policy: true,将根据加密策略配置 CASignatureAlgorithmsCiphersHostKeyAlgorithmsKexAlgorithmsMACs

对于尚未描述的选项的解释,请阅读 https://man.openbsd.org/sshd_config

只有在 sshd_admin_net 中定义的网络才能连接到 sshd_ports。 请注意,为允许访问其他服务,还需要设置附加规则。

仅允许主组或补充组列表与 sshd_allow_groups 中的模式匹配的用户进行 OpenSSH 登录。 也允许 sshd_allow_users 中的用户进行 OpenSSH 登录。 为相反的目的以拒绝访问,使用 sshd_deny_groupssshd_deny_users 参数,这两个参数优先于前面的参数。

sshd_allow_agent_forwarding 指定是否允许 ssh-agent(1) 转发。

sshd_allow_tcp_forwarding 指定是否允许 TCP 转发。 可用选项为 trueall 以允许 TCP 转发,false 以阻止所有 TCP 转发,local 以仅允许本地(从 ssh(1) 的角度)转发或 remote 仅允许远程转发。

sshd_authentication_methods 指定必须成功完成的身份验证方法,以便授予用户访问权限。

sshd_log_level 给出了记录消息时使用的详细级别。

sshd_max_auth_triessshd_max_sessions 指定每个连接允许的最大 SSH 身份验证尝试次数和每个网络连接允许的最大开放 shell、登录或子系统(例如,sftp)会话数量。

sshd_password_authentication 指定是否允许密码身份验证。

sshd_ports 指定 sshd(8) 监听的端口号。

sshd_required_rsa_sizeRequiredRSASize 仅在 SSH 版本高于 9.1 时设置。

sshd_config_d_force_clear 强制清除目录 /etc/ssh/sshd_config.d。 默认值:false

sshd_config_force_replace 强制替换配置文件 /etc/ssh/sshd_config。 默认值:false

注意

默认情况下,角色检查目录 /etc/ssh/sshd_config.d 是否存在,以及它是否由 /etc/ssh/sshd_config 文件中的 Include 参数链接。如果存在,则在 /etc/ssh/sshd_config.d 中创建附加配置文件;如果没有,则覆盖 /etc/ssh/sshd_config 文件。

警告

如果设置任何 sshd_match_(users|groups|addresses|local_ports)sshd_sftp_only_group 参数,则隐含值将为 true

sshd_host_keys_files 为 sshd 设置的主机密钥。如果为空,将使用 ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'],前提是安装的 sshd 版本支持。

sshd_host_keys_owner 设置 sshd 主机密钥的所有者。

sshd_host_keys_group 设置 sshd 主机密钥的组。

sshd_host_keys_mode 设置 sshd 主机密钥的权限。

sshd_match_users 为用户添加条件块。如果满足匹配行上的所有条件,则以下行定义的规则/参数将覆盖配置文件的全局部分中的设置,直到遇到另一个 Match 行或文件末尾。

预期的配置结构:

sshd_match_users:
  - user: <username>
    rules:
      - <parameter sshd> <value>
      - <parameter sshd> <value>

示例,允许 ubuntu 用户通过密码身份验证访问,并且允许 ansible 用户不使用横幅访问:

sshd_match_users:
  - user: ubuntu
    rules:
      - AllowUsers ubuntu
      - AuthenticationMethods password
      - PasswordAuthentication yes
  - user: ansible
    rules:
      - AllowUsers ansible
      - Banner none

sshd_match_groups 为组添加条件块。 更多详细信息和示例请参见 sshd_match_users 参数描述。

预期的配置结构:

sshd_match_groups:
  - group: <groupname>
    rules:
      - <parameter sshd> <value>
      - <parameter sshd> <value>

sshd_match_addresses 为地址添加条件块。 更多详细信息和示例请参见 sshd_match_users 参数描述。

预期的配置结构:

sshd_match_addresses:
  - address: <ip>
    rules:
      - <parameter sshd> <value>
      - <parameter sshd> <value>

sshd_match_local_ports 为端口添加条件块。 更多详细信息和示例请参见 sshd_match_users 参数描述。

预期的配置结构:

sshd_match_ports:
  - port: <port>
    rules:
      - <parameter sshd> <value>
      - <parameter sshd> <value>

sshd_print_pam_motd 指定是否通过 pam 打印 MOTD。

sshd_sftp_enabled 指定是否启用 sftp 配置。

sshd_sftp_subsystem 设置文件传输守护进程的子系统。

sshd_sftp_only_group 指定将仅允许对 sftp 服务访问的组名。

sshd_sftp_only_chroot 指定组访问将通过 chroot 隔离。

sshd_sftp_only_chroot_dir 指定 chroot 目录。 接受令牌 %%(文字 %)、%h(用户的主目录)和 %u(用户名)。

sshd_syslog_facility 设置用于记录 sshd 消息的设施代码。

sshd_update_moduli,如果设置为 true,将从 konstruktoid/ssh-moduli 仓库下载更新的 moduli 文件

./defaults/main/suid_sgid_blocklist.yml

suid_sgid_permissions: true
suid_sgid_blocklist:
  - 7z
  - aa-exec
  - ab
  - agetty
  - alpine
  - ansible-playbook
  - ansible-test
  - aoss
  - apt
  - apt-get
  [...]

如果 suid_sgid_permissions: true,则遍历 suid_sgid_blocklist 并删除任何 SUID/SGID 权限。

完整的文件列表可在 defaults/main/suid_sgid_blocklist.yml 中找到,基于 @GTFOBins 的工作。

./defaults/main/sysctl.yml

manage_sysctl: true
sysctl_conf_dir: "{{ '/usr/lib/sysctl.d' if usr_lib_sysctl_d_dir else '/etc/sysctl.d' }}"

sysctl_dev_tty_ldisc_autoload: 0

ipv4_sysctl_settings:
  net.ipv4.conf.all.accept_redirects: 0
  net.ipv4.conf.all.accept_source_route: 0
  net.ipv4.conf.all.log_martians: 1
  net.ipv4.conf.all.rp_filter: 1
  net.ipv4.conf.all.secure_redirects: 0
  net.ipv4.conf.all.send_redirects: 0
  net.ipv4.conf.all.shared_media: 0
  net.ipv4.conf.default.accept_redirects: 0
  net.ipv4.conf.default.accept_source_route: 0
  net.ipv4.conf.default.log_martians: 1
  net.ipv4.conf.default.rp_filter: 1
  net.ipv4.conf.default.secure_redirects: 0
  net.ipv4.conf.default.send_redirects: 0
  net.ipv4.conf.default.shared_media: 0
  net.ipv4.icmp_echo_ignore_broadcasts: 1
  net.ipv4.icmp_ignore_bogus_error_responses: 1
  net.ipv4.ip_forward: 0
  net.ipv4.tcp_challenge_ack_limit: 2147483647
  net.ipv4.tcp_invalid_ratelimit: 500
  net.ipv4.tcp_max_syn_backlog: 20480
  net.ipv4.tcp_rfc1337: 1
  net.ipv4.tcp_syn_retries: 5
  net.ipv4.tcp_synack_retries: 2
  net.ipv4.tcp_syncookies: 1

generic_sysctl_settings:
  fs.protected_fifos: 2
  fs.protected_hardlinks: 1
  fs.protected_symlinks: 1
  fs.suid_dumpable: 0
  kernel.core_pattern: "|/bin/false"
  kernel.core_uses_pid: 1
  kernel.dmesg_restrict: 1
  kernel.kptr_restrict: 2
  kernel.panic: 60
  kernel.panic_on_oops: 60
  kernel.perf_event_paranoid: 3
  kernel.randomize_va_space: 2
  kernel.sysrq: 0
  kernel.unprivileged_bpf_disabled: 1
  kernel.yama.ptrace_scope: 2
  net.core.bpf_jit_harden: 2
  user.max_user_namespaces: 62967

conntrack_sysctl_settings:
  net.netfilter.nf_conntrack_max: 2000000
  net.netfilter.nf_conntrack_tcp_loose: 0

如果 manage_sysctl: true,则更新 sysctl 配置。

sysctl_conf_dir 是放置 sysctl 配置的地方。

请参阅 sysctl.conf内核文档

./defaults/main/templates.yml

adduser_conf_template: etc/adduser.conf.j2
common_account_template: etc/pam.d/common-account.j2
common_auth_template: etc/pam.d/common-auth.j2
common_password_template: etc/pam.d/common-password.j2
coredump_conf_template: etc/systemd/coredump.conf.j2
faillock_conf_template: etc/security/faillock.conf.j2
hardening_rules_template: etc/audit/rules.d/hardening.rules.j2
hosts_allow_template: etc/hosts.allow.j2
hosts_deny_template: etc/hosts.deny.j2
initpath_sh_template: etc/profile.d/initpath.sh.j2
issue_template: etc/issue.j2
journald_conf_template: etc/systemd/journald.conf.j2
limits_conf_template: etc/security/limits.conf.j2
login_defs_template: etc/login.defs.j2
login_template: etc/pam.d/login.j2
logind_conf_template: etc/systemd/logind.conf.j2
logrotate_conf_template: etc/logrotate.conf.j2
motd_template: etc/motd.j2
pwquality_conf_template: etc/security/pwquality.conf.j2
resolved_conf_template: etc/systemd/resolved.conf.j2
rkhunter_template: etc/default/rkhunter.j2
ssh_config_template: etc/ssh/ssh_config.j2
sshd_config_template: etc/ssh/sshd_config.j2
sysctl_ipv6_config_template: etc/sysctl/sysctl.ipv6.conf.j2
sysctl_main_config_template: etc/sysctl/sysctl.main.conf.j2
system_conf_template: etc/systemd/system.conf.j2
timesyncd_conf_template: etc/systemd/timesyncd.conf.j2
tmp_mount_template: etc/systemd/tmp.mount.j2
user_conf_template: etc/systemd/user.conf.j2
useradd_template: etc/default/useradd.j2

提供了路径以支持覆盖默认的 角色模板

./defaults/main/ufw.yml

manage_ufw: true

ufw_outgoing_traffic:
  - 22
  - 53
  - 80
  - 123
  - 443
  - 853

ufw_rate_limit: false

请参阅关于 所需注释 的说明。

manage_ufw: true 安装并配置 ufw 及相关规则。 将其设置为 false 以便手动安装和配置防火墙。

ufw_outgoing_traffic 打开特定的 ufw 端口,允许外发流量。

如果 ufw_rate_limittrue,将对所有可用的物理网络接口进行连接速率限制。

./defaults/main/umask.yml

session_timeout: 900
umask_value: "077"

session_timeout 以秒为单位设置 TMOUT 环境变量。

umask_value 设置默认 umask 值

./defaults/main/usbguard.yml

manage_usbguard: true

usbguard_configuration_file: /etc/usbguard/usbguard-daemon.conf
usbguard_rulefile: /etc/usbguard/rules.conf

usbguard_auditbackend: LinuxAudit
usbguard_auditfilepath: /var/log/usbguard/usbguard-audit.log
usbguard_authorizeddefault: none
usbguard_devicemanagerbackend: uevent
usbguard_deviceruleswithport: false
usbguard_hidepii: false
usbguard_implicitpolicytarget: block
usbguard_inserteddevicepolicy: apply-policy
usbguard_ipcaccesscontrolfiles: /etc/usbguard/IPCAccessControl.d/
usbguard_ipcallowedgroups:
  - plugdev
  - root
  - wheel
usbguard_ipcallowedusers:
  - root
usbguard_presentcontrollerpolicy: keep
usbguard_presentdevicepolicy: apply-policy
usbguard_restorecontrollerdevicestate: false

manage_usbguard: true 安装并配置 USBGuard

如果可以列出任何规则且尚未存在策略,则将生成策略。

有关可用选项的信息,请参见 配置文档

./defaults/main/users.yml

delete_users:
  - games
  - gnats
  - irc
  - list
  - news
  - sync
  - uucp

将被移除的用户。

推荐阅读

比较 DISA STIG 和 CIS 基准值

互联网安全中心 Linux 基准

常见配置枚举

DISA 安全技术实施指南

SCAP 安全指南

安全性聚焦的 systemd 配置

贡献

想要贡献吗?太好了!我们欢迎任何贡献,无论大小。 如果你发现了什么不对劲,随时可以提交问题、通过创建拉取请求来改进代码,或者通过 赞助该项目

许可证

Apache 许可证 版本 2.0

作者信息

https://github.com/konstruktoid

安装
ansible-galaxy install konstruktoid.hardening
许可证
apache-2.0
下载
33.6k
拥有者