(旧)Roundcube + Nginxをインストールする

次の記事に集約しました。

・Mail Server: PostfixとDovecotを使ったメールサーバの構築

 


メールのサーバ証明書が切れたのでLets encryptを使うことにしました。Lets encryptはWeb向けに作られていて、証明書はメールサーバにも使えるのですがWebサーバがないと取得が出来ません。そこでWebmailを更新と同時に証明書も刷新することにしました。

以前、PostfixとDovecotを使ったメールサーバを構築しましたがどうもWebmailの調子が良くありません。そこでWebmailアプリのRoundcubeをインストールしてみました。

VPSサーバの下にUbuntuのlxcのメールサーバがあります。そこにnginxのWebサーバがインストールされてあり、そこにRoundcubeをインストールします。aptで関連モジュール一式をインストールしましたがどうもうまく行きません。そこでRoundcubeのサイトからパッケージをダウンロードしてインストールしました。

Let’s encrypt

1台のVPSで運用して複数ドメインを使ってみます。たとえばwww.example.comとmail.example.comような感じです。wordpress用とメール用の共通の証明書を作ります。

$ sudo certbot --manual

質問に答えて割符が合えば証明書のインストールができます。定期的にアップデートする必要があるのでcronに登録しておきます。アップデートは次のようにします。

/usr/bin/certbot renew -d <Domain 1> -d <Domain 2>

NginxのReverse Proxyを使っている場合、そのプロキシサーバに証明書をインストールします。その証明書はメールサーバにrsync等でコピーします。

Roundcube + Nginx

NginxのWebサーバにPHP7.0が稼働しているのが条件です。Roundcubeはapache向けに作られているので作業は少し煩雑になります。

Roundcubeのインストール場所は/usr/shareです。roundcubemail-1.2.9を展開しroundcubemailにシンボリックリンクを張ります。roundcubemail-1.2.9以下ユーザ/グループをwww-dataに変えます。関連パッケージはサイトを見てインストールしていきます。例えばPEARパッケージはaptでインストールしない時があるのでインストールします。

PHP version 5.4.1 or greater with

  • PCRE (Perl-Compatible Regular Expressions)
  • DOM
  • JSON
  • XML
  • Mbstring
  • OpenSSL
  • Session support
  • Socket support
  • PHP Data Objects (PDO) with driver for either MySQL, PostgreSQL, SQL Server or SQLite
  • Iconv (optional)
  • FileInfo (optional)
  • Zip (optional)
  • Pspell (optional)

PEAR packages distributed with Roundcube or external:

  • Mail_Mime 1.10.0 or newer
  • Net_SMTP 1.7.1 or newer
  • Net_Socket 1.2.1 or newer
  • Net_IDNA2 0.1.1 or newer
  • Auth_SASL 1.1.0 or newer
  • Net_Sieve 1.4.0 or newer (for managesieve plugin)
  • Crypt_GPG 1.6.1 or newer (for enigma plugin)
  • Net_LDAP2 2.2.0 or newer (for LDAP address books)
  • kolab/Net_LDAP3 dev-master (for LDAP address books)

例)

$ sudo pear install Mail_Mime

PHPの例)

$ sudo apt install php-pear php-mysql php-mcrypt php-intl

データベースを作成します。SQLサーバ(MySQL)は違うホストある場合のインストール方法です。

$ mysql -u root -p

mysql> CREATE DATABASE roundcubemail;
mysql> GRANT ALL PRIVILEGES ON roundcubemail.* TO 'roundcube'@'<IP>' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON client_data.* to 'roundcube'@'<IP>' identified by 'password' with grant option; mysql> FLUSH PRIVILEGES; 
mysql> quit 

$ mysql -u roundcube -h <IP> -p roundcubemail < /usr/share/webapps/roundcubemail/SQL/mysql.initial.sql

ネットワーク経由でアクセスする場合は設定を変更します。

my.cnf

bind-address            = 0.0.0.0

 

ディレクトリの作成とパーミッションの変更

$ sudo chmod 775 /var/cache/roundcube
$ sudo chown www-data:www-data /var/cache/roundcube
$ sudo mkdir /var/log/roundcubemail
$ sudo chmod 775 /var/log/roundcubemail
$ sudo chown www-data:www-data /var/log/roundcubemail
$ sudo mkdir -p /var/lib/roundcubemail/temp
$ sudo chmod 775 /var/lib/roundcubemail/temp
$ sudo chown www-data:www-data /var/lib/roundcubemail/temp

 

Nignxの設定

ArchLinuxのサイトを参考に作成してみました。

server { 
    listen 443 ssl; 
    server_name mail.example.com; 
    root /var/www/html; 
    #index index.php index.html index.htm; 
    port_in_redirect on; 
    location = /50x.html { 
        root /usr/share/nginx/html; 
    } 
    error_page 404 /404.html; 
    error_page 500 502 503 504 /50x.html; 
    location / { 
        rewrite ^.*$ https://mail.example.com/webmail permanent; 
    } 
    location /webmail { 
        alias /usr/share/roundcubemail; 
        index index.php; 
        error_log /var/log/nginx/roundcubemail.error; 
        access_log /var/log/nginx/roundcubemail.access; 
        # Favicon 
        location ~ ^/webmail/favicon.ico$ { 
            root /usr/share/roundcubemail/skins/classic/images; 
            log_not_found off; 
            access_log off; 
            expires max; 
        } 
        # Robots file 
        location ~ ^/webmail/robots.txt { 
            allow all; 
            log_not_found off; 
            access_log off; 
        } 
        # Deny Protected directories  
            location ~ ^/webmail/(config|temp|logs)/ { 
            deny all; 
        } 
        location ~ ^/webmail/(README|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ { 
            deny all; 
        } 
        location ~ ^/webmail/(bin|SQL)/ { 
            deny all; 
        } 
        # Hide .md files
        location ~ ^/webmail/(.+\.md)$ {
            deny all;
        }
        location ~ ^/webmail/(.+\.php)$ { 
            fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
            fastcgi_index index.php; 
            fastcgi_split_path_info ^/webmail(.+\.php)(/.*)$; 
            #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
            fastcgi_param SCRIPT_FILENAME $request_filename; 
            fastcgi_param PHP_VALUE    open_basedir="/tmp/:/var/cache/roundcubemail:/usr/share/roundcubemail:/etc/roundcubemail:/var/lib/roundcubemail/temp:/var/log/roundcubemail:/usr/share/php"; 
            include fastcgi_params; 
        } 
    } 
#    listen 443 ssl; # managed by Certbot 
ssl_certificate /etc/letsencrypt/live/mail.example.com/fullchain.pem; # managed by Certbot 
ssl_certificate_key /etc/letsencrypt/live/mail.example.com/privkey.pem; # managed by Certbot 
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot 
 
    location ~ /.well-known/acme-challenge { 
        allow all; 
    } 
}

 

<サイト>/installerにアクセスしてRoundcubeの設定をします。SSL/TLSおよびSTARTTLSの設定は次のようになります。

$config['default_host'] = 'ssl://mail.example.com';
$config['default_port'] = 993
$config['smtp_server'] = 'tls://mail.example.com';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

 

Roundcubeがメール−サーバと同じプライベートネットワークにあるとき起こる問題

データーベースの設定をすれば繋がるはずですが、テストするとどうもメールサーバにつながりません。メールサーバの設定を全部見直してみましたが問題ありません。どうもNATの問題があるようです。次のようにテストしてみました。

$ sudo openssl s_client -connect mail.example.com:587 -starttls smtp
 connect: Connection refused
 connect:errno=111

 

x509で認証するためグローバルアドレスでアクセスしますが、ポートフォワーディングしてるとローカルネットからつながりません。かといってローカルアドレスでアクセスすれば認証できません。検索しても回答が見つかりませんでしたが、次のようにhostsにローカルアドレスを追加したらうまく接続できました。

/etc/hosts

192.168.20.1 mail.example.com

 

Fail2ban

Fail2banはアクセス制限をしてくれるアプリです。サーバごとにそれぞれ設定します。ログを解析してアクセス制限するのでパスを摺り合わせます。

/etc/fail2ban/jail.d

defaults-debian.conf  dovecot.conf  nginx-http-auth.conf  php-url-fopen.conf  postfix.conf  roundcube-auth.conf

 

記述例)

grep roundcube_errors_log paths-common.conf
paths-common.conf:roundcube_errors_log = /var/log/roundcubemail/errors

roundcube-auth.conf

[roundcube-auth] 
enableed = true 
port     = http,https 
logpath = %(roundcube_errors_log)s

稼働状況

$ sudo fail2ban-client status
Status 
|- Number of jail:      5 
`- Jail list:   dovecot, php-url-fopen, postfix, roundcube-auth, sshd

エラーが発生た時の対処法

systemd[1]: fail2ban.service: Start request repeated too quickly.

クライアントを実行して原因を調べます。

$ sudo fail2ban-client -vvv -x start