CentOS Stream9のシステム全体の暗号化ポリシー、SELinuxの設定方法等についてまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.システム全体の暗号化ポリシー
- 2.暗号化ポリシーの管理ツール、使用例
- 3.各アプリで暗号化ポリシーをカスタマイズ
- 4.SELinuxの概要
- 5.SELinuxのモード、ステータス確認
- 6.SELinuxのポリシー管理ツール(semanage)
- 7.SELinuxの強制アクセス制御(MAC)の概要
- 8.SELinuxコンテキスト
- 9.主なSELinuxユーザー、ロールの種類
・システム全体の暗号化ポリシーは、コア暗号化サブシステムを設定するシステムコンポーネントで、TLS、IPsec、SSH、DNSSec、Kerberos の各プロトコルに対応する。
・システム全体のポリシーを設定すると、アプリケーションはそのポリシーに従い、ポリシーを満たしていないアルゴリズムやプロトコルを使用するように明示的に要求されない限り、その使用を拒否する(必要な場合は上書きできる)。
2)定義済みのポリシー
〇DEFAULT
・現在の脅威モデルに対して安全なもの。
・TLS1.2/1.3、IKEv2、SSH2が使用できる。
・RSA鍵とDiffie-Hellmanパラメーターは長さが2048ビット以上であれば許容される。
・SHA-1 デジタル署名および証明書に:無効
〇LEGACY
・RHEL6以前との互換性を最大限に確保。
・攻撃対象領域が増えるため、セキュリティーが低下する。
・SHA-1 は、TLS ハッシュ、署名、およびアルゴリズムとして使用できる。
・CBC モードの暗号は、SSH と併用できる。
・GnuTLS を使用するアプリケーションは、SHA-1 で署名した証明書を許可する。
・TLS1.2/1.3、IKEv2、SSH2が使用できる。
・RSA鍵とDiffie-Hellman パラメーターは長さが2048ビット以上であれば許容される。
〇FUTURE
・将来の潜在的なポリシーをテストすることを目的とした、より厳格な将来を見据えたセキュリティーレベル。
・DNSSec または HMAC としての SHA-1 の使用は許可されない。
・SHA2-224 および SHA3-224 ハッシュは拒否される。
・128 ビット暗号は無効になる。
・CBC モードの暗号は、Kerberos を除き無効。
・TLS1.2/1.3、IKEv2、SSH2が使用できる。
・RSA鍵とDiffie-Hellman パラメーターは、ビット長が3072以上だと許可される。
・システムが公共のインターネット上で通信する場合、相互運用性の問題が発生する可能性がある。
〇FIPS
・FIPS140要件に準拠。
・RHELシステムをFIPSモードに切り替えるfips-mode-setupツールは、このポリシーを内部的に使用する。
・FIPSポリシーに切り替えても、FIPS140標準への準拠は保証されない。
・システムをFIPSモードに設定した後、すべての暗号キーを再生成する必要がある。多くのシナリオでは、これは不可能。
$ which update-crypto-policies
/usr/bin/update-crypto-policies
$ rpm -qf /usr/bin/update-crypto-policies
crypto-policies-scripts-20231016-1.git77ceb0b.el9.noarch
2)update-crypto-policiesツールの使用方法
〇現在のシステム全体の暗号化ポリシーを表示
$ update-crypto-policies –show
DEFAULT
〇現在のシステム全体の暗号化ポリシーを変更
例)
# update-crypto-policies –set FUTURE
Setting system policy to FUTURE
〇保管場所のディレクトリ
/etc/crypto-policies/back-ends
〇ディレクトリ内の設定ファイルの表示例
# ls -al /etc/crypto-policies/back-ends
bind.config -> /usr/share/crypto-policies/DEFAULT/bind.txt
gnutls.config -> /usr/share/crypto-policies/DEFAULT/gnutls.txt
java.config -> /usr/share/crypto-policies/DEFAULT/java.txt
javasystem.config -> /usr/share/crypto-policies/DEFAULT/javasystem.txt
krb5.config -> /usr/share/crypto-policies/DEFAULT/krb5.txt
libreswan.config -> /usr/share/crypto-policies/DEFAULT/libreswan.txt
libssh.config -> /usr/share/crypto-policies/DEFAULT/libssh.txt
nss.config
openssh.config -> /usr/share/crypto-policies/DEFAULT/openssh.txt
opensshserver.config -> /usr/share/crypto-policies/DEFAULT/opensshserver.txt
openssl.config -> /usr/share/crypto-policies/DEFAULT/openssl.txt
openssl_fips.config -> /usr/share/crypto-policies/DEFAULT/openssl_fips.txt
opensslcnf.config -> /usr/share/crypto-policies/DEFAULT/opensslcnf.txt
(2)OpenSSHにおける設定方法
1)サーバー側の設定
●設定ファイルの保管場所
/etc/ssh/sshd_config.d/ ディレクトリー
●設定方法
イ)50-redhat.confファイル内にポリシーを指定する場合
・以下の記述の上に設定を記述する
Include /etc/crypto-policies/back-ends/opensshserver.config
ロ)新たに設定ファイルを作成してポリシーを指定する場合
・辞書式順序で 50-redhat.conf ファイルよりも前に来るように、50 未満の 2 桁の数字接頭辞と、.conf という接尾辞を付ける (例: 49-crypto-policy-override.conf)。
〇50-redhat.confのデフォルト設定
# more 50-redhat.conf # This system is following system-wide crypto policy. The changes to # crypto properties (Ciphers, MACs, ...) will not have any effect in # this or following included files. To override some configuration option, # write it before this block or include it before this file. Include /etc/crypto-policies/back-ends/opensshserver.config SyslogFacility AUTHPRIV ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes PrintMotd no
2)クライアント側の設定
●設定方法
イ)各ユーザー毎に設定する場合
・~/.ssh/config ファイルのユーザー固有の設定でグローバルの /etc/ssh/ssh_config を上書きする。
ロ)システム全体で設定する場合
・/etc/ssh/ssh_config.d/ ディレクトリーにあるドロップイン設定ファイルに暗号化ポリシーを指定する。
このとき、辞書式順序で 50-redhat.conf ファイルよりも前に来るように、50 未満の 2 桁の接頭辞と、.conf という接尾辞を付ける (例: 49-crypto-policy-override.conf)。
※/etc/ssh/ssh_configのデフォルト設定
# This system is following system-wide crypto policy.
# To modify the crypto properties (Ciphers, MACs, …), create a *.conf
# file under /etc/ssh/ssh_config.d/ which will be automatically
# included below.
Include /etc/ssh/ssh_config.d/*.conf
(3)wgetで暗号化設定をカスタマイズする例
・–secure-protocol オプションおよび –ciphers オプションを使用する。
例)
wget –secure-protocol=TLSv1_1 –ciphers=”SECURE128″ https://example.com
・SELinux は、どのプロセスがどのファイル、ディレクトリー、およびポートにアクセスできるのかを指定するシステムセキュリティーの追加レイヤー。
・上記パーミッションは、SELinux ポリシー(SELinux セキュリティーエンジンをガイドする一連のルール)で定義する。
・特定の SELinux で制限されたユーザーにマッピングすることで、どのユーザーがどのアクションを実行できるかを制御できる。
●ステータス
・無効
・有効
●有効な場合のモードの種類
〇Enforcing
・インストール”後”のデフォルトモードで、最も安全な SELinux モード。
・SELinux は読み込まれたポリシーを強制的に実行する。
・SELinux は、SELinux ポリシールールに基づいてアクセスを拒否し、明示的に許可された対話だけを有効にする。
〇Permissive
・インストール”時”のデフォルトのモード。
・SELinux は読み込まれたポリシーを強制に実行しない。
・SELinux はアクセスを拒否しないが、ルールに違反するアクションを /var/log/audit/audit.log ログで報告する。
・Permissive モードは、問題のトラブルシューティングなど、特定のケースで役に立つ。
2)ステータスの確認例
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
3)モードの変更方法
・デフォルトでは、Enforcing モードで動作するが、特定のシナリオでは、Permissive モードに設定したり、無効にしたりすることもできる。
・Red Hat は、Enforcing モードでシステムを使用することを推奨する。
デバッグの目的で、一時的にPermissive モードに設定する場合がある。
●現在有効な SELinux モードを表示
$ getenforce
●一時的な設定
・Enforcing モードに設定する場合の例
# setenforce 1
# getenforce
Enforcing
・Permissive モードに設定する場合の例
# setenforce 0
# getenforce
Permissive
●永続的な設定
・設定ファイル名:/etc/selinux/config
・変数名: SELINUX
・指定できる値:enforcing、permissive、disabled
・設定の反映:システムの再起動が必要
※disabled(無効)について
・無効にすると、メモリーリークや競合状態によりカーネルパニックが発生する可能性があるため、/etc/selinux/config ファイルの SELINUX=disabled オプションを使用して SELinux を無効にしない。
・代わりに、selinux=0 パラメーターをカーネルコマンドラインに追加して、SELinux を無効にする。
SELinuxのポリシー管理ツールであるsemanageを利用するには、policycoreutils-python-utilsパッケージが必要。
〇インストール例
# dnf install policycoreutils-python-utils : : ================================================================================ パッケージ Arch バージョン Repo サイズ ================================================================================ インストール: policycoreutils-python-utils noarch 3.6-0.rc1.1.el9 appstream 77 k アップグレード: libselinux x86_64 3.6-0.rc1.1.el9 baseos 86 k libselinux-utils x86_64 3.6-0.rc1.1.el9 baseos 190 k libsemanage x86_64 3.6-0.rc1.1.el9 baseos 118 k libsepol x86_64 3.6-0.rc1.1.el9 baseos 330 k policycoreutils x86_64 3.6-0.rc1.1.el9 baseos 242 k python3-libselinux x86_64 3.6-0.rc1.1.el9 appstream 189 k 依存関係のインストール: checkpolicy x86_64 3.6-0.rc1.1.el9 appstream 353 k python3-audit x86_64 3.1.2-2.el9 appstream 83 k python3-distro noarch 1.5.0-7.el9 baseos 37 k python3-libsemanage x86_64 3.6-0.rc1.1.el9 appstream 79 k python3-policycoreutils noarch 3.6-0.rc1.1.el9 appstream 2.1 M python3-setools x86_64 4.4.3-1.el9 baseos 604 k python3-setuptools noarch 53.0.0-12.el9 baseos 944 k : : アップグレード済み: libselinux-3.6-0.rc1.1.el9.x86_64 libselinux-utils-3.6-0.rc1.1.el9.x86_64 libsemanage-3.6-0.rc1.1.el9.x86_64 libsepol-3.6-0.rc1.1.el9.x86_64 policycoreutils-3.6-0.rc1.1.el9.x86_64 python3-libselinux-3.6-0.rc1.1.el9.x86_64 インストール済み: checkpolicy-3.6-0.rc1.1.el9.x86_64 policycoreutils-python-utils-3.6-0.rc1.1.el9.noarch python3-audit-3.1.2-2.el9.x86_64 python3-distro-1.5.0-7.el9.noarch python3-libsemanage-3.6-0.rc1.1.el9.x86_64 python3-policycoreutils-3.6-0.rc1.1.el9.noarch python3-setools-4.4.3-1.el9.x86_64 python3-setuptools-53.0.0-12.el9.noarch 完了しました!
(2)semanageを使って登録済みのポリシーを確認
●ログインのポリシー
# semanage login -l ログイン名 SELinux ユーザー MLS/MCS 範囲 サービス __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 *
●ネットワークポートのポリシー
# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989
●ファイルコンテキストのポリシー
# semanage fcontext -l | grep ssh /etc/rc\.d/init\.d/sshd regular file system_u:object_r:sshd_initrc_exec_t:s0 /etc/ssh/oslogin_trustedca.pub named pipe system_u:object_r:sshd_key_t:s0
●booleanのポリシー
# semanage boolean -l | grep ssh fenced_can_ssh (オフ,オフ) fenced が can ssh できるようにします selinuxuser_use_ssh_chroot (オフ,オフ) selinuxuser が use ssh chroot できるようにします ssh_chroot_rw_homedirs (オフ,オフ) ssh が chroot rw homedirs できるようにします ssh_keysign (オフ,オフ) ssh が keysign できるようにし ます ssh_sysadm_login (オフ,オフ) ssh が sysadm login できるようにします ssh_use_tcpd (オフ,オフ) ssh が use tcpd できるようにします virt_qemu_ga_manage_ssh (オフ,オフ) virt が qemu ga manage ssh できるようにします
〇強制アクセス制御(SELinux)
・”誰が何にどのようにアクセスできるか”というアクセス制御を、”セキュリティポリシーに基づいて強制
・アクセス制御はホワイトリスト形式となっており、あらかじめ定義したアクセスルール以外のアクセスについてはすべて拒否する。
・セキュリティポリシーに従ったアクセス制限をrootユーザを含む全てのユーザやプロセスに強制させる。
・セキュリティポリシーに登録されているアクセスルールはセキュリティ管理者のみが変更でき、ファイルの所有者でもアクセスルールを変更できない。
〇任意アクセス制御(伝統的なUNIXパーミッション)
・ログインユーザ情報とリソースの所有者情報を基にアクセス制御を行う。
・ファイルの所有者がパーミッションの設定を自由に変更でき、rootユーザはすべてのファイルにアクセスすることが可能。
2)強制アクセス制御(MAC)と任意アクセス制御(DAC)の比較
●任意アクセス制御(伝統的なUNIXパーミッション)
〇制御方法
・ユーザIDやグループIDとリソースの所有者・所有グループ情報を基にアクセス制御
〇アクセス権の変更
・ファイルの所有者がファイルのパーミッションを自由に設定・変更することが可能
〇root特権昇格のセキュリティ侵害時の被害
・root特権を奪うと何でもできる。
●強制アクセス制御(SELinux)
〇制御方法
・アクセスルールをセキュリティポリシーとして集中管理し、システムレベルでアクセス制御を強制的に実行
〇アクセス権の変更
・ファイルの所有者であってもアクセスルールの変更は不可
〇root特権昇格のセキュリティ侵害時の被害
・プロセスに制限が掛かるため、root特権を奪われても影響範囲が限定される
3)RHREのルール・ポリシー適用
・DACルールが最初に確認され、その他都にSELinuxのMACポリシーが確認される。
・DAC ルールがアクセスを拒否すると、SELinuxポリシールールは使用されない。
→従来のDACルールがアクセスを拒否すると、SELinux 拒否がログに記録されない。
・プロセス、システムリソースには、SELinuxコンテキストと呼ばれる特別なセキュリティーラベルがある。
・SELinux コンテキストは、システムレベルの詳細を抽象化し、エンティティーのセキュリティープロパティーに焦点を当てた識別子。
・SELinux ポリシーは、プロセスが、互いに、またはさまざまなシステムリソースと相互作用する方法を定義する一連のルールにこのコンテキストを使用する。
・SELinux はロールベースアクセス制御 (RBAC)、Type Enforcement(TE)、およびオプションで Multi-Level Security(MLS) の組み合わせを提供する。
2)SELinuxコンテキストの構文
user:role:type:level
〇user
・各Linux ユーザーは、SELinux ポリシーを使用して SELinuxユーザーにマッピングされる。これにより、Linux ユーザーは SELinux ユーザーの制限を継承できる。
・マップされた SELinux ユーザー ID は、開始できるロールとレベルを定義するために、そのセッションのプロセスに対して SELinux コンテキストで使用される。
〇role(ロールベースのアクセス制御 (RBAC) の属性)
・SELinux ユーザーはロールに対して許可され、ロールはドメインに対して承認され、ロールは、ドメインと SELinux ユーザーの仲介として機能する。
・入力可能なロールによって入力できるドメインが決まり、最終的には、アクセス可能なオブジェクトタイプを制御する。
〇type(Type Enforcement の属性)
・タイプは、プロセスのドメインとファイルのタイプを定義する。
・SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかにかかわらず、タイプが相互にアクセスできる方法を定義する。
・アクセスは、それを許可する特定の SELinux ポリシールールが存在する場合にのみ許可される。
〇level(MLS と MCS の属性)
・MLS(Multi-Level Security) および Multi-Category Security(MCS) で使用される属性。
3)ユーザーの SELinux コンテキストの確認例
〇確認例
# id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# semanage login -l
ログイン名 SELinux ユーザー MLS/MCS 範囲 サービス
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
〇RHELのデフォルト動作
・RHEL、Linux ユーザーはデフォルトで制限なしで実行される。
・上記コンテキストは、Linux ユーザーが SELinux unconfined_u ユーザーにマップされ、unconfined_r ロールとして実行され、unconfined_t ドメインで実行されていることを示している。
・Linux ユーザーはデフォルトで SELinux の __default__ ログインにマッピングされ、SELinux unconfined_u ユーザーにマッピングされる。
・useradd コマンドで Linux ユーザーを作成し、オプションを指定しないと、SELinux unconfined_u ユーザーにマッピングされる。
4)プロセスの SELinux コンテキストの確認例
# ps -eZ LABEL PID TTY TIME CMD system_u:system_r:init_t:s0 1 ? 00:00:03 systemd system_u:system_r:firewalld_t:s0 585 ? 00:00:00 firewalld system_u:system_r:sshd_t:s0-s0:c0.c1023 1098 ? 00:00:00 sshd system_u:system_r:systemd_logind_t:s0 1253 ? 00:00:00 systemd-logind unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3949 ? 00:00:00 sshd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3950 pts/0 00:00:00 bash system_u:system_r:httpd_t:s0 4047 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 4262 ? 00:00:00 php-fpm unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 4267 pts/0 00:00:00 ps
・auditadm_r:auditサブシステムに関連するプロセスの管理が可能
・dbadm_r:データベース管理システムに関連するSELinuxタイプの管理が可能
・logadm_r:syslogおよびauditlogプロセスに関連するSELinuxタイプの管理が可能
・secadm_r:SELinuxの管理が可能
・webadm_r:Webサーバに関連するSELinuxタイプの管理が可能
〇利用可能なロールのリストを表示
# seinfo -u Users: 8 guest_u root staff_u sysadm_u system_u unconfined_u user_u xguest_u
※seinfo コマンドは、setools-console パッケージにより提供される。
2)主なSELinuxユーザー
〇unconfined_u
・デフォルトでマッピングされるユーザー。
・unconfined_u が実行するプロセスはすべて、unconfined_t ドメイン内にあり、システム全体にアクセスできる。
〇system_u
・システムプロセスおよびオブジェクトの特別なユーザー ID。
・Linux ユーザーに関連付けることはできない。
〇sysadm_u
・su、sudoが可能。
〇staff_u
・sudoが可能。
〇guest_u
・sudo不可。
●利用可能なSELinuxユーザーを表示
# seinfo -u Users: 8 guest_u root staff_u sysadm_u system_u unconfined_u user_u xguest_u