はじめに
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の編集
現在のサーバは以下のエントリーにあるようにアクセス制限をしている。
- Debian 10 (buster)のnftablesでアクセス制御 - 発声練習
- localhost (127.0.0.1)からはすべてのアクセスを許可
- IP spoofingを防ぐため、127.0.0.0/8からのパケットはドロップ。
この際、/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の設定だけを行う。
- Debian 10 (buster)上でPostfixとDovecotを用いてSMTP認証+TLS - 発声練習
- Debian 11 Bullseye : Dovecot : インストール : Server World
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 }