2020年末のサーバ構築その2

2020-12-31 11:23:30 +09:00 Post Comments

2日前にサーバ構築の記事を書いたばかりですが、 結局やり直しです。 メールが受け取れない環境で公開すると、 内容に責任を持てないのではないかと感じたためです。 (しかし、まだメールサーバは復旧していません。)

環境

  • ハードウェア:Raspberry Pi 4 Model Bを使用します。
    • 月に1MBも転送しないサイトなので、あまり強いハードウェアは用いません。
    • 安定性に問題があれば別の方法を検討します。
  • OS:Ubuntu Server 20.04.1

設定手順

ディスク書き込み

  • 今回は、microSDカードの制限を逃れるため、 USBマスストレージデバイスからの起動を使うことにしました。

  • 手順はRaspberry Pi 4 Model B で USB ブート(1) - Qiita を参考にしました。

  • EEPROMのバージョンを確認(Raspberry Pi上で)

    • raspbianで起動した状態で確認したところ既にSep 3 2020版になっていました。
  • イメージの取得(PC上で)

  • 書き込み(PC上で)

    • ダウンロードしたファイルはxz圧縮されているので、伸張
      sakai@myPC ~ % xz -kd ubuntu-20.04.1-preinstalled-server-arm64+raspi.img.xz
      
    • 伸張したファイルを書き込み
      sakai@myPC ~ % cat ubuntu-20.04.1-preinstalled-server-arm64+raspi.img | sudo dd of=/dev/disk5 bs=134217728
      
      • macOSなので、/dev/disknになっていたりbs=に接頭辞が使えなかったりしましたが、 適当に補正しました。
      • disknの数字は「ディスクユーティリティ」でドライブの「情報を見」て、 「BSD装置ノード」の欄を見ることで確認できます。

ディスク内容の補正(Raspberry Pi上で)

  • 引き続きRaspberry Pi 4 Model B で USB ブート(1) - Qiita を参考にしています。
  • ext4ファイルシステムを安全に拡張するために、Linuxマシンが必要です。 (macOSでさえなければいけるかもしれない)
  • 手元にLinux端末がRaspberry Piしかなかったのでこれを使いました。
  • ディスクはまだ準備ができていないので、一旦raspbianで起動して作業を行います。
  • ディスクをRaspberry PiにUSB接続
  • パーティションをいじる( ディスクパーティションとファイルシステムの拡張 - Qiita を参考にしました。)
    • パーティションマップの変更
      pi@raspberrypi:~ $ sudo parted /dev/sda
      (parted) unit s # セクタ単位に変更
      (parted) resizepart 2 -1s # 2番目のパーティションを最大サイズに拡張
      (parted) quit
      
      • Raspberry Piのディスクは大抵USB接続したディスクだけ (メモリーカードはディスクとは別扱い)なので、 繋いだディスクは大抵/dev/sdaになります。 しかし、ディスクの取り違えを防ぐため、
        (parted)print
        
        などとして正しいディスクを操作しているか確認しましょう。
    • ファイルシステムの拡張
      pi@raspberrypi:~ $ sudo e2fsck -f /dev/sda2
      pi@raspberrypi:~ $ sudo resize2fs /dev/sda2
      
  • マウント
    pi@raspberrypi:~ $ mkdir /tmp/hdd_boot
    pi@raspberrypi:~ $ mkdir /tmp/hdd_root
    pi@raspberrypi:~ $ sudo mount /dev/sda1 /tmp/hdd_boot
    pi@raspberrypi:~ $ sudo mount /dev/sda2 /tmp/hdd_root
    
  • vmlinuzを伸張
    pi@raspberrypi:~ $ cd /tmp/hdd_boot
    pi@raspberrypi:/tmp/hdd_boot $ zcat vmlinuz | sudo dd of=vmlinux
    
  • これを使うように設定
     pi@raspberrypi:/tmp/hdd_boot $ sudo vi config.txt
    
  • vmlinuxがvmlinuzに追従するように、スクリプトを配置
    pi@raspberrypi:/tmp/hdd_boot $ sudo vi auto_decompress_kernel
    
    • 新規ファイル。記すべき内容は前項の記事の6)に記載されている。
  • これを実行させるように設定
    pi@raspberrypi:/tmp/hdd_boot $ sudo vi /tmp/hdd_root/etc/apt/apt.conf.d/999_decompress_rpi_kernel
    
    • 内容は前項の記事の8)に記載されている。
  • 電源を切る
    pi@raspberrypi:/tmp/hdd_boot $ sudo shutdown -h now
    
  • microSDカードを抜き、Raspberry Piをモニタにつないで起動

SSH接続まで

  • まずログインする。Ubuntu ServerのRaspberry Piイメージでは、デフォルトユーザが作成済み。
    • ログインするとパスワード変更が始まるので、事前に決めておく。
    • この手順ではキーレイアウト設定ができていないので、記号がまともに入力できない。 英数字のみで作っておくほうが安全。
      Login: ubuntu
      Password: (見えないけど)ubuntu
      (自動でパスワード変更が始まる)
      〈Current Password〉: (もう一度)ubuntu
      〈New Password〉: 〈新しいパスワード〉
      〈Retype Password〉: 〈もう一度入れる〉
      
  • WiFiネットワークに接続 (「Ubuntu Server(Raspberry Pi)のWifi設定〜リモート接続 - Qiita」 を参考にしました。)
    • Netplanの設定ファイルを編集
      ubuntu@ubuntu:~$ vi /etc/netplan/51-wifi.yaml
      
      • 次のようにしてIPアドレスを固定してWiFiに接続するように設定
        network:
        	wifis:
        		wlan0:
        			addresses:
        				- 〈IPアドレス〉/24
        			gateway4: 192.168.0.1
        			nameservers:
        				addresses:
        					- 192.168.0.1
        			optional: true
        			access-points:
        				"〈SSID〉":
        					password: 〈WiFiのパスワード〉
        
    • 反映させる。
      ubuntu@ubuntu:~$ sudo netplan generate
      
    • 〜wlan0.service not foundというエラーが出た。
    • 調べてみると、再起動すると直るらしいことがわかった。 (Ask Ubuntuの投稿を参考にしました。)
      ubuntu@ubuntu:~$ sudo reboot
      〈再起動の表示〉
      Login: ubuntu
      Password: (先ほど作ったパスワード)
      ubuntu@ubuntu:~$ sudo netplan generate
      ubuntu@ubuntu:~$ sudo netplan apply
      
    • 設定できた。もう少しマシな方法がありそうだけれど、まあいいか。滅多にやらないし。
  • Ubuntu ServerのRaspberry Piイメージでは、デフォルトでSSHが起動しているので、 先ほど作ったパスワードでログインできる。
    sakai@myPC ~ % ssh ubuntu@〈IPアドレス〉
    〈サーバ証明書の確認〉 yes
    〈パスワード〉 入力する
    ubuntu@ubuntu:~$ 
    
  • パスワードを記号入りのものに変えておく。
    ubuntu@ubuntu:~$ passwd
    Changing password for ubuntu.
    Current password: 
    New password: 
    Retype new password: 
    

公開鍵認証の設定

一昨日に設定したときと 同じなので省略します。

Webサーバの設定

  • 今回はコメント機能の復旧を後に回すので先にnginxだけ設定します。

  • インストール

    ubuntu@ubuntu:~$ sudo apt install nginx
    (略)
    続行しますか? [Y/n] 〈Enter〉
    
  • 設定。UbuntuはDebian系なので 同じDebian系のRaspbianを使った一昨日の設定 と同様にできます。

    pi@raspberrypi:~ $ sudo vi /etc/nginx/sites-available/〈設定名(半角英字など)
    • 設定内容(後で追加するIssoの設定も追加しておきます)
      server {
      	listen 80;
      	listen [::]:80;
      
      	location ~ ^/isso/(.*)$ {
      		include uwsgi_params;
      		uwsgi_pass 127.0.0.1:8080;
      		uwsgi_param SCRIPT_NAME /isso;
      		uwsgi_param PATH_INFO /$1;
      	}
      
      	root	/var/www/〈設定名(半角英字など)〉;
      	index	index.html index.htm;
      	server_name 〈ドメイン名〉;
      }
      
  • 追加設定。知らないサーバへの要求は無視します。

    pi@raspberrypi:~ $ sudo vi /etc/nginx/sites-available/unknown
    
    • 設定内容
      server {
      				listen 80 default_server;
      				listen [::]:80 default_server;
      
      				server_name _;
      				location / {
      								return 400;
      				}
      }
      
  • その設定を有効化

    pi@raspberrypi:~ $ cd /etc/nginx/
    ubuntu@ubuntu:/etc/nginx$ sudo ln -s ../sites-available/xxxx.xx sites-enabled/
    ubuntu@ubuntu:/etc/nginx$ sudo ln -s ../sites-available/unknown sites-enabled/
    ubuntu@ubuntu:/etc/nginx$ sudo systemctl reload nginx
    

DNSサーバの設定

  • 前の設定で設定したDNSはサーバ間の連携のために 必要でしたが、今回はサーバは同一の機体にします。

  • それでも、メールサーバをテストするときにDNSサーバがあるほうが楽なので、 DNSサーバを設定します。

  • 今回の用途(内側から参照するための、一部内容を書き換える必要のあるキャッシュDNS) にはdnsmasqが適していると思われるため、今回もdnsmasqを使います。

  • systemd-resolvedのスタブリゾルバを無効化 (Ubuntu 18.04 の systemd-resolved で local DNS stub listener の利用をやめる - Qiitaを参考にしました。)

    • (systemd-resolvedはsystemdの拡張で、 参照するDNSサーバを柔軟に設定するためのもの。 スタブリゾルバ機能は、DNSサーバと同じプロトコルで待ち受け、 ここに設定されたDNSを見に行った結果を返す擬似的なDNSサーバとして動作する機能。)
    • スタブリゾルバが動いていると、53番ポートが塞がって使えないので止める。
    • 止めるための設定
      ubuntu@ubuntu:~$ sudo vi /etc/systemd/resolved.conf.d/51-disable-stub.conf
      
      • 内容は次の通り
        [Resolve]
        DNSStubListener=no
        
    • スタブリゾルバを使わずにDNSを見に行かせる設定
      ubuntu@ubuntu:~$ sudo ln -sf ../run/systemd/resolve/resolv.conf
      
    • systemd-resolvedに設定を反映
      ubuntu@ubuntu:~$ sudo systemctl restart systemd-resolved
      
  • DNSを設定する前にホスト名を変更

    • プロンプトに出るマシン名を設定しておく。
      ubuntu@ubuntu:~$
             ~~~~~~ ここ
      
    • manのhostname(5)によれば、/etc/hostnameに書くことで設定できる。
      vi /etc/hostname
      
      • 元書いてあるのと同じように、マシン名だけ書いておけばOK
        raspiu
        
    • 再起動すれば反映されるが、再起動しなくてもhostname(1)で設定できる。
      ubuntu@ubuntu:~$ hostname raspiu
      
      • SSHログインをやり直せば反映される。
        ubuntu@ubuntu:~$ exit
        sakai@myPC ~ % ssh raspiu # この辺の設定は略。
        ubuntu@raspiu:~$
        
  • dnsmasqをインストール

    ubuntu@raspiu:~$ sudo apt install dnsmasq
    
  • dnsmasqを設定

    ubuntu@raspiu:~$ sudo vi /etc/dnsmasq.d/local.conf
    
    • 設定内容は以下の通り
      # Never forward plain names (without a dot or domain part)
      domain-needed
      # Never forward addresses in the non-routed address spaces.
      bogus-priv
      # Set this (and domain: see below) if you want to have a domain
      # automatically added to simple names in a hosts-file.
      expand-hosts
      
  • /etc/hostsに追記

    〈IPアドレス〉     raspiu raspiu.airport
    
  • 反映

    ubuntu@raspiu:~$ sudo systemctl reload dnsmasq
    
  • このDNSサーバを見に行くように設定

    ubuntu@raspiu:~$ sudo vi /etc/netplan/51-wifi.yaml
    
    • nameservers / addresesを更新。
      			nameservers:
      				addresses:
      					- 192.168.0.7
      

メールサーバの設定

  • パスワード認証なので、全面的にインターネットから接続可能にすることはお勧めできません。 25番ポートのみ開放すれば認証を試行できないので問題ないはずです。

証明書の発行

  • 前回とほぼ同様ですが、 次の箇所を変更したので再掲します。

    • local.cf → local.cnf
    • SMTPサーバとIMAPサーバの証明書を共通化
  • 証明書を作る

    ubuntu@raspiu:~$ cd /etc/ssl
    ubuntu@raspiu:/etc/ssl$ sudo vi local.cnf
    
    • local.cnfの内容:
      [ req ]
      default_bits = 4096
      encrypt_key = yes
      x509_extensions = extensions
      distinguished_name = req_distinguished_name
      
      [ req_distinguished_name ]
      countryName			= Country Name (2 letter code)
      countryName_min			= 2
      countryName_max			= 2
      stateOrProvinceName		= State or Province Name (full name)
      localityName			= Locality Name (eg, city)
      0.organizationName		= Organization Name (eg, company)
      organizationalUnitName		= Organizational Unit Name (eg, section)
      commonName			= Common Name (eg, fully qualified host name)
      commonName_max			= 64
      emailAddress			= Email Address
      emailAddress_max		= 64
      
      [ extensions ]
      nsCertType = server
      subjectAltName = @alt_names
      
      [alt_names]
      DNS.1 = xxxx.xx
      DNS.2 = raspiu
      DNS.3 = raspiu.airport
      
    • 準備ができたので作る
      ubuntu@raspiu:/etc/ssl$ sudo mkdir localcerts
      ubuntu@raspiu:/etc/ssl$ sudo openssl req -new -x509 -config local.cnf \
        -newkey rsa:4096 -nodes -keyout private/server.key -days 730 \
        -subj /C=JP/ST=Tokyo/CN=raspiu.airport/emailAddress=xxx@xxxx.xx/ \
        -out localcerts/server.cer
      

Postfixの設定

  • 次のサイトを参考にしております。

  • 前回とほぼ同様ですが、 次の箇所を変更したので再掲します。

    • Ubuntu上なので、aptを使ってインストールするように変更
    • Rspamdとの連携をネットワーク経由に変更
    • 証明書のパスを変更
    • Received: ヘッダーにTLS状態を記録する設定を追加
    • /etc/postfix/virtualの設定内容が抜けていたので補完
  • まずaptを使ってインストール

    ubuntu@raspiu:/etc/ssl$ sudo apt install postfix
    Postfix Configuration: 設定なし
    
  • 設定ファイルの作成

    ubuntu@raspiu:/etc/ssl$ cd /etc/postfix
    ubuntu@raspiu:/etc/postfix$ sudo cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
    ubuntu@raspiu:/etc/postfix$ sudo vi main.cf
    
    • 内容
      ### ### Local Configurations ### ###
      myhostname = raspiu.airport
      virtual_mailbox_domains = xxxx.xx
      virtual_alias_maps = hash:/etc/postfix/virtual
      virtual_transport = lmtp:unix:private/dovecot-lmtp
      
      strict_rfc821_envelopes = yes
      disable_vrfy_command = yes
      
      smtpd_helo_required = yes
      smtpd_helo_restrictions = reject_non_fqdn_helo_hostname
      smtpd_sender_restrictions = reject_unknown_sender_domain
      smtpd_recipient_restrictions =
       reject_unknown_recipient_domain,
       reject_non_fqdn_recipient,
       reject_unverified_recipient,
       reject_unauth_destination
      
      smtpd_tls_cert_file=/etc/ssl/localcerts/server.cer
      smtpd_tls_key_file=/etc/ssl/private/server.key
      smtpd_tls_security_level = may
      smtp_tls_security_level = may
      
      message_size_limit = 20480000
      
      # rspamd
      smtpd_milters = inet:localhost:11332
      milter_protocol = 6
      milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
      milter_default_action = accept
      
      # Print TLS connection information on the header.
      smtpd_tls_received_header = yes
      
      • Debianのpostfixはデフォルトでchrootが有効。 (smtpdが乗っ取られても悪さできないように、smtpdからアクセスできるファイルを 特定ディレクトリ配下に制限してある。)
      • smtpd_miltersをunixソケットにする場合、その配下にないと動かない。 色々と面倒なので、ネットワークソケット(inet:localhost:11332)を使う。
    • master.cfも編集
      ubuntu@raspiu:/etc/postfix$ sudo vi master.cf
      
    • 追記内容は以下の通り
      submission inet n       -       y       -       -       smtpd
          -o syslog_name=postfix/submission
          -o smtpd_tls_security_level=encrypt
          -o smtpd_sasl_auth_enable=yes
          -o smtpd_sasl_type=dovecot
          -o smtpd_sasl_path=private/auth
          -o smtpd_sasl_security_options=noanonymous
          -o smtpd_sasl_local_domain=$myhostname
          -o smtpd_tls_auth_only=yes
          -o smtpd_reject_unlisted_recipient=no
          -o smtpd_recipient_restrictions=reject_unknown_recipient_domain,reject_non_fqdn_recipient,permit_sasl_authenticated,reject
          -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
          -o milter_macro_daemon_name=ORIGINATING
      
  • エイリアスを更新

    ubuntu@raspiu:/etc/postfix$ sudo newaliases
    
  • postmasterやinfoを管理者に転送する設定

    ubuntu@raspiu:/etc/postfix$ sudo vi virtual
    
    • virtualの内容
      postmaster	xxx@xxxx.xx
      info	xxx@xxxx.xx
      root	xxx@xxxx.xx
      
    • virtualのハッシュファイルを作成
      ubuntu@raspiu:/etc/postfix$ sudo postmap virtual
      

Dovecotの設定

  • 次のサイトを参考にしております。

  • 前回と同様ですが、 次の箇所を変更したので再掲します。

    • aptを使うようにパッケージ名を変更
    • 証明書のパスを変更
    • 参考サイトと設定の記述順が違っていて見比べにくかったので修正
    • sieveファイルのパスがずれていたので補正
  • インストール

    ubuntu@raspiu:/etc/postfix$ sudo apt install dovecot-imapd dovecot-lmtpd dovecot-sieve
    
  • 設定

    ubuntu@raspiu:/etc/postfix$ cd /etc/dovecot/
    ubuntu@raspiu:/etc/dovecot$ sudo vi local.conf
    
    • local.confの内容
      protocols = imap lmtp
      
      # Mail location
      mail_location = maildir:~/maildir
      mail_plugins = acl quota
      
      # Authentication
      auth_mechanisms = plain
      passdb {
      	driver = passwd-file
      	args = username_format=%u /var/vmail/auth.d/%d/passwd
      }
      userdb {
      	driver = passwd-file
      	args = username_format=%u /var/vmail/auth.d/%d/passwd
      }
      
      # Services
      service imap-login {
      	inet_listener imap {
      		address = 0.0.0.0
      		port = 143
      	}
      	inet_listener imaps {
      		address = 0.0.0.0
      		port = 993
      	}
      }
      service lmtp {
      	unix_listener /var/spool/postfix/private/dovecot-lmtp {
      		group = postfix
      		mode = 0600
      		user = postfix
      	}
      }
      service imap {
      }
      service auth {
      	unix_listener /var/spool/postfix/private/auth {
      		group = postfix
      		mode = 0660
      		user = postfix
      	}
      	user = $default_internal_user
      }
      service auth-worker {
       user = $default_internal_user
      }
      verbose_proctitle = yes
      
      # Protocols
      protocol lmtp {
      	postmaster_address = postmaster@xxxx.xx   # required
      	mail_plugins = $mail_plugins sieve
      }
      protocol imap {
      	mail_plugins = $mail_plugins imap_acl imap_quota mail_log notify
      }
      
      # Plugins
      plugin {
      	quota = dict:user::file:%h/maildir/dovecot-quota
      	quota_rule = *:storage=1GB
      	quota_rule2 = Trash:storage=+10%%
      	acl = vfile:/var/vmail/conf.d/%d/acls:cache_secs=300
      }
      # for mail filtering
      plugin {
      	sieve = ~/.dovecot.sieve
      	sieve_dir = ~/sieve
      	sieve_global_dir = /var/vmail/conf.d/%d/sieve
      	sieve_before = /etc/dovecot/sieve/rspam_deliver.sieve
      }
      
      # TLS
      ssl_cert = </etc/ssl/localcerts/server.cer
      ssl_key = </etc/ssl/private/server.key
      
    • 上記で使ったrspam_deliver.sieveを作る
      ubuntu@raspiu:/etc/dovecot$ sudo mkdir sieve
      ubuntu@raspiu:/etc/dovecot$ sudo vi sieve/rspam_deliver.sieve
      
    • rspam_deliver.sieveの内容は以下の通り
      require "fileinto";
      require "imap4flags";
      if header :is "X-Spam" "Yes" {
      	fileinto "Junk";
      	setflag "\\seen";
      	stop;
      }
      
    • コンパイルしておく
      ubuntu@raspiu:/etc/dovecot$ sudo sievec /etc/dovecot/rspam_deliver.sieve
      

Rspamdの設定

  • 次のサイトを参考にしております。

  • 前回とほぼ同様ですが、 次の箇所を変更したので再掲します。

    • aptを使うように変更
    • DKIMとARCの鍵を共通化
    • Postfixとの連携をネットワーク経由に変更
  • インストール

    ubuntu@raspiu:/etc/dovecot$ sudo apt install rspamd redis clamav-daemon clamav-freshclam
    ubuntu@raspiu:/etc/dovecot$ cd /etc/rspamd/
    
  • DKIMキーを生成(k210101:セレクタ名。日付などを使っておくと更新の時に楽なのでそうする。)

    ubuntu@raspiu:/etc/rspamd$ sudo rspamadm dkim_keygen -s 'k210101' \
      -d xxxx.xx -k local.d/dkim_priv.key \
      | sudo dd of=/etc/rspamd/local.d/dkim_pub.key
    
    • 秘密鍵のパーミッション設定
      ubuntu@raspiu:/etc/rspamd$ sudo chown _rspamd:_rspamd local.d/dkim_priv.key
      ubuntu@raspiu:/etc/rspamd$ sudo chmod go-rwx local.d/dkim_priv.key
      
  • DNSサーバにdkim_pub.keyの公開鍵を設定する。

    • まず公開鍵を読み出す。
      ubuntu@raspiu:/etc/rspamd$ cat local.d/dkim_pub.key
      
    • 内容は以下のようになっている
      k210101._domainkey IN TXT ( "v=DKIM1; k=rsa; "
      "p=MIG(略)" ) ;
      
    • dnsmasqの設定ファイルを開く
      ubuntu@raspiu:/etc/rspamd$ sudo vi /etc/dnsmasq.d/local.conf
      
    • 次のように追記する
      txt-record=k210101._domainkey.xxxx.xx,"v=DKIM1; k=rsa; p=MIG(略)"
      
  • Rspamdの設定。(ファイル数が多いので/etc/rspamd/以下のパスで示す)

    • local.d/antivirus.conf
      clamav {
        attachments_only = false;
        servers = "/run/clamav/clamd.ctl";
      }
      
    • local.d/arc.conf
      path = "/etc/rspamd/local.d/dkim_priv.key";
      selector = "k210101";
      use_esld = false;
      
    • local.d/dkim_signing.conf
      path = "/etc/rspamd/local.d/dkim_priv.key";
      selector = "k210101";
      use_esld = false;
      
    • local.d/milter_headers.conf
      extended_spam_headers = true;
      authenticated_headers = ["authentication-results","x-virus"];
      extended_headers_rcpt = ["@xxxx.xx"]
      use = ["authentication-results","x-spam-level","x-virus"];
      
    • local.d/redis.conf
      servers = "127.0.0.1";
      
    • local.d/statistic.conf
      autolearn = [-5, 10]
      
    • local.d/worker-controller.inc
      bind_socket = "*v4:11334";
      password = "$2$xxx$xxxxxxxxx";
      enable_password = "$2$xxx$xxxxxxxxx";
      
      • passwordの値は次のコマンドで生成する
        ubuntu@raspiu:/etc/rspamd$ rspamadm pw
        Enter passphrase: 
        $2$xxx$xxxxxxxxx
        
    • local.d/worker-normal.inc
      enabled = false;
      
    • local.d/worker-proxy.inc
      milter = yes;
      timeout = 120s;
      bind_socket = localhost:11332;
      upstream "local" {
      	default = yes;
      	self_scan = yes;
      }
      

メールアカウントの作成

  • 前回とほぼ同様ですが、 次の箇所を変更したので再掲します。

    • Ubuntuにはmkpasswdコマンドが標準ではついてこないので、openssl-passwdに変更。
  • ディレクトリを作成

    ubuntu@raspiu:/etc/rspamd$ sudo mkdir /var/vmail
    ubuntu@raspiu:/etc/rspamd$ cd /var/vmail
    ubuntu@raspiu:/var/vmail$ sudo mkdir -p auth.d/xxxx.xx
    ubuntu@raspiu:/var/vmail$ sudo mkdir -p xxxx.xx/xxx/maildir
    ubuntu@raspiu:/var/vmail$ sudo mkdir -p xxxx.xx/isso/maildir
    ubuntu@raspiu:/var/vmail$ sudo chown 5000 xxxx.xx/xxx/maildir
    ubuntu@raspiu:/var/vmail$ sudo chown 5000 xxxx.xx/isso/maildir
    
  • パスワードハッシュを作成

  • パスワードファイルを作成

    sudo vi auth.d/xxxx.xx/passwd
    
    • 内容は以下のようにする
      xxxx@xxxx.xx:$6$xxxx$xxxxxxxx:5000:5000::/var/vmail/xxxx.xx/xxx::userdb_quota_rule=*:storage=1G
      isso@xxxx.xx:$6$xxxx$xxxxxxxx:5000:5000::/var/vmail/xxxx.xx/xxx::userdb_quota_rule=*:storage=1G
      mail address:password hash   :*1  :*2:*3:home directory       :*4:*5
      *1: Used ID. 
      *2: Group ID. 
      *3: Comment/Full Name. 書くことがないので空欄
      *4: Login Shell. システムにログインできるユーザのリストを書くためのpasswd(5)の
            形式を使っているため枠が存在するが、書くことがないので空欄
      *5: passwd(5)には無い枠。Dovecotのプラグイン設定。
      

起動させる

  • インストール時点で自動起動の設定はされています。 再起動をかければ動くはずですが、動かなかった場合、ログなどを参照してアドリブでがんばります。
    • systemdに対して出力した内容を見る。
      systemctl status postfix
      systemctl status dovecot
      systemctl status rspamd
      systemctl status clamav-daemon
      
    • 各ソフトウェアのログ
      • /var/log/mail.log
      • /var/log/rspamd/rspamd.log

Webサーバの設定(コメント欄編:Isso)

  • Issoの公式の説明を参考にしております。

  • 前回とほぼ同様ですが、 以下の点を変更しています。

    • aptを使用した
    • GitHubの最新版に変更した(pip版は壊れているため)
  • 必要ツールをインストールする。

    ubuntu@raspiu:/var/isso$ sudo apt install python3-virtualenv python3-dev npm \
        uwsgi uwsgi-plugin-python3
    
  • virtualenvを準備する。

    ubuntu@raspiu:~$ sudo mkdir /var/isso
    ubuntu@raspiu:~$ cd /var/isso
    ubuntu@raspiu:/var/isso$ sudo chown ubuntu:ubuntu ./
    
    • virtualenvを作成して有効化
      ubuntu@raspiu:/var/isso$ virtualenv env
      ubuntu@raspiu:/var/isso$ . env/bin/activate
      
  • virtualenvにIssoをインストールする

    • gitリポジトリを取得
      (env) ubuntu@raspiu:/var/isso$ git clone https://github.com/posativ/isso.git
      (env) ubuntu@raspiu:/var/isso$ cd isso
      
    • bower、require.jsを取得
      (env) ubuntu@raspiu:/var/isso/isso$ npm i bower jade uglify-js requirejs
      
    • IssoのJavascriptをビルド
      (env) ubuntu@raspiu:/var/isso/isso$ PATH=/var/isso/isso/node_modules/.bin:$PATH make init js
      
    • virtualenvにインストール
      (env) ubuntu@raspiu:/var/isso$ pip install ./isso
      
  • Issoの設定

    (env) ubuntu@raspiu:/var/isso$ vi isso.conf
    
    • 設定内容は以下の通り
      [general]
      dbpath = /var/isso/data/comments.db
      host = http://xxxx.xx/
      max-age = 15m
      notify = smtp
      
      [moderation]
      enabled = true
      
      [smtp]
      username = isso@xxxx.xx
      password = xxxx
      host = raspiu.airport
      port = 587
      security = starttls
      to = xxx@xxxx.xx
      from = isso@xxxx.xx
      timeout = 10
      
  • uWSGIの設定(この場所に置くことで自動起動設定も兼ねる)

    (env) ubuntu@raspiu:/var/isso$ sudo vi /etc/uwsgi/apps-available/isso.ini
    
    • 設定内容は以下の通り
      [uwsgi]
      socket = 127.0.0.1:8080
      master = true
      ; `nproc` = 4 on raspberry pi 4 
      processes = 4
      cache2 = name=hash,items=1024,blocksize=32
      ;
      spooler = /var/isso/mail
      plugin = python3
      module = isso.run
      virtualenv = /var/isso/env
      env = ISSO_SETTINGS=/var/isso/isso.conf
      
    • 有効化
      (env) ubuntu@raspiu:/var/isso$ sudo ln -s ../apps-available/isso.ini /etc/uwsgi/apps-enabled/
      
  • 環境の準備

    • SMTPサーバの証明書を受け入れるように、証明書を登録
      (env) ubuntu@raspiu:/var/isso$ sudo cp /etc/ssl/localcerts/server.cer /usr/local/share/ca-certificates/server.crt
      
    • パーミッション設定
      (env) ubuntu@raspiu:/var/isso$ mkdir mail data
      (env) ubuntu@raspiu:/var/isso$ touch data/comments.db
      (env) ubuntu@raspiu:/var/isso$ sudo chown www-data:www-data data data/comments.db mail
      
      • comments.dbが置かれているディレクトリが書き込み可能でないと、 書き込みの際にエラーになる(一時ファイルを作るため?)。 そこで間にdataディレクトリを挟んでいる。
  • Issoの起動

    (env) ubuntu@raspiu:/var/isso$ sudo systemctl restart uwsgi
    

終わりに

何かと障害の多いサイトですが、今後もよろしくお願いします。