携帯メールサーバ (mobileimap)の構築(RedHat系編)


SuSEでうまく動作していますので、RedHat系でもまとめておきました。基本的には何も変わりません。ここで紹介する mobileimap は、送信も可能な携帯電話用の IMAP対応 Webメーラであり、自宅サーバアカウントでのメール送受を携帯で行うことができます。一方で、転送開始や終了する仕組みや転送メールの選択機能 (SPAM/Virus除去)等がないと不便かもしれませんが、自宅サーバアカウント宛のメールを携帯で見たいのであれば、procmail で携帯に転送するレシピを書けば対応できますので、利用シーンに応じて使い分ければよいかと思います。
mobileimap のいろいろなオプションや関連情報については、mobileimap のサイトに詳しい情報がありますのでそちらを先にご覧になってください。ここでは、システム全体としてのまとめ方を中心に示します。ここで示しているのは、RedHat9.0 / FedoraCore2 ベースです。
単純にcronで起動すると、再起動で起動に失敗することがあるので簡単なスクリプトを作成して起動するように変更しました。

■システム概要

ここで説明している mobileimap は、携帯からの webアクセスを基に IMAP/SMTPと連動して動作するWeb サーバです。それ自体が SSL対応できる Webサーバになっており、au端末のサブスクライバIDにも対応しているので、au端末だけからしか利用しないならかなり安全に動かすことができます。しかし、おやじの環境では、複数の docomoユーザが使用することになるため mobileimap単独では認証機能がないことやユーザ毎に異なるポートが必要なため外部に複数ポートを開けることになりセキュリティが不安になります。そこで、ここでは作者の意図(操作は簡単に)に反しますが、Apacheの Basic 認証機能、SSL機能とReversProxy機能を使用することでセキュリティを確保することにしました。
mobileimapシステムを構築するには、まずは、当然のことながら、メールシステム(SMTP/IMAP)が既に動作していることが大前提になります。使用できるIMAPサーバが mobileimapのサイトにあるので確認してください。おやじは、Courier-IMAPです。CentOS4.1 で Dovecot での動作も確認済みです。
また、SSL対応した Apacheが動作していることが必要です。これらを含めて新規に構築する場合は、Top ページから各コンテンツを参照し、まずは Webサーバや SMTP/IMAPサーバを動かしてください。

■動作概要

後々の設定をスムーズに行うため、ここで説明している mobileimapシステムの動作概要を以下に示します。なお、SMTPに関しては、localhostの SMTPサーバを使うだけで、基本的な動作は IMAPアクセスと変わらないのでここでは省略します。
簡単に言えば、このシステムは、ApacheのSSL機能で暗号化されたアクセスを、Basic認証してリバース・プロキシ機能でユーザ対応に異なるポートで待ち受けしている mobileimapへ中継してあげることにより動作しているものです。

  1. mobileimapは、予めユーザ毎に起動している Webサーバであり、ユーザ毎に異なるポート番号で待ち受けている。
    そこに、Webから要求があると対応するユーザのメール情報を IMAPサーバにアクセスして引き出しクライアントに通知する。

  2. mobileimapに直接クライアントがアクセスする場合は、ポートが異なるのでそれで識別できる。しかし、このままでは mobileimapへのアクセスURIさえわかってしまえば、メールを読み書きできてしまい危険である。そこで、今回はインターネット側からの接続要求に対して、Apacheの認証機能を利用してセキュリティを確保すると同時に、mod_proxyを使用したリバース・プロキシ機能を利用してユーザ毎に異なるポート番号で待ち受けるmobileimapに振り向ける仕組みで動作させた。そのため、インターネット側からどのmobileimapサーバにアクセスするかを識別する情報が必要になり、下記のURI(mobile1/2)でユーザを識別するようにした。
    このURIは単なる識別情報なので任意であるが、他のディレクトリ名との重複は当然できないので注意が必要である。

    注: 実際の話としてはユーザが数人ならこのままでもかまわないが、多くなる場合は Apacheの Basic認証用の設定が大変になるので、mobileimap専用のドメインを用意して名前ベースのバーチャルホストで動かすか、もしくは、「https://www.aconus.com/mobile/user1、https://www.aconus/mobile/user2」のように mobileimap専用ディレクトリ名を付与することで設定が簡単にできるようになる。詳細は後述。

  3. Apacheは、まずはセキュリティ対策としての httpsの終端と mibileimapへのアクセス制御として Basic認証を行う。このとき、公開サーバである以上、全てのアクセスを認証するわけにはいかないので、下記の例では mobile1や mobile2へのアクセスで識別する.。(上記の注の対策が必要になるかもしれない。)

  4. 続いて、mobileimapへはリバース・プロキシ機能で中継接続するが、mobileimapがユーザ毎に異なるポート番号で動作しているためアクセスしてきた URI(mobile1/2)をキーにして、lホスト名(localhost)とポート番号の変換を相互に行う。なお、初回アクセスは特に問題ないが、以降、コンテンツ内のリンクが合わなくなるので、mobileimap側でも URIの設定(-x オプション)が必要になる。これに伴い、mobileimap側へのアクセスに URI(mobile1/2)がないと接続規制されるので、Apache側のリバース・プロキシでもそのまま中継する。


■mobileimap のインストールと設定

mobileimapを動かすため、以下のソフトをインストールします。なお、ここで紹介している方法では SSL対応は Apacheが受け持つので、OpenSSL for Rubyのインストールは不要です。
mobileimapは Rubyで書かれたソフトなので、予め Rubyを rpmでインストールしておいてください。おやじは yumを使っているので、「yum install ruby」とやってあげれば関連モジュールもあわせてインストールできました。aptでも同じはずです。

◆mobileimap のダウンロードとインストール

メインの mobileimapをインストールします。おやじがダウンロードしたものは、バージョンは 2.5 でした。SuSEのRubyではrpmのRuby使用時のエラー回避のため、makeの前にmobileimapの先頭行のRubyのパスとオプションを下記の緑字のように指定してあげる必要がありましたが、RedHat系では本作業はしなくても問題はでません。やっておいても無駄なことはありません。
なお、mobileimapはメッセージサイズが4KByte(下記の@max_body_length 4096)になっており、少し長い文章だと切断されてしまうので使用している携帯のバッファサイズを調べたところ、x505以降なら20KByteあるようなので4倍の16384に変更しました。

$ wget http://namazu.org/~satoru/mobileimap/mobileimap-2.5.tar.gz
$ tar zxfv mobileimap-2.5.tar.gz
$ cd mobileimap*
$ vi mobileimap.in
「下記を編集」。

#! /usr/bin/
ruby -Ke

「Esc」、「/@max_body_length」でジャンプし、「下記を編集」。

  @max_body_length
16384

「Esc」、「:」、「w」、「q」で保存する。

$ make
$ su
# make install


◆mobileimap の動作確認

以上で、mobileimapが動作する環境ができたので、最初に mobileimapの動作確認をします。確認は、HTTPサーバ名の関係からここではサーバ機自身、つまり localhostで行います。内向き DNSが動いていれば他のクライアントからも可能ですが、HTTPサーバ名が不一致ですとアクセス拒否され、その問題に時間をとられます。今回のシステム構成では、このようなアクセスはないので localhostでの確認で十分です。サーバ機でブラウザが使えない場合は、他のクライアントから試験しますが、アクセスするホスト名と実際のサーバ機のホスト名が一致するよう DNSもしくは hostsで設定にしてください。(参考)
この場合、家庭内からのアクセスにもファイヤウォールがある場合は、試験中だけは必要なポート(8143等)は開けてください。
  1. サーバ機で mobileimapをコマンドラインから起動する。コマンドを入れると指定ユーザの IMAP用パスワードを要求してくるので、入力すると mobileimapサーバへのアクセス形式が表示され(下記3行目。8143はデフォルトの mobileimapのポート番号)、mobileimapが webサーバとして起動する。
    下記は、以下の条件で起動したものである。オプションの詳細は mobileimapのサイトを参照してください。
    ・IMAP認証形式: -a login (平文のlogin認証を使用。Dovecotのデフォルトは"plain"なので要注意。mobileimapのデフォルトはCRAM-MD5)
    ・IMAPユーザ名: -u oyaji
    ・HTTPサーバ名: -s localhost
    ・メール送信時のFrom: -f "oyaji <oyaji@mail.aconus.com>"

    $ mobileimap -a login -u oyaji -s localhost -f "oyaji <oyaji@mail.aconus.com>"
    oyaji@localhost:143[login]: IMAP Password:
    xxxxxxxx (IMAP用パスワードを入力。エコーなし)
    http://localhost:8143/


  2. サーバ機のブラウザで上記の3行目のURLでアクセスし、下記のようにメールフォルダ画面が表示されることを確認する。下記はサーバ機以外の Windowsクライアントからアクセスした例であるが、実際にアクセスしてメールが読めるかここで確認する。送信も確認しておく。



  3. 動作確認ができたら、 Ctrl + C を押して一旦、mobileimap を終了しておく。

■Apache関連の設定

Apache関連の設定としては、proxyと認証の設定がありますが、一気に作業してしまうとうまく動作しないときの切り分け作業が大変ですので、1ステップずつ確実に作業を進めていきます。下記は、FedoraCore2ベースで記述してます。

◆Proxy関連の設定と動作確認

以下の順番で設定と確認をしていきます。

  1. Apache起動時に mod_proxy関連の4モジュールを組み込むように、LoadModuleディレクティブで下記を追記する。(rpmから入れたのなら標準で組み込まれているはず) ソースから入れた場合で、コンパイル時に組み込んでない場合はコンパイルからやり直す必要がある。

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_connect_module modules/mod_proxy_connect.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

  2. 続いて Proxy動作 ( Proxyといっているが、実際は外部から内部への proxy動作で ReverseProxyのことなので注意が必要。)の設定を行うが、予め mobileimapを使用するユーザ毎に次の項目と値を決めておく必要がある。

    [設定例]
    No. IMAPユーザ名 URIパス名 mobileimap
    ユーザ名 パスワード ポート番号
    1 oyaji mobile1 moyaji 12345678 8143
    2 hoge mobile2 mhoge adgjmptw 8144
     :  :  :  :  :

    [パラメータ]
    名 称 概 要
    IMAPユーザ名 IMAPのユーザ名で mobileimap起動時の IMAPへのアクセスに使用。当然パスワードも要。
    URIパス名 ユーザ毎に携帯からのアクセス識別として必要。ユーザ数が多くなる場合は専用ドメインを用意するか、/mobile/user1、/mobile/user2のように mobileimapへのアクセス識別ができる上位のパス(mobile)を付与するようにしないと管理が大変になる。
    mobileimap ユーザ名 Basic認証用のユーザ名とパスワード。
    パスワードは、携帯用なのでワンタッチで押せる数字か英字の組み合わせがよいでしょう。
    パスワード
    ポート番号 mobileimapのユーザ毎の待ちうけポート番号。

  3. リバース・プロキシの設定は、今回はセキュリティ上 HTTPSのみに対応するので、既にある /etc/httpd/conf.d/ssl.conf (Apacheのインストール形態により異なる)の VirtualHost ディレクティブに追記する。
    但し、この設定はユーザ毎に設定が必要になるので、ssl.confに記述するとゴチャゴチャするので /etc/httpd/conf/mobileimap.conf としてリバース・プロキシの設定をまとめて、メインの ssl.confからはInclude(下記の赤字部分)するようにした。

    [/etc/httpd/conf.d/ssl.conf]
    LoadModule ssl_module modules/mod_ssl.so

    Listen 443

    ##
    ## SSL Global Context
    ##

    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl

    SSLPassPhraseDialog builtin

    SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
    SSLSessionCacheTimeout 300

    SSLMutex default

    SSLRandomSeed startup file:/dev/urandom 256
    SSLRandomSeed connect builtin
    SSLCryptoDevice builtin

    ##
    ## SSL Virtual Host Context
    ##

    <VirtualHost 192.168.1.100:443>
    # General setup for the virtual host
    ServerAdmin webmaster@mail.aconus.com
    DocumentRoot "/var/www/html/acorn"
    ServerName www.aconus.com

    <Directory "/var/www/html/acorn">
       Options FollowSymLinks Includes ExecCGI
       AllowOverride FileInfo AuthConfig Limit
       Order allow,deny
       Allow from all
    </Directory>

    ErrorLog logs/error_log
    TransferLog logs/ssl_access_log
    LogLevel warn

    Include /etc/httpd/conf/mobileimap.conf

    #SSL Engine Switch:
    SSLEngine on

    #SSL Cipher Suite:
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

    #Server Certificate:
    SSLCertificateFile /usr/local/certs/server.crt

    #Server Private Key:
    SSLCertificateKeyFile /usr/local/certs/server.key

    #SSL Engine Options:
    #SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
       SSLOptions +StdEnvVars
    </Files>
    <Directory "/var/www/cgi-bin">
       SSLOptions +StdEnvVars
    </Directory>

    #SSL Protocol Adjustments:
    SetEnvIf User-Agent ".*MSIE.*" \
       nokeepalive ssl-unclean-shutdown \
       downgrade-1.0 force-response-1.0

    #Per-Server Logging:
    CustomLog logs/ssl_request_log \
       "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

    </VirtualHost>

    実際のリバース・プロキシの設定は下記のようなものであり、先頭の「ProxyRequests Off」(Revers Proxyの設定)を除き、ユーザ毎に ProxyPass と ProxyPassReverseの記述をセットで設定していく。設定内容は以下のとおりである。( [ ]は説明上付与したものであるので設定上は不要。)

    ProxyPass           /[URIパス名] http://localhost:[ポート番号]/[URIパス名]
    ProxyPassReverse /[URIパス名] http://localhost:[ポート番号]/[URIパス名]

    [/etc/httpd/conf/mobileimap.conf]
    # ProxyRevers options
    ProxyRequests Off

    # User: oyaji
    ProxyPass /mobile1 http://localhost:8143/mobile1
    ProxyPassReverse /mobile1 http://localhost:8143/mobile1
    # User: hoge
    ProxyPass /mobile2 http://localhost:8144/mobile2
    ProxyPassReverse /mobile2 http://localhost:8144/mobile2

  4. Apacheの設定が完了したら 下記で再起動しておく。

    # /etc/rc.d/init.d/httpd restart

  5. ここで、リバース・プロキシが正常に動作するか試験を行うが、複数ユーザ対応なら最低2ユーザ分の mobileimapをコマンドラインで起動する。

    ・IMAP認証形式: -a login (平文のlogin認証)
    ・IMAPユーザ名: -u oyaji
    ・HTTPサーバ名: -s localhost
    ・URIパス名: -x mobile1
    ・ポート番号: -p 8143
    ・メール送信時のFrom: -f "oyaji <oyaji@mail.aconus.com>"

    $ mobileimap -a login -u oyaji -s localhost -x mobile1 -p 8143 -f "oyaji <oyaji@mail.aconus.com>"
    oyaji@localhost:143[login]: IMAP Password:
    xxxxxxxx (IMAP用パスワードを入力。エコーなし)
    http://localhost:8143/mobile1
    /1


    ここの最後の行(実際にはもう一行起動メッセージが表示される)の内容が、リバース・プロキシで設定した内容の最後のパラメータと一致していなければつながらないので確認しておく。続いて、もう一人分を別窓を開いて起動する。

    $ mobileimap -a login -u hoge -s localhost -x mobile2 -p 8144 -f "hoge <hoge@mail.aconus.com>"
    hoge@localhost:143[login]: IMAP Password:
    xxxxxxxx (IMAP用パスワードを入力。エコーなし)
    http://localhost:8143/mobile2
    /1


  6. この時点で、既に Webサーバが動作していたならインターネット側からアクセスすると各ユーザの IMAPフォルダにアクセスできるはずである。家庭内でも外部からのアクセスと同じ方法(URLが同じ)でアクセスできるなら家庭内クライアントのブラウザで試験してもよいし、パソコンでの外部からのアクセスや携帯で試験してみる。(おやじのテストはHTTPSには対応していないので使用できません。)

    ・oyajiへのアクセス: https://www.aconus.com/mobile1
    ・hogeへのアクセス: https://www.aconus.com/mobile2

  7. このまま放置するとインターネットから簡単にアクセスできてしまうので、 Ctrl + C を押して一旦、mobileimap を終了しておく。

◆Basic認証関連の設定と動作確認

以下の順番で設定と確認をしていきます。Basic認証に関しては、こちらも参考にしてください。

  1. まずは、Basic認証用の .htpasswd ファイルを作成する。既にあるならそれを用いても良いが、全員が本機能は使用するわけではないし、必ずしもIMAPのユーザ名と一致させる必要もないので、管理対象が増加するが mobileimap専用に新規に作成しても良い。
    .htpasswd ファイルは、Apache のインストール時に同時にインストールされる htpasswd コマンドで作成する。コマンドプロンプトで、

      htpasswd -c ファイル名 ユーザ名

    と入力すると、パスワードを2回聞かれるので入力する。パスワードファイルはドキュメントルート以外に置き、設置フォルダはあらかじめ作成しておかないとエラーとなる。-c オプションは、初回にファイルがないときだけ指定すればよく、二人目からは不要である。パスワード変更は、上書きされるので二人目以降同様、-c オプションなしで入力すればよい。下記は、既存ファイルと別に作成するため .htpasswd2とした。

    # htpasswd -c /etc/httpd/conf/.htpasswd2 moyaji
    Automatically using MD5 format.
    New password: *****
    Re-type new password: *****
    Adding passwd for user oyaji


  2. 次に制御のための設定を先に作成した /etc/httpd/conf/mobileimap.conf ファイルに追加する。設定は、先の例では以下のようにURIのパス毎に行わなければならない。設定を書く場所は、最初か最後にすれば管理しやすいのでは? 各パラメータは、こちらを参考にしてください。

    [/etc/httpd/conf/mobileimap.conf]
    # ProxyRevers options
    ProxyRequests Off

    ProxyPass /mobile1 http://localhost:8143/mobile1
    ProxyPassReverse /mobile1 http://localhost:8143/mobile1
    ProxyPass /mobile2 http://localhost:8144/mobile2
    ProxyPassReverse /mobile2 http://localhost:8144/mobile2

    # Basic attestation
    # User: moyaji
    <Location /mobile1>
       AuthType Basic
       AuthName "Enter"
       AuthUserFile /etc/httpd/conf/.htpasswd2
       AuthGroupFile /dev/null
       require user moyaji
    </Location>

    # User: mhoge
    <Location /mobile2>
       AuthType Basic
       AuthName "Enter"
       AuthUserFile /etc/httpd/conf/.htpasswd2
       AuthGroupFile /dev/null
       require user mhoge
    </Location>

  3. 設定が済んだら Apacheを再起動し、mobileimapを起動してアクセス試験を行う。正常ならば認証画面が表示され、mobileimap用のユーザ名とパスワードを入力すれば IMAPサーバにログインでき、送信もできるはずである。
    ここで、認証画面がでないでアクセスできてしまった場合は、ssl.confでこのバーチャルホストのドキュメントルートの AllowOverrideディレクティブが「none」もしくは個別指定されていて「AuthConfig」が無い状態になっていないか確認してみる。認証をさせたいディレクトリの AllowOverrideディレクティブの設定で、「all」もしくは「AuthConfig」が指定されていないと認証動作が行われないので注意すること。

    [/etc/httpd/conf.d/ssl.conf]
     (snip)

    <VirtualHost 192.168.1.100:443>
    # General setup for the virtual host
    ServerAdmin webmaster@mail.aconus.com
    DocumentRoot "/var/www/html/acorn"
    ServerName www.aconus.com

    <Directory "/var/www/html/acorn">
       Options FollowSymLinks Includes ExecCGI
       AllowOverride FileInfo AuthConfig Limit
       Order allow,deny
       Allow from all
    </Directory>

     (snip)


■mobileimapの自動起動の設定

以上で問題なく使用できることが確認できたら、システム再起動時等にmobileimapを自動起動できるように設定します。mobileimapは、起動パラメータを「.mobileimaprc」というファイルに書きだし、起動時にそのファイルを読み込んで起動することができるようになっていますので、これを利用して自動起動できるようにします。
 以下の設定操作を、各mobileimapユーザ毎に行ってください。
  1. 対象ユーザのホームディレクトリに移動し、以下の操作で ~/.mobileimaprcファイルを作成する。作成した ~/.mobileimaprcファイルをエディタで開き、imap_password を自動ログインできるように設定し、パーミッションを変更しておく。「-d --dump-config > ~/.mobileimaprc」が、指定された核オプションを含んだ ~/.mobileimaprcファイルを作成する指定である。

    # su oyaji
    $ cd ~
    $ mobileimap -a login -u oyaji -s localhost -x mobile1 -p 8143 -f "oyaji <oyaji@mail.aconus.com>" -d --dump-config > ~/.mobileimaprc
    $ vi .mobileimaprc

     (snip)

     :imap_password    => "xxxxxxxx", (Imap用パスワードを設定)

    「Esc」、「:」、「w」、「q」で保存する。
    $ chmod 600 .mobileimaprc


  2. 続いて、システム起動時に自動起動するようにユーザ毎に crontabで以下のように1行設定する。
    MAILTO=""は、cron起動時にユーザに起動パスがわかるメール(http://localhost:8143/mobile1)が届くので、それを停止するための設定です。
    「 > /dev/null 2>&1」は、cron起動時にユーザに起動パスがわかるメール(http://localhost:8143/mobile1)が届くので、それを停止するための設定です。(MAILTO=""では止まらないバージョンがあるため、設定変更)
    また、単純にcrontabで起動すると、再起動で起動に失敗することがあるので簡単なスクリプト(mobileimap_start)を作成して起動するように変更しました。

    # cd /usr/local/bin
    # vi mobileimap_start
    「i」を押す。

    #!/bin/sh

    if [ -f ~/.mobileimap.pid ]; then
         rm -rf ~/.mobileimap.pid
    fi

    /usr/local/bin/mobileimap > /dev/null 2>&1

    「Esc」、「:」、「w」、「q」で保存する。

    # su oyaji  
    # 各ユーザで以下を実行
    $ crontab -e
    「i」を押す。

    @reboot /usr/local/bin/mobileimap_start > /dev/null 2>&1
    MAILTO=""

    「Esc」、「:」、「w」、「q」で保存する。
    $


    注:@rebootは時間指定の変わりに起動時だけ動作するという設定で、rc.localと同等の動作になる。

以上で、システムを再起動しても動作するようになります。


Top Pageへ