4.10. SELinux ラベルの維持
以下のセクションでは、ファイルおよびディレクトリーのコピー、移動、およびアーカイブ時に SELinux コンテキストの動作を説明します。また、コピーおよびアーカイブ時にコンテキストを保存する方法も説明します。
4.10.1. ファイルおよびディレクトリーのコピー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ファイルまたはディレクトリーのコピー時に、新しいファイルまたはディレクトリーが存在しない場合は作成されます。この新しいファイルまたはディレクトリーのコンテキストは、元のコンテキストの保存にオプションが使用されていない限り、デフォルトのラベル付けルールに基づいています。たとえば、ユーザーのホームディレクトリーに作成されたファイルには、
user_home_t タイプのラベルが付けられます。
touch file1
~]$ touch file1
ls -Z file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
このようなファイルを、
/etc などの別のディレクトリーにコピーすると、/etc のデフォルトのラベル付けルールに従って、新しいファイルが作成されます。追加オプションなしでファイルをコピーすると、元のコンテキストが保持されない場合があります。
ls -Z file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
cp file1 /etc/
~]# cp file1 /etc/
ls -Z /etc/file1
~]$ 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 コマンドでファイルをコピーする場合 (オプションが指定されていない場合)、タイプはターゲットの親ディレクトリーから継承されます。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_tタイプのラベルが付けられます。touch file1
~]$ touch file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/ディレクトリーには、以下のコマンドのようにhttpd_sys_content_tタイプのラベルが付けられます。ls -dZ /var/www/html/
~]$ ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow file1が/var/www/html/にコピーされると、httpd_sys_content_tタイプを継承します。cp file1 /var/www/html/
~]# cp file1 /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.12 コピー時の SELinux コンテキストの保持
この手順では、
--preserve=context オプションを使用して、コピー時にコンテキストを保持する方法を説明します。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_tタイプのラベルが付けられます。touch file1
~]$ touch file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/ディレクトリーには、以下のコマンドのようにhttpd_sys_content_tタイプのラベルが付けられます。ls -dZ /var/www/html/
~]$ ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow --preserve=contextオプションを使用すると、コピー操作時に SELinux コンテキストが保持されます。以下に示すように、ファイルが/var/www/html/にコピーされると、user_home_tタイプのfile1が保持されます。cp --preserve=context file1 /var/www/html/
~]# cp --preserve=context file1 /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.13 コンテキストのコピーと変更
この手順では、
--context オプションを使用して宛先コピーのコンテキストを変更する方法を説明します。以下の例は、ユーザーのホームディレクトリーで実行されます。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_tタイプのラベルが付けられます。touch file1
~]$ touch file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow --contextオプションを使用して SELinux コンテキストを定義します。cp --context=system_u:object_r:samba_share_t:s0 file1 file2
~]$ cp --context=system_u:object_r:samba_share_t:s0 file1 file2Copy to Clipboard Copied! Toggle word wrap Toggle overflow --contextがない場合、file2にはunconfined_u:object_r:user_home_tコンテキストでラベルが付けられます。ls -Z file1 file2
~]$ 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 file2Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.14 既存ファイルを介したファイルのコピー
この手順では、ファイルが既存のファイルにコピーされた場合に、コンテキストの保存にオプションを使用しない限り、既存のファイルのコンテキストが保持されることを示しています。
- root として、
/etcディレクトリーに新しいファイルfile1を作成します。以下に示すように、ファイルにはetc_tタイプのラベルが付けられています。touch /etc/file1
~]# touch /etc/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /etc/file1
~]$ ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 別のファイル
file2を/tmpディレクトリーに作成します。以下に示すように、ファイルにはuser_tmp_tタイプのラベルが付けられます。touch /tmp/file2
~]$ touch /tmp/file2Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~$ ls -Z /tmp/file2 -rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
~$ ls -Z /tmp/file2 -rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2Copy to Clipboard Copied! Toggle word wrap Toggle overflow file1をfile2で上書きします。cp /tmp/file2 /etc/file1
~]# cp /tmp/file2 /etc/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - コピーした後、次のコマンドを実行すると、
/etc/file1を置き換えた/tmp/file2のuser_tmp_tタイプではなく、etc_tタイプのラベルが付けられたfile1が表示されます。ls -Z /etc/file1
~]$ ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
重要
ファイルおよびディレクトリーを移動せずにコピーします。これにより、正しい SELinux コンテキストでラベル付けされることを確認できます。SELinux コンテキストが間違っていると、プロセスがこのようなファイルおよびディレクトリーにアクセスできなくなる可能性があります。
4.10.2. ファイルとディレクトリーの移動 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ファイルおよびディレクトリーは、移動時に現在の SELinux コンテキストを保持します。多くの場合、これは移動先の場所として正しくありません。以下の例は、ユーザーのホームディレクトリーから、Apache HTTP サーバーが使用する
/var/www/html/ ディレクトリーにファイルを移動する方法を示しています。ファイルは移動されるため、正しい SELinux コンテキストは継承されません。
手順4.15 ファイルとディレクトリーの移動
- ホームディレクトリーに移動し、そこでファイルを作成します。ファイルには、
user_home_tタイプのラベルが付けられます。touch file1
~]$ touch file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して、
/var/www/html/ディレクトリーの SELinux コンテキストを表示します。ls -dZ /var/www/html/
~]$ ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、/var/www/html/にはhttpd_sys_content_tタイプのラベルが付けられます。/var/www/html/に作成されたファイルおよびディレクトリーは、このタイプを継承します。 - root で
file1を/var/www/html/に移動します。このファイルは移動したので、現在のuser_home_tタイプを保持します。mv file1 /var/www/html/
~]# mv file1 /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1
~]# ls -Z /var/www/html/file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
デフォルトでは、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 の確認
- root ユーザーとして、
/var/www/html/ディレクトリーに 3 つのファイル (file1、file2、およびfile3) を作成します。これらのファイルは、/var/www/html/からhttpd_sys_content_tタイプを継承します。touch /var/www/html/file{1,2,3}~]# touch /var/www/html/file{1,2,3}Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/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 file3Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
file1タイプをsamba_share_tに変更します。Apache HTTP Server は、samba_share_tタイプのラベルが付けられたファイルまたはディレクトリーを読み取ることができないことに注意してください。chcon -t samba_share_t /var/www/html/file1
~]# chcon -t samba_share_t /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow matchpathcon-Vオプションは、現在の SELinux コンテキストを SELinux ポリシー内の正しいデフォルトコンテキストと比較します。以下のコマンドを実行して、/var/www/html/ディレクトリー内の全ファイルをチェックします。matchpathcon -V /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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
/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 -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 -
~]$ tar -xvf archive.tar | restorecon -f -
ディレクトリーによっては、
restorecon を実行するためには、root ユーザーでなければならない場合があることに注意してください。
以下の例は、SELinux コンテキストを保持する
tar アーカイブの作成を示しています。
手順4.17 tar アーカイブの作成
/var/www/html/ディレクトリーに移動し、その SELinux コンテキストを表示します。cd /var/www/html/
~]$ cd /var/www/html/Copy to Clipboard Copied! Toggle word wrap Toggle overflow html]$ ls -dZ /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
html]$ ls -dZ /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
/var/www/html/に 3 つのファイル (file1、file2、およびfile3) を作成します。これらのファイルは、/var/www/html/からhttpd_sys_content_tタイプを継承します。html]# touch file{1,2,3}html]# touch file{1,2,3}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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 file3Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、以下のコマンドを実行して、
test.tarという名前のtarアーカイブを作成します。SELinux コンテキストを維持するには、--selinuxを使用します。html]# tar --selinux -cf test.tar file{1,2,3}html]# tar --selinux -cf test.tar file{1,2,3}Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
test/という名前の新規ディレクトリーを作成し、すべてのユーザーによる完全なアクセスを許可します。mkdir /test
~]# mkdir /testCopy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 777 /test/
~]# chmod 777 /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow test.tarファイルをtest/にコピーします。cp /var/www/html/test.tar /test/
~]$ cp /var/www/html/test.tar /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/ディレクトリーに移動します。このディレクトリーに移動し、以下のコマンドを実行してtarアーカイブをデプロイメントします。--selinuxオプションを再度指定すると、SELinux コンテキストがdefault_tに変更されます。cd /test/
~]$ cd /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow test]$ tar --selinux -xvf test.tar
test]$ tar --selinux -xvf test.tarCopy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux コンテキストを表示します。
httpd_sys_content_tタイプはdefault_tに変更されず、保持されました。これは、--selinuxが使用されていなかったとしたら、変更されていたでしょう。Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリー内のすべてのファイルも削除します。rm -ri /test/
~]# rm -ri /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
拡張属性をすべて保持する
--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 アーカイブの作成
- root で、
/var/www/html/に 3 つのファイル (file1、file2、およびfile3) を作成します。これらのファイルは、/var/www/html/からhttpd_sys_content_tタイプを継承します。touch /var/www/html/file{1,2,3}~]# touch /var/www/html/file{1,2,3}Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/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 file3Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/ディレクトリーに変更します。このディレクトリーに、root で以下のコマンドを実行して、test.starという名前のstarアーカイブを作成します。cd /var/www/html
~]$ cd /var/www/htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow html]# star -xattr -H=exustar -c -f=test.star file{1,2,3} star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).html]# star -xattr -H=exustar -c -f=test.star file{1,2,3} star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
test/という名前の新規ディレクトリーを作成し、すべてのユーザーによる完全なアクセスを許可します。mkdir /test
~]# mkdir /testCopy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 777 /test/
~]# chmod 777 /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコマンドを実行して、
test.starファイルをtest/にコピーします。cp /var/www/html/test.star /test/
~]$ cp /var/www/html/test.star /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/に移動します。このディレクトリーに移動したら、以下のコマンドを実行してstarアーカイブをデプロイメントします。cd /test/
~]$ cd /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow test]$ star -x -f=test.star star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
test]$ star -x -f=test.star star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux コンテキストを表示します。
httpd_sys_content_tタイプはdefault_tに変更されず、保持されています。これは、-xattr -H=exustarオプションが使用されていなかったとしたら、変更されていたでしょう。Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリー内のすべてのファイルも削除します。rm -ri /test/
~]# rm -ri /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow starが不要になった場合は、root でパッケージを削除します。yum remove star
~]# yum remove starCopy to Clipboard Copied! Toggle word wrap Toggle overflow
star の詳細は、star(1) man ページを参照してください。