openssl
postfix
CentOS6.x
dovecot
centos7.x

CentOS6.9/CentOS7.4でメール関連のSSLログの取得および調査

改訂(2018/1/25): CentOS6.6からCentOS6.9およびCentOS7.4用に改訂

はじめに

SSL関係の脆弱性の報道はよくありますが、SSLを使っているのはWeb(HTTP over SSL)だけではなくメールも使っています。

現在使っているSSL通信プロトコルの調査をするためにログを取得する方法、およびログを読んで調査する方法を述べます。

なお、すでに基本的なSSLの設定は行われていて運用されていいる事を想定しています。

2.メール関係のプロトコル

メール関係では以下のプロトコルでSSLが使われますかね。

-smtp + starttls (SSL無しで繋いでstartls命令でSSL通信開始)
port: 25/tcp, 587/tcp
-smtps (いきなりSSL通信)
port: 465/tcp

-imap + starttls
port: 143/tcp
-imaps
port: 993/tcp
-pop3 + starttls
port: 110/tcp
-pop3s
port: 995/tcp

上記のログを取ってみます。

標準設定でのSSLログの取得設定

メールサーバを提供するアプリケーションは色々種類がありますが、今回はOSに標準で入っているpostfixとdovecotを想定します。

CentOS6.9/7.4の標準設定では、メールのログファイルは以下の所にあります。1週間ごとにファイルがバックアップされていきます。標準では4週間保存されます。(保存期間を増やす場合は/etc/logrotate.confの rotateの行を変更ください。HDD残量が厳しい場合はcompressを指定してください。古いログは圧縮されます。)

 /var/log/maillog  (最新)
 /var/log/maillog-20180121 (バックアップ)
 /var/log/maillog-20180114 (バックアップ)
 ...

上記のメールログには標準ではSSLは詳細なログが記録されません。

以下のような設定をすることによりSSLの詳細ログが取得できますので、設定を行なっておいて、最低1週間程度まって下さい。できれば一か月。。

注意点: postfixの設定やログではsmtpd(d有り)とsmtp(d無し)の違いに注意して下さい。smtpdは受信時の設定、smtpは送信時の設定です。

postfixの設定

postfixのmain.cfに加筆してください。

注意: postfixの設定やログではsmtpd(d有り)とsmtp(d無し)の違いに注意して下さい。smtpdは受信時の設定、smtpは送信時の設定です。

/etc/postfix/main.cf
# メール受信時のSSLログ
smtpd_tls_loglevel = 1

# メール送信時のSSLログ
smtp_tls_loglevel = 1

# おまけ: 
# 受信時のSSL暗号化はテストされる方が多いのですが、
# 送信時の設定を忘れている場合がよくあるようです。
# 送信時のSSLを有効にする設定。
smtp_use_tls = yes
smtp_tls_security_level = may

dovecotの設定

標準設定の最後に%kを加筆しています。(CentOS6.9/CentOS7.4いずれも同じ)

/etc/dovecot/conf.d/10-logging.conf
#login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k

OSを再起動することにより、上記設定が有効になります。

(執筆メモ:上記はブログ掲載用。実際運用しているCentOS7.xサーバの設定と違う。)

一週間以上経過後、ログが溜まってからの作業

再掲になりますが、メールのログは(/var/log/maillog)です。このファイルから抜粋したログを例示します。

以下はpostfixのメール受信の例。 postfix/smtpd の行がSSL有りでメールを受信したときのログです。(smtpにd有り)

Jan 21 23:37:16 mail postfix/smtpd[23240]: Anonymous TLS connection established mail.example.com[203.0.113.1]: TLSv1.2 with cipher AES256-SHA256 (256/256 bits)

上記ログはSSLのバージョンはTLSv1.2でcipherは ADH-AES256-GCM-SHA384 (256/256 bits)ということですね。

送信の例。postfix/smtpの行がSSL有りでメールを送信したときのログです。 (smtpにd無し)

Jan 22 04:02:38 mail postfix/smtp[28472]: Trusted TLS connection established to mail.example.com[203.0.113.1]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)

続いてdovecotですが、pop3-login/imap-loginでpop3でログインしたかimapでログインしたか分かります。

Jul 26 03:13:12 mail dovecot: pop3-login: Login: user=<USER-NAME>, method=PLAIN, rip=198.51.100.100, lip=198.51.100.1, mpid=19924, TLS, TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
Jul 26 03:23:32 mail dovecot: imap-login: Login: user=<USER-NAME>, method=PLAIN, rip=198.51.100.101, lip=198.51.100.1, mpid=20141, TLS, TLSv1 with cipher RC4-MD5 (128/128 bits)

集計スクリプト

集計のための簡単なスクリプトを用意します。

cat-XXがログを標準出力に出すスクリプト。count-XXが集計。grep-XXが検索です。

::::::::::::::
./cat-maillog.sh
サーバにあるメールのログを全て標準出力に出力。
ログを圧縮してないときはgzipから後を消してください。
::::::::::::::
cat /var/log/maillog /var/log/maillog*[0-9]; gzip -dc /var/log/maillog*.gz

::::::::::::::
./cat-maillog0.sh 
サーバにあるメールのログで最近のだけ標準出力に出力.。
改訂(2018/1/25): 最近の1週間程度に修正。
::::::::::::::
cat `ls -t /var/log/maillog* | head -2`

::::::::::::::
./count-dovecot-tls.sh
dovecotのSSLログを集計
(執筆メモ:ブログ掲載用。実際運用しているCentOS7.xサーバのスクリプトは違う。)
::::::::::::::
grep dovecot: | grep -v "Disconnected" | grep "with cipher" | perl -pe 's/^.*, TLS, //' | sort | uniq -c

::::::::::::::
./count-postfix-receive-tls.sh
postfixのメール受信時のSSLログを集計
::::::::::::::
fgrep "postfix/smtpd[" | grep "with cipher"| perl -ne '/^.* ([\w\.]+ with cipher .*)$/;print $1."\n";' | sort | uniq -c

::::::::::::::
./count-postfix-send-tls.sh
postfixのメール送信時のSSLログを集計
::::::::::::::
fgrep "postfix/smtp[" | grep "with cipher"| perl -ne '/^.* ([\w\.]+ with cipher .*)$/;print $1."\n";' | sort | uniq -c

::::::::::::::
./grep-dovecot-tls.sh
dovecotのSSLログをgrep
::::::::::::::
grep dovecot: | grep "with cipher" | fgrep "$1"

::::::::::::::
./grep-postfix-receive-tls.sh
postfixのメール受信時のSSLログをgrep
::::::::::::::
fgrep "postfix/smtpd[" | grep "with cipher"| fgrep "$1"

::::::::::::::
./grep-postfix-send-tls.sh
postfixのメール送信時のSSLログをgrep
::::::::::::::
fgrep "postfix/smtp[" | grep "with cipher"| fgrep "$1"

上記のファイルをそれぞれ作成しchmod +xしてください。

集計およびログの読み方

補足(2018/1/25): 以下CentOS6.6の時点のログです。細微な変更がある可能性あり。

メールログとスクリプトを使って、現在使われているSSLプロトコルを集計してみます。

dovecotのログの集計は以下のスクリプトで出来ます。

(ここ最近の1週間程度のログのみ集計)
# ./cat-maillog0.sh | ./count-dovecot-tls.sh 
    459 TLSv1 with cipher AES128-SHA (128/128 bits)
   1174 TLSv1 with cipher AES256-SHA (256/256 bits)
   5940 TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
   1626 TLSv1 with cipher RC4-MD5 (128/128 bits)
   1179 TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)
  12730 TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)
      1 TLSv1.2 with cipher RC4-SHA (128/128 bits)
(サーバにある全てのログを集計)
# ./cat-maillog.sh | ./count-dovecot-tls.sh  
 (省略)

各行の最初の数字が接続数で、接続に使われたSSLプロトコルです。

近年ではRC4の暗号化レベルは十分とみなされていないようですので、RC4-MD5, RC4-SHAは止めたよさそうですね。

RC4-MD5を使っているクライアントIPを調べてみます。./grep-dovecot-tls.sh の引数にSSLプロトコルを指定して下さい。ダブルクオートで括ってください。

./cat-maillog0.sh | ./grep-dovecot-tls.sh "TLSv1 with cipher RC4-MD5" 
Jul 26 03:13:27 mail dovecot: imap-login: Login: user=<USER-NAME>, method=PLAIN, rip=203.0.113.1, lip=198.51.100.1, mpid=19930, TLS, TLSv1 with cipher RC4-MD5 (128/128 bits)
 (大量に表示されますので省略)

「rip」は接続してきたクライアントのIPです。「lip」はメールサーバのIPです。ですので、IPアドレス203.0.113.1がRC4-MD5を使って接続してきたクライアントになります。

実サーバでUSER-NAMEに表示されたユーザに聞き取り調査したところ、AUの携帯電話でした。

続いて、postfixの集計をします。

繰り返しになりますが、postfixがメールを受信したときのログはsmtpd (d有り)、送信したときのログはsmtp (d無し)です。

(メール受信時のログ。ここ最近のログのみ。)
#  ./cat-maillog0.sh | ./count-postfix-receive-tls.sh
      5 SSLv3 with cipher DHE-RSA-AES256-SHA (256/256 bits)
     10 TLSv1 with cipher ADH-AES256-SHA (256/256 bits)
      8 TLSv1 with cipher AES128-SHA (128/128 bits)
     20 TLSv1 with cipher AES256-SHA (256/256 bits)
      6 TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)
    297 TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
     20 TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)
      7 TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (128/168 bits)
      5 TLSv1 with cipher RC4-MD5 (128/128 bits)
      2 TLSv1 with cipher RC4-SHA (128/128 bits)
      8 TLSv1.1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
   1225 TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)
     18 TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)
      4 TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)
      1 TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    236 TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)
     50 TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)
      1 TLSv1.2 with cipher DHE-RSA-AES256-SHA (256/256 bits)
      1 TLSv1.2 with cipher RC4-SHA (128/128 bits)
(メール送信時のログ。ここ最近のログのみ。)
#  ./cat-maillog0.sh | ./count-postfix-send-tls.sh
    903 TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
      1 TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)
    179 TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)
     11 TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)
    315 TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    126 TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)

上記出力で後半のメール送信時のログは特に問題ないと思いますが、前半のメール受信時のログではRC4等脆弱性のあるSSLプロトコルが使われているようです。

受信時のログでRC4-SHAの送り主と送り先を調べてみます。./grep-postfix-receive-tls.sh の引数にSSLプロトコルを指定して下さい。ダブルクオートで括ってください。

# ./cat-maillog0.sh | ./grep-postfix-receive-tls.sh "TLSv1 with cipher RC4-SHA"
Jul 23 19:44:19 mail postfix/smtpd[18502]: Anonymous TLS connection established from mail.example.com[203.0.113.99]: TLSv1 with cipher RC4-SHA (128/128 bits)
Jul 23 23:50:55 mail postfix/smtpd[21825]: Anonymous TLS connection established from mail.example.com[203.0.113.99]: TLSv1 with cipher RC4-SHA (128/128 bits)

7月23日の19:44頃と23:50頃の二つのログが出てきました。19:44のほうを調べてみます。

fgrepの引数にhostnameとIPの所をコピペして実行してみてください。

# ./cat-maillog0.sh | fgrep "mail.example.com[203.0.113.99]"
Jul 23 19:44:19 mail postfix/smtpd[18502]: connect from mail.example.com[203.0.113.99]
Jul 23 19:44:19 mail postfix/smtpd[18502]: setting up TLS connection from mail.example.com[203.0.113.99]
Jul 23 19:44:19 mail postfix/smtpd[18502]: Anonymous TLS connection established from mail.example.com[203.0.113.99]: TLSv1 with cipher RC4-SHA (128/128 bits)
Jul 23 19:44:20 mail postfix/smtpd[18502]: 9D49D61C77: client=mail.example.com[203.0.113.99]
Jul 23 19:44:21 mail postfix/smtpd[18502]: disconnect from mail.example.com[203.0.113.99]

上記の下から2行目に「9D49D61C77」というのがありますが、これはメールのQUEUE-IDです。これを使ってさらに検索してみます。

# ./cat-maillog0.sh | fgrep "9D49D61C77"
Jul 23 19:44:20 mail postfix/smtpd[18502]: 9D49D61C77: client=mail.example.com[203.0.113.99]: 
Jul 23 19:44:21 mail postfix/cleanup[18506]: 9D49D61C77: message-id=<123456478@mail.example.com>
Jul 23 19:44:21 mail postfix/qmgr[2192]: 9D49D61C77: from=<USER-NAME-FROM@example.com>, size=11014, nrcpt=1 (queue active)
Jul 23 19:44:21 mail postfix/local[18507]: 9D49D61C77: to=<USER-NAME-TO@example.jp>, relay=local, delay=1, delays=0.95/0.01/0/0.09, dsn=2.0.0, status=sent (delivered to maildir)
Jul 23 19:44:21 mail postfix/qmgr[2192]: 9D49D61C77: removed

上記で上から4行目のfromのところに書かれているUSER-NAME-FROM@example.comが送信主。5行目のtoに書かれているUSER-NAME-TO@example.jpが送り先になります。

(注意: fromはメール本文にかかれているfromと上記ログに書かれているfromが異なる事は多々あります。スパムメールも異なることが多々ありますが、MLなどではエラーメール対策で意図的に書き換えられていることがあります。)

以上のような手順で、受信時のログを基に脆弱性のあるSSLプロトコルで送られてきたメールの送り主、送り先が調査できました。

postfixのメール送信時のログを基に送り主送り先の調査については省略します。

送信時は以下のコマンドを使って下さい。SSLプロトコルはダブルクオートで括ってください。

# ./cat-maillog0.sh | ./grep-postfix-send-tls.sh "TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA"

この記事の続き

ログをもとにした設定変更は次の記事を参考にください。

CentOS6.9/CentOS7.4でメール関連のSSLログの調査および設定変更
https://qiita.com/qiitamatumoto/items/7e22a766d77d8e9f0048

追記(2018/1/25)

ログの細微な検討については以下の記事も参考にください。

メールサーバでユーザ認証の暗号化を強制したときの話。(設定とかでなくログの読み方)
https://qiita.com/qiitamatumoto/items/8c4341d0af9958543db4

以上。