mysqlを利用したアプリで、SELinux周りでつまずいた話

作成日:

更新日:

mysqlを使ったdiscord botを作成した

サーバを借りて、シェル上での実行は上手く行ったのだが、systemdで起動を行おうとした際に権限不足でエラーはまりした
ログを見る限りでは、DBへのアクセス時に権限が無いせいでアクセスができず、リトライがずっと走っているようだった

SELinux周りで上手く動かないことがあるようなので、ひとまずこれを無効化してみた

# setenforce 0

上記を実行してみたところ、プログラムが動き始めたので、一旦上記が問題と分かった
このままだとあれなので、一旦再起動でSELinuxを有効化する

# reboot

調べてみたところ、audit2allowコマンドで、SELinuxの監査ログからどのような許可を行うかを作成できるらしい
以下からその手順を記載する

初めに以下を実行して、どんな問題が、なぜ起きているかを確認する

# grep APPNAME /var/log/audit/audit.log | audit2allow -a -w

その後、以下を実行してポリシーパッケージ(*.ppファイル)を作成する

# grep APPNAME /var/log/audit/audit.log | audit2allow -a -M POLICY_NAME

上記で作成されたファイルをインストールする

# semodule -i POLICY_NAME.pp

念のため再起動し、ポリシーがインストールされていることを確認する

# semodule -l | grep POLICY_NAME

この段階まで来ると、自分の環境ではsystemdで起動したボットが正常に動作しているのを確認できた
もし同じ現象に陥った人が居たら参考までに

それではまた

追記

今回ボットのバイナリを/opt/bot/botに配置していて、このバイナリのコンテキストをリストアしても上手く動いた

# restorecon -v /opt/bot/bot

みたところ、以前のラベルがetc_tで、上記コマンドを実行することでusr_tに変わっていた
おそらくこの違いで権限が不足していたように見える

実際、バイナリのラベルをetc_tに変えたところ最初のエラーが発生していたため、正しそう
おそらくmvやcpで引っ張ってきた元の場所が悪いような気がする
なので、実行ファイル系をホームディレクトリから/optとか/binみたいな場所に持っていったら、一度このラベルが正しいかを確認する必要がありそう