4.10. SELinux ラベルの維持

このセクションでは、ファイルおよびディレクトリーのコピー、移動、アーカイビングによる SELinux コンテキストへの影響を説明します。また、コピーおよびアーカイブ時にコンテキストを維持する方法も説明します。

4.10.1. ファイルおよびディレクトリーのコピー

ファイルまたはディレクトリーのコピーがない場合にこれらをコピーすると、新たなファイルまたはディレクトリーが作成されます。この新規作成のファイルまたはディレクトリーのコンテキストは、オリジナルコンテキストを維持するオプションが使用されていなければオリジナルのファイルまたはディレクトリーのコンテキストではなく、デフォルトのラベリングルールに基づくことになります。例えば、ユーザーのホームディレクトリーに作成されたファイルは、user_home_t タイプのラベルが付けられます。
~]$ touch file1
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
このファイルが /etc という別のディレクトリーにコピーされたとすると、この新しいファイルは /etc のデフォルトのラベル付けルールにしたがって作成されます。追加オプションなしでファイルをコピーすると、オリジナルのコンテキストは保持されない可能性があります。
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
~]# cp file1 /etc/
~]$ ls -Z /etc/file1
-rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
/etc/file1 が存在しない状況で、file1/etc/ にコピーされると、/etc/file1 は新規ファイルとして作成されます。上の例にあるように、/etc/file1 はデフォルトのラベル付けルールにしたがって、etc_t タイプでラベル付けされます。
ファイルが既存ファイル上にコピーされると、ユーザーが --preserve=context などの cp オプションを指定してオリジナルファイルのコンテキストを維持しない限り、既存ファイルのコンテキストが維持されます。SELinux ポリシーは、コピー時にコンテキストの維持を妨げる場合があります。

手順4.11 SELinux コンテキストを維持せずにコピーする

この手順では、cp コマンドでオプションなしでファイルをコピーすると、ターゲットの親ディレクトリーからタイプを継承することを示しています。
  1. ユーザーのホームディレクトリーでファイルを作成します。ファイルは user_home_t タイプでラベル付けされます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
  2. 以下のコマンドで示すように、/var/www/html/ ディレクトリーは httpd_sys_content_t タイプでラベル付けされています。
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
  3. file1/var/www/html/ にコピーされると、httpd_sys_content_t タイプを継承します。
    ~]# cp file1 /var/www/html/
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1

手順4.12 SELinux コンテキストを維持してコピーする

この手順では、--preserve=context オプションを使用してコピー時にコンテキストを維持する方法を示しています。
  1. ユーザーのホームディレクトリーでファイルを作成します。ファイルは user_home_t タイプでラベル付けされます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
  2. 以下のコマンドで示すように、/var/www/html/ ディレクトリーは httpd_sys_content_t タイプでラベル付けされています。
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
  3. --preserve=context オプションを使うと、コピー時に SELinux コンテキストが維持されます。以下で示すように、file1user_home_t タイプは、このファイルを /var/www/html/ にコピーしても維持されます。
    ~]# cp --preserve=context file1 /var/www/html/
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1

手順4.13 コンテキストのコピーおよび変更

この手順では、--context オプションを使ってコピー先のコンテキストを変更する方法を示しています。以下の例は、ユーザーのホームディレクトリーで行われています。
  1. ユーザーのホームディレクトリーでファイルを作成します。ファイルは user_home_t タイプでラベル付けされます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
  2. --context オプションを使って SELinux コンテキストを定義します。
    ~]$ cp --context=system_u:object_r:samba_share_t:s0 file1 file2
  3. --context を使用しないと、file2unconfined_u:object_r:user_home_t コンテキストでラベル付けされます。
    ~]$ ls -Z file1 file2
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    -rw-rw-r--  user1 group1 system_u:object_r:samba_share_t:s0 file2

手順4.14 既存ファイル上へのファイルのコピー

この手順では、既存ファイル上にファイルをコピーする際に、オプションを使ってコンテキストを維持する場合を除いて、既存ファイルのコンテキストが維持されることを示しています。
  1. root で新規ファイル file1/etc ディレクトリーに作成します。以下のように、このファイルは etc_t タイプでラベル付けされます。
    ~]# touch /etc/file1
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
  2. 別のファイル file2/tmp ディレクトリーに作成します。以下のように、このファイルは user_tmp_t タイプでラベル付けされます。
    ~]$ touch /tmp/file2
    ~$ ls -Z /tmp/file2
    -rw-r--r--  root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
  3. file1file2 で上書きします。
    ~]# cp /tmp/file2 /etc/file1
  4. コピー後に以下のコマンドを実行すると、file1etc_t タイプでラベル付けされており、/etc/file1 を上書きした /tmp/file2user_tmp_t タイプではないことが分かります。
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1

重要

ファイルやディレクトリーは移動するのではなく、コピーしてください。こうすることで、正しい SELinux コンテキストでのラベル付けが確保されます。SELinux コンテキストが間違っていると、プロセスがそれらのファイルやディレクトリーにアクセスできなくなります。

4.10.2. ファイルおよびディレクトリーの移動

ファイルとディレクトリーは、移動すると現行の SELinux コンテキストを維持します。多くの場合、これは移動先の場所で間違ったものとなります。以下の例では、ファイルをユーザーのホームディレクトリーから Apache HTTP Server が使用する /var/www/html/ ディレクトリーに移動します。ファイルは移動されたため、正しい SELinux コンテキストを継承しません。

手順4.15 ファイルおよびディレクトリーの移動

  1. ユーザーのホームディレクトリーに移動して、ファイルを作成します。ファイルは user_home_t タイプでラベル付けされます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
  2. 以下のコマンドを実行して、/var/www/html/ ディレクトリーの SELinux コンテキストを表示します。
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    デフォルトでは、/var/www/html/ には httpd_sys_content_t タイプがラベル付けされています。/var/www/html/ 下で作成されたファイルおよびディレクトリーはこのタイプを継承するため、このタイプでラベル付けされます。
  3. root で file1/var/www/html/ に移動します。このファイルは移動したので、現行の user_home_t タイプを維持します。
    ~]# mv file1 /var/www/html/
    ~]# ls -Z /var/www/html/file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
デフォルトでは、Apache HTTP Server は user_home_t タイプでラベル付けされたファイルを読み取れません。Web ページを構成するすべてのファイルが user_home_t タイプ、もしくは Apache HTTP Server が読み取り不可能な別のタイプでラベル付けされている場合、それらに Mozilla Firefox のような Web ブラウザーを使用してアクセスしようとすると、パーミッションは拒否されます。

重要

ファイルやディレクトリーを mv コマンドで移動すると、誤った SELinux コンテキストとなり、Apache HTTP Server や Samba などのプロセスがそれらのファイルやディレクトリーにアクセスできなくなる可能性があります。

4.10.3. デフォルト SELinux コンテキストのチェック

ファイルやディレクトリーの SELinux コンテキストが正しいかどうかは、matchpathcon ユーティリティーを使ってチェックします。このユーティリティーは、システムポリシーにクエリを行い、ファイルパスに関連するデフォルトのセキュリティーコンテキストを提供します[6]。以下の例では、matchpathcon を使って /var/www/html/ ディレクトリーのファイルが正しくラベル付けされているかを検証しています。

手順4.16 matchpathcon を使ってデフォルトの SELinux コンテキストをチェックする

  1. root ユーザーとして /var/www/html/ ディレクトリーに 3 つのファイルを作成します (file1file2file3)。これらのファイルは /var/www/html/ から httpd_sys_content_t タイプを継承します。
    ~]# touch /var/www/html/file{1,2,3}
    ~]# ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
  2. root で file1 のタイプを samba_share_t に変更します。Apache HTTP Server は、samba_share_t タイプでラベル付けされたファイルやディレクトリーを読み取れないことに注意してください。
    ~]# chcon -t samba_share_t /var/www/html/file1
  3. matchpathcon -V オプションは、現行の SELinux コンテキストを SELinux ポリシーの正しいデフォルトのコンテキストと比較します。以下のコマンドを実行すると、/var/www/html/ ディレクトリー内の全ファイルをチェックします。
    ~]$ matchpathcon -V /var/www/html/*
    /var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
    /var/www/html/file2 verified.
    /var/www/html/file3 verified.
以下の matchpathcon コマンドの出力は、file1samba_share_t タイプでラベル付けされていますが、httpd_sys_content_t タイプでラベル付けされるべきであることを示しています。
/var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
このラベル問題を解決して Apache HTTP Server が file1 にアクセスできるようにするには、root で restorecon ユーティリティーを使用します。
~]# restorecon -v /var/www/html/file1
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0

4.10.4. tar を使ったファイルのアーカイブ作成

tar ユーティリティーはデフォルトでは拡張属性を維持しません。SELinux コンテキストは拡張属性に保存されるので、ファイルをアーカイブするとコンテキストは失われます。コンテキストを維持するアーカイブを作成し、アーカイブからファイルを復元するには、tar --selinux を使います。tar アーカイブに拡張属性のないファイルが含まれる、もしくはシステムデフォルトに拡張属性を適合させたい場合は、restorecon ユーティリティーを使用します。
~]$ tar -xvf archive.tar | restorecon -f -
ディレクトリーによっては、root ユーザーで restorecon を実行する必要があることもあります。
以下の例では、SELinux コンテキストを保持する tar アーカイブの作成方法を説明します。

手順4.17 tar アーカイブを作成する

  1. /var/www/html/ ディレクトリーに移動し、その SELinux コンテキストを確認します。
    ~]$ cd /var/www/html/
    html]$ ls -dZ /var/www/html/
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
  2. root ユーザーとして /var/www/html/ ディレクトリーに 3 つのファイルを作成します (file1file2file3)。これらのファイルは /var/www/html/ から httpd_sys_content_t タイプを継承します。
    html]# touch file{1,2,3}
    html]$ ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
  3. root で以下のコマンドを実行し、test.tar という名前の tar アーカイブを作成します。SELinux コンテキストを保持するには、--selinux を使用します。
    html]# tar --selinux -cf test.tar file{1,2,3}
  4. root で test/ という名前の新規ディレクトリーを作成し、全ユーザーに完全アクセスを許可します。
    ~]# mkdir /test
    ~]# chmod 777 /test/
  5. test.tar ファイルを test/ にコピーします。
    ~]$ cp /var/www/html/test.tar /test/
  6. test/ ディレクトリーに移動し、以下のコマンドを実行して tar アーカイブを抽出します。--selinux オプションを指定してください。これを行わないと、SELinux コンテキストが default_t に変更されます。
    ~]$ cd /test/
    test]$ tar --selinux -xvf test.tar
  7. SELinux コンテキストを確認します。httpd_sys_content_t タイプが維持されたことが分かります。--selinux を使用していなければ、default_t に変更されていました。
    test]$ ls -lZ /test/
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
    -rw-r--r--  user1 group1 unconfined_u:object_r:default_t:s0 test.tar
  8. test/ ディレクトリーが不要になったら、root で以下のコマンドを実行し、ディレクトリーとその中の全ファイルを削除します。
    ~]# rm -ri /test/
拡張属性すべてを保持する --xattrs オプションなどの tar に関する詳細情報は、tar(1) man ページを参照してください。

4.10.5. star を使ったファイルのアーカイブ作成

star ユーティリティーは、デフォルトでは拡張属性を維持しません。SELinux コンテキストは拡張属性に保存されるので、ファイルをアーカイビングするとコンテキストは失われます。コンテキストを維持するアーカイブを作成するには、star -xattr -H=exustar コマンドを使用します。star パッケージはデフォルトではインストールされません。star をインストールするには、yum install star コマンドを root ユーザーで実行します。
以下の例では、SELinux コンテキストを保持する star アーカイブの作成方法を説明します。

手順4.18 star アーカイブを作成する

  1. root で /var/www/html/ ディレクトリーに 3 つのファイルを作成します (file1file2file3)。これらのファイルは /var/www/html/ から httpd_sys_content_t タイプを継承します。
    ~]# touch /var/www/html/file{1,2,3}
    ~]# ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
  2. /var/www/html/ ディレクトリーに移動し、root で以下のコマンドを実行して test.star という名前の star アーカイブを作成します。
    ~]$ cd /var/www/html
    html]# star -xattr -H=exustar -c -f=test.star file{1,2,3}
    star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
  3. root で test/ という名前の新規ディレクトリーを作成し、全ユーザーに完全アクセスを許可します。
    ~]# mkdir /test
    ~]# chmod 777 /test/
  4. 以下のコマンドを実行して、test.star ファイルを test/ にコピーします。
    ~]$ cp /var/www/html/test.star /test/
  5. test/ ディレクトリーに移動し、以下のコマンドを実行して star アーカイブを抽出します。
    ~]$ cd /test/
    test]$ star -x -f=test.star 
    star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
  6. SELinux コンテキストを確認します。httpd_sys_content_t タイプが維持されたことが分かります。-xattr -H=exustar オプションを使用していなければ、default_t に変更されていました。
    ~]$ ls -lZ /test/
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
    -rw-r--r--  user1 group1 unconfined_u:object_r:default_t:s0 test.star
  7. test/ ディレクトリーが不要になったら、root で以下のコマンドを実行し、ディレクトリーとその中の全ファイルを削除します。
    ~]# rm -ri /test/
  8. star が不要になったら、root でパッケージを削除します。
    ~]# yum remove star
star についての詳細は、star(1) の man ページを参照してください。


[6] matchpathcon についての詳細情報は、matchpathcon(8) の man ページを参照してください。

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