cyrus-imapを使ってみよう

2007/02/25作成、2007/03/15変更

Line4にcyrus-imapd2.2をインストールして利用できているようなので、メモを残しておきます。

Postfix + cyrus-imapdという環境の場合、他のデストリビュージョンでも参考になるかもしれません。

目次
  1. このドキュメントの概要
  2. cyrus-imapのインストール
  3. server.keyの生成
  4. imapd.confの設定
  5. cyrus-imapdサービスを起動
  6. アカウントの管理
  7. Postfixの設定を変更
  8. メールボックスの管理
  9. sieveの利用
  10. 参考文書

このドキュメントの概要

cyrusでIMAPサーバを動作させ、アカウント管理を行い、sieveでメールの自動振り分けについても書きました。

以下に、私が使ってみた感じでの特徴を書きます。これらについての詳細は、それぞれのパートで書きます。

  • cyrus-imapは、Linuxユーザーアカウントを利用せず、それ単独でアカウント管理ができるようになっています。
  • メールボックスのアクセス制御をすることができます。
  • sieveというスクリプト言語を使ってメール振り分け機能が使えます。


cyrus-imapのインストール

  1. Vine4を想定しているので、aptでインストールします。
    $ su
    # apt-get update

    以下のようにしてインストールします。
    apt-get install cyrus-imapd \
    cyrus-imapd-utils cyrus-sasl \
    cyrus-sasl-plain \
    cyrus-sasl-md5 \
    perl-Cyrus


server.keyの生成

  1. ここでは認証にTLS(SSL)を使った暗号化認証を利用することにします。
    キーなどが必要となるので以下のようにして作ります。
    # cd /usr/share/ssl/certs

    最初に付いているサンプルのserver.keyを削除します。
    # rm server.key

  2. キーを生成します。
    # make server.key
    Enter pass phrase:パスフレーズを入力
    Verifying - Enter pass phrase:パスフレーズを再入力
  3. パスフレーズを削除します。
    # openssl rsa -in server.key -out server.key
    Enter pass phrase for server.key:パスフレーズを入力
  4. CSR (サイト証明書を依頼する書類)を作成します。
    # make server.csr
    umask 77 ; \
    /usr/bin/openssl req -new -key server.key -out server.csr
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:JP ←国
    State or Province Name (full name) [Some-State]:Mie ←都市を入力
    Locality Name (eg, city) []:Kuwana
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tsuttayo ←会社名などを入力
    Organizational Unit Name (eg, section) []: ←必要ない
    Common Name (eg, YOUR name) []:tsuttayo.sytes.net ←アドレスを入力
    Email Address []:sg@tsuttayo.sytes.net ←メール・アドレスを入力
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: ←必要ない
    An optional company name []: ←必要ない
    		
  5. ここでは、CAに署名を依頼するかわりに、自分で署名してしまいます。以下は有効期限を365日にしてますが、これはご自身で適当に変えてください。また、CAへ署名を依頼するときは上記CSRを使って依頼します。
    # openssl x509 -in server.csr -out server.pem -req -signkey server.key -days 365

これで /usr/share/ssl/certs/server.pem が出来上がったはずです。


imapd.confの設定

  1. IMAPサーバについての設定は /etc/imapd.conf で行います。
    /etc/imapd.conf をエディタで編集します。以下は設定例です
    # Cyrus IMAP Serverが各種管理用ファイルを置くディレクトリ
    configdirectory: /var/lib/imap
    
    # ユーザーのメールの保管場所
    partition-default: /var/spool/imap
    
    # 管理者権限を持つユーザーの一覧
    admins: admin
    
    # /home/USER/.sieve でメールの振り分け処理をする場合、
    # コメントをはずす。
    #sieveusehomedir: true
    
    # sieveusehomedirを無効にしている場合、
    # sieveスクリプトの保管場所
    sievedir: /var/lib/imap/sieve
    
    # 認証方法の指定。
    # ここではsaslpasswd2コマンドでユーザー管理をするのでsasldbとしています。
    
    sasl_pwcheck_method: sasldb
    
    # TLS関係の設定
    tls_cert_file: /usr/share/ssl/certs/server.pem
    tls_key_file: /usr/share/ssl/certs/server.pem
    		
  2. cyrus-imapdは、色々なサービスを提供しています。
    もしも必要がないサービスがあれば /etc/cyrus.conf をエディタで変更します。
    # UNIX sockets start with a slash and are put into /var/lib/imap/sockets
    SERVICES {
      # add or remove based on preferences
      imap			cmd="imapd" listen="imap" prefork=5
      imaps 		cmd="imapd -s" listen="imaps" prefork=1
      pop3			cmd="pop3d" listen="pop3" prefork=3
      pop3s 		cmd="pop3d -s" listen="pop3s" prefork=1
      sieve 		cmd="timsieved" listen="sieve" prefork=0
    # 上記のようなところで、もしもpop3を利用禁止にしたいなら、
    # 以下のように、先頭に「#」を付けてコメントに変えます。
    #  pop3 		 cmd="pop3d" listen="pop3" prefork=3
    		
  3. さらにプレーン認証を行う場合(OutlookExpressはプレーン認証が必要)、/usr/lib/sasl2/smtpd.confに「pwcheck_method: auxprop」という行を追加する必要があるようです。

cyrus-imapdサービスを起動

  1. cyrus-imapdサービスを起動します。
    # /etc/init.d/cyrus-imapd start
  2. cyrus-imapdを自動起動するように設定します。
    # /sbin/chkconfig cyrus-imapd on

Postfixの設定を変更

  1. /etc/postfix/main.cfを変更します。
    # 通常のメールボックスへの配信にcyrusのインターフェイスを利用する
    mailbox_transport = cyrus
    # メールアドレスが見つからないメールの配信に
    # cyrusのインターフェイスを利用する
    fallback_transport = cyrus
  2. Postfixをリスタートします。
  3. # /etc/init.d/postfix restart

アカウントの管理

cyrus-imapでは、ユーザー管理がLinuxのシステムユーザーとは独立していますので、アカウントの登録などは独自コマンドを利用します。
また、cyrus-imapではユーザーとメールボックスとは別に管理することになります。

ユーザーの追加/パスワード変更 saslpasswd2 ユーザー名
ユーザーの削除 saslpasswd2 -d ユーザー名
ユーザーの一覧表示 sasldblistusers2

たとえば 「suzuki」 というユーザーを作る場合では
# saslpasswd2 suzuki
ここでパスワードを2回入力すると、ユーザー「suzuki」が追加されます。

なお、/etc/imapd.confのadminsで設定したユーザーは必ず必要です。 この管理者が全アカウントのメールボックス管理を行えます。 この説明の例では「admin」というユーザーは必ず作ることになります。
# saslpasswd2 admin


メールボックスの管理

メールボックスの管理は cyradm という対話型のコマンドで行います。

  1. ここでは、例としてアカウント「suzuki」が利用するメールボックスを作ってみましょう。
    cyradmを起動します。ここではsaslpasswd2で作成した管理者用ユーザーの「cyrus」でログインしています。
    $ cyradm --user admin localhost
    パスワードはsaslpasswd2で設定したパスワードです。
  2. suzuki用のメールボックスを作ります。
    DOMAIN.NAME> cm user.suzuki
cyradmで「セグメンテーション違反です」(Segmentation fault)になってログインできない場合、以下のようにしてsasldb2のパーミッション設定を変えることで直る場合があるようです。
# chown cyrus. /etc/sasldb2

cyradmでよく使いそうなコマンドには以下があります。
? cyradmコマンドの操作方法を表示します。
cm user.USERNAME ユーザー専用のメールボックス追加を作ります。このメールボックスの初期アクセス権はUSERNAMEで指定したユーザーです。
lm すべてのメールボックスを表示します。
dm user.USERNAME

メールボックスの削除をします。

ただ、このとき管理者に書き込み権限がないと「deletemailbox: Permission denied」というエラーになります。
sam user.USERNAME cyrus write (ここでcyrusはメールボックス管理者のことです)
このようにして、管理者に書き込み権限を付加した後なら、メールボックスを削除することができます。
sam user.USERNAME OPTUSER [read/write]

メールボックス「USERNAME」について、OPTUSERのアクセス権設定をします。

たとえば、suzukiは営業部に所属しているので営業部専用のメールボックス(eigyou)についても読み取りのみ可能にしたいという場合では次のようにします。
> sam user.eigyou suzuki read

なお、read/write以外にも色々な設定が可能なんですが、普通はこれ以上の設定があまり必要ないんじゃないかと思います。

lam user.USERNAME メールボックスのアクセス権を表示します。
sq user.USERNAME 1024 メールボックス「USERNAME」の容量制限を1024KBにします。


sieveの利用

sieveというスクリプト言語機能を利用して、メールをサーバ側で自動的に振り分けることができます。

sieve機能は、ユーザーのホームディレクトリに.sieveというファイルを作成して利用する方式(以下、sieveusehomedir方式と呼びます)と、サーバ側と通信してスクリプト定義をする方式(以下、sieveshell方式と呼びます)があります。

Linuxシステムアカウントとは別管理にしたアカウント管理というのがcyrus本来の考え方だと思いますので、後者のサーバ側と通信する方式がお勧めですが、 それぞれ一長一短があるかと思いますので、ここでは両方の方式について書きたいと思います。

なお、sieveで利用する簡易言語機能については、sieveスクリプトに書きます。

sieveusehomedir方式でのsieve利用

  1. /etc/imapd.confを編集して、「sieveusehomedir: true」という行を追加します。
    また「sievedir: /etc/sieve」というような行は削除(またはコメントに)します。
  2. 変更したらimapdを再起動します。
    # /etc/init.d/cyrus-imapd restart
  3. 振り分けする一般ユーザーでログインします (sieveusehomedir方式ではLinuxアカウントが必要です)。
    エディタを使ってsieveの言語構文にのっとってソースを書きます。
    ここでは、sieve.srcというファイルで保存したこととします。ファイル名は何でもかまいません。
  4. 作成したソースをsievecでサーバが実行できるようにコンパイルします。
    $ /usr/lib/cyrus-imapd/sievec sieve.src ~/.sieve
    これでコンパイル済みファイルは、ホームディレクトリの.sieveに作成されます。
    ホームディレクトリに.sieveが置かれると、自動的に振り分け機能がスタートします。

sieveshell方式でのsieve利用

  1. どの一般ユーザーでもかまいませんので、ログインします。
    エディタを使ってsieveの言語構文にのっとってソースを書きます。
    ここでは、sieve.srcというファイルで保存したこととします。ファイル名は何でもかまいません。
  2. sieveshellを起動します。ここでは「suzuki」というユーザーについての振り分け定義をすることとします。
    $ sieveshell -u suzuki -a suzuki localhost
    > put sieve.src
    > activate sieve.src
    > quit
    この後、届いたメールは自動振り分けされます。

sieveスクリプト

Cyrus IMAP serverでsieveを使うでのサンプルがシンプルでわかりやすいです。

RFC3028を見るとUTF8で書くのがいいようですね。RFC3028には細かい言語仕様が書かれています。

上記2つを見ていただければ、他の言語の経験があればわかると思います。ここでは単純な例を書きます。

# ファイル操作拡張機能の読み込み
require "fileinto";

# SpamAssassinでSPAMと判定されメールをSPAMフォルダへ移動
if header :is "X-Spam-Flag" "YES" {
	fileinto "INBOX.SPAM";
}

参考文書

Copyright©2001-2017 釣ったよ! All Right Reserved.    sg@tsuttayo.jpn.org