ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で提供されています。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときは、これらの値をクラウド環境に固有の値に置き換えます。
Oracle LinuxでのSELinuxの使用
イントロダクション
SELinuxは、システムセキュリティー、正確なアクセス制御、システム全体の管理者定義ポリシー、および特権エスカレーション攻撃に対する軽減の別のレイヤーを提供する一連のカーネルモジュールおよびユーザー空間ツールです。
このチュートリアルでは、これらのユーザー空間ツールを使用して、システムを強制モードで動作させるのに役立ちます。
目的
この演習では、次のことを学習します。
- SELinuxモードとステータスの確認
- SELinuxのセキュリティ・ラベルの理解
- SELinuxネットワークサービスの操作
- SELinuxユーザーの使用
- SELinuxブールを変更する
- SELinuxファイル・コンテキストの評価
前提条件
- 次の構成で Oracle Linux 8がインストールされているシステム。
sudo
権限を持つroot以外のユーザー
演習環境の設定
ノート:無料ラボ環境を使用する場合、接続およびその他の使用手順については、Oracle Linux Labの基本を参照してください。
ユーザーの作成
追加ユーザーは、この演習の後半でSELinuxユーザーの割当てをテストできます。
-
まだ接続していない場合は、端末を開き、ssh経由でol8-serverシステムに接続します。
ssh oracle@<ip_address_of_ol8-server>
-
ユーザーを作成し、パスワードを設定します。
sudo useradd -u 8000 ralph echo "ralph:oracle" | sudo chpasswd
-
SSH接続を許可します。
oracle
ユーザー・アカウントからSSHキーをコピーします。sudo mkdir /home/ralph/.ssh sudo cp /home/oracle/.ssh/authorized_keys /home/ralph/.ssh/authorized_keys sudo chown -R ralph:ralph /home/ralph/.ssh sudo chmod 700 /home/ralph/.ssh sudo chmod 600 /home/ralph/.ssh/authorized_keys
-
新しい端末を開き、SSH接続が機能することを確認します。
ssh ralph@<ip_address_of_ol8-server>
次に、セッションを
exit
し、端末ウィンドウを閉じます。
SELinuxモードおよびステータス
Oracle LinuxはデフォルトでSELinuxをインストールし、Enforcing
モードで実行します。
-
SELinuxモードをチェックして確認します。
Enforcing
に設定する必要があります。getenforce
-
SELinuxの状態とモードを確認します。
sestatus
sestatus
コマンドの出力には、SELinuxのステータス、ポリシー、およびモードが表示されます。出力例:
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: 31
SELinuxのセキュリティーラベル
SELinuxのすべてのプロセスおよびシステムリソースには、SELinuxコンテキストと呼ばれるセキュリティーラベルがあります。SELinuxコンテキスト(SELinuxラベルとも呼ばれる)は、セキュリティープロパティーに焦点を当て、SELinuxポリシー内のオブジェクトを一貫した方法で参照できるようにします。
-
ファイルの SELinuxセキュリティーラベルを表示します。
ls -ldZ /etc/passwd
出力例:
-rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwd
-Z
オプションを指定したls
出力には、4つの SELinux属性フィールドが表示されます。- ユーザー:
system_u
- ロール:
object_r
- タイプ:
passwd_file_t
- セキュリティ:
s0
SELinuxの
targeted
ポリシー・ルールの大部分はSELinuxタイプを利用して、あるオブジェクト(プロセスなど)と別のオブジェクト(ファイルなど)との間で許容される相互作用を定義するため、これらのうち最も重要なのはSELinuxタイプです。 - ユーザー:
-
使用可能な SELinuxタイプのリストを取得します。
seinfo --type | head
head
コマンドは、出力を最初の10行のみに制限します。
完全な出力は、
ssh
やsshd
などのさまざまなコマンドやサービスに対して SELinuxタイプが存在することを示しています。 -
特定の SELinuxタイプのリストを取得します。
grep
は、ssh
という語を含む型のみに出力を制限します。seinfo -t | grep ssh
-
特定のプロセスおよび構成ファイルのセキュリティ・ラベルのリストを取得します。
ps
を使用すると、プロセスのセキュリティ・ラベルが取得されます。ps -efZ | grep sshd
出力例:
system_u:system_r:sshd_t:s0-s0:c0.c1023 root 2535 1 0 14:37 ? 00:00:00 /usr/sbin/sshd -D system_u:system_r:sshd_t:s0-s0:c0.c1023 root 18514 2535 0 15:21 ? 00:00:00 sshd: oracle [priv] unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 18528 18514 0 15:21 ? 00:00:00 sshd: oracle@pts/0 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 23611 18529 0 15:41 pts/0 00:00:00 grep --color=auto sshd
ls
を使用すると、構成ファイルのセキュリティ・ラベルが取得されます。ls -lZ /etc/ssh/
出力例:
total 600 -rw-r--r--. 1 root root system_u:object_r:etc_t:s0 577388 Oct 9 2021 moduli -rw-r--r--. 1 root root system_u:object_r:etc_t:s0 1770 Oct 9 2021 ssh_config drwxr-xr-x. 2 root root system_u:object_r:etc_t:s0 28 Feb 18 08:51 ssh_config.d -rw-------. 1 root root system_u:object_r:etc_t:s0 4268 Apr 13 14:37 sshd_config -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 537 Apr 13 14:37 ssh_host_ecdsa_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 197 Apr 13 14:37 ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 432 Apr 13 14:37 ssh_host_ed25519_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 117 Apr 13 14:37 ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 2635 Apr 13 14:37 ssh_host_rsa_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 589 Apr 13 14:37 ssh_host_rsa_key.pub
sshd
デーモン・プロセスでは、sshd_t
タイプが使用されます。したがって、targetedポリシーでは、sshd_t
を持つオブジェクトが次のセキュリティー属性を持つ任意のオブジェクトにアクセスできることを示すsshd_t
SELinux属性のルールが必要です。etc_t
sshd_key_t
- ...
同様に、
ssh
コマンドを確認する場合、ssh_home_t
とssh_exec_t
の間の同様のマッピングを判断できます。ls -lZ /usr/bin/ssh
出力例:
-rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct 9 2021 /usr/bin/ssh
ls -lZ ~/.ssh
出力例:
total 4 -rw-------. 1 oracle oracle unconfined_u:object_r:ssh_home_t:s0 404 Apr 13 14:39 authorized_keys
-
ユーザーのセキュリティ・コンテキストを取得します。
もう1つのコンテキスト・タイプは
unconfined_t
です。この SELinuxタイプのオブジェクト(ユーザーなど)には無制限のアクセスがあります。このアクセス・レベルでは、SELinuxではユーザーが実行できる操作が制限されず、DAC権限によってのみ禁止されます。DAC(任意アクセス制御)は、従来のユーザー、グループおよびその他の権限によって処理されるセキュリティ・ポリシーです。たとえば、
oracle
ユーザーのセキュリティ属性を表示します。whoami
id -Z
出力例:
[oracle@ol-selinux ~]$ whoami oracle [oracle@ol-selinux ~]$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
SELinuxおよびネットワークサービス
SELinuxは、内部データベース内で最も一般的に使用されるネットワークベースのソフトウェアパッケージの構成を追跡します。この追跡により、SELinuxは外部対応のサービスから攻撃を防止できます。
したがって、標準以外のディレクトリまたはポートを使用するようにソフトウェアを構成した場合、SELinuxはサービスが動作しないことがあります。
システムの標準ポートに関して SELinuxが認識しているものを表示するには、SELinuxユーティリティー semanage
を使用する必要があります。Oracle Linuxでは、このユーティリティはデフォルトでインストールされないため、インストールします。
-
ユーティリティーを提供するパッケージを決定します。
sudo dnf whatprovides semanage
結果には、
/usr/sbin/semanage
がpolicycoreutils-python-utils
パッケージに含まれていることが示されます。 -
パッケージと依存関係をインストールします。
sudo dnf install -y policycoreutils-python-utils
-
SELinuxで
sshd
が許可されているポートを確認します。sudo semanage port -l | grep ssh
出力例:
ssh_port_t tcp 22
-
SELinuxポリシーに新しいポートを追加します。
SSHデーモンが待機するポートを2222に変更する場合、またはデフォルトの構成を格納する場所を変更する場合は、SELinuxにこれらの変更を通知する必要があります。また、
semanage
を使用して、新しいポリシー・ルールを追加してカスタム・ポートを許可することもできます。sudo sudo semanage port -a -t ssh_port_t -p tcp 2222
-a
オプションは、-t
タイプの新しいポリシー・ルールを追加します。
-
SELinuxで許可されているポートを確認します。
sudo semanage port -l | grep ssh
出力例:
ssh_port_t tcp 2222, 22
-
SELinuxポリシーのポートを変更します。
たとえば、SSHデーモンをポート443にマップするとします。同じコマンドを繰り返しますが、ポートがすでに使用されているというメッセージでエラーが発生します。
sudo semanage port -a -t ssh_port_t -p tcp 443
出力例:
ValueError: Port tcp/443 already defined
http_port_t
タイプからssh_port_t
タイプへのポート443の切替えを試行しているため、エラーが発生しました。これが機能するには、ポートオブジェクトレコードを変更する-m
オプションを使用します。sudo semanage port -m -t ssh_port_t -p tcp 443
SELinuxユーザー
各Linuxユーザーは、SELinuxポリシーを使用してSELinuxユーザーにマップされます。この方法により、Linuxユーザーは SELinuxユーザーマッピングに基づいて制限を継承できます。Oracle Linuxのデフォルトのマッピングは、SELinux unconfined_u
ユーザーにマップされる__default__
ログインです。
-
現在のすべての Linuxユーザーマッピングのリストを取得します。
sudo semanage login -l
oracle
ユーザーはリストされていないため、unconfined_u
ユーザーにマップされます。
-
SELinuxユーザーのリストを取得します。
seinfo -u
-
ユーザーのアクションを制限します。
デフォルトのLinuxユーザーは制約なしで実行されますが、ユーザーのアクションによってアプリケーション
domain
に基づいて制限が発生する場合があります。domain
は、同じSELinuxタイプの多数のオブジェクトです。X Window System、
sudo
、およびネットワークの使用をブロックする場合はどうなりますか。SELinuxにはそのためのユーザーがあります。
これを確認するには、別のLinuxユーザーが必要です。ユーザー ralphを使用します。
-
guest_u
への新しいマッピングを作成します。sudo semanage login -a -s guest_u ralph
-
マッピングを検証します。
sudo semanage login -l
-
ralphがネットワークにアクセスできないことをテストします。
guest_u
から継承される制限は、ログイン後にのみ発生し、sudo
またはsu
の実行では発生しません。新しい端末を開き、ssh経由でralphユーザーとしてol8-serverシステムに接続します。
ssh ralph@<ip_address_of_ol8-server>
-
ユーザーのコンテキストを確認します。
id; id -Z
出力例:
uid=8000(ralph) gid=8000(ralph) groups=8000(ralph) context=guest_u:guest_r:guest_t:s0 guest_u:guest_r:guest_t:s0
-
ユーザーの現在のプロセスのセキュリティ・コンテキストを表示します。
ps axZ
出力には、
guest_u
にマップされたユーザー ralphが表示され、ログインできます。ただし、ralphはネットワークにアクセスできません。 -
ping
を使用してネットワーク接続をテストします。ping localhost
出力例:
ping: socket: Permission denied
-
また、
curl
を使用してネットワークをテストします。curl ifconfig.me
出力例:
curl: (6) Could not resolve host: ifconfig.me
このメッセージは、
curl
がifconfig.me
のDNS名をIPアドレスに解決できないことを示しています。Linuxネットワークサービスである DNSはソケットを開く必要があるため、SELinuxguest_u
ユーザーがそれをブロックします。 -
現在のターミナル・ウィンドウを閉じます。
ユーザー ralphを使用したテストが終了したため、その端末ウィンドウを閉じます。
exit
-
SELinuxブール
SELinuxブールでは、SELinuxポリシーの記述方法を知ることなく、実行時に特定のポリシー変更を行うことができます。Oracle Linuxには多数の組み込みのブール機能が備わっています。または、SELinuxポリシーに精通した管理者が独自のブールを記述することもできます。実装されたポリシーがオプションの場合、管理者はポリシーをブールとして記述することをお薦めします。
-
ブール人とその意味のリストを取得します。
oracleとしてログインしている端末に戻り、次のコマンドを実行します。
sudo semanage boolean -l
出力例:
SELinux boolean State Default Description abrt_anon_write (off , off) Allow abrt to anon write abrt_handle_event (off , off) Allow abrt to handle event abrt_upload_watch_anon_write (on , on) Allow abrt to upload watch anon write antivirus_can_scan_system (off , off) Allow antivirus to can scan system antivirus_use_jit (off , off) Allow antivirus to use jit auditadm_exec_content (on , on) Allow auditadm to exec content authlogin_nsswitch_use_ldap (off , off) Allow authlogin to nsswitch use ldap authlogin_radius (off , off) Allow authlogin to radius ...
- 出力には、各ブールの動作と、有効(
on
)か無効(off
)かを示します。
- 出力には、各ブールの動作と、有効(
-
ブールのみとそのステータスのリストを取得します。
sudo getsebool -a
出力例:
abrt_anon_write --> off abrt_handle_event --> off abrt_upload_watch_anon_write --> on antivirus_can_scan_system --> off antivirus_use_jit --> off auditadm_exec_content --> on authlogin_nsswitch_use_ldap --> off authlogin_radius --> off authlogin_yubikey --> off ...
-
単一のブールのステータスを取得します。
ブール名が判明している場合は、その名前を引数として渡して、そのブールのステータスのみを取得します。
sudo getsebool virt_use_nfs
-
ブール値のSELinuxポリシーを問い合せます。
SELinuxポリシー内のブール・トリガーについて疑問に思うことはありませんか。SELinuxには、それらのルールを問い合せるユーティリティが用意されています。
sesearch -b virt_use_nfs -A
出力例:
allow fsdaemon_t autofs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:file { getattr ioctl lock open read }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:lnk_file { getattr read }; [ virt_use_nfs ]:True ...
-
ブールがアクセスを許可するかどうかを問い合せます。
条件付きブール値に基づいて特定のアクセスが許可される場合について教えてください。質問に回答します。ユーザーpingでは、ユーザー・ドメイン(
user_t
)からpingドメイン(ping_t
)への移行が許可されますか。sesearch -s user_t -t ping_t -c process -p transition -AT
出力例:
allow user_t ping_t:process transition; [ selinuxuser_ping ]:True
user_ping
SELinuxブールが有効な場合、遷移が許可されます。
-
ブールを有効にします。
KVMにSamba共有へのイメージの格納を許可するとします。それにはブールもある。
-
ブールを検索します。
sudo semanage boolean -l | grep virt | grep samba
出力例:
virt_use_samba (off , off) Allow virt to use samba
-
ブール値をenabledに変更します。
sudo setsebool virt_use_samba on
または
sudo semanage boolean -m --on virt_use_samba
-
現在のステータスを確認します。
getsebool virt_use_samba
-
変更がリブートしたことを確認します。
sudo setsebool -P virt_use_samba on
-
-
ローカルの SELinuxポリシーのカスタマイズを表示します。
デフォルト設定が変更されたことを確認すると、これらのローカル・カスタマイズを表示できます。
sudo semanage boolean -l -C
出力例:
SELinux boolean State Default Description virt_use_samba (on , on) Allow virt to use samba
- 出力には、デフォルト値が
on
になったことが示されます。スイッチを永続化し、保留中の値をディスク上のポリシーファイルに書き込むと、デフォルト値は変更されました。
- 出力には、デフォルト値が
SELinuxファイル・コンテキスト
SELinuxの実行時には、すべてのファイルとディレクトリに SELinuxコンテキストのラベルが付けられます。ファイル・システムのラベル付けを管理するためのいくつかのコマンドを確認します。
わかりやすい例として、Nginxのドキュメント・ルート用の新しいディレクトリを作成します。
-
3つのファイルとともに新しいディレクトリを作成します。
sudo mkdir -p /web sudo touch /web/file{1,2,3}
-
新しいディレクトリとファイルのラベルを確認します。
ls -lZ /web
出力例:
total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
- 新しいディレクトリのコンテキスト・タイプおよびファイルは
default_t
です。
ノート:新しく作成されたファイルとディレクトリは、親ディレクトリの SELinuxタイプを継承します。
- 新しいディレクトリのコンテキスト・タイプおよびファイルは
-
一時的なラベルの変更
トラブルシューティングまたはテストの一環として、コンテキストを一時的に変更できます。
sudo chcon -R -t httpd_sys_content_t /web/
ls -lZ /web
-
ラベルをデフォルト設定に戻します。
コンテキストをデフォルトのコンテキスト・タイプに戻します。
sudo restorecon -R -v /web/
出力例:
[oracle@ol-selinux ~]$ sudo restorecon -R -v /web/ Relabeled /web from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file1 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file2 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file3 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 [oracle@ol-selinux ~]$ ls -lZ /web total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
-
ラベルの変更を永続化します。
変更を永続的にして再起動し続けるには、
semanage fcontext
コマンドを使用します。-a
はファイル/etc/selinux/targeted/contexts/files/file_contexts.local
にレコードを追加し、-t
はタイプを定義します。sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
ノート: SELinuxコンテキストを
semanage fcontext
で変更する場合は、ファイルシステムのラベル変更後またはrestorecon
の実行後にファイルのラベル付けを誤らないように、ファイルまたはディレクトリへのフルパスを使用することをお勧めします。 -
コンテキストを確認します。
ls -ldZ /web; ls -lZ /web
出力例:
[oracle@ol-selinux ~]$ ls -ldZ /web; ls -lZ /web drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 45 Apr 14 19:00 /web total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
コンテキストが変わらなかったことに注目してください。
-
新しく作成したファイルとディレクトリのコンテキストを表示します。
sudo semanage fcontext -C -l
出力例:
[oracle@ol-selinux ~]$ sudo semanage fcontext -C -l SELinux fcontext type Context /web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
-
変更をコンテキストに適用します。
sudo restorecon -R -v /web
出力例:
[oracle@ol-selinux ~]$ sudo restorecon -R -v /web Relabeled /web from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file1 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file2 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file3 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
-
新しい SELinuxコンテキストを削除します。
sudo semanage fcontext -d "/web(/.*)?"
- この例では、コンテキストの作成時に使用される正規表現を渡し、ファイルのコンテキスト・レコードの先頭に配置します。正規表現であるため、引用符で囲みます。
-
変更を適用し、
default_t
に戻されたコンテキストを確認します。sudo restorecon -R -v /web; ls -ldZ /web; ls -lZ /web
表示されているユーティリティについては、man
ページを確認してください。その後、学習した内容を使用して、SELinuxをEnforcing
モードのままにします。
詳細情報
他の関連リソースを参照してください。
その他の学習リソース
他のラボをdocs.oracle.com/learnで探すか、Oracle Learning YouTubeチャネルでより無料の学習コンテンツにアクセスします。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品のドキュメントは、Oracle Help Centerを参照してください。