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
file1/etc にコピーする際に、/etc/file1 が存在しない場合は、/etc/file1 が新規に作成されます。上記の例で示すように、/etc/file1 には、default-labeling ルールに基づいて 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 コンテキストが保持されます。以下に示すように、ファイルが /var/www/html/ にコピーされると、user_home_t タイプの file1 が保持されます。
    ~]# 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 がない場合、file2 には unconfined_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 として、/etc ディレクトリーに新しいファイル file1 を作成します。以下に示すように、ファイルには 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. コピーした後、次のコマンドを実行すると、/etc/file1 を置き換えた /tmp/file2user_tmp_t タイプではなく、etc_t タイプのラベルが付けられた file1 が表示されます。
    ~]$ 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 サーバーが使用する /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 サーバーや Samba などのプロセスがそのようなファイルやディレクトリーにアクセスできなくなる可能性があります。

4.10.3. デフォルトの SELinux コンテキストの確認

matchpathcon ユーティリティーを使用して、ファイルおよびディレクトリーに正しい SELinux コンテキストがあるかどうかを確認します。このユーティリティーは、system policy にクエリーを行い、ファイルパスに関連付けられたデフォルトのセキュリティーコンテキストを提供します。[6] 以下の例では、matchpathcon を使用して、/var/www/html/ディレクトリーのファイルに正しくラベル付けされていることを確認します。

手順4.16 matchpathconを使用したデフォルトの SELinux Conxtext の確認

  1. root ユーザーとして、/var/www/html/ ディレクトリーに 3 つのファイル (file1file2、および file3) を作成します。これらのファイルは、/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 コマンドの出力では、file1 には samba_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
ラベルの問題を解決し、root で Apache HTTP Server が file1 にアクセスできるようにするには、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 -
ディレクトリーによっては、restorecon を実行するためには、root ユーザーでなければならない場合があることに注意してください。
以下の例は、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 つのファイル (file1file2、および file3) を作成します。これらのファイルは、/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 タイプは default_t に変更されず、保持されました。これは、--selinux が使用されていなかったとしたら、変更されていたでしょう。
    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 をインストールするには、root ユーザーとして yum install star を実行します。
以下の例は、SELinux コンテキストを保持する star アーカイブの作成を示しています。

手順4.18 star アーカイブの作成

  1. root で、/var/www/html/ に 3 つのファイル (file1file2、および file3) を作成します。これらのファイルは、/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 タイプは default_t に変更されず、保持されています。これは、-xattr -H=exustar オプションが使用されていなかったとしたら、変更されていたでしょう。
    ~]$ 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 ページを参照してください。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.