Debian GNU/Linux 11.6上でroundcube 1.6.1

はじめに

Debian GNU/Linux 11.6のおいて標準のroundcubeは1.4.13と古いため、最新のroundcube1.6.1をインストールする。これにともない、phpを7系から8系にする必要がある。

前提

  • SMTPサーバ、IMAPサーバ、Roundcubeサーバはすべて同一サーバにある。
  • サーバのFQDNはhogehoge.hugahuga.ac.jpとする。
  • サーバ証明書は所属機関を通して、UPKI電子証明書発行サービスで発行済み
    • サーバ証明書ファイル: hogehoge.crt
    • サーバ鍵ファイル:hogehoge.key
    • 中間証明書ファイル:nii-odca4g7rsa.cer

/etc/hostsの編集

現在のサーバは以下のエントリーにあるようにアクセス制限をしている。

この際、/etc/hostsにおいて以下のように設定していると、SMTP接続に失敗してしまう(127.0.1.1からのパケットはドロップ)。

127.0.0.1	localhost 
127.0.1.1	hogehoge.hugahuga.ac.jp	hogehoge

そこで、以下のように変更する。

127.0.0.1	localhost hogehoge.hugahuga.ac.jp	hogehoge

SMTPサーバの準備(postfix)

設定は以下を参考にした。

% sudo apt install -y postfix sasl2-bin
% cd /etc/postfix
% sudo mkdir -p ssl/keys

/etc/postfix/ssl/keys以下に/path-to-dir/に置いてある証明書関連ファイルをコピーする。また、サーバ証明書と中間証明書が一緒になっているファイルを作成する。

% sudo cp /path-to-dir/hogehoge.crt /etc/postfix/ssl/keys
% sudo cp /path-to-dir/hogehoge.key /etc/postfix/ssl/keys
% sudo cp /path-to-dir/nii-odca4g7rsa.cer /etc/postfix/ssl/keys
% cd /etc/postfix/ssl/keys
% sudo cat hogehoge.crt >> hogehoge_full.crt
% sudo cat nii-odca4g7rsa.cer >> hogehoge_full.crt

サーバ鍵のパスフレーズを外す。

% sudo cp -p hogehoge.key hogehoge.key.with_passphrase
% sudo openssl rsa -in hogehoge.key.with_passphrase -out hogehoge.key

所有者を変更する。

% sudo chown root:root /etc/postfix/ssl/keys/*

Postfixの設定を変更する。SMTP認証と通信路暗号化(smtps)を設定する。

% sudo cp -p main.cf main.cf.org
% sudo vi main.cf

主な設定は以下のとおり。

% postconf -d > /tmp/default_setting.txt
% postconf > /tmp/current_setting.txt
% diff  /tmp/default_setting.txt /tmp/current_setting.txt
133c133
< disable_vrfy_command = no
---
> disable_vrfy_command = yes

187c187
< home_mailbox =
---
> home_mailbox = Maildir/

210,211c210,211
< inet_interfaces = all
< inet_protocols = all
---
> inet_interfaces = loopback-only
> inet_protocols = ipv4


454,459c454,459
< mydestination = $myhostname, localhost.$mydomain, localhost
< mydomain = localdomain
< myhostname = hogehoge.localdomain
< mynetworks = 127.0.0.0/8 [::1]/128 [fe80::]/64
< mynetworks_style = ${{$compatibility_level} < {2} ? {subnet} : {host}}
< myorigin = $myhostname
---
> mydestination = $myhostname, hogehoge.hugahuga.ac.jp, localhost.hugahuga.ac.jp, localhost
> mydomain = hugahuga.ac.jp
> myhostname = hogehoge.hugahuga.ac.jp
> mynetworks = 127.0.0.0/8
> mynetworks_style = subnet
> myorigin = /etc/mailname

749c749
< smtp_tls_session_cache_database =
---
> smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
760c760
< smtpd_banner = $myhostname ESMTP $mail_name
---
> smtpd_banner = $myhostname ESMTP
784c784
< smtpd_helo_required = no
---
> smtpd_helo_required = yes
809c809
< smtpd_recipient_restrictions =
---
> smtpd_recipient_restrictions = permit_mynetworks, permit_auth_destination, permit_sasl_authenticated, reject
814c814
< smtpd_relay_restrictions = ${{$compatibility_level} < {1} ? {} : {permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination}}
---
> smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
816c816
< smtpd_sasl_auth_enable = no
---
> smtpd_sasl_auth_enable = yes
819,820c819,820
< smtpd_sasl_local_domain =
< smtpd_sasl_path = smtpd
---
> smtpd_sasl_local_domain = $myhostname
> smtpd_sasl_path = private/auth
825c825
< smtpd_sasl_type = cyrus
---
> smtpd_sasl_type = dovecot
832c832
< smtpd_tls_CAfile =
---
> smtpd_tls_CAfile = /etc/postfix/ssl/keys/nii-odca4g7rsa.cer
838c838
< smtpd_tls_cert_file =
---
> smtpd_tls_cert_file = /etc/postfix/ssl/keys/hogehoge.crt
850c850
< smtpd_tls_key_file = $smtpd_tls_cert_file
---
> smtpd_tls_key_file = /etc/postfix/ssl/keys/hogehoge.key
859c859
< smtpd_tls_session_cache_database =
---
> smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
864c864
< smtpd_use_tls = no
---
> #smtpd_use_tls = no (注:古い記述とのこと。Postfix 3以降は以下のように記載)
> smtpd_tls_security_level = may

master.cfを編集する。以下の部分をコメントインする。

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

設定を反映させる。

% sudo newaliases 
% sudo systemctl restart postfix 

IMAPサーバの準備

以下のサイトのIMAPの設定だけを行う。

Dovecotのインストール

% sudo apt install dovecot-core dovecot-imapd

設定を編集する。

% cd /etc/dovecot/conf.d
% sudo cp -p 10-mail.conf 10-mail.conf.org
% vi 10-mail.conf 

設定内容は以下の通り。

% diff 10-mail.conf.org 10-mail.conf
30c30
< mail_location = mbox:~/mail:INBOX=/var/mail/%u
---
>    mail_location = maildir:~/Maildir

以下、同様に設定を行っていく。SSLの設定。

# diff 10-ssl.conf.org 10-ssl.conf
12,13c12,15
< ssl_cert = </etc/dovecot/private/dovecot.pem
< ssl_key = </etc/dovecot/private/dovecot.key
---
> #ssl_cert = </etc/dovecot/private/dovecot.pem
> ssl_cert = </etc/postfix/ssl/keys/hogehoge_full.cer
> #ssl_key = </etc/dovecot/private/dovecot.key
> ssl_key = </etc/postfix/ssl/keys/hogehoge.key
55c57,58
< ssl_dh = </usr/share/dovecot/dh.pem
---
> #ssl_dh = </usr/share/dovecot/dh.pem
> ssl_dh = </etc/postfix/ssl/keys/hogehoge.dh.pem

SMTP認証のログイン方式の設定。

# diff 10-auth.conf.org 10-auth.conf
100c100
< auth_mechanisms = plain
---
> auth_mechanisms = login

IMAPとSMTP認証のポートの設定。

# diff 10-master.conf.org 10-master.conf
22,23c22,23
<     #port = 993
<     #ssl = yes
---
>     port = 993
>     ssl = yes
107,109c107,111
<   #unix_listener /var/spool/postfix/private/auth {
<   #  mode = 0666
<   #}
---
>   unix_listener /var/spool/postfix/private/auth {
>     mode = 0666
>     user = postfix
>     group = postfix
>   }

DovecotのDiffie-Hellman鍵を作成する。

% cd /etc/postfix/ssl/keys/
% sudo openssl dhparam 4096 > hogehoge.dh.pem

dovecotを再起動する。

% sudo systemctl restart dovecot

MariaDBのインストール

Debian 11 Bullseye : MariaDB : インストール : Server Worldに書いてある通りに設定する。

% sudo apt install -y mariadb-server
% sudo mysql_secure_installation

roundcube 1.6.1のインストール&設定

Install Roundcube Webmail on Debian 11/10 with Apache/Nginxを参考にインストールする。

roundcubeの最新版をダウンロードする。

% cd
% wget https://github.com/roundcube/roundcubemail/releases/download/1.6.1/roundcubemail-1.6.1-complete.tar.gz
% tar xvfz roundcubemail-1.6.1-complete.tar.gz
% sudo mv roundcubemail-1.6.1 /var/lib
% cd /var/lib
% sudo ln -s roundcubemail-1.6.1 roundcube
% cd roundcube
% sudo chown www-data:www-data temp logs -R

PHP 8系をインストールするため、サードパーティリポジトリを追加する。まず、追加に必要なソフトウェアのインストールをする。

% sudo apt install software-properties-common ca-certificates apt-transport-https gnupg2

サードパーティリポジトリを追加する。2023年3月現在、サードパーティを追加するときにはapt-keyを使わないことが推奨されているが、今回はapt-keyを使っている。

% echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
% wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -

これでPHP8系をインストールできるので、必要なパッケージをインストールする。

% sudo apt update
% sudo apt install libapache2-mod-php8.2 465php-net-ldap2 php-net-ldap3 php-imagick php8.2-fpm php8.2-common php8.2-gd php8.2-imap php8.2-mysql php8.2-curl php8.2-zip php8.2-xml php8.2-mbstring php8.2-bz2 php8.2-intl php8.2-gmp php8.2-redis


roundcube用のDBを準備する。

  • データベース名:roundcube_db
  • ユーザ名:rc_admin
  • パスワード:rc_pass
% sudo su
# mysql
> create database roundcube_db; 
> grant all privileges on roundcube_db.* to rc_admin@'localhost' identified by 'rc_pass';
> flush privileges; 
> exit 

データベースの構築。

#  mysql -u rc_admin -D roundcube_db -h localhost -p < /var/www/roundcube/SQL/mysql.initial.sql

設定ファイルの記載。

# cd /var/lib/roundmail/config
# cp -p config.inc.php.sample config.inc.php
# vi config.inc.php

設定内容は以下の通り。注意点はデータベースのパスワード中の禁止文字は percent encodingする必要があること。

# diff config.inc.php.sample config.inc.php
28c28
< $config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
---
> $config['db_dsnw'] = 'mysql://rc_admin:rc_pass@localhost/roundcube_db';
32c32,33
< $config['imap_host'] = 'localhost:143';
---
> $config['imap_host'] = 'ssl://hogehoge.hugahuga.ac.jp:993';
> 
36c37
< $config['smtp_host'] = 'localhost:587';
---
> $config['smtp_host'] = 'ssl://hogehoge.hugahuga.ac.jp:465';
51c52
< $config['product_name'] = 'Roundcube Webmail';
---
> $config['product_name'] = 'My Roundcube Webmail';
57c58
< $config['des_key'] = 'rcmail-!24ByteDESkey*Str';
---
> $config['des_key'] = '適当なランダム文字列';
66a68,71
> 
> // Spell checker
> $config['enable_spellcheck'] = true;
> 

Apacheの設定を行う。

# cd /etc/apache2/sites-available/
# cp -p default-ssl.conf default-ssl.conf.org
# vi default-ssl.conf

変更点は以下の通り。

< ServerAdmin webmaster@localhost
---
> ServerAdmin webmaster@hogehoge.fugafuga.ac.jp

<SSLCertificateFile	/etc/ssl/certs/ssl-cert-snakeoil.pem
<SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
---
>SSLCertificateFile	/etc/postfix/ssl/keys/hogehoge_full.crt
>SSLCertificateKeyFile /etc/postfix/ssl/keys/hogehoge.key

設定ファイルとSSLを有効化する。

# a2ensite default-ssl 
# a2enmod ssl 

roundcubeの設定ファイルを編集する。Debianのaptで管理しているroundcube 1.4.13の設定ファイルをそのまま利用した。

# cd /etc/apache2/conf-available/
# touch roundcube.conf
# vi roundcube.conf

内容は以下の通り。

Alias /roundcube /var/lib/roundcube/public_html

<Directory /var/lib/roundcube/public_html/>
  Options +FollowSymLinks
  # This is needed to parse /var/lib/roundcube/.htaccess. See its
  # content before setting AllowOverride to None.
  AllowOverride All
  <IfVersion >= 2.3>
    Require all granted
  </IfVersion>
  <IfVersion < 2.3>
    Order allow,deny
    Allow from all
  </IfVersion>
</Directory>

# Protecting basic directories (not needed when the document root is
# /var/lib/roundcube/public_html):
<Directory /var/lib/roundcube/config>
  Options -FollowSymLinks
  AllowOverride None
</Directory>

<Directory /var/lib/roundcube/temp>
  Options -FollowSymLinks
  AllowOverride None
  <IfVersion >= 2.3>
    Require all denied
  </IfVersion>
  <IfVersion < 2.3>
    Order allow,deny
    Deny from all
  </IfVersion>
</Directory>

<Directory /var/lib/roundcube/logs>
  Options -FollowSymLinks
  AllowOverride None
  <IfVersion >= 2.3>
    Require all denied
  </IfVersion>
  <IfVersion < 2.3>
    Order allow,deny
    Deny from all
  </IfVersion>
</Directory>

設定を有効化する。

# a2enconf roundcube

ついでにphp-fpm(今回の場合はphp8.2-fpm)の設定も有効化する。

# a2enmod php8.2
# a2enconf php8.2-fpm

php-fpmを起動する。

# systemctl start  php8.2-fpm

Apacheを再起動する。

# systemctl restart apache2


https://hogehoge.fugafuga.ac.jp/roundcube にアクセスする。うまくいかない場合は以下のログを見る。

  • Apacheのログ:/var/log/apache2/error.log
  • roundcubeのエラーログ: /var/lib/roundcube/logs/error.log
  • postfixやdovecotのログ: /var/log/mail.log

ログのタイムゾーン設定

roundcubeのエラーログに使われているタイムゾーンはphpのタイムゾーンが使用される。標準ではUTCになっているため、日本時間(JST)に変更する。今回は php8.2-fpmを利用しているため、設定ファイルのphp.iniは/etc/php/8.2/fpmにある。どこにあるかはWebブラウザから閲覧できる場所に以下のファイルを置いて確認できる。今回の例では/var/www以下に置くとする。

# cd /var/www
# touch phoinfo.php
# echo "<?php phpinfo() ?>" | tee phpinfo.php
<?php phpinfo() ?>

Webブラウザからphpinfo.phpにアクセスし「Configuration File (php.ini) Path 」に記載されているphp.iniを編集する。

php.iniの当該部分をコメントアウトし、タイムゾーンを設定する。設定できるタイムゾーンはこちらを参照(PHP: サポートされるタイムゾーンのリスト - Manual

[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
; date.timezone = 
date.timezone = "Asia/Tokyo"

その後、php-fpmを再起動する。

# systemctl restart  php8.2-fpm

ログのローテーション

logrotateでログをローテーションする。今回は週1回、8週分を保管しておくこととする。

# cd /etc/logrotate.d
# touch roundcube
# vi roundcube

中身を以下のようにする。

/var/lib/roundcube/logs/*.log 
{
    weekly
    missingok
    rotate 8
    compress
    delaycompress
    notifempty
    create 644 www-data www-data
}