VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで

CentOS Stream9のセキュリティ設定(暗号化ポリシー、SELinux)

CentOS Stream9のシステム全体の暗号化ポリシー、SELinuxの設定方法等についてまとめました。

※目次をクリックすると目次の下部にコンテンツが表示されます。

システム全体の暗号化ポリシー
1)概要
 
・システム全体の暗号化ポリシーは、コア暗号化サブシステムを設定するシステムコンポーネントで、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モードに設定した後、すべての暗号キーを再生成する必要がある。多くのシナリオでは、これは不可能。
暗号化ポリシーの管理ツール、使用例
1)暗号化ポリシーの管理ツール:update-crypto-policiesツール
 
$ 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
各アプリで暗号化ポリシーをカスタマイズ
(1)各アプリケーション毎のポリシー設定ファイルの保管場所
 
〇保管場所のディレクトリ
/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の概要
・Security Enhanced Linux (SELinux) は強制アクセス制御 (MAC) の実装であり、追加のセキュリティー層を提供する。
・SELinux は、どのプロセスがどのファイル、ディレクトリー、およびポートにアクセスできるのかを指定するシステムセキュリティーの追加レイヤー。
・上記パーミッションは、SELinux ポリシー(SELinux セキュリティーエンジンをガイドする一連のルール)で定義する。
・特定の SELinux で制限されたユーザーにマッピングすることで、どのユーザーがどのアクションを実行できるかを制御できる。
SELinuxのモード、ステータス確認
1)ステータス、モードの種類
 
●ステータス
・無効
・有効
 
●有効な場合のモードの種類
〇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)
(1)policycoreutils-python-utilsパッケージのインストール
 
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の強制アクセス制御(MAC)の概要
1)強制アクセス制御(MAC)と任意アクセス制御(DAC)の概要
 
〇強制アクセス制御(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コンテキスト
1)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
主なSELinuxユーザー、ロールの種類
1)主なロール
 
・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

VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで

トップへ戻る