ノート:

Oracle LinuxでのSELinuxの使用

イントロダクション

SELinuxは、システムセキュリティー、正確なアクセス制御、システム全体の管理者定義ポリシー、および特権エスカレーション攻撃に対する軽減の別のレイヤーを提供する一連のカーネルモジュールおよびユーザー空間ツールです。

このチュートリアルでは、これらのユーザー空間ツールを使用して、システムを強制モードで動作させるのに役立ちます。

目的

この演習では、次のことを学習します。

前提条件

演習環境の設定

ノート:無料ラボ環境を使用する場合、接続およびその他の使用手順については、Oracle Linux Labの基本を参照してください。

ユーザーの作成

追加ユーザーは、この演習の後半でSELinuxユーザーの割当てをテストできます。

  1. まだ接続していない場合は、端末を開き、ssh経由でol8-serverシステムに接続します。

    ssh oracle@<ip_address_of_ol8-server>
    
  2. ユーザーを作成し、パスワードを設定します。

    sudo useradd -u 8000 ralph
    echo "ralph:oracle" | sudo chpasswd
    
  3. 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
    
  4. 新しい端末を開き、SSH接続が機能することを確認します。

    ssh ralph@<ip_address_of_ol8-server>
    

    次に、セッションをexitし、端末ウィンドウを閉じます。

SELinuxモードおよびステータス

Oracle LinuxはデフォルトでSELinuxをインストールし、Enforcingモードで実行します。

  1. SELinuxモードをチェックして確認します。

    Enforcingに設定する必要があります。

    getenforce
    
  2. 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ポリシー内のオブジェクトを一貫した方法で参照できるようにします。

  1. ファイルの 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タイプです。

  2. 使用可能な SELinuxタイプのリストを取得します。

    seinfo --type | head
    
    • headコマンドは、出力を最初の10行のみに制限します。

    完全な出力は、sshsshdなどのさまざまなコマンドやサービスに対して SELinuxタイプが存在することを示しています。

  3. 特定の SELinuxタイプのリストを取得します。

    grepは、sshという語を含む型のみに出力を制限します。

    seinfo -t | grep ssh
    
  4. 特定のプロセスおよび構成ファイルのセキュリティ・ラベルのリストを取得します。

    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_tssh_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
    
  5. ユーザーのセキュリティ・コンテキストを取得します。

    もう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では、このユーティリティはデフォルトでインストールされないため、インストールします。

  1. ユーティリティーを提供するパッケージを決定します。

    sudo dnf whatprovides semanage
    

    結果には、/usr/sbin/semanagepolicycoreutils-python-utilsパッケージに含まれていることが示されます。

  2. パッケージと依存関係をインストールします。

    sudo dnf install -y policycoreutils-python-utils
    
  3. SELinuxでsshdが許可されているポートを確認します。

    sudo semanage port -l | grep ssh
    

    出力例:

    ssh_port_t                     tcp      22
    
  4. SELinuxポリシーに新しいポートを追加します。

    SSHデーモンが待機するポートを2222に変更する場合、またはデフォルトの構成を格納する場所を変更する場合は、SELinuxにこれらの変更を通知する必要があります。また、semanageを使用して、新しいポリシー・ルールを追加してカスタム・ポートを許可することもできます。

    sudo sudo semanage port -a -t ssh_port_t -p tcp 2222
    
    • -aオプションは、-tタイプの新しいポリシー・ルールを追加します。
  5. SELinuxで許可されているポートを確認します。

    sudo semanage port -l | grep ssh
    

    出力例:

    ssh_port_t                     tcp      2222, 22
    
  6. 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__ログインです。

  1. 現在のすべての Linuxユーザーマッピングのリストを取得します。

    sudo semanage login -l
    
    • oracleユーザーはリストされていないため、unconfined_uユーザーにマップされます。
  2. SELinuxユーザーのリストを取得します。

    seinfo -u
    
  3. ユーザーのアクションを制限します。

    デフォルトのLinuxユーザーは制約なしで実行されますが、ユーザーのアクションによってアプリケーションdomainに基づいて制限が発生する場合があります。domainは、同じSELinuxタイプの多数のオブジェクトです。

    X Window System、sudo、およびネットワークの使用をブロックする場合はどうなりますか。

    SELinuxにはそのためのユーザーがあります。

    これを確認するには、別のLinuxユーザーが必要です。ユーザー ralphを使用します。

    1. guest_uへの新しいマッピングを作成します。

      sudo semanage login -a -s guest_u ralph
      
    2. マッピングを検証します。

      sudo semanage login -l
      
    3. ralphがネットワークにアクセスできないことをテストします。

      guest_uから継承される制限は、ログイン後にのみ発生し、sudoまたはsuの実行では発生しません。

      新しい端末を開き、ssh経由でralphユーザーとしてol8-serverシステムに接続します。

      ssh ralph@<ip_address_of_ol8-server>
      
    4. ユーザーのコンテキストを確認します。

      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
      
    5. ユーザーの現在のプロセスのセキュリティ・コンテキストを表示します。

      ps axZ
      

      出力には、guest_uにマップされたユーザー ralphが表示され、ログインできます。ただし、ralphはネットワークにアクセスできません。

    6. pingを使用してネットワーク接続をテストします。

      ping localhost
      

      出力例:

      ping: socket: Permission denied
      
    7. また、curlを使用してネットワークをテストします。

      curl ifconfig.me
      

      出力例:

      curl: (6) Could not resolve host: ifconfig.me
      

      このメッセージは、curlifconfig.meのDNS名をIPアドレスに解決できないことを示しています。Linuxネットワークサービスである DNSはソケットを開く必要があるため、SELinux guest_uユーザーがそれをブロックします。

    8. 現在のターミナル・ウィンドウを閉じます。

      ユーザー ralphを使用したテストが終了したため、その端末ウィンドウを閉じます。

      exit
      

SELinuxブール

SELinuxブールでは、SELinuxポリシーの記述方法を知ることなく、実行時に特定のポリシー変更を行うことができます。Oracle Linuxには多数の組み込みのブール機能が備わっています。または、SELinuxポリシーに精通した管理者が独自のブールを記述することもできます。実装されたポリシーがオプションの場合、管理者はポリシーをブールとして記述することをお薦めします。

  1. ブール人とその意味のリストを取得します。

    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)かを示します。
  2. ブールのみとそのステータスのリストを取得します。

    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
    ...
    
  3. 単一のブールのステータスを取得します。

    ブール名が判明している場合は、その名前を引数として渡して、そのブールのステータスのみを取得します。

    sudo getsebool virt_use_nfs
    
  4. ブール値の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
    ...
    
  5. ブールがアクセスを許可するかどうかを問い合せます。

    条件付きブール値に基づいて特定のアクセスが許可される場合について教えてください。質問に回答します。ユーザー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ブールが有効な場合、遷移が許可されます。
  6. ブールを有効にします。

    KVMにSamba共有へのイメージの格納を許可するとします。それにはブールもある。

    1. ブールを検索します。

      sudo semanage boolean -l | grep virt | grep samba
      

      出力例:

      virt_use_samba                 (off  ,  off)  Allow virt to use samba
      
    2. ブール値をenabledに変更します。

      sudo setsebool virt_use_samba on
      

      または

      sudo semanage boolean -m --on virt_use_samba
      
    3. 現在のステータスを確認します。

      getsebool virt_use_samba
      
    4. 変更がリブートしたことを確認します。

      sudo setsebool -P virt_use_samba on
      
  7. ローカルの 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のドキュメント・ルート用の新しいディレクトリを作成します。

  1. 3つのファイルとともに新しいディレクトリを作成します。

    sudo mkdir -p /web
    sudo touch /web/file{1,2,3}
    
  2. 新しいディレクトリとファイルのラベルを確認します。

    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タイプを継承します。

  3. 一時的なラベルの変更

    トラブルシューティングまたはテストの一環として、コンテキストを一時的に変更できます。

    sudo chcon -R -t httpd_sys_content_t /web/
    
    ls -lZ /web
    
  4. ラベルをデフォルト設定に戻します。

    コンテキストをデフォルトのコンテキスト・タイプに戻します。

    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
    
  5. ラベルの変更を永続化します。

    変更を永続的にして再起動し続けるには、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の実行後にファイルのラベル付けを誤らないように、ファイルまたはディレクトリへのフルパスを使用することをお勧めします。

  6. コンテキストを確認します。

    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
    

    コンテキストが変わらなかったことに注目してください。

  7. 新しく作成したファイルとディレクトリのコンテキストを表示します。

    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 
    
  8. 変更をコンテキストに適用します。

    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
    
  9. 新しい SELinuxコンテキストを削除します。

    sudo semanage fcontext -d "/web(/.*)?"
    
    • この例では、コンテキストの作成時に使用される正規表現を渡し、ファイルのコンテキスト・レコードの先頭に配置します。正規表現であるため、引用符で囲みます。
  10. 変更を適用し、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を参照してください。