thechip911.hardening
ハードニング - Ansible ロール
AlmaLinux、Debian、またはUbuntuサーバーを少しだけセキュアにするためのAnsibleロールです。
systemdエディションです。
Ansibleのバージョンは2.12以上が必要です。
Ansible Galaxyで入手できます。
AlmaLinux 8、Debian 11、Ubuntuの20.04 LTS (Focal Fossa) および22.04 LTS (Jammy Jellyfish)がサポートされています。
注意
このロールを実運用環境で使用する前に、必ず非運用環境でテストしてください。
注意
検証用のSLSAアーティファクトが、slsaアクションワークフローにあり、確認できます。
依存関係
なし。
例
プレイブック
---
- hosts: localhost
any_errors_fatal: true
tasks:
- name: ハードニングロールを含める
ansible.builtin.include_role:
name: thechip911.hardening
vars:
block_blacklisted: true
sshd_admin_net:
- 10.0.0.0/16
suid_sgid_permissions: false
...
git checkoutを使ったansible-pull
---
- hosts: localhost
any_errors_fatal: true
tasks:
- name: gitをインストール
become: true
ansible.builtin.package:
name: git
state: present
- name: thechip911.hardeningをチェックアウト
become: true
ansible.builtin.git:
repo: 'https://github.com/thechip911/ansible-role-hardening'
dest: /etc/ansible/roles/thechip911.hardening
version: master
- name: ハードニングロールを含める
ansible.builtin.include_role:
name: thechip911.hardening
vars:
block_blacklisted: true
sshd_admin_net:
- 10.0.2.0/16
suid_sgid_permissions: false
...
UFWファイアウォールルールに関する注意
ufw
を毎回リセットするのではなく、ネットワークトラフィックの中断を防ぐために、comment: ansible managed
タスクパラメータと値を持たないすべてのufw
ルールを削除します。
このロールはまた、デフォルトの拒否ポリシーを設定します。これは、sshd_port
およびufw_outgoing_traffic
変数に指定されたポートを除いて、他のポート用のファイアウォールルールを作成する必要があることを意味します。
タスクの実行と構成
ロールの構成ツリーについては、STRUCTURE.mdを参照してください。
ロールテスト
テスト方法については、TESTING.mdを参照してください。
デフォルト付きロール変数
./defaults/main/auditd.yml
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_max_log_file: 8
auditd_max_log_file_action: keep_logs
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
Grubを使用してブート時にauditd
を有効にします。
auditd_apply_audit_rules: 'yes'
の場合、ロールは含まれているテンプレートファイルからauditdルールを適用します。
auditd_action_mail_acct
は有効なメールアドレスまたはエイリアスである必要があります。
auditd_admin_space_left_action
は、システムがディスクスペースが不足していることを検出したときに取るべきアクションを定義します。suspend
は、auditデーモンがディスクへのレコード書き込みを停止する原因となります。
auditd_max_log_file_action
は、システムが最大ファイルサイズ制限に達したことを検出したときに取るべきアクションを設定します。例えば、rotate
オプションは、auditデーモンにログを回転させます。keep_logs
オプションはrotate
に似ていますが、num_logs
設定を使用しません。これにより、auditログが上書きされるのを防ぎます。
auditd_space_left_action
は、システムがディスクスペースが不足していることを検出したときに取るべきアクションをシステムに指示します。email
は、action_mail_acct
に指定されたメールアカウントに警告を送信し、syslogにもメッセージを送信することを意味します。
auditd_mode
はauditd
の失敗モードを設定します。0=サイレント、1=printk、2=パニック。
./defaults/main/compilers.yml
compilers:
- as
- cargo
- cc
- cc-[0-9]*
- clang-[0-9]*
- gcc
- gcc-[0-9]*
- go
- make
- rustc
ルートユーザーに制限されるコンパイラのリスト。
./defaults/main/disablewireless.yml
disable_wireless: false
true
の場合、すべてのワイヤレスインターフェースをオフにします。
./defaults/main/dns.yml
dns: 127.0.0.1 1.1.1.1
fallback_dns: 9.9.9.9 1.0.0.1
dnssec: allow-downgrade
dns_over_tls: opportunistic
システムとフォールバックのDNSサーバーとして使用するIPv4およびIPv6のアドレス。
dnssec
が「allow-downgrade」に設定されている場合、DNSSEC検証は試行されますが、サーバーがDNSSECを適切にサポートしていない場合、DNSSECモードは自動的に無効になります。
dns_over_tls
がtrueの場合、DNSサーバーがDNS-over-TLSをサポートしており、有効な証明書を持っていれば、サーバーへのすべての接続が暗号化されます。
systemdオプション。
./defaults/main/ipv6.yml
disable_ipv6: false
ipv6_disable_sysctl_settings:
net.ipv6.conf.all.disable_ipv6: 1
net.ipv6.conf.default.disable_ipv6: 1
disable_ipv6: true
の場合、IPv6が無効になります。
./defaults/main/limits.yml
limit_nofile_hard: 1024
limit_nofile_soft: 512
limit_nproc_hard: 1024
limit_nproc_soft: 512
プロセスとオープンファイルの最大数。
./defaults/main/misc.yml
install_aide: true
reboot_ubuntu: false
redhat_signing_keys:
- 567E347AD0044ADE55BA8A5F199E2F91FD431D51
- 47DB287789B21722B6D95DDE5326810137017186
epel7_signing_keys:
- 91E97D7C4A5E96F17F3E888F6A2FAEA2352C64E5
epel8_signing_keys:
- 94E279EB8D8F25B21810ADF121EA45AB2F86D6A1
epel9_signing_keys:
- FF8AD1344597106ECE813B918A3872BF3228467C
install_aide: true
の場合、AIDEがインストールされ、構成されます。
reboot_ubuntu: true
の場合、必要に応じてUbuntuノードが再起動されます。
redhat_signing_keys
はRedHat製品の署名鍵です。
epel7_signing_keys
、epel8_signing_keys
、およびepel9_signing_keys
はリリース特有のFedora EPEL署名鍵です。
./defaults/main/module_blocklists.yml
block_blacklisted: false
fs_modules_blocklist:
- cramfs
- freevxfs
- hfs
- hfsplus
- jffs2
- squashfs
- udf
misc_modules_blocklist:
- bluetooth
- bnep
- btusb
- can
- cpia2
- firewire-core
- floppy
- n_hdlc
- net-pf-31
- pcspkr
- soundcore
- thunderbolt
- usb-midi
- usb-storage
- uvcvideo
- v4l2_common
net_modules_blocklist:
- atm
- dccp
- sctp
- rds
- tipc
ブロックされたカーネルモジュール。
block_blacklisted: true
を設定すると、自動的にblacklisted
カーネルモジュールがロードされるのを防ぎます。ブラックリストに登録されているモジュールでも、modprobe module_name
を使って手動でロードできます。install module_name /bin/true
を使うことで、これを防ぐことができます。
./defaults/main/mount.yml
hide_pid: 2
process_group: root
hide_pid
は/proc/<pid>/
アクセスモードを設定します。
process_group
設定は、hidepid=
で禁止されているプロセス情報を学ぶことができるグループを構成します。
./defaults/main/ntp.yml
fallback_ntp: 2.ubuntu.pool.ntp.org 3.ubuntu.pool.ntp.org
ntp: 0.ubuntu.pool.ntp.org 1.ubuntu.pool.ntp.org
NTPサーバーのホスト名またはIPアドレス。systemdオプション。
./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*
- 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
- rkhunter
- rsyslog
- sysstat
- tcpd
- vlock
- wamerican
packages_redhat:
- audispd-plugins
- audit
- cracklib
- gnupg2
- haveged
- libpwquality
- openssh-server
- needrestart
- postfix
- psacct
- rkhunter
- rsyslog
- rsyslog-gnutls
- vlock
- words
packages_ubuntu:
- fwupd
- secureboot-db
system_upgrade: 'yes'
を設定すると、必要に応じてapt upgrade
またはdnf update
が実行されます。
インストールするパッケージはディストリビューションに依存し、削除するパッケージはpackages_blocklist
で管理されます。
./defaults/main/password.yml
crypto_policy: FIPS
pwquality_config:
dcredit: -1
dictcheck: 1
difok: 8
enforcing: 1
lcredit: -1
maxclassrepeat: 4
maxrepeat: 3
minclass: 4
minlen: 15
ocredit: -1
ucredit: -1
暗号化ポリシーを設定します。
/etc/crypto-policies/config
が存在する場合に有効です。
libpwqualityライブラリを構成します。
./defaults/main/sshd.yml
sshd_accept_env: LANG LC_*
sshd_admin_net:
- 192.168.0.0/24
- 192.168.1.0/24
sshd_allow_agent_forwarding: 'no'
sshd_allow_groups: sudo
sshd_allow_tcp_forwarding: 'no'
sshd_authentication_methods: any
sshd_banner: /etc/issue.net
sshd_challenge_response_authentication: 'no'
sshd_ciphers: [email protected],[email protected],aes256-ctr
sshd_client_alive_count_max: 1
sshd_client_alive_interval: 200
sshd_compression: 'no'
sshd_gssapi_authentication: 'no'
sshd_hostbased_authentication: 'no'
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_ignore_user_known_hosts: 'yes'
sshd_kerberos_authentication: 'no'
sshd_kex_algorithms: [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
sshd_login_grace_time: 20
sshd_log_level: VERBOSE
sshd_macs: [email protected],[email protected],hmac-sha2-512,hmac-sha2-256
sshd_max_auth_tries: 3
sshd_max_sessions: 3
sshd_max_startups: 10:30:60
sshd_password_authentication: 'no'
sshd_permit_empty_passwords: 'no'
sshd_permit_root_login: 'no'
sshd_permit_user_environment: 'no'
sshd_port: 22
sshd_print_last_log: 'yes'
sshd_print_motd: 'no'
sshd_rekey_limit: 512M 1h
sshd_required_rsa_size: 2048
sshd_strict_modes: 'yes'
sshd_subsystem: sftp internal-sftp
sshd_tcp_keep_alive: 'no'
sshd_use_dns: 'no'
sshd_use_pam: 'yes'
sshd_x11_forwarding: 'no'
詳しいオプションについては、https://man.openbsd.org/sshd_configを参照してください。
sshd_admin_net
で定義されたネットワークだけがsshd_port
に接続できます。追加のサービスへのアクセスを許可するためには、さらにルールを設定する必要があります。
OpenSSHのログインは、ユーザーの主グループまたは補助グループのリストがsshd_allow_groups
のパターンの1つに一致するユーザーにのみ許可されます。
sshd_allow_agent_forwarding
は、ssh-agent(1)の転送が許可されるかどうかを指定します。
sshd_allow_tcp_forwarding
は、TCP転送が許可されるかどうかを指定します。利用可能なオプションはyes
(すべてのTCP転送を許可)、no
(すべてのTCP転送を防止)、local
(ssh(1)からの視点でのローカル転送のみ許可)、remote
(リモート転送のみ許可)です。
sshd_authentication_methods
は、ユーザーがアクセスを許可されるために成功裏に完了する必要のある認証方法を指定します。
sshd_log_level
は、ログメッセージの記録に使用される詳細レベルを指定します。
sshd_max_auth_tries
およびsshd_max_sessions
は、接続ごとに許可される最大SSH認証試行回数と、ネットワーク接続ごとに許可される最大オープンシェル、ログインまたはサブシステム(例:sftp)セッション数を指定します。
sshd_password_authentication
は、パスワード認証が許可されるかどうかを指定します。
sshd_port
はsshd(8)がリッスンするポート番号を指定します。
sshd_required_rsa_size
とRequiredRSASizeは、SSHバージョンが9.1を超えている場合のみ設定されます。
./defaults/main/suid_sgid_blocklist.yml
suid_sgid_permissions: true
suid_sgid_blocklist:
- ansible-playbook
- ar
- as
- at
- awk
- base32
- base64
- bash
- busctl
- busybox
[...]
suid_sgid_permissions: true
の場合、suid_sgid_blocklist
をループして、SUID/SGID権限を削除します。
完全なファイルリストはdefaults/main/suid_sgid_blocklist.ymlで確認できます。
./defaults/main/sysctl.yml
sysctl_dev_tty_ldisc_autoload: 0
sysctl_net_ipv6_conf_accept_ra_rtr_pref: 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
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
generic_sysctl_settings:
fs.protected_fifos: 2
fs.protected_hardlinks: 1
fs.protected_symlinks: 1
fs.suid_dumpable: 0
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
conntrack_sysctl_settings:
net.netfilter.nf_conntrack_max: 2000000
net.netfilter.nf_conntrack_tcp_loose: 0
sysctl
設定。
./defaults/main/ufw.yml
ufw_enable: true
ufw_outgoing_traffic:
- 22
- 53
- 80
- 123
- 443
- 853
ufw_enable: true
は、関連するルールでufw
をインストールおよび構成します。手動でファイアウォールをインストールおよび構成するには、false
に設定します。ufw_outgoing_traffic
は、特定のufw
ポートを開き、外向きのトラフィックを許可します。
./defaults/main/users.yml
delete_users:
- games
- gnats
- irc
- list
- news
- sync
- uucp
削除すべきユーザー。
推奨リーディング
Center for Internet Security Linuxベンチマーク
Common Configuration Enumeration
貢献
貢献したいですか?素晴らしい!貢献は常に歓迎されます。大小を問わず、何かおかしいと感じたら、問題を提出したり、プルリクエストを作成してコードを改善したり、このプロジェクトを支援したりしてください。
ライセンス
Apache License Version 2.0