
CIS - Red Hat Enterprise Linux 8 Benchmark v3.0.0 に基づく Linux セキュリティ監査ツールCIS - Red Hat Enterprise Linux 8 Benchmark v3.0.0 に基づいて約130項目の監査を実施します(ドキュメントの完全なセットではありません)。項目:
1. 初期設定
1.6 システム全体の暗号ポリシーの設定
1.6.1 システム全体の暗号ポリシーがレガシーに設定されていないことを確認
1.6.2 システム全体の暗号ポリシーがsha1ハッシュと署名サポートを無効にしていることを確認
1.6.3 システム全体の暗号ポリシーがsshのcbcを無効にしていることを確認
1.6.4 システム全体の暗号ポリシーが128ビット未満のmacを無効にしていることを確認
1.7 コマンドライン警告バナーの設定
1.7.1 デイリーメッセージが適切に設定されていることを確認
1.7.2 ローカルログイン警告バナーが適切に設定されていることを確認
1.7.3 リモートログイン警告バナーが適切に設定されていることを確認
1.7.4 /etc/motdへのアクセスが設定されていることを確認
1.7.5 /etc/issueへのアクセスが設定されていることを確認
1.7.6 /etc/issue.netへのアクセスが設定されていることを確認
2. サービス
2.1 時刻同期の設定
2.1.1 時刻同期が使用されていることを確認
2.1.2 chronyが設定されていることを確認
2.1.3 chronyがrootユーザーとして実行されていないことを確認
2.2 特別目的サービスの設定
2.2.1 autofsサービスが使用されていないことを確認
2.2.2 avahiデーモンサービスが使用されていないことを確認
2.2.3 dhcpサーバーサービスが使用されていないことを確認
2.2.4 dnsサーバーサービスが使用されていないことを確認
2.2.5 dnsmasqサービスが使用されていないことを確認
2.2.6 sambaファイルサーバーサービスが使用されていないことを確認
2.2.7 ftpサーバーサービスが使用されていないことを確認
2.2.8 メッセージアクセスサーバーサービスが使用されていないことを確認
2.2.9 ネットワークファイルシステムサービスが使用されていないことを確認
2.2.10 nisサーバーサービスが使用されていないことを確認
2.2.11 プリントサーバーサービスが使用されていないことを確認
2.2.12 rpcbindサービスが使用されていないことを確認
2.2.13 rsyncサービスが使用されていないことを確認
2.2.14 snmpサービスが使用されていないことを確認
2.2.15 telnetサーバーサービスが使用されていないことを確認
2.2.16 tftpサーバーサービスが使用されていないことを確認
2.2.17 Webプロキシサーバーサービスが使用されていないことを確認
2.2.18 Webサーバーサービスが使用されていないことを確認
2.2.19 xinetdサービスが使用されていないことを確認
2.2.20 Xウィンドウサーバーサービスが使用されていないことを確認
2.2.21 メール転送エージェントがローカルモードのみに設定されていることを確認
2.2.22 承認されたサービスのみがネットワークインターフェースで待機していることを確認
4. アクセス、認証、および許可
4.1 ジョブスケジューラーの設定
4.1.1 cronの設定
4.1.1.1 cronデーモンが有効でアクティブであることを確認
4.1.1.2 /etc/crontabの権限が設定されていることを確認
4.1.1.3 /etc/cron.hourlyの権限が設定されていることを確認
4.1.1.4 /etc/cron.dailyの権限が設定されていることを確認
4.1.1.5 /etc/cron.weeklyの権限が設定されていることを確認
4.1.1.6 /etc/cron.monthlyの権限が設定されていることを確認
4.1.1.7 /etc/cron.dの権限が設定されていることを確認
4.1.1.8 crontabが許可されたユーザーのみに制限されていることを確認
4.1.2 atの設定
4.1.2.1 atが許可されたユーザーのみに制限されていることを確認
4.2 SSHサーバーの設定
4.2.1 /etc/ssh/sshd_configの権限が設定されていることを確認
4.2.2 SSH秘密ホスト鍵ファイルの権限が設定されていることを確認
4.2.3 SSH公開ホスト鍵ファイルの権限が設定されていることを確認
4.2.4 sshdアクセスが設定されていることを確認
4.2.5 sshdバナーが設定されていることを確認
4.2.6 sshd暗号が設定されていることを確認
4.2.7 sshdのClientAliveIntervalとClientAliveCountMaxが設定されていることを確認
4.2.8 sshd DisableForwardingが有効であることを確認
4.2.9 sshd HostbasedAuthenticationが無効であることを確認
4.2.10 sshd IgnoreRhostsが有効であることを確認
4.2.11 sshd KexAlgorithmsが設定されていることを確認
4.2.12 sshd LoginGraceTimeが設定されていることを確認
4.2.13 sshd LogLevelが設定されていることを確認
4.2.14 sshd MACが設定されていることを確認
4.2.15 sshd MaxAuthTriesが設定されていることを確認
4.2.16 sshd MaxSessionsが設定されていることを確認
4.2.17 sshd MaxStartupsが設定されていることを確認
4.2.18 sshd PermitEmptyPasswordsが無効であることを確認
4.2.19 sshd PermitRootLoginが無効であることを確認
4.2.20 sshd PermitUserEnvironmentが無効であることを確認
4.2.21 sshd UsePAMが有効であることを確認
4.2.22 sshd crypto_policyが設定されていないことを確認
4.3 権限昇格の設定
4.3.1 sudoがインストールされていることを確認
4.3.2 sudoコマンドがptyを使用することを確認
4.3.3 sudoログファイルが存在することを確認
4.3.4 ユーザーが昇格のためにパスワードを提供する必要があることを確認
4.3.5 権限昇格の再認証がグローバルに無効化されていないことを確認
4.3.6 sudo認証タイムアウトが正しく設定されていることを確認
4.3.7 suコマンドへのアクセスが制限されていることを確認
4.4 プラグイン可能な認証モジュール(PAM)の設定
4.4.2 authselectの設定
4.4.2.1 アクティブなauthselectプロファイルにpamモジュールが含まれていることを確認
4.4.2.2 pam_faillockモジュールが有効であることを確認
4.4.2.3 pam_pwqualityモジュールが有効であることを確認
4.4.2.4 pam_pwhistoryモジュールが有効であることを確認
4.4.2.5 pam_unixモジュールが有効であることを確認
4.4.3 プラグイン可能モジュール引数の設定
4.4.3.1.1 パスワード失敗試行ロックアウトが設定されていることを確認
4.4.3.1.2 パスワードロック解除時間が設定されていることを確認
4.4.3.1.3 パスワード失敗試行ロックアウトにrootアカウントが含まれていることを確認
4.4.3.2.1 パスワードの変更文字数が設定されていることを確認
4.4.3.2.2 パスワード長が設定されていることを確認
4.4.3.2.3 パスワード複雑性が設定されていることを確認(手動)
4.4.3.2.4 パスワードの連続同一文字が設定されていることを確認
4.4.3.2.5 パスワードの最大連続文字が設定されていることを確認
4.4.3.2.6 パスワード辞書チェックが有効であることを確認
4.4.3.2.7 rootユーザーに対してパスワード品質が強制されていることを確認
4.4.3.3.1 パスワード履歴の記憶が設定されていることを確認
4.4.3.3.2 rootユーザーに対してパスワード履歴が強制されていることを確認
4.4.3.3.3 pam_pwhistoryにuse_authtokが含まれていることを確認
4.4.3.4.1 pam_unixにnullokが含まれていないことを確認
4.4.3.4.2 pam_unixにrememberが含まれていないことを確認
4.4.3.4.3 pam_unixに強力なパスワードハッシュアルゴリズムが含まれていることを確認
4.4.3.4.4 pam_unixにuse_authtokが含まれていることを確認
4.5 ユーザーアカウントと環境
4.5.1 シャドウパスワードスイートパラメータの設定
4.5.1.1 強力なパスワードハッシュアルゴリズムが設定されていることを確認
4.5.1.2 パスワード期限切れポリシーが180日以下であることを確認
4.5.1.3 パスワード期限切れ警告日数が7日以上であることを確認
4.5.1.4 非アクティブパスワードロックが30日以下であることを確認
4.5.1.5 全ユーザーの最終パスワード変更日が過去であることを確認
4.5.2 rootアカウントとシステムアカウントの環境設定
4.5.2.1 rootアカウントのデフォルトグループがGID 0であることを確認
4.5.2.2 rootユーザーのumaskが設定されていることを確認
4.5.2.3 システムアカウントが保護されていることを確認
4.5.2.4 rootパスワードが設定されていることを確認
4.5.3 ユーザーデフォルト環境の設定
4.5.3.1 nologinが/etc/shellsにリストされていないことを確認
4.5.3.2 デフォルトユーザーシェルタイムアウトが設定されていることを確認
4.5.3.3 デフォルトユーザーumaskが設定されていることを確認
5. ログ記録と監査
5.1 ログ記録の設定
5.1.1 rsyslogの設定
5.1.1.1 rsyslogがインストールされていることを確認
5.1.1.2 rsyslogサービスが有効であることを確認
5.1.1.4 rsyslogのデフォルトファイル権限が設定されていることを確認
5.1.1.5 ログ記録が設定されていることを確認
5.1.1.6 rsyslogがリモートログホストにログを送信するように設定されていることを確認
5.1.1.7 rsyslogがリモートクライアントからログを受信するように設定されていないことを確認
6. システムメンテナンス
6.1 システムファイルの権限
6.1.1 /etc/passwdの権限が設定されていることを確認
6.1.2 /etc/passwd-の権限が設定されていることを確認
6.1.3 /etc/opasswdの権限が設定されていることを確認
6.1.4 /etc/groupの権限が設定されていることを確認
6.1.5 /etc/group-の権限が設定されていることを確認
6.1.6 /etc/shadowの権限が設定されていることを確認
6.1.7 /etc/shadow-の権限が設定されていることを確認
6.1.8 /etc/gshadowの権限が設定されていることを確認
6.1.9 /etc/gshadow-の権限が設定されていることを確認
6.1.10 /etc/shellsの権限が設定されていることを確認
6.1.11 ワールド書き込み可能なファイルとディレクトリが保護されていることを確認
6.1.12 所有者またはグループがないファイルやディレクトリが存在しないことを確認
6.1.13 SUIDおよびSGIDファイルがレビューされていることを確認
6.1.14 システムファイル権限の監査
6.2 ローカルユーザーとグループの設定
6.2.1 /etc/passwdのアカウントがシャドウパスワードを使用していることを確認
6.2.2 /etc/shadowのパスワードフィールドが空でないことを確認
6.2.3 /etc/passwdの全てのグループが/etc/groupに存在することを確認
6.2.4 重複するUIDが存在しないことを確認
6.2.5 重複するGIDが存在しないことを確認
6.2.6 重複するユーザー名が存在しないことを確認
6.2.7 重複するグループ名が存在しないことを確認
6.2.8 rootパスの整合性が確認されていることを確認
6.2.9 rootが唯一のUID 0アカウントであることを確認
6.2.10 ローカルインタラクティブユーザーのホームディレクトリが設定されていることを確認
6.2.11 ローカルインタラクティブユーザーのドットファイルへのアクセスが設定されていることを確認

$ date
Tue Aug 6 04:00:37 UTC 2024
$ python3 -V
Python 3.6.8
$ sudo python3 main.py
===========================================================
Linux Security Audit Tool 1.0.1 (2024.08.06)
by password123456
===========================================================
[+][2024-08-06 04:01:14] Start Security Audit.
---------------------------------------------------------
Hostname: buddy2
OS: Rocky Linux 8.8 (Green Obsidian)
IP Address: [ens192] 172.16.13.51
MAC Address: [ens192] 00:50:56:a6:76:b8
[+] 1.Initial Setup
---------------------------------------------------------
1.6.Configure system wide crypto policy
[pass] 1.6.1 : Ensure system wide crypto policy is not set to legacy
[fault] 1.6.2 : Ensure system wide crypto policy disables sha1 hash and signature support
[pass] 1.6.3 : Ensure system wide crypto policy disables cbc for ssh
[manual] 1.6.4 : Ensure system wide crypto policy disables macs less than 128 bits
1.7.Configure Command Line Warning Banners
[pass] 1.7.1 : Ensure message of the day is configured properly
[fault] 1.7.2 : Ensure local login warning banner is configured properly
[pass] 1.7.3 : Ensure remote login warning banner is configured properly
[pass] 1.7.4 : Ensure access to /etc/motd is configured
[pass] 1.7.5 : Ensure access to /etc/issue is configured
[pass] 1.7.6 : Ensure access to /etc/issue.net is configured
...
[*] RESULT
---------------------------------------------------------
output=/home/buddy/1722884474_buddy2_audit.xml
---------------------------------------------------------
[+][2024-08-06 04:01:57] End Security Audit.
$ cat 1722884474_buddy2_audit.xml
<?xml version="1.0" encoding="UTF-8"?>
<results>
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:14</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.8 (Green Obsidian)</os_name>
<os_version>8.8</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:76:b8</mac_address>
<item_no>1.6.1</item_no>
<item_title>Ensure system wide crypto policy is not set to legacy</item_title>
<result>pass</result>
<result_code>0</result_code>
<raw_data>
<![CDATA[
[ok] Not Found: /etc/crypto-policies/config --> ^[ \t]*(\bLEGACY\b)
# cat /etc/crypto-policies/config
...
DEFAULT
]]>
</raw_data>
</items>
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:14</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.8 (Green Obsidian)</os_name>
<os_version>8.8</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:76:b8</mac_address>
<item_no>1.6.2</item_no>
<item_title>Ensure system wide crypto policy disables sha1 hash and signature support</item_title>
<result>fault</result>
<result_code>1</result_code>
<raw_data>
<![CDATA[
[vul] Found: /etc/crypto-policies/state/CURRENT.pol
- found: ^[ \t]*(hash|sign)[ \t]*=[ \t]*([^\n\r#]+)?-sha1\b --> `ECDSA-SHA1,RSA-PSS-SHA1,RSA-SHA1` near at line: 13
# cat /etc/crypto-policies/state/CURRENT.pol
...
11: mac = AEAD HMAC-SHA2-256 HMAC-SHA1 UMAC-128 HMAC-SHA2-384 HMAC-SHA2-512
12: protocol =
13: sign = ECDSA-SHA3-256 ECDSA-SHA2-256 ECDSA-SHA3-384 ECDSA-SHA2-384 ECDSA-SHA3-512 ECDSA-SHA2-512 EDDSA-ED25519 EDDSA-ED448 RSA-PSS-SHA2-
256 RSA-PSS-SHA2-384 RSA-PSS-SHA2-512 RSA-SHA3-256 RSA-SHA2-256 RSA-SHA3-384 RSA-SHA2-384 RSA-SHA3-512 RSA-SHA2-512 ECDSA-SHA2-224 RSA-PSS-S
HA2-224 RSA-SHA2-224 ECDSA-SHA1 RSA-PSS-SHA1 RSA-SHA1
14: arbitrary_dh_groups = 1
15: min_dh_size = 2048
[vul] Found: /etc/crypto-policies/state/CURRENT.pol
- found: ^[ \t]*sha1_in_certs[ \t]*=[ \t]*(0|1)$ --> `1` near at line: 18
# cat /etc/crypto-policies/state/CURRENT.pol
...
16: min_dsa_size = 2048
17: min_rsa_size = 2048
18: sha1_in_certs = 1
19: ssh_certs = 1
20: ssh_etm = 1
]]>
</raw_data>
</items>
...
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:38</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.7 (Green Obsidian)</os_name>
<os_version>8.7</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:4a:80</mac_address>
<item_no>6.1.10</item_no>
<item_title>Ensure permissions on /etc/shells are configured</item_title>
<result>pass</result>
<result_code>0</result_code>
<raw_data>
<![CDATA[
[ok] -rw-r--r-- 1 root root 44 Sep 10 20:51 /etc/shells
- permissions: 644
- owner:group: root:root
]]>
</raw_data>
</items>
</results>
目標は、ほぼ100%純粋なPythonコードでこのツールを実装することでした。ただし、シェルコマンドの使用が避けられない特定のケースがありました。
避けられないケース:
find などのコマンドを使ったファイルやディレクトリの検索操作が、ネイティブのPythonコードよりも大幅に高速な場合。このスクリプトは、可能な限り Pythonコード > サブプロセスでシェルコマンド実行 > 出力を解析 という一般的なパターンを避け、90%以上の純粋なPythonコードで構成されています。
pass、fault、manual、error)と検証用の生のシステムデータの両方が含まれます。ログ内の生監査データは、見方によっては乱雑に見えるかもしれません。