2016/02/14
またニッチな技術系ネタを投稿します
案外いると思うのに、なかなか情報が出てこず、私みたいに無駄に時間をかけずに解決できることを願って。
今回は、以下のような事態でした。
「CentOS5.7で、postfix、authdaemond、courier-pop3d(courier-imap)、dracd(pop before smtp)使ってメールサーバ稼働してんだけど、SSLv2とSSLv3どころかTLS1.0もNGにして、TLSv1.1かTLSv1.2でしかPOPを許可しないようにして欲しいんだよね」
…ということで対応。
「そもそも、CentOS5とか使うのやめなされ」というのはとりあえず横に置いておいて。
まず、/usr/local/courier-imap/etc/pop3d-ssl をみたんですが(courier-imapがソースインストールされてます)、
##NAME: TLS_PROTOCOL:0
#
# TLS_PROTOCOL sets the protocol version. The possible versions are:
#
# SSL2 – SSLv2
# SSL3 – SSLv3
# TLS1 – TLS1
TLS_PROTOCOL=SSL3
となっていて、
TLS_PROTOCOL=TLS1.1
とか
TLS_STARTTLS_PROTOCOL=TLS1.1
とか試してみたものの、案の定ダメ…。
まあ、CentOS5.7のopensslが0.9.8なので想像はしてました。
確か、TLSv1.1.とかTLSv.1.2に対応させるには、openssl1.0.X 以上じゃないとダメだったんじゃないかな、と。
で少し調べたんですが、courier-imapの情報があまりないことと、なんとなくモダンな感じでないので、この際、dovecot と saslauthd にしてしまおうと判断。
pop before smtp で送信制限ってのもどうかなぁということもあり。
しかしです。
CentOS5系のパッケージのdovecotを使ってみたところ、こちらも案の定TLSv1.1とTLSv1.2には対応していないっぽい。
まあ、先のopensslが0.9.8系だし、dovecotも1系だしそれはそうなりますね…。
ということで、こんなときは「男は黙ってソースインストール!」です。
実はこのサーバ、opensslについては、openssl-1.0.1t が、/usr/local/ssl にインストールされてます。
つまり、このサーバ、パッケージで最初から入っている openssl-0.9.8系と、後からソースでインストールされた openssl-1.0.1tが共存してます。
dovecotをソースでインストールするにしても、opensslは /usr/local/ssl にインストールされた1.0.1系を指定しないといけません。
念のため openssl-1.0.1tのソースインストールの方法です。
# tar xzf openssl-1.0.1t.tar.gz
# cd openssl-1.0.1t
# ./config –prefix=/usr/local/ssl -fPIC shared
# make
# make install
# echo ‘/usr/local/ssl/lib’ >> /etc/ld.so.conf
# ldconfig
…と、openssl-1.0.1tがインストールされた前提で話をすすめます。
以下から最新のdovecot-2.2.27をダウンロード後、解凍、ディレクトリ移動です。
https://www.dovecot.org/download.html
# wget http://www.dovecot.org/releases/2.2/dovecot-2.2.27.tar.gz
# tar xfz dovecot-2.2.27.tar.gz
# cd dovecot-2.2.27
で、./configureのオプションですが、これが大変でした。結論は以下です。
# env SSL_CFLAGS=”-I/usr/local/ssl/include” SSL_LIBS=”-L/usr/local/ssl/lib -Wl,-R/usr/local/ssl/lib -lcrypto -lssl” ./configure
# make
# make install
SSLを/usr/local/sslで指定したかったのですが、apache等で見られる –with-ssl=/usr/local/ssl が使えません。
実際、指定しても怒られます。
用意しておいて欲しいなぁ…。
かといって、何も指定せず、./configure とかやったら、当然ながら パッケージでインストールされている openssl-0.9.8が参照されるので、./configureもmakeもmake installもできますが、肝心のTLSv1.1とTLSv1.2は指定できません。
指定しても、
TLS handshaking: SSL_accept() failed: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol,
とかいうログが出て、認証できません。
ということで、./configure で上記を指定してあげれば、/usr/local/ssl 以下のopenssl が参照されて、無事、TLSv1.1とかTLSv1.2とか指定できるようになります。
ここから後は、dovecotを稼働させた手順を記載します。
dovecotにしたことでpop before smtpは使わなくなり、送信はsaslauthdでの認証に切り替えたんですが、そこは割愛します。
./configureのオプションは上記以外も色々と調べたのですが、正直、普通のことは自動的にどうにかしてくれるっぽいので、余計なオプションつける必要ないだろうということで他は何も指定せずスルッとインストール。
(デフォルトであっても明示的に指定するというのも意味はあると思いますが、まあ指定しなくてもいいんじゃないかと)
–sysconfdir=/etcを指定するとrpm(yum)でインストールした時と同じように/etc/dovecotでインストールされるんですが、「ソースでインストールした時はそれがわかるように/usr/local/以下にしとけ」という師匠の言葉に従ってあえて指定せず、/usr/local/以下にインストールしました。
# tar xvfz dovecot-2.2.27.tar.gz
# env SSL_CFLAGS=”-I/usr/local/ssl/include” SSL_LIBS=”-L/usr/local/ssl/lib -Wl,-R/usr/local/ssl/lib -lcrypto -lssl” ./configure
# make
# make install
いろいろ調べた結果 dovecot ユーザは作らなないといけないようなので、以下でユーザを作成。
# groupadd -g 97 dovecot
# groupadd -g 497 dovenull
# useradd -u 97 -g 97 -s /sbin/nologin -d /usr/local/libexec/dovecot dovecot
# useradd -u 498 -g 497 -s /sbin/nologin -d /usr/local/libexec/dovecot dovenull
で以下のような感じで設定ファイルを設置して諸々設定。
# cp /usr/local/share/doc/dovecot/example-config/dovecot.conf /usr/local/etc/dovecot/
# cp /usr/local/share/doc/dovecot/example-config/conf.d /usr/local/etc/dovecot/
# sed -i -e ‘s/#listen = \*, ::/listen = \*/g’ /usr/local/etc/dovecot/dovecot.conf
# sed -i -e ‘s/^#ssl = yes/ssl = required/g’ /usr/local/etc/dovecot/conf.d/10-ssl.conf
# sed -i -e ‘s/\/etc\/ssl\/certs\/dovecot.pem/\/usr\/local\/etc\/dovecot\/ssl\/hogehoge.crt/g’ /usr/local/etc/dovecot/conf.d/10-ssl.conf
# sed -i -e ‘s/\/etc\/ssl\/private\/dovecot.pem/\/usr\/local\/etc\/dovecot\/ssl\/hogehoge.key/g’ /usr/local/etc/dovecot/conf.d/10- ssl.conf
# sed -i -e ‘s/#ssl_ca =/ssl_ca = <\/usr\/local\/etc\/dovecot\/ssl\/hogehoge.ca/g’ /usr/local/etc/dovecot/conf.d/10-ssl.conf
# sed -i -e ‘s/#ssl_protocols = !SSLv3/ssl_protocols = !SSLv2 !SSLv3 !TLSv1/g’ /usr/local/etc/dovecot/conf.d/10-ssl.conf
# sed -i -e ‘s/#disable_plaintext_auth = yes/disable_plaintext_auth = no/g’ /usr/local/etc/dovecot/conf.d/10-auth.conf
# sed -i -e ‘s/auth_mechanisms = plain/auth_mechanisms = plain login/g’ /usr/local/etc/dovecot/conf.d/10-auth.conf
# sed -i -e ‘s/#mail_location =/mail_location = maildir:~\/Maildir/g’ /usr/local/etc/dovecot/conf.d/10-mail.conf
# sed -i -e ‘s/#valid_chroot_dirs =/valid_chroot_dirs = \/home/g’ /usr/local/etc/dovecot/conf.d/10-mail.conf
/etc/pam.d/dovecot
1 2 3 4 5 |
#%PAM-1.0 auth required pam_nologin.so auth include system-auth account include system-auth session include system-auth |
/etc/rc.d/init.d/dovecot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
#!/bin/bash # # /etc/rc.d/init.d/dovecot # # Starts the dovecot daemon # # chkconfig: - 65 35 # description: Dovecot Imap Server # processname: dovecot # config: /usr/local/etc/dovecot.conf ### BEGIN INIT INFO # Provides: dovecot # Required-Start: $local_fs $network # Required-Stop: $local_fs $network # Should-Start: $remote_fs # Should-Stop: $remote_fs # Default-Start: # Default-Stop: 0 1 2 3 4 5 6 # Short-Description: start and stop Dovecot Imap server # Description: Dovecot is an IMAP server for Linux/UNIX-like systems, # written with security primarily in mind. It also contains # a small POP3 server. ### END INIT INFO # Source function library. . /etc/init.d/functions RETVAL=0 prog="Dovecot Imap" exec="/usr/local/sbin/dovecot" config="/usr/local/etc/dovecot/dovecot.conf" pidfile="/usr/local/var/run/dovecot/master.pid" lockfile="/var/lock/subsys/dovecot" start() { [ $UID -eq 0 ] || exit 4 [ -x $exec ] || exit 5 [ -f $config ] || exit 6 echo -n $"Starting $prog: " daemon --pidfile $pidfile $exec $OPTIONS RETVAL=$? [ $RETVAL -eq 0 ] && touch $lockfile echo } stop() { [ $UID -eq 0 ] || exit 4 echo -n $"Stopping $prog: " killproc -p $pidfile $exec RETVAL=$? [ $RETVAL -eq 0 ] && rm -f $lockfile echo } reload() { [ $UID -eq 0 ] || exit 4 echo -n $"Reloading $prog: " killproc -p $pidfile $exec -HUP RETVAL=$? echo } # # See how we were called. # case "$1" in start) start ;; stop) stop ;; reload) reload ;; force-reload|restart) stop sleep 1 start RETVAL=$? ;; condrestart|try-restart) if [ -f $lockfile ]; then stop sleep 3 start fi ;; status) status -p $pidfile $exec RETVAL=$? ;; *) echo $"Usage: $0 {condrestart|try-restart|start|stop|restart|reload|force-reload|status}" RETVAL=2 [ "$1" = 'usage' ] && RETVAL=0 esac exit $RETVAL |
# chmod 755 /etc/rc.d/init.d/dovecot
# /sbin/service dovecot start
TLSv1.1とTLSv1.2に制限できました。
./configureのオプション指定が上手くいかず、途中、make時に、以下とか
collect2: ld returned 1 exit status
make[3]: *** [test-http-client] Error 1
make[3]: Leaving directory ‘/usr/local/src/dovecot-2.2.27/src/lib-http’
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory ‘/usr/local/src/dovecot-2.2.27/src’
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory ‘/usr/local/src/dovecot-2.2.27’
make: *** [all] Error 2
以下とか
sha1.h:80: error: static or type qualifiers in abstract declarator
make[4]: *** [guid.lo] Error 1
make[4]: Leaving directory ‘/usr/local/src/dovecot-2.2.25/src/lib’
make[3]: *** [all] Error 2
make[3]: Leaving directory ‘/usr/local/src/dovecot-2.2.25/src/lib’
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory ‘/usr/local/src/dovecot-2.2.25/src’
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory ‘/usr/local/src/dovecot-2.2.25’
make: *** [all] Error 2
以下のエラーが出て大変でした。
make[3]: *** [iostream-openssl-context.lo] Error 1
make[3]: Leaving directory ‘/usr/local/src/dovecot-2.2.27/src/lib-ssl-iostream’
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory ‘/usr/local/src/dovecot-2.2.27/src’
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory ‘/usr/local/src/dovecot-2.2.27’
make: *** [all] Error 2
どなたかの役に立てば幸いです。
コメント
[…] をソースでインストールしてます( openssl 1.0.2 のインストールの仕方は、openssl0.9.8系OS(CentOS5とか)のdovecotでTLS1.1かTLS1.2に制限する 等を参考にしてください […]
by CentOS5でLet'sEncryptでdehydratedを使っていてACMEv2対応にした話 | 麻姑掻痒 〜まこそうよう〜 2021年7月12日 12:49 AM