この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
EC2(RHEL)でlogrotateを設定した際、ハマった部分もあったので忘備録として記事にしていきます。
ハマった部分
SELinuxの影響により、cronによるlogrotateの呼び出しがパーミッションエラーとなってしまい、logrotateが実行されないでログが溜まり続けてしまう事象が発生する
原因の推測
cronのプロセスよりlogrotateという異なるプロセスが呼び出され、cronのプロセスに権限が付与されていなかったため、アクセス制限に抵触してパーミッションエラーが発生し、logrotateが実行されなかった。
用語理解
logrotateとは(githubより抜粋意訳)
logrotateは、ログファイルの管理を簡素化するために設計されました。
ログファイルを自動的に、ローテーション、圧縮、削除、メール転送を可能にし、ログファイルを1時間ごと、毎日、毎週、毎月、またはログファイルが一定のサイズになったときに処理するように設定することが可能です。
参考URL:githubによるlogrotateの説明
SELinuxとは(wikiより抜粋意訳)
Security-Enhanced Linux (SELinux) とは、アメリカ国家安全保障局 (NSA) がGPL下で提供している、Linuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールの名称。
Linuxではファイルやディレクトリにはパーミッションに基づいてアクセス制限が決められています。
パーミッションとは、「オーナー」「グループ」「その他」に対して、「r(読み込み)」「w(書き込み)」「x(実行)」を設定しているもので、このパーミッションに関係なくアクセス可能なのがrootユーザの特権です。ただし全ての権限が集中してしまうため、rootユーザのパスワードが漏洩してしまうとサーバの全てが乗っ取られてしまう危険があります。
SELinux は上記の可能性を考慮し、プロセスごとにアクセス制限をかける Type Enforcement (TE)と、rootも含む全てのユーザに関して制限をかけるロールベースアクセス(RBAC)などで制御を行うことで、rootによる権限の集中を防いでいる。
参考URL:wikipediaによるSELinuxの説明
解決方法
SELinuxを無効化する
用語理解の箇所では利点をお伝えしましたが現状では、意図的にプログラムが動かなくなったり、インストールできなくなったりすることがある。
SELinuxの設定確認方法/恒久的な無効化/一時的な無効化・有効化
1.設定確認方法
SELinuxのステータスをチェックするにはgetenforce
コマンドを利用します。
(例)有効化されている場合
$ getenforce
Enforcing
レスポンス内容について
ステータス | 状態の詳細 |
---|---|
Enforcing | SELinux 有効 |
Permissive | 動作しないが、ログは残る |
Disabled | SELinux 無効 |
2.恒久的な無効化
2.1.設定ファイル修正
SELinuxの設定パス
$ vi /etc/SELinux/config
【SELinuxの詳細内容】
# This file controls the state of SELinux on the system.
# SELinux= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELinux=enforcing
# SELinuxTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELinuxTYPE=targeted
上記SELinuxの詳細内容のenforcing
をdisabled
に修正をする
SELinux=enforcing
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
SELinux=disabled
2.2.修正後設定の反映
reboot
コマンドを打ち込み、OSの再起動をして設定を反映させる
$ reboot
再度ターミナルで設定の反映がされているかを確認する
$ getenforce
Disabled
上記画面が表示されていれば、SELinuxは無効化されている
2.3.一時的な無効化・有効化
OSの再起動ができない場合など、下記コマンドで一時的な無効化することが可能です
無効化する場合
$ setenforce 0
有効化する場合
$ setenforce 1
※ただし【SELinuxの詳細内容】でdisabled
にしている場合は、上記の設定を反映させることは出来ません
さいごに
前回記事のEC2(RHEL)でlogrotate設定のハンズオンで、cronからlogrotateを呼び出した際に発生した問題でしたが、無事に解決することができました。
cronのプロセスに権限を与えることでも解決するかとも思いましたが、実際に適用させようとしていた環境を確認したところ、SELinuxをOFFにしているようだったので、こちらのような解決方法となりました。