実践Linux
SELinux SELinux 目次へ TOP(HOME)へ
SELinux audit2allowを使ってトラブルを簡易解決する 2017年9月
audit2allowコマンドは、ログを読み込み、拒否された理由、解決策を表示してくれるという、非常に便利なコマンドです。
ログファイルを指定しない場合のデフォルトは /var/log/audit/audit.logを読み込みます。ログファイルを指定する場合は「-a」の代わりに「-i ログファイル」と指定します。
@準備
# audit2allow -a -l -m mylocal等で、すでにさまざまな表示が出てしまう場合は、auditdのログを新しくとりなおしたほうがよいと思われます。/var/log/audit/audit.logを削除するか退避させておいて、その上で、auditdを再起動=#
service auditd restart します。(CentOS7でのsystemctlコマンドは使えないので注意)
serviceコマンドは、auditdデーモンと正しく対話する唯一の方法となります。auidの値が正しく記録されるように serviceコマンドを使用する必要があります。CentOS7のsystemctlコマンドは、enableとstatusの2つのアクションにのみ使用できます。
A実際の操作
まず、selinuxをPermissiveモードに切り替えます。
Permissiveモードは,SELinuxによって拒否されるアクセスがあっても,アクセス拒否のログを残すだけで,実際にはアクセスを通します。Permissiveモードでアプリケーションの動作確認を行うと,その間に拒否されるアクセスをログから把握できます。
# setenforce 0 ←permissiveモードにする
この状態でアクセスしてログをとる。
# setenforce 1 ←snforcingモードに戻す
# audit2allow -a -l -m mylocal (mylocalは適当な名称)
require {
type mysqld_port_t;
type httpd_t;
class tcp_socket name_connect;
}
#============= httpd_t ==============
#!!!! This avc can be allowed using one of the these booleans:
# httpd_can_network_connect, httpd_can_network_connect_db
allow httpd_t mysqld_port_t:tcp_socket name_connect;
この出力例では、httpd_can_network_connect、httpd_can_network_connect_dbをonにすればよいことがわかります。(下から2行目)
# getsebool -a | grep http 調査
# setsebool -P httpd_can_network_connect on
# setsebool -P httpd_can_network_connect_db on
audit2allowによるポリシー・モジュールの作成 (タイプは既存のまま)
上の例では、単純にブーリアンパラメータを変更するだけで対処できましたが、通常はポリシーを追加して対処することになります。
ただし、ここではあくまで簡易策なので、audit2allowコマンドで出力された内容をそのまま利用するという方法をとります。(ともかく動かすことが目標。かなり危険な設定になってしまう場合も多いので注意。)
ポリシーを追加するには「モジュール・パッケージ」を作成し、これをインストールすることになります。
詳しくは、この後の新しいタイプとポリシ・モジュールの作成参照。
●モジュール・パッケージ作成の準備
@checkpolicyパッケージのインストール
このパッケージには,テキスト形式の設定(teファイル,fcファイル)をモジュール・パッケージの形式に変換するためのコマンド類が含まれる。
# yum list installed | grep checkpolicy でインストールされているか調査。
もし、インストールされていなければ # yum install checkpolicy
Aselinux-policy-develのインストール(Makefileを使うときは必要。)
# yum list installed | grep selinux でインストールされているか調査。
# yum install selinux-policy-devel インストール
Makefileを使う場合は、作業ディレクトリを作成し、ここに /usr/share/selinux/devel/Makefileをコピーしておく。
●audit2allowでモジュール・パッケージ作成
(ここでは簡易策なので、タイプ等はそのまま使用することを想定しています。タイプを新しく作成する場合は、新しいタイプとポリシ・モジュールの作成参照)
モジュール・パッケージを作成し,アプリケーションを動作させるための一般的な手順は以下の通り。
(1)permissiveモードでのテスト
(2)audit2allowでteファイルを作成
(3)モジュール・パッケージに変換して設定を反映
(4)動作するまでpermissiveモードでのテストと設定追加を反復(繰り返す)
(1)permissiveモードでの動作テスト
上記と同様、Permissiveモードにして、ログをとります。auditdサービスは動かしているものとします。
(2)audit2allowでteファイル生成
audit2allowコマンドは,SELinuxのアクセス拒否ログを解析し,そのアクセスを許可するような設定を生成します。
# audit2allow -a -l -m local または
# audit2allow -m local -l -i /var/log/audit/audit.log > local.te または
# audit2allow -M local < /var/log/audit/audit.log この場合local.teとlocal.ppが作成される。
オプション
-l: 前回の設定反映後のログのみを読み込む
-d: dmesgコマンドのログを読み込む。auditサービスは切っておく。-a、-iとけんかする
-a: /var/log/audit/audit.logを読み込む。auditが起動しているとき有効。-iとけんかする
-i <ファイル名>: <ファイル名>のログを入力として読み込む。-aとけんかする
-r: requireブロックを自動生成する
-t: 入力ファイルとしてteファイルを使う。通常、-rとの組み合わせで使用する
古いteフォーマットから新しいフォーマットに移行するとき使う
-m <モジュール名>: モジュールの書式を出力する。-rを含む
-M <モジュールパッケージ名>: モジュール・パッケージを出力する。-o、-mとけんかする
-R: マクロを使うリファレンス・ポリシー設定を生成する(後述)
-o <ファイル名>: 追加出力。-Mとけんかする
-v: 冗長(詳しい)出力
-e: さらに詳しいフル出力
(3)パッケージに変換してインストール
◆local.teをモジュール・パッケージlocal.ppに変換
(上で-Mを使った場合はすでに作成されているので不要ですが、local.teを編集した場合は必要)
# make モジュール・パッケージlocal.ppが生成される。
または(makeを使わない場合)
# checkmodule -M -m -o local.mod local.te local.teからlocal.modが生成される。
# semodule_package -o local.pp -m local.mod fcファイルも使用する場合は -f local.fc を追加。
◆モジュール・パッケージのインストール
# semodule -i local.pp
ポリシー・モジュールの表示
# semodule -l インストールされたか否か確認。
local 1.0のように表示されたら,インストールされている。
ポリシー・モジュールを削除するには,
# semodule -r local
ポリシー・モジュールのアップグレード
# semodule -u local.pp
(4)テストと設定追加の反復
Enforcingモードに切り替えて,それでも動かない場合は,再度Permissiveモードに切り替えて,audit2allowでの設定追加とモジュール・パッケージのインストールを繰り返します。
local.teファイルに設定を追加する場合は,
# audit2allow -a -l -m local だと先頭の「module local 1.0;」という記述が重複してしまい,設定反映時にエラーが生じるので,次のように実行して表示された出力を追加します。
# audit2allow -a -l -r
この場合は「module local 1.0」と記述されないため,きちんと設定が反映でます。
以上で使われているコマンドの詳細については,「man<コマンド名>」を実行して表示されるマニュアルで参照してください。
SELinux目次
TOP(HOME)へ