Qpopper

(作成:2006/03)

QpopperはMailbox形式のPOPサーバの一つ。よく知られたPOPサーバのなかだと、APOPだのPOP3sだのの設定の組み合わせが可能なパッケージはこれが最多じゃないかな。
ただ、QpopperではMailbox形式のみ対応なので、スプールファイルがちょっと壊れただけで全てのスプールされてるメールが破壊、なんて欠点がある。 Courier-IMAPなんかのMaildir/形式を用いればこの問題は解決するんだけど、逆にこっちは設定の組み合わせが豊富でない。

今回はセキュアなアクセスを実現する手段が豊富なQpopperについての備忘録。

Install on Vine

ここではサーバのホスト名 mail 、ドメイン名 hyakki.local として話を進める。(FQDN: mail.hyakki.local)
POP/SSLによるアクセス設定を実現するために、一旦 src.rpm からリビルドする必要がある。 ビルド環境の構築については拙サイト「Vine - パッケージのリビルド」参照。

Computer雑記
(更新:2017/10)Windows (更新:2014/07)Android (更新:2012/02)OS最適化-CentOS (更新:2...

src.rpm を取得。

$ apt-get source qpopper
...

以下のコマンドで一時的に展開し、spec ファイルを書換える。必要なのは --with-openssl の記述。

$ rpm -Uvh qpopper-4.0.5-0vl2.src.rpm
...
#### ~/rpm/SPECS/qpopper.spec

...
%build
...
   --with-popuid=pop \
   --enable-apop=/etc/pop.auth \
   --with-openssl
...

パッケージのリビルド。

$ rpm -bb rpm/SPECS/qpopper.spec
...

このリビルドでは、あらかじめ gdbm-devel pam-devel openssl-devel のパッケージが必要。

# apt-get install gdbm-devel pam-devel openssl-devel
...

出来上がったパッケージをインストール。

# rpm -Uvh rpm/RPMS/i386/qpopper-4.0.5-0vl2.i386.rpm
...

設定

POP3サーバにする

qpopperはスーパーサーバとして起動するんで、 inetd 等のパッケージが必要。 導入されてなかったら apt-get でインストール。

# apt-get install inetd
...

/etc/inetd.conf に設定を施して再起動すれば良い。

#### /etc/inetd.conf

pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd  in.qpopper
# /etc/init.d/inet restart

もし inetd が導入済でTCP-wrapperを掛けとるなら、 /etc/hosts.allow も修正。

#### /etc/hosts.allow

in.qpopper : ALL

ここで一旦動作チェック。以下のように外部から telnet で接続してみる。POP3サーバにする場合、特に設定変更はせずともOK。
例えばPostfixで紹介したようなやり方で既にメールを送信済みなら、rootアカウント宛へこんな風にメールが届いてるのがわかる。

Postfix
(作成:2006/03) Postfixは従来のsendmailに比べてパフォーマンスやセキュリティ等の様々な面で優位なMTAらしい。q...
# telnet mail.hyakki.local 110
Trying ***.***.***.***...
Connected to mail.hyakki.local.
Escape character is '^]'.
+OK Qpopper (version 4.0.5) at mail.hyakki.local starting.  <917.1140427984@mail.hyakki.local>
USER riyo
+OK Password required for riyo.
PASS (パスワード)
+OK riyo has 1 visible message (0 hidden) in 640 octets.
LIST
+OK 1 visible messages (640 octets)
1 640
.
RETR 1
+OK 602 octets
Return-Path: <riyo@hyakki.local>
X-Original-To: root@hyakki.local
Delivered-To: root@hyakki.local
Received: from hyakki.local (mail.hyakki.local [192.168.1.1])
        by mail.hyakki.local (Postfix) with SMTP id E20DCE5406F
        for <root@hyakki.local]>; Mon, 20 Feb 2006 19:05:36 +0900 (JST)
Message-Id: <20060220100536.E20DCE5406F@mail.hyakki.local>
Date: Mon, 20 Feb 2006 19:05:36 +0900 (JST)
From: riyo@hyakki.local
To: undisclosed-recipients:;
X-UIDL: ATT"!c-W"!dK^!!n-E"!

Viva la raza!

.
QUIT
+OK Pop server at mail.hyakki.local signing off.
Connection closed by foreign host.
$

POPAuthサーバにする

APOPユーザの作成

まずは以下のコマンドでAPOPを初期化。

# popauth -init

APOPユーザの作成。

# popauth -user riyo
New password:
Retype new password:

ここでもう一度動作確認。外部から telnet で接続し、今度はエラーで弾かれる。

$ telnet mail.hyakki.local 110
Trying 192.168.1.1...
Connected to mail.hyakki.local.
Escape character is '^]'.
+OK Qpopper (version 4.0.5) at mail.hyakki.local starting.  <1045.1140428612@mail.hyakki.local>
USER riyo
-ERR [AUTH] You must use stronger authentication such as AUTH or APOP to connect to this server

POP/SSL設定

証明書の作成

証明書作成の詳細は拙サイト「OpenSSL」参照。

OpenSSL
(作成:2013/01) Linuxなら大概標準で入っているSSL関連パッケージとSSH関連パッケージ。SSL関連は所謂HTTPSなんか...

下準備はRPMのリビルドで済んどるとして、まずは証明書の設置場所を作成。

# mkdir /etc/mail
# mkdir /etc/mail/certs
# chown root:mail /etc/mail/certs
# chmod 660 /etc/mail/certs

オレオレ証明書を作成。

# openssl req -new -nodes -out /etc/mail/certs/req.pem -keyout /etc/mail/certs/cert.pem
...

一応、オプションの意味は以下の通り。

オプション 意味
req 証明書要求ファイルを作成。
-new 新規に証明書要求ファイルを作る。
-nodes 秘密鍵を暗号化しない。
-out ... CSRファイル名の指定。
-keyout ... 秘密鍵ファイル名の指定。

以下、質問に対する返答について簡単に。空欄のものについては記入しない。

Country Name : (住んでる国)
State or Province Name : (住んでる都道府県)
Locality Name : (住んでる市区郡)
Organization Name : (仕事場の名前)
Organization Unit Name : 
Common Name : mail.hyakki.local
Email Address : root@mail.hyakki.local
A challenge password : ********
An optional company name : ********

証明書ファイルの権限変更。

# chmod 600 /etc/mail/certs/cert.pem
# chown root:0 /etc/mail/certs/cert.pem

本当ならここで出来た req.pem を認証機関に送付して認証して貰う。でもここでは証明書に対し自称することにしよう。オレだよオレオレ。 問われるパスフレーズについてはお好きなように。

# openssl genrsa -des3 -out ca.key 1024
...

オプションの意味は以下の通り。

オプション 意味
genrsa RSA形式の秘密鍵作成。
-des3 DES3暗号化方式を用いる。
-out ... 秘密鍵ファイル名の指定。
1024 1024bitで秘密鍵を作る。

最初に問われるパスフレーズについては直上で入力したものを。以降の質問は証明書作成時と同様に。

# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
...

オプションの意味は以下の通り。

オプション 意味
-x509 X.509形式の証明書要求ファイルを作成する。
-days ... 証明書の有効期限。
-key ... 出力する秘密鍵の指定。
-out ... CSRファイル名の指定。

再びこのコマンドによりパスフレーズを入力、先に作成したcert.pemと結合して出来上がり。

# openssl x509 -req -CA ca.crt -CAkey ca.key -days 365 -in req.pem -out signed-req.pem -CAcreateserial
...
# cat signed-req.pem >> cert.pem

オプションの意味は以下の通り。

オプション 意味
x509 X.509証明書の署名要求の作成。
-req 証明書要求から証明書を作成。
-CA ... 入力するCSRファイルの指定。
-CAkey ... 入力する秘密鍵の指定。
-in ... 入力する証明書ファイルの指定。
-out ... 出力する証明書ファイルの指定。
-CAcreateserial 証明書のシリアルナンバーを格納するファイルを作成。

認証設定

最後にQpopperでSSLが使えるように設定する。 /etc/mail/qpopper.conf を作成し、 /etc/inetd.conf を修正。

#### /etc/mail/qpopper.conf

set tls-support = alternate-port
set tls-server-cert-file = /etc/mail/certs/cert.pem
## /etc/inetd.conf

pop3s   stream  tcp     nowait  root    /usr/sbin/tcpd  in.qpopper -s -f /etc/mail/qpopper.config
```shell
# /etc/init.d/inet restart

SSL経由なので telnet とかでは確認が出来ない。実際にメーラの設定を修正してPOP3sを用いて利用出来るか確認するしかないかな。