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 コマンドでファイルをコピーする場合 (オプションが指定されていない場合)、タイプはターゲットの親ディレクトリーから継承されます。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。~]$
touch file1~]$
ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 /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/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
オプションを使用して、コピー時にコンテキストを保持する方法を説明します。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。~]$
touch file1~]$
ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 /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/--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
オプションを使用して宛先コピーのコンテキストを変更する方法を説明します。以下の例は、ユーザーのホームディレクトリーで実行されます。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。~]$
touch file1~]$
ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 --context
オプションを使用して SELinux コンテキストを定義します。~]$
cp --context=system_u:object_r:samba_share_t:s0 file1 file2--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 既存ファイルを介したファイルのコピー
この手順では、ファイルが既存のファイルにコピーされた場合に、コンテキストの保存にオプションを使用しない限り、既存のファイルのコンテキストが保持されることを示しています。
- 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 - 別のファイル
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 file1
をfile2
で上書きします。~]#
cp /tmp/file2 /etc/file1- コピーした後、次のコマンドを実行すると、
/etc/file1
を置き換えた/tmp/file2
のuser_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 ファイルとディレクトリーの移動
- ホームディレクトリーに移動し、そこでファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。~]$
touch file1~]$
ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 - 以下のコマンドを入力して、
/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/
に作成されたファイルおよびディレクトリーは、このタイプを継承します。 - 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 の確認
- root ユーザーとして、
/var/www/html/
ディレクトリーに 3 つのファイル (file1
、file2
、および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 - root で、
file1
タイプをsamba_share_t
に変更します。Apache HTTP Server は、samba_share_t
タイプのラベルが付けられたファイルまたはディレクトリーを読み取ることができないことに注意してください。~]#
chcon -t samba_share_t /var/www/html/file1 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 アーカイブの作成
/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 .- root で、
/var/www/html/
に 3 つのファイル (file1
、file2
、および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 - root で、以下のコマンドを実行して、
test.tar
という名前のtar
アーカイブを作成します。SELinux コンテキストを維持するには、--selinux
を使用します。html]#
tar --selinux -cf test.tar file{1,2,3} - root で
test/
という名前の新規ディレクトリーを作成し、すべてのユーザーによる完全なアクセスを許可します。~]#
mkdir /test~]#
chmod 777 /test/ test.tar
ファイルをtest/
にコピーします。~]$
cp /var/www/html/test.tar /test/test/
ディレクトリーに移動します。このディレクトリーに移動し、以下のコマンドを実行してtar
アーカイブをデプロイメントします。--selinux
オプションを再度指定すると、SELinux コンテキストがdefault_t
に変更されます。~]$
cd /test/test]$
tar --selinux -xvf test.tar- 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 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
アーカイブの作成
- root で、
/var/www/html/
に 3 つのファイル (file1
、file2
、および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 /var/www/html/
ディレクトリーに変更します。このディレクトリーに、root で以下のコマンドを実行して、test.star
という名前のstar
アーカイブを作成します。~]$
cd /var/www/htmlhtml]#
star -xattr -H=exustar -c -f=test.star file{1,2,3} star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).- root で
test/
という名前の新規ディレクトリーを作成し、すべてのユーザーによる完全なアクセスを許可します。~]#
mkdir /test~]#
chmod 777 /test/ - 次のコマンドを実行して、
test.star
ファイルをtest/
にコピーします。~]$
cp /var/www/html/test.star /test/ test/
に移動します。このディレクトリーに移動したら、以下のコマンドを実行してstar
アーカイブをデプロイメントします。~]$
cd /test/test]$
star -x -f=test.star star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).- 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 test/
ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリー内のすべてのファイルも削除します。~]#
rm -ri /test/star
が不要になった場合は、root でパッケージを削除します。~]#
yum remove star
star
の詳細は、star(1) man ページを参照してください。