実践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は適当な名称)

module mylocal 1.0;

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)へ

目 次

特別企画
Raspberry Piで遊ぶ

HOME(全体のシステム構成&目次)

CentOS7
CentOS7のインストール〜ネットワークの設定ほか
CentOS7の新機能(systemdとfirewalld)
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
Webサーバー
  Webでファイルの受け渡し
  アクセス解析ツールAwstats
  Wordpressでブログ構築
  EC-CUBEショッピングサイト構築
FTPサーバー
FTPS(FTP over SSL/TLS)
Mail(Dovecot&Postfix)サーバー
Sambaサーバー
MariaDB(MySQL)サーバー
DHCPサーバー
SSHサーバー
VNCサーバー
ストリーミングサーバーRed5
ドメインの追加

CentOS5〜6
ネットワーク&ファイアウォール(iptables)
DNS(BIND)サーバー
DHCPサーバー
メールサーバー(基本)
メールサーバー/実際の運用
Webサーバー
  WebDAVによるファイル共有
  Webでファイルのやり取り
  アクセス解析ツールawstats
  namazuで全文検索
  WordPressブログサイト構築
  EC-CUBEショッピングサイト構築
FTPサーバー
ファイルサーバー・Samba
データベースpostgreSQL
  ExcelからpostgreSQLを操作
データベースMySQL
SSHサーバー
VNC
SSL/TLSを利用した暗号化通信
openVPN
ストリーミングサーバー
    C++ RTMP Server
    Helix server Basic
ドメインの追加
Xen・仮想化
特定ディレクトリに容量制限

SELinux
SELinux基本設定
audit2allowを使い問題の解決
新しいタイプとポリシー・モジュールを作成してみる
マクロを利用したteファイルの記述
新しいドメインを導入してみる

coLinux
Fedora11で試す

Cプログラミング目次
X11プログラム
サイエンス・プログラム

計測・プログラム
秋月電子のデーターロガーpico ADC-16
「今すぐ使えるパソコン計測USBマイコン基板」に付属のTRZ1102
センサーの使用例

Glade2/GTK+を使ってみる
テキスト・ビューで簡易エディター
ドローイングエリアで自動描画
放物線運動(pango、cairoも試してみる)
これらを、GTK+のみで書き出す

フォントについて
ネットワーク・プログラミング
postgreSQL接続
CGI
ファイル操作

●その他
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く