Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CentOS6.3 でのインストール手順の確認 #13

Closed
okkez opened this issue Aug 14, 2012 · 20 comments
Closed

CentOS6.3 でのインストール手順の確認 #13

okkez opened this issue Aug 14, 2012 · 20 comments

Comments

@okkez
Copy link
Member

okkez commented Aug 14, 2012

上記を参考にして、インストール手順を確認する。

@okkez
Copy link
Member Author

okkez commented Aug 14, 2012

clamavの起動時に” ERROR: Malformed database ”と言われて起動できない。
⇒ freshclamを一度実行してから起動すればOK。

これはその通りなので、手順に freshclam の実行を追加する。

milter-greylistの起動時に”smmspユーザが存在しない”といわれて起動できない。
⇒ sendmailパッケージをインストールすると上記ユーザが作成される。なお、
sendmailパッケージを追加するとデフォルトのMTAがsendmailに切り替わるの
で、”alternatives —config mta” でpostfixに切り替えること。

これは違う。クリーンな環境で手順をなぞると smmsp ユーザは作成される。
=> いつ作成されるか調べた。

yum install -y spamass-milter clamav-milter milter-greylist
のあとで作成されているので、このパッケージか依存パッケージで作成されている。

以下の依存関係で sendmail がインストールされるのが原因だった。

$ rpm -q --whatrequires sendmail
spamass-milter-0.3.1-3.el6.rf.x86_64

でも sendmail のインストールで作成される smmsp ユーザを使っているのは不自然な気がする。

milter-greylistの設定で、/etc/sysconfig/milter-greylistで以下を設定し
てtcpソケットにしているが、”milter-manager —show-config”の結果では

milter.connection_spec = "unix:/var/milter-greylist/milter-greylist.sock"

となるため、いっそこのファイルは作らない。(ってドキュメントでもUNIXドメインソケットで検出している)

これはその通り。どっちかに揃える。

main.cf の smtpd_milter の設定で、Postfix がchrootする。ということで以下のような設定になっているけど、

smtpd_milters = unix:/milter-manager/milter-manager.sock

これって、milter-managerがきちんとそれを踏まえてやってくれるという前
提なのかな?今回の環境ではmilter-managerのUNIXドメインソケットは
/var/run/milter-manager/milter-manager.sockになっていて、chrootするも
くそも/var/spool/postfix配下にはmilter-manager絡みのファイルは一切な
いので、このままだと通信できない。
⇒ chroot云々を考えるのが面倒だったので、milter-managerのソケットを
UNIXドメインソケットからTCPソケットに変えました。

/etc/milter-manager/milter-manager.local.confに以下を追加。

manager.connection_spec = "inet:10025@[127.0.0.1]"

chroot 云々のところはあやしい。
CentOS6.3 の Postfix はデフォルトで chroot するみたい。

chroot する場合としない場合について書いた方がいいかも。

okkez added a commit that referenced this issue Aug 14, 2012
@okkez
Copy link
Member Author

okkez commented Aug 14, 2012

手順通りセットアップしたが、以下のようなログが出力されて、spamass-milter が起動しない。

Aug 14 18:07:30 localhost spamass-milter[5413]: spamass-milter 0.3.1 starting
Aug 14 18:07:30 localhost spamass-milter[5413]: SpamAssassin: Unable to create new socket: Permission denied
Aug 14 18:07:30 localhost spamass-milter[5413]: SpamAssassin: Unable to create listening socket on conn inet:11120@[127.0.0.1]
Aug 14 18:07:30 localhost spamass-milter[5413]: spamass-milter 0.3.1 exiting

@okkez
Copy link
Member Author

okkez commented Aug 15, 2012

↑の原因は SELinux が有効になっていたこと。
とりあえず、起動するだけなら以下のコマンドを実行して SELinux を一時的に無効にすればよい。

$ sudo /usr/sbin/setenforce permissive

確認

$ sudo /usr/sbin/getenforce 
Permissive

@okkez
Copy link
Member Author

okkez commented Aug 15, 2012

$ sudo ausearch -m AVC
time->Wed Aug 15 09:19:50 2012
type=SYSCALL msg=audit(1344989990.349:6730): arch=c000003e syscall=50 success=yes exit=0 a0=4 a1=80 a2=10 a3=7fffd3d530d0 items=0 ppid=1 pid=7352 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=335 comm="spamass-milter" exe="/usr/sbin/spamass-milter" subj=unconfined_u:system_r:spamass_milter_t:s0 key=(null)
type=AVC msg=audit(1344989990.349:6730): avc:  denied  { listen } for  pid=7352 comm="spamass-milter" laddr=127.0.0.1 lport=11120 scontext=unconfined_u:system_r:spamass_milter_t:s0 tcontext=unconfined_u:system_r:spamass_milter_t:s0 tclass=tcp_socket

@okkez
Copy link
Member Author

okkez commented Aug 15, 2012

5. Troubleshooting SELinux を参考に以下を実行した。

$ sudo yum install setroubleshoot
$ sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt 

ログを確認すると以下のような内容だった。
長いので一つ目だけ抜粋した。

found 6 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------

SELinux is preventing /usr/sbin/spamass-milter from create access on the tcp_socket .

*****  Plugin catchall (100. confidence) suggests  ***************************

次のような場合: 
 spamass-milter に、  tcp_socket の create アクセスがデフォルトで許可されるべきです。   
このようにします: 
 これをバグをして報告すべきです。 
このアクセスを許可するために、ローカルポリシーモジュールを生成することができます。
そして、以下を実行します: 
このアクセスを一時的に許可するには、以下を実行してください。:
# grep spamass-milter /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

@okkez
Copy link
Member Author

okkez commented Aug 15, 2012

ログに記載されていた以下を実行すると、spamass-milter が起動することが確認できたが、milter-test-server がまだちゃんと動かない。

# grep spamass-milter /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

ログ。

Aug 15 12:01:35 localhost spamass-milter[8469]: spamass-milter 0.3.1 starting
Aug 15 12:06:41 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:06:41 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again
Aug 15 12:06:42 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:06:42 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again
Aug 15 12:06:44 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:06:44 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again
Aug 15 12:06:47 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:06:47 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again
Aug 15 12:06:48 localhost milter-manager[1997]: [13] [children][timeout][reading][negotiate][accept] [16] spamass-milter
Aug 15 12:06:48 localhost milter-manager[1997]: [statistics] [milter][end][negotiate][pass][7.04255](16): spamass-milter
Aug 15 12:06:51 localhost milter-manager[1997]: [statistics] [session][end][negotiate][accept][9.83458](13)
Aug 15 12:06:51 localhost milter-manager[1997]: [statistics] [sessions][finished] 4(+1) 0
Aug 15 12:06:51 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:06:51 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again
Aug 15 12:06:56 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:06:56 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again
Aug 15 12:07:02 localhost spamass-milter[8469]: SpamAssassin: Unable to set close-on-exec on connfd (Bad file descriptor)
Aug 15 12:07:02 localhost spamass-milter[8469]: SpamAssassin: accept() returned invalid socket (Permission denied), try again

@okkez
Copy link
Member Author

okkez commented Aug 15, 2012

調べてみたけど、SELinux 有効のまま spamass-milter, spamassassin を使うことはできなかった。

@okkez
Copy link
Member Author

okkez commented Aug 17, 2012

/usr/share/selinux/devel/include/services/milter.if を見ると spamassasin milter についての記述がある。

@okkez
Copy link
Member Author

okkez commented Aug 17, 2012

以下のコマンドで milter 関連のポリシーだけ無効にできた。
コマンド実行後 enforcing でも spamass-milter が起動することが確認できた。

$ sudo semodule -d milter
$ sudo semodule -l | grep milter
milter  1.1.1   Disabled

@okkez
Copy link
Member Author

okkez commented Aug 20, 2012

ログを見てもどこが悪いのか見当が付かなかったので、ソースを確認することにした。
(どっか権限がおかしいのだろうなーくらいの認識。)

SRPM の内容を確認したら、
spamassassin と spamass-milter の SELinux 対応には問題なさそうだった。
selinux のモジュールに書いてあるソケットのパスが /etc/sysconfig/spamass-milter と違っていたので /etc/sysconfig/spamass-milter を修正したら、spamassassin と spamass-milter はちゃんと起動した。

milter-test-server を試すと動かない。

$ sudo -u milter-manager milter-test-server -s unix:/var/run/milter-manager/milter-manager.sock
[2012-08-20T02:36:34.867733Z]: [1] [agent][error][decode] Decode error: milter-decoder-error-quark:3: unexpected reply was received: 

** (milter-test-server:32367): CRITICAL **: milter_event_loop_quit: assertion `priv->depth > 0' failed
Decode error: milter-decoder-error-quark:3: unexpected reply was received: 

/var/log/maillog を確認すると permisson denied になっていた。

Aug 20 11:36:29 localhost milter-manager[32309]: [5] [children][error][connection] [8] Failed to connect to unix:/var/run/spamass-milter.sock: 許可がありません: spamass-milter
Aug 20 11:36:29 localhost milter-manager[32309]: [5] [leader][error] Failed to connect to unix:/var/run/spamass-milter.sock: 許可がありません
Aug 20 11:36:29 localhost spamass-milter[32380]: spamass-milter 0.3.1 starting
Aug 20 11:36:34 localhost milter-manager[32309]: [5] [children][error][connection] [8] Failed to connect to unix:/var/run/spamass-milter.sock: 許可がありません: spamass-milter
Aug 20 11:36:34 localhost milter-manager[32309]: [5] [leader][error] Failed to connect to unix:/var/run/spamass-milter.sock: 許可がありません
Aug 20 11:36:34 localhost milter-manager[32309]: [statistics] [milter][end][start][pass][-4.2e-08](8): spamass-milter
Aug 20 11:36:34 localhost milter-manager[32309]: [5] [children][error][connection] [8] Failed to connect to unix:/var/run/spamass-milter.sock: 許可がありません: spamass-milter
Aug 20 11:36:34 localhost milter-manager[32309]: [5] [leader][error] Failed to connect to unix:/var/run/spamass-milter.sock: 許可がありません
Aug 20 11:36:34 localhost milter-manager[32309]: [statistics] [milter][end][start][pass][-4.2e-08](8): spamass-milter
Aug 20 11:36:34 localhost milter-manager[32309]: [statistics] [session][end][connect][pass][5.00989](5)
Aug 20 11:36:34 localhost milter-manager[32309]: [statistics] [sessions][finished] 2(+1) 0

@okkez
Copy link
Member Author

okkez commented Aug 20, 2012

↑のログだと milter-manager が spamass-milter のソケットに書き込めていないようなので、
milter-manager 用の SELinux ポリシーモジュールを作らないと根本解決しない気がする。

@okkez
Copy link
Member Author

okkez commented Aug 20, 2012

TCP ソケットだと spamass-milter がうまく動かないのはポリシーが不足しているからだった。

以下のようなコメントが selinux-policy のソースに書かれていた。

# Allow communication with MTA over a unix-domain socket
# Note: usage with TCP sockets requires additional policy

@okkez
Copy link
Member Author

okkez commented Aug 20, 2012

Unix ドメインソケットの場合に エラー が発生していたのはソケットファイルのパーミッションが原因。

$ ls -l /var/run/spamass-milter.sock 
srwxr-xr-x. 1 root root 0  8月 20 14:51 2012 /var/run/spamass-milter.sock

@okkez
Copy link
Member Author

okkez commented Aug 20, 2012

spamass-milter で/var/run/spamass-milter.sock のパーミッションを設定する方法はなさそうなのでこれまで通り TCP ソケットを使うことにする。

そうすると、やっぱりポリシーが足りないので spamass-milter に TCP ソケットを操作する権限を与える必要がある。
これは audit2allow を使えば簡単にできる。

しかし、権限を追加しても Enforcing モードだと spamassassin と spamass-milter の通信がうまく行かない。
Permissive モードだと期待通りに動く。

Aug 20 15:36:37 localhost spamass-milter[1717]: SpamAssassin, mi_rd_cmd: read returned -1: Permission denied
Aug 20 15:36:37 localhost spamass-milter[1717]: mlfi_close
Aug 20 15:36:37 localhost milter-manager[1649]: [12] [reader][error][read] I/O error: g-io-channel-error-quark:8: 接続が相手からリセットされました
Aug 20 15:36:37 localhost milter-manager[1649]: [12] [agent][error][reader] Input error: milter-reader-error-quark:1: I/O error: g-io-channel-error-quark:8: 接続が相手からリセットされました
Aug 20 15:36:37 localhost milter-manager[1649]: [9] [children][error][negotiate][accept] [12] Input error: milter-reader-error-quark:1: I/O error: g-io-channel-error-quark:8: 接続が相手からリセットされました: spamass-milter

/var/log/audit/audit.log にログが出力されていることを期待したが、出力されていないのでログからの調査はできない。

@okkez
Copy link
Member Author

okkez commented Aug 21, 2012

手動で spamass-milter を起動すると unconfined_u になってしまってダメ。

$ sudo service spamass-milter start
$ ps auxZ | grep spam
unconfined_u:system_r:spamass_milter_t:s0 root 1717 0.0  0.1 102212 820 ?      Ssl  Aug20   0:00 spamass-milter -p inet:11120@[127.0.0.1] -f -m -r 15 -d func,misc,poll,str,uori
system_u:system_r:spamd_t:s0    root      3766  0.0 10.7 248152 54088 ?        Ss   05:18   0:05 /usr/bin/spamd -d -c -m5 -H -r /var/run/spamd.pid
system_u:system_r:spamd_t:s0    root      3768  0.0 10.2 248152 51552 ?        S    05:18   0:00 spamd child
system_u:system_r:spamd_t:s0    root      3769  0.0 10.2 248152 51552 ?        S    05:18   0:00 spamd child

run_init 経由で起動して init プロセスから起動したように見せかけてやると OK

$ sudo run_init service spamass-milter start
$ ps auxZ | grep spam
system_u:system_r:spamd_t:s0    root      3766  0.0 10.7 248152 54088 ?        Ss   05:18   0:05 /usr/bin/spamd -d -c -m5 -H -r /var/run/spamd.pid
system_u:system_r:spamd_t:s0    root      3768  0.0 10.2 248152 51552 ?        S    05:18   0:00 spamd child
system_u:system_r:spamd_t:s0    root      3769  0.0 10.2 248152 51552 ?        S    05:18   0:00 spamd child
system_u:system_r:spamass_milter_t:s0 root 4791 0.0  0.1  26432   748 ?        Ssl  14:16   0:00 spamass-milter -p inet:11120@[127.0.0.1] -f -m -r 15 -d func,misc,poll,str,uori
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 kenji 4795 0.0  0.1 107448 956 pts/0 S+ 14:16   0:00 grep spam

okkez added a commit that referenced this issue Aug 21, 2012
@okkez
Copy link
Member Author

okkez commented Aug 21, 2012

/etc/postfix/master.cf を確認すると chroot する設定になっていなかったため、chroot に関する記述は削除する。
ソケットのパスもフルパスを記述すれば動くことを確認した。

okkez added a commit that referenced this issue Aug 21, 2012
Remove about chroot, because Postfix doesn't chroot by default.
see GitHub: #13
@okkez
Copy link
Member Author

okkez commented Aug 21, 2012

やっぱり enforcing にすると spamass-milter がうまく動かない。
あと Postfix が milter-manager の unix domain socket に書き込めない。

@okkez
Copy link
Member Author

okkez commented Aug 21, 2012

ここまでをまとめると SELinux が有効 (Enforcing) だと動かないことがわかった。

  • spamass-milter が spamassassin のソケットを読み書きできない
    • Permissive だと読み書きできるので SELinux の問題であるはず
  • spamass-milter が TCP Socket を作成できない
    • これは selinux-policy のバグ。ただし upstream では修正済み。
  • Postfix が milter-manager の unix domain socket を読み書きできない
    • milter-manager のソケットを TCP ソケットに変更してもダメ
    • milter-manager を無効にするとメールを処理できる

以下のコマンドで postfix, milter のポリシーモジュールを無効にすれば milter-manager を使用してメールの配送ができるところまで確認した。

$ sudo semodule -d postfix
$ sudo semodule -d milter

@okkez
Copy link
Member Author

okkez commented Aug 22, 2012

たぶん、SELinux 有効で milter を動かすための手順を一般化すると以下のようになる。

  1. Permissive で一通りセットアップする
  2. /var/log/audit/audit.log をクリアする
  3. Permissive で一通り動作させてログを記録させる
  4. audit2allow でログからモジュールを作る
  5. semodule -i で作ったモジュールをインストールする
  6. Enforcing で動作確認する

たぶん、この手順だと解決しきれない問題もあると思う。
たとえば、spamass-milter の問題はこの手順だと解決できていない。

@okkez
Copy link
Member Author

okkez commented Aug 22, 2012

手順書は以下のように修正した。

  • SELinux 無効
  • chroot は使っていないので記述を削除

SELinux 有効の状態で動かせるようにする件は別 issue で扱うことにする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant