4.13. マルチレベルのセキュリティー (MLS)

マルチレベルのセキュリティー技術とは、Bell-La Padula Mandatory Access Model を強制するセキュリティースキームを指します。MLS では、ユーザーとプロセスは サブジェクト (subjects) と呼ばれ、ファイル、デバイス、システムのその他のパッシブコンポーネントは オブジェクト (objects) と呼ばれます。サブジェクトとオブジェクトの両方がセキュリティーレベルでラベル付けされ、これはサブジェクトのクリアランスとオブジェクトの分類を必要とします。各セキュリティーレベルは sensitivity (秘密度) category (カテゴリ) で構成されています。例えば、社内のリリーススケジュールは、社内ドキュメントカテゴリの部外秘の秘密度で保管されています。
図4.1「クリアランスレベル」は、米国の国防コミュニティーが最初に設計したクリアランスレベルを示しています。上記の例の社内スケジュールに当てはめると、部外秘カテゴリのドキュメントを閲覧できるのは、部外秘クリアランスを取得しているユーザーのみとなります。しかし、部外秘クリアランスしかないユーザーは、より高いレベルのクリアランスを必要とするドキュメントの閲覧はできません。このようなユーザーは、より低いレベルのクリアランスのドキュメントには読み取り専用アクセスが許可され、より高いレベルのクリアランスのドキュメントには書き込みアクセスが許可されます。
クリアランスレベル

図4.1 クリアランスレベル

図4.2「MLS を使用したデータフローの許可」は、「秘密」セキュリティーレベルで実行しているサブジェクトと異なるセキュリティーレベルのオブジェクト間で許可されるすべてのデータフローを示しています。簡潔に説明すると、Bell-LaPadula モデルは no read up (上方読み取りは不可) no write down (下方書き込みは不可) という 2 つの特性を強制します。
MLS を使用したデータフローの許可

図4.2 MLS を使用したデータフローの許可

4.13.1. MLS とシステム権限

MLS アクセスルールは、常に従来のアクセスパーミッション (ファイルパーミッション) と組み合わせて使われます。例えば、「秘密」のセキュリティーレベルを持つユーザーが任意アクセス制御 (DAC) を使って他のユーザーによるファイルへのアクセスを遮断すると、「最高秘密」のセキュリティーレベルを持つユーザーのアクセスも遮断されます。SELinux の MLS ポリシールールは、DAC ルールの 後に チェックされることを覚えておくことが重要です。より高いセキュリティークリアランスがあるからといって、任意にファイルシステムを閲覧する許可が自動的に与えられるわけではありません。
トップレベルのクリアランスを持つユーザーは、マルチレベルシステム上で自動的に管理者権限を獲得するわけではありません。このようなユーザーは、コンピューター上の全情報へのアクセスがありますが、これは管理者権限とは別のものです。

4.13.2. SELinux における MLS の有効化

注記

X Window System 実行中のシステム上では、MLS ポリシーの使用は推奨されません。
システム上で SELinux の MLS ポリシーを有効にするには、以下のステップにしたがいます。

手順4.19 SELinux MLS ポリシーを有効にする

  1. selinux-policy-mls パッケージをインストールします。
    ~]# yum install selinux-policy-mls
  2. MLS ポリシーを有効にする前に、ファイルシステム上のすべてのファイルが MLS ラベルで再ラベル付けされる必要があります。ファイルシステムが再ラベル付けされると、制限のあるドメインはアクセスが拒否され、システムが正常に起動できない可能性があります。これを回避するには、/etc/selinux/config ファイルで SELINUX=permissive と設定します。また、SELINUXTYPE=mls と設定して MLS ポリシーを有効にします。設定ファイルは以下のようになります。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=mls
  3. SELinux が permissive モードで実行されていることを確認します。
    ~]# setenforce 0
    ~]$ getenforce
    Permissive
  4. fixfiles コマンドを使用して /.autorelabel ファイルを作成します。-F オプションを使用して、次回リブート時にファイルに再ラベル付けされるようにします。
    ~]# fixfiles -F onboot
  5. システムをリブートします。次回の起動時にすべてのファイルシステムが MLS ポリシーにしたがって再ラベル付けされます。ラベルプロセスでは、全ファイルが適切な SELinux コンテキストでラベル付けされます。
    *** Warning -- SELinux mls policy relabel is required.
    *** Relabeling could take a very long time, depending on file
    *** system size and speed of hard drives.
    ***********
    一番下の行の * (アスタリスク) 記号はそれぞれ、ラベル付けされた 1000 ファイルを表します。上記の例では、11 個の * 記号はラベル付けされた 11000 ファイルを表しています。全ファイルにラベル付けする時間はシステム上のファイル数とハードディスクドライブの速度によって異なります。最近のシステムでは、このプロセスは 10 分程度で終わります。ラベリングプロセスが完了すると、システムは自動で再起動します。
  6. permissive モードでは SELinux ポリシーは強制されませんが、enforcing モードであれば拒否されたはずのアクションについては拒否がログに記録されます。enforcing モードに変更する前に、root で以下のコマンドを実行して、SELinux が最後の起動時にアクセスを拒否しなかったことを確認します。最後の起動時にアクセス拒否がなかった場合は、このコマンドはなにも返しません。起動時に SELinux がアクセスを拒否した場合は、トラブルシューティング情報を「11章トラブルシューティング」で参照してください。
    ~]# grep "SELinux is preventing" /var/log/messages
  7. /var/log/messages ファイルに拒否メッセージがない場合、または既存の拒否をすべて解決した場合は、/etc/selinux/config ファイルで SELINUX=enforcing と設定します。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=mls
  8. システムを再起動し、SELinux が enforcing モードで稼働していることを確認します。
    ~]$ getenforce
    Enforcing
    MLS ポリシーが有効であることも確認します。
    ~]# sestatus |grep mls
    Policy from config file:        mls

4.13.3. 特別の MLS 範囲を持つユーザーの作成

特別の MLS 範囲を持つ新規 Linux ユーザーを作成するには、以下のステップにしたがいます。

手順4.20 特別の MLS 範囲を持つユーザーの作成

  1. useradd コマンドで新規 Linux ユーザーを追加し、このユーザーを既存の SELinux ユーザーにマッピングします (このケースでは staff_u)。
    ~]# useradd -Z staff_u john
  2. 新規作成の Linux ユーザーにパスワードを割り当てます。
    prompt~]# passwd john
  3. root で以下のコマンドを実行し、SELinux ユーザーと Linux ユーザー間のマッピングを表示します。出力は以下のようになります。
    ~]# semanage login -l
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          user_u               s0-s0                *
    john                 staff_u              s0-s15:c0.c1023      *
    root                 root                 s0-s15:c0.c1023      *
    staff                staff_u              s0-s15:c0.c1023      *
    sysadm               staff_u              s0-s15:c0.c1023      *
    system_u             system_u             s0-s15:c0.c1023      *
  4. ユーザー john の特定範囲を定義します。
    ~]# semanage login --modify --range s2:c100 john
  5. SELinux ユーザーと Linux ユーザー間のマッピングを再度表示します。ユーザー john に特定の MLS 範囲が定義されていることに注意してください。
    ~]# semanage login -l
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          user_u               s0-s0                *
    john                 staff_u              s2:c100              *
    root                 root                 s0-s15:c0.c1023      *
    staff                staff_u              s0-s15:c0.c1023      *
    sysadm               staff_u              s0-s15:c0.c1023      *
    system_u             system_u             s0-s15:c0.c1023      *
  6. john のホームディレクトリーのラベル修正が必要な場合には、以下のコマンドを実行します。
    ~]# chcon -R -l s2:c100 /home/john

4.13.4. Polyinstantiated ディレクトリーの設定

/tmp および /var/tmp/ ディレクトリーは通常、すべてのプログラム、サービス、ユーザーが一時的なストレージとして使用します。しかしこの設定では、これらのディレクトリーは競合状態の攻撃やファイル名に基づく情報漏えいに対して脆弱となってしまいます。SELinux は、polyinstantiated ディレクトリーという形で解決法を提供します。これはつまり、/tmp/var/tmp/ の両方がインスタンス化され、各ユーザーにはプライベートのように見えるということです。ディレクトリーのインスタンス化が有効になると、各ユーザーの /tmp/var/tmp/ ディレクトリーは自動的に /tmp-inst および /var/tmp/tmp-inst 下にマウントされます。
ディレクトリーの polyinstantiation を有効にするには、以下のステップにしたがいます。

手順4.21 Polyinstantiation ディレクトリーを有効にする

  1. /etc/security/namespace.conf ファイルの最後の 3 行をコメント解除し、/tmp/var/tmp/、ユーザーのホームディレクトリーのインスタンス化を有効にします。
    ~]$ tail -n 3 /etc/security/namespace.conf
    /tmp     /tmp-inst/            level      root,adm
    /var/tmp /var/tmp/tmp-inst/    level      root,adm
    $HOME    $HOME/$USER.inst/     level
  2. /etc/pam.d/login ファイルで pam_namespace.so がセッション用に設定されていることを確認します。
    ~]$ grep namespace /etc/pam.d/login
    session    required     pam_namespace.so
  3. システムを再起動します。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。