前回はSELinuxの概要について説明しました。
今回はSELinuxのコマンドについて説明します。
この記事で行うこと
1. SELinuxのモード確認と変更
SELinuxには Enforcing
(実行)と Permissive
(許容)の2つのモードが存在しています。
Enforcing
はSELinuxで許可されない操作は拒否されるモードつまりSELinuxが有効な状態です。 Permissive
はSELinuxで許可されない操作も警告を出すだけで許容するモード、つまり実質無効な状態となります。
モード確認は以下のコマンドで行えます。
[root@localhost ~]# getenforce
また、モード変更は以下のコマンドで行えます。
[root@localhost ~]# setenforce 1
引数が1の場合は Enforcing
に、0の場合は Permissive
に設定されます。
2. SELinuxのログを確認する
SELinuxでブロックされた際にはシステムログにログが残ります。
システムログは journalctl
コマンドで確認出来ます。
今日発生したSELinuxのログのみを確認したい場合は以下のコマンドとなります。
[root@localhost ~]# journalctl --identifier setroubleshoot --since today
journalctl
: 前述の通りシステムログを確認するためのコマンドです。--identifier setroubleshoot
:--identifier
は指定したシステムログだけを表示させるオプションです。ここではsetroubleshoot
というSELinuxに関する問題のログを指定しています。--since today
:--since
はいつからのログを表示するかのオプションです。基本的にはYYYY-MM-DD
といった形で指定をしますが、today
やyesterday
といった指定も出来ます。また、--until
といういつまでのログを表示するかのオプションを組み合わせることで特定期間のログを表示出来ます。
3. ファイル・ディレクトリのコンテキストを確認する
コンテキストの確認は ls
コマンドで行うことが出来ます。
ls
はファイルの一覧を表示する基本的なコマンドですが、これに -Z
というオプションを付けることでコンテキストを表示することが出来ます。
また、 -l
オプションを加えると基本的な権限設定も一緒に見れるため見やすいです。
[root@localhost ~]# ls -lZ 「表示したいディレクトリ」
4. ファイル・ディレクトリのコンテキストを変更する
ファイルやディレクトリのコンテキストを変更する方法には一時的な変更と永続的な変更の2種類があります。
まず永続的な変更から説明すると、こちらはSELinuxで持っているコンテキストのリストを更新するものになります。SELinuxではファイルパスとコンテキストを紐付けるリストを持っています。
後述する一時的変更やファイルの移動などが行われた場合はこのリストと異なるコンテキストを持つこともありますが、 restorecon
というコマンドを実行することでリスト通りのコンテキストに復元出来ます。このため、このリストを更新する方法を永続的な変更と言います。
逆に一時的な変更は、上記のリストを更新せずにファイルやディレクトリのコンテキストを直接変更することを指します。こうして変更されたコンテキストは restorecon
を実行すると失われてしまうため一時的な変更と言います。
4-1. 一時的な変更
一時的な変更は chcon
というコマンドで行うことが出来ます。
[root@localhost ~]# chcon -R -t 「変更するタイプ名」 「変更したいファイル・ディレクトリ名」
chcon
: コンテキストを変更する為のコマンドです。-R
: 再帰的に変更するオプションです。このオプションを付けることで、指定したディレクトリ以下のファイル・ディレクトリ全てに設定が適用されます。1ファイルや特定のディレクトリだけ変えたい場合はこのオプションは外してください。-t 「変更するタイプ名」
:-t
はタイプを変更するためのオプションです。このオプションの直後に指定されたタイプに変更されます。前回の記事で話したとおり、コンテキストには他にもユーザやロールがありますがデフォルトではほぼ使われません。
4-2. 永続的な変更
永続的な変更の際には、semanage
というコマンドを使ってコンテキストのリストを更新します。
これだけでは実際のファイルやディレクトリのコンテキストは変更されないので、 restorecon
でリストの内容から実際のファイルやディレクトリに反映させる必要があります。
まず、コンテキストのリストを見るのは以下の方法で可能です。
[root@localhost ~]# semanage fcontext --list
しかし、リストは膨大で画面から流れて言ってしまうので grep
コマンドを使って以下のように絞り込みます。
[root@localhost ~]# semanage fcontext --list | grep 「確認したいフォルダパス」
semanage
: SELinuxの設定を行うためのコマンドです。fcontext
: ファイルのコンテキストの設定を行う為のサブコマンドです。FileCONTEXTということです。たぶん。--list
: リスト表示を行う為のオプションです。設定されているファイルパスとファイルコンテキストの対応リストが全て表示されます。|
: これは左のコマンドの結果を右に渡す為のコマンドとなります。今回は出力されたリストをgrep
コマンドに渡して絞り込みを行うものとなります。grep
: 出力から引数にある文字列を含む行だけを抜き出すコマンドです。
このコマンドを使って出力されるファイルパスには /var/www/cgi-bin(/.*)?
という形で主に末尾に変な記号が記載されているかと思います。
これは正規表現が使われている為です。上記の場合は /var/www/cgi-bin
と /var/www/cgi-bin/
内の全てのファイルに一致するという事になります。
このため、 grep
で探して目的のファイルにコンテキストがついていないように見えても正規表現でコンテキスト指定の対象となっている場合もあるので注意してください。
コンテキストのリストの設定は以下のように行います。
[root@localhost ~]# semanage fcontext -a -t「変更するタイプ名」 "「変更したいファイル・ディレクトリ名」"
-a
:--add
の略です。ファイルパスとコンテキストの対応表に新たな行を追加する為のオプションです。-t「変更するタイプ名」
: 一時的な変更と同様にタイプ名を指定します。"「変更したいファイル・ディレクトリ名」"
: 前述の通り、正規表現を使って指定します。ディレクトリ以下全てに適用する場合は末尾の/
の代わりに(/.*)?
と入れてあげれば大丈夫です。また、ファイル・ディレクトリ名は""
で囲みます。
なお、削除する(設定を解除する)場合は上記コマンドの -a
の代わりに -d
とします。( --delete
の略です)
最後に設定した内容で実際のファイル・ディレクトリに適用します。
[root@localhost ~]# restorecon -R 「変更したいファイル・ディレクトリ名」
restorecton
: SELinuxのファイルパスとコンテキストの対応表に合わせて実際のファイル・ディレクトリのコンテキストを変更するコマンドです。-R
: 再帰的に変更を行うオプションです。これによって指定したディレクトリ内のファイル・ディレクトリ全てに変更を適用します。単一のファイルやディレクトリのみ変更したい場合はこのオプションは外してください。
5. ブール値を変更する
ブール値の変更は以下のコマンドで行います。(コンテキスト変更時に使った semanage
コマンドを通しても行えますが、こちらの方が簡便です)
[root@localhost ~]# setsebool 「ブール名」 「設定値」
setsebool
: SELinuxのブール値を設定するためのコマンドです。「ブール名」
: 設定するブールを指定します。基本的にはSELinuxのログにどのブール値を変えれば良いかが乗っているのでその通りにします。ブール値の一覧が見たい場合はsemanage boolean --list
で確認が出来ます。- 「設定値」 : 有効にする場合は
on
、無効にする場合はoff
です。或いは数字で有効は1
、無効は0
と入力することも可能です。
まとめ
今回はSELinuxに関連するコマンドについて解説しました。
とはいえ、コマンドだけ分かってもどうやって設定していけば良いか分かりづらいかと思います。
次回は実際に設定を行う例を挙げて説明したいと思います。