前回は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に関連するコマンドについて解説しました。
とはいえ、コマンドだけ分かってもどうやって設定していけば良いか分かりづらいかと思います。
次回は実際に設定を行う例を挙げて説明したいと思います。