GNU/Linux >> Linux の 問題 >  >> Linux

15 セキュリティ コンテキストを変更する SELinux chcon コマンドの例

SELinux で頻繁に行うタスクの 1 つは、オブジェクトのセキュリティ コンテキストを変更することです。これには、chcon コマンドを使用します。

chcon は Change Context の略です。

このコマンドは、ファイルの SELinux セキュリティ コンテキストを変更するために使用されます。

このチュートリアルでは、次の chcon コマンドの例について説明します:

<オール>
  • 完全な SELinux コンテキストを変更する
  • 別のファイルを参照してコンテキストを変更する
  • SELinux コンテキストでユーザーのみを変更
  • SELinux コンテキストでロールのみを変更
  • SELinux コンテキストでタイプのみを変更
  • SELinux コンテキストで範囲 (レベル) のみを変更する
  • chcon でユーザー、役割、タイプ、レベルを組み合わせる
  • シンボリック リンクでの Chcon のデフォルトの動作
  • シンボリック リンクの SELinux コンテキストを強制的に変更
  • SELinux コンテキストを再帰的に変更する
  • chcon操作の詳細を表示
  • 再帰的なシンボリック リンクでの Chcon のデフォルトの動作
  • chcon に、再帰的に指定されたシンボリック リンクをトラバースさせる
  • chcon に再帰的なすべてのシンボリック リンクをトラバースさせる
  • システム全体の変更のための / ルート ディレクトリでの Chcon の動作
  • 1.完全な SELinux コンテキストを変更する

    ファイルのセキュリティ コンテキストを表示するには、以下に示すように ls コマンドで -Z (大文字の Z) オプションを使用します。

    # ls -lZ httpd.conf
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf
    

    上記の例では、httpd.conf ファイルのセキュリティ コンテキストは次のとおりです。

    unconfined_u:object_r:admin_home_t:s0
    

    これは、/etc/httpd/conf ディレクトリの下にある httpd.conf ファイルの間違った SELinux コンテキストです。

    したがって、セキュリティ コンテキストを変更するには、次の chcon コマンドを使用します。

    # chcon system_u:object_r:httpd_config_t:s0 httpd.conf
    

    上記の例では、httpd.conf ファイルのセキュリティ コンテキストを次のように変更しましたが、これは正しいものです。

    system_u:object_r:httpd_config_t:s0
    

    これは、次の ls -lZ コマンドを使用して確認できます。

    # ls -lZ httpd.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
    

    注:上記の例では、ファイルの完全な SELinux コンテキスト (つまり、ユーザー、ロール、タイプ、および範囲) を user:role:type:range の形式で提供していますが、これ以上壊れることはありません。

    SELinux 関連の問題に直面したときはいつでも、先に説明したように SELinux を無効にしたくなるかもしれません。しかし、多くの場合、問題のファイルが間違ったセキュリティ コンテキストを持っているだけであることがわかります。これは、chcon コマンドを使用して変更できます。

    2.別のファイルを参照として使用してコンテキストを変更する

    ファイルにどの SELinux コンテキストを設定する必要があるのか​​ わからない場合があります。

    その場合、別のファイルのセキュリティ コンテキストを参照として使用し、それを使用してファイルに割り当てることができます。

    基本的に、ファイルの完全な SELinux コンテキストを指定する代わりに、ファイルに別のファイルのコンテキストを使用しているだけです。

    次の例では、ssl.conf と httpd.conf の両方に異なる SELinux コンテキストがあることがわかります。

    # ls -lZ
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 ssl.conf
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf
    

    この場合、ssl.conf ファイルに正しいセキュリティ コンテキストがあることがわかります。しかし、httpd.conf に間違ったものがあります。

    そのため、httpd.conf ファイルのセキュリティ コンテキストを変更しますが、以下に示すように、この変更の参照として ssl.conf のコンテキストを使用します。

    # chcon --reference=ssl.conf httpd.conf
    

    上記の変更後、httpd.conf ファイルが ssl.conf ファイルと同じセキュリティ コンテキストを持っていることがわかります。

    # ls -lZ
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 ssl.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
    

    関連して、SELinux の現在のステータスを表示するには、sestatus コマンドを使用します。ここで説明されているように、sestatus コマンドの出力を理解することが重要です:3 SELinux sestatus コマンド出力の説明と例

    3. SELinux コンテキストで USER のみを変更

    SELinux セキュリティ コンテキスト全体を変更する代わりに、その部分的な値のみを変更することもできます。

    以下は、httpd.conf ファイルの現在のセキュリティ コンテキストです。

    # ls -lZ httpd.conf 
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf
    

    上記の例では、「unconfined_u」がセキュリティ コンテキストの USER 部分です。

    chcon -u オプションを使用すると、セキュリティ コンテキストのユーザー部分のみを変更できます。

    次の例では、セキュリティ コンテキストのユーザー部分を httpd.conf ファイルの system_u に設定しています。

    # chcon -u system_u httpd.conf
    

    次の出力からわかるように、httpd.conf ファイルのセキュリティ コンテキストの USER 部分のみが変更されます。

    # ls -lZ httpd.conf
    -rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf
    

    -u の代わりに -user を使用することもできます。次のコマンドは両方ともまったく同じです。

    # chcon --user system_u httpd.conf
    
    # chcon -u system_u httpd.conf
    

    4. SELinux コンテキストで ROLE のみを変更

    chcon -r オプションを使用すると、セキュリティ コンテキストの ROLE 部分のみを変更できます。

    次の例では、セキュリティ コンテキストのロール部分を httpd.conf ファイルの object_r に設定しています。

    # chcon -r object_r httpd.conf
    

    次の出力からわかるように、httpd.conf ファイルのセキュリティ コンテキストの ROLE 部分のみが変更されます。

    # ls -lZ httpd.conf
    -rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf
    

    SELinux で認識されないロールを付与すると、次の無効な引数エラーが発生します。この例では、「identity_r」という役割はありません。

    # chcon -r identity_r httpd.conf
    chcon: failed to change context of ‘httpd.conf’ to ‘system_u:identity_r:admin_home_t:s0’: Invalid argument
    

    -r の代わりに -role を使用することもできます。次のコマンドは両方ともまったく同じです。

    # chcon --role object_r httpd.conf
    
    # chcon -r object_r httpd.conf
    

    5. SELinux コンテキストの TYPE のみを変更

    TYPE は、典型的な SELinux セットアップで最も頻繁に使用されるものであるため、おそらくこれが主に使用されるものです。

    以下は、httpd.conf ファイルの現在のセキュリティ コンテキストです。

    # ls -lZ httpd.conf 
    -rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf
    

    上記の例では、「admin_home_t」がセキュリティ コンテキストの TYPE 部分です。

    chcon -t オプションを使用すると、セキュリティ コンテキストのタイプ部分のみを変更できます。

    次の例では、セキュリティ コンテキストのタイプ部分を httpd.conf ファイルの httpd_config_t に設定しています。

    # chcon -t httpd_config_t httpd.conf
    

    次の出力からわかるように、httpd.conf ファイルのセキュリティ コンテキストの TYPE 部分のみが変更されます。

    # ls -lZ httpd.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
    

    -t の代わりに -type を使用することもできます。次のコマンドは両方ともまったく同じです。

    # chcon -t httpd_config_t httpd.conf
    
    # chcon --type httpd_config_t httpd.conf
    

    6. SELinux コンテキストで RANGE (レベル) のみを変更

    chcon -l オプションを使用すると、セキュリティ コンテキストの RANGE 部分 (レベルとも呼ばれます) のみを変更できます。範囲は MLS でのみ使用され、通常の状況では範囲を変更しない場合があります。

    次の例では、セキュリティ コンテキストの範囲部分を httpd.conf ファイルの「s0」に設定しています。

    # chcon -l s0 httpd.conf
    

    次の出力からわかるように、httpd.conf ファイルのセキュリティ コンテキストの ROLE 部分のみが変更されます。

    # ls -lZ httpd.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
    

    -l の代わりに -range を使用することもできます。次のコマンドは両方ともまったく同じです。

    # chcon -l s0 httpd.conf
    
    # chcon --range s0 httpd.conf
    

    7. chcon でユーザー、ロール、タイプ、レベルを組み合わせる

    chcon では、ユーザー (-u)、ロール (-r)、タイプ (-t)、またはレベル (-l) オプションを組み合わせることができます。

    たとえば、次のようにすると、4 つすべてが次のように変更されます。

    # chcon -u system_u -r object_r  -t httpd_config_t -l s0 httpd.conf
    

    または、一度に数個だけを組み合わせて変更することもできます。たとえば、次の例では、httpd.conf ファイルの USER と TYPE のみを変更しています。

    # chcon -u system_u -t httpd_config_t httpd.conf
    

    8.シンボリック リンクでの Chcon のデフォルトの動作

    次の例では、apache.conf は httpd.conf ファイルへのシンボリック リンクです。どちらも間違ったセキュリティ コンテキストを持っています。

    # ls -lZ
    lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf
    -rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf
    

    次の例では、apache.conf シンボリック リンクの USER と TYPE を変更しています。

    # chcon -u system_u -t httpd_config_t apache.conf
    

    しかし、ここでわかるように、これにより、シンボリック リンクではなく、参照しているファイルの SELinux コンテキストが実際に変更されています。

    # ls -lZ
    lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf
    -rw-r--r--. system_u:object_r:httpd_config_t:s0 httpd.conf
    

    これは、chcon コマンドのデフォルトの動作です。つまり、シンボリック リンク自体ではなく、それが指しているファイルのコンテキストを変更します。

    この動作は、参照解除と呼ばれます。 Chcon には、シンボリック リンクの代わりにファイルを変更する –dereference というオプションがあります。

    次の例は両方ともまったく同じです。

    # chcon -u system_u -t httpd_config_t apache.conf
    
    # chcon --dereference -u system_u -t httpd_config_t apache.conf
    

    9.シンボリック リンクの SELinux コンテキストを強制的に変更

    シンボリック リンクによって参照されるファイルのセキュリティ コンテキストを変更する代わりに、シンボリック リンク自体のコンテキストを強制的に変更することもできます。

    次の例では、apache.conf は httpd.conf ファイルへのシンボリック リンクです。どちらも間違ったセキュリティ コンテキストを持っています。

    # ls -lZ
    lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf
    -rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf
    

    chcon で –no-dereference オプションを指定すると、シンボリック リンクのコンテキストが変更され、それが指しているファイルは変更されません。

    したがって、次の例では、apache.conf シンボリック リンク (httpd.conf ファイルではなく) の USER と TYPE を変更します。

    # chcon --no-dereference -u system_u -t httpd_config_t apache.conf
    

    以下からわかるように、apache.conf シンボリック リンクの SELinux コンテキストのみが、上で指定したものに変更されます。

    # ls -lZ
    lrwxrwxrwx. system_u:object_r:httpd_config_t:s0 apache.conf -> httpd.conf
    -rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf
    

    –no-dereference の代わりに、以下に示すように「-h」オプションを指定することもできます。

    次のコマンドは両方ともまったく同じです。

    # chcon -h -u system_u -t httpd_config_t apache.conf
    
    # chcon --no-dereference -u system_u -t httpd_config_t apache.conf
    

    10. SELinux コンテキストを再帰的に変更

    この例では、conf.d の下にあるすべてのファイルの現在のセキュリティ Linux コンテキストを以下に示します

    # ls -lZ conf.d/
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 autoindex.conf
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 nss.conf
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 README
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 userdir.conf
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 welcome.conf
    

    chcon -R recursive オプションを使用すると、以下に示すように、conf.d 内のすべてのファイルを特定のセキュリティ コンテキストに再帰的に変更できます。

    # chcon -R system_u:object_r:httpd_config_t:s0 conf.d
    

    以下に示すように、conf.d 内のすべてのファイルのコンテキストが再帰的に変更されます

    # ls -lZ conf.d
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 autoindex.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 nss.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 README
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 userdir.conf
    -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 welcome.conf
    

    注:conf.d 内に他のサブディレクトリがある場合、それらのすべてのサブディレクトリとその下のファイルも -R オプションの影響を受けます。

    –recursive オプションも使用できます。次のコマンドは両方ともまったく同じです。

    # chcon --recursive system_u:object_r:httpd_config_t:s0 conf.d
    
    # chcon -R system_u:object_r:httpd_config_t:s0 conf.d
    

    11. chcon操作の詳細を表示

    -v オプションを使用すると、chcon が行っていることの詳細を表示できます。

    -v は verbose の略で、以下に示すように、chcon コマンドによって現在処理されているファイルの名前が表示されます。

    これは、多くのファイルのコンテキストを変更する可能性がある -R 再帰オプションと組み合わせて、以下に示すように chcon が現在何をしているかを確認したい場合に非常に役立ちます。

    # chcon -Rv system_u:object_r:httpd_config_t:s0 conf.d
    changing security context of ‘conf.d/README’
    changing security context of ‘conf.d/autoindex.conf’
    changing security context of ‘conf.d/userdir.conf’
    changing security context of ‘conf.d/welcome.conf’
    changing security context of ‘conf.d/nss.conf’
    changing security context of ‘conf.d’
    

    12.再帰的なシンボリック リンクでの Chcon のデフォルトの動作

    この例では、「config」は以下に示すように conf.d ディレクトリへのシンボリック リンクです。

    # ls -lZ
    drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d
    lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d
    

    デフォルトでは、シンボリック リンクで再帰的な操作を行う場合、ディレクトリ構造をトラバースしません。

    これは、出力にファイル名を表示しない -v オプションと -R を組み合わせることで確認できます。これは、「config」シンボリック リンクを経由していないことを示しています。

    # chcon -Rv -t httpd_config_t config
    changing security context of ‘configuration’
    

    このデフォルトの動作は、-P (大文字の P) オプションによっても参照されます。

    したがって、次のコマンドはどちらもまったく同じです。どちらもシンボリック リンクをたどりません。

    # chcon -Rv -t httpd_config_t config
    
    # chcon -RPv -t httpd_config_t configuration
    

    13.再帰のために指定されたシンボリック リンクをトラバースするように chcon を強制

    この例では、「config」は以下に示すように conf.d ディレクトリへのシンボリック リンクです。

    # ls -lZ
    drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d
    lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d
    

    chcon コマンドでシンボリックを指定すると、以下に示すように -H オプションを使用して chcon にシンボリックをトラバースさせることができます。

    次の出力からわかるように、「-H」オプションと「-R」オプションを指定した場合、chcon は構成シンボリック リンクをトラバースし、すべてのファイルを処理しています。

    # chcon -RHv -t httpd_config_t config
    changing security context of ‘config/README’
    changing security context of ‘config/autoindex.conf’
    changing security context of ‘config/userdir.conf’
    changing security context of ‘config/welcome.conf’
    changing security context of ‘config/nss.conf’
    changing security context of ‘config/ndd’
    changing security context of ‘config’
    

    14. chcon に強制的にすべてのシンボリック リンクを再帰的にトラバースする

    この例では、「config」は以下に示すように conf.d ディレクトリへのシンボリック リンクです。

    # ls -lZ
    drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d
    lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d
    

    次の例では、config ディレクトリ内に、シンボリック リンクである「ndd」ディレクトリがあります。

    # ls -l configuration/ndd
    lrwxrwxrwx. 1 root root 6 Jul  8 00:13 configuration/ndd -> ../ndd
    

    再帰操作中に遭遇するすべてのシンボリック リンクを chcon コマンドでトラバースする場合は、-L オプションを指定する必要があります。

    次のオプションは、-L オプションと -R オプションを組み合わせたものです。これは、遭遇するすべてのシンボリック リンクをトラバースします。たとえば、以下に示すように、これは「ndd」シンボリック リンクをトラバースし、それに応じてすべてのファイルを処理しました。

    # chcon -RLv -t httpd_config_t configuration
    changing security context of ‘configuration/README’
    changing security context of ‘configuration/autoindex.conf’
    changing security context of ‘configuration/userdir.conf’
    changing security context of ‘configuration/welcome.conf’
    changing security context of ‘configuration/nss.conf’
    changing security context of ‘configuration/ndd/nd1-conf’
    changing security context of ‘configuration/ndd/nd2-conf’
    changing security context of ‘configuration/ndd/nd3-conf’
    changing security context of ‘configuration/ndd/nd-main.conf’
    changing security context of ‘configuration/ndd’
    changing security context of ‘configuration’
    

    注:-P、-H、または -L オプションを (-R と共に) 指定する場合、何らかの理由でそれらを組み合わせた場合、最後のオプションとして指定されたものは何でも有効になります。

    15.システム全体の変更のための / ルート ディレクトリでの Chcon の動作

    デフォルトでは、以下に示すように、chcon を使用して、ルート ファイルシステムの下にあるすべてのファイルの SELinux コンテキストを再帰的に変更できます。

    これは、root オプションを保持しないと呼ばれます (つまり、–no-preserve-root がデフォルトの動作です)

    警告:システムでこのコマンドを実行しないでください。使えないシステムになってしまいます。次のコマンドはどちらもまったく同じように動作します。

    chcon -Rv system_u:object_r:httpd_config_t:s0 /
    
    chcon -Rv --no-preserve-root system_u:object_r:httpd_config_t:s0 /
    

    ただし、システム上のすべてのファイルの SELinux コンテキストを同じにしたくないため、自分が何をしているのかを理解していない限り、お勧めしません。間違えて間違ったコンテキストをファイルに設定した場合は、restorecon コマンドを使用して SELinux コンテキストを復元する方法を理解しておく必要があります

    –no-preserve-root オプションを指定すると、以下に示すようにコマンド ライン オプションとして指定すると、ルートを通過しません。

    # chcon -Rv --preserve-root system_u:object_r:httpd_config_t:s0 /
    chcon: it is dangerous to operate recursively on `/'
    chcon: use --no-preserve-root to override this failsafe
    

    デフォルトの動作は危険であるため、偶発的なミスを避けるために、巨大なディレクトリ (特にシェル スクリプト内から) で -R 再帰オプションを実行するときは常に、–preserve-root を使用することをお勧めします。このように、誤って chcon コマンドの最後に / を指定しても、システム内のすべてのファイルが誤って変更されることはありません。


    Linux
    1. Linux での rm コマンドの例

    2. Linux での ps コマンドの例

    3. w Linux でのコマンド例

    1. 7 Linux df コマンドの例

    2. 8 Linux TR コマンドの例

    3. dnf コマンドの例

    1. 5 Linux Touch コマンドの例 (ファイルのタイムスタンプを変更する方法)

    2. Linux での chcon コマンドの例

    3. Linux での setenforce コマンドの例