常時稼働の検証サーバー構築

非力なノートパソコンで色々な検証は無理

ちょっとした検証や学習用として、ミスって止めても問題の起こらないサーバーとして、最新のラズベリーパイ Raspberry pi 4 B+ 4GB を購入して構築を始めました。

なおここから記述している作業は基本的に、Linux の Ubuntu が稼働しているパソコン上での作業が中心です。一部でターゲットとして構築している Raspberry pi 本体での作業の場合もあります。

構築を始めたサーバーの利用目的

最大の目的は、プライベート写真を公開している現在のウェブシステムでは、単純に写真を撮影日を元にしてディレクトリに入れて、単純なインデックスを付けているだけなので、特定な条件により選び出すような使い方ができません。

公開システムの構築を思い立った頃に、データベースの知識不足とセキュリティを考慮したシステムを作る自信が無かったこともあって、そのまま大幅な改修もできないまま現在に至っています。

当時気にしていたのはSQLインジェクション

当時はSQLインジェクションなんて呼ばれている攻撃で、データベースシステムが改ざんされる話があちこちで騒がれていたし、データベース未使用でも色々な攻撃でダウンさせられる事件も頻繁に起きていたので、可能な限り最低限の運用に重点を置いていました。

最低限なシステムが功を奏したのか、ヤドカリのように何世代にも渡って殻 (サーバー) を乗換えながらネットに公開していましたが、まだ改ざんされた経験はありません。ちょっと心配になるくらい切れ目なく攻撃の記録がログに残されています。

真の目的は、何の事はないSQL言語の学習用

今のプライベート公開写真のシステムは、データベースを利用しないで、サーバー側で動作する Ruby言語のスクリプトと、端末側で動作する JavaScript の記述を組合せて構築していますが、サーバー側での Ruby スクリプトからデータベースを利用して効率的な検索ができるようになれば、見たい写真の選択が容易になって理想だろうと考えてます。

今回のシステム構築の備忘録

項目リスト

  1. Raspberry pi 4 B+ 、電源アダプタ、ケース類を 購入
  2. Raspbian 最新版のダウンロード と microSD 32GB Class10 への書込み
  3. USBキーボード、マウス、 micro HDMI へモニタを接続してシステム起動
  4. 表示に従って、キーボード種別や言語を指定、その他の問いに答えて初期設定
  5. リブート、初期設定システムの確認と最新アップデートの適用
  6. 初期起動は、microSD で、実システムには、2.5インチ USB ハードディスクへ
  7. vi コマンドで編集するため、vimの設定
  8. 初期設定済み pi ユーザーを sunao ユーザーに置き換え
  9. 基本はリモート作業で利用するため、RSA秘密鍵の生成と SSHの設定
  10. リモート操作で基本の仮想端末 byobu / screen の設定
  11. サーバー内からメールを転送することができる設定
  12. Logwatch と Cron の動作確認

検討内容や作業内容

1.Raspberry pi の機材購入

後の事を考えて最新版で最大メモリ搭載を選択

今回は、サーバーとして利用する予定なので、Wi-Fiや4GBのメモリも全く必要がないのですが、後々不要となって再利用を考えた場合、パソコンとしてセットアップしてみたり、別のOSを入れてみたりと考えると、現時点の最新最上で導入していても良いかなと思い、それに沿った Raspberry pi と ケース、micro HDMIケーブル、電源を一緒に購入しました。

手持ちのものは有るもので間に合わせ

行く行くは入出力を直接持たない単体のサーバーとして稼働の予定なので、初期のセットアップでの間に合せで使用する microSD や キーボード、マウスは使い古しの余っているもので代用させます。

実行時にシステムディスクとして常設する予定の USBハードディスクは、過去に公開ウェブサーバーで使用していたものをパーティションを再定義しての流用を考え購入しません。

2.OSのダウンロードとmicroSDへのセットアップ

OSは最新版のRaspbian

システムは、一般的な Raspbian の最新版のデスクトップを含むフルサイズのものを公式サイトから普通にダウンロードしました。 sha256sum コマンドでエラーのないことを確認してから解凍し、–.img ファイルを作成しました。

$ cd download-dir
$ ls
2020-02-13-raspbian-buster-full.zip

$ sha256sum 2020-02-13-raspbian-buster-full.zip
  〜〜しばらく時間がかかりハッシュチェック完了〜〜
c9c382b659bd96b859ccb9e2ac0c2292a91a37c286ab464f2f380d451077663d  2020-02-13-raspbian-buster-full.zip
$ unzip *.zip
$ ls
2020-02-13-raspbian-buster-full.img  2020-02-13-raspbian-buster-full.zip

手持ちの 32GB microSD Class10 のものに、単純に dd コマンドで書込みました。

$ sudo dd if=2020-02-13-raspbian-buster-full.img of=/dev/mmcblk0 bs=4096
   〜〜しばらく時間がかかり書込み完了〜〜

3.初期設定に必要な機材の接続と電源投入

前述でシステムを書き込んだ microSD を Raspberry pi 本体に挿入し、USBマウス、USBキーボードを接続します。

モニター表示のためにテレビを用意して、HDMIケーブルを接続します。ケーブルの反対側の micro HDMI コネクタを、2つ有る micro HDMI ポートの Raspberry pi 本体電源供給用 Type-C 寄りの HDMIポートに接続します。

必要なものを接続したら電源ON

最後に電源供給用の USB Type-C のポートに 5V電源アダプタを接続して電源ONします。しばらくするとテレビのモニタには、並んだラズベリーマークを表示して動作を始めます。

作成したシステム用の microSD は、固定サイズの 2パーティション構成で作成されて残りのエリアが空きのままなので、システムパーティション(第2パーティション ext4)に残り全てのエリアを取り込むために少し経つと勝手にリブートします。

その度に進化していて初期化手順が異なります

初期のラズベリーパイから何度も初期設定していますが、毎回改良され進化しているので、都度操作手順も設定項目も変わっていて、操作手順を詳細に記録してもあまり意味がないようです。

4.言語やタイムゾーンの初期設定を行います

操作している Raspberry pi 4 B+ 本体を今後はラズパイと省略して呼ぶことにします。ラズパイも初期化する度に初期化の手順や動きが異なりますので、モニターに表示された問に対して返答しながら必要な項目を設定していきます。

日本語の言語選択や Japan / Tokyo 等のタイムゾーン、キーボードの種類の設定も、ただ選択するだけで設定できてしまいます。以前は苦労しながらフォントやキーボード等をカスタマイズしたのが嘘のように簡単です。

インターネットに接続するために、Wi-Fiに接続しますが、これも聞かれるままに接続ポイントとパスワードを指定するだけです。複数の接続ポイントが存在していて、複数を設定するならモニター右上の無線の扇マークのクリックから設定できます。

5.初期設定システムの確認と最新アップデート

リブートして立上がると指定した日本語のデスクトップ画面になっていて、システム時間も日本の時間になっています。画面からターミナルを起動して date コマンドを入力すると一般的な日本の時間が表示されます。

$ date
2020年  3月 29日 日曜日 17:43:47 JST

最新へアップデートを行っておきます。

$ sudo apt update
  〜〜リストされ時間が掛かります〜〜
$ sudo apt -y upgrade
  〜〜少しずつリストされ時間が掛かります〜〜

6.システムパーティションを USBハードディスクへ

現時点のシステムディスクは microSD

現時点で、システムパーティションが microSD 32GB Class10 の第2パーティションになっています。

ラズパイ 3 ならば、USBディスクにシステムを入れて直接起動もできるとネットに情報が上げられています。しかし、ラズパイ 4 ではまだ対応できていないとの情報があって、色々調べましたが現時点ではそれが真実のようです。

microSDで初期起動して、USB-HDDで稼働させます

今までの家屋内で稼働しているラズパイと同様に、起動には microSD の第1パーティションを使い、実際に稼働するOSをUSBハードディスクのパーティションに作成する方法を利用することにします。

再利用なのでパーティションを見直します

まずシステムパーティションやデータの格納パーティションになる USBハードディスクの設定です。前に他で利用していたものの再利用ですので、パーティションの削除から行います。

$ sudo fdisk /dev/sdb

結果として次のような構成に設定しました。今回利用するのは 1TB 2.5インチ USB3.0 のハードディスクです。

作業を後からまとめるつもりで作業していたわけではなかったので、作業中の情報を残していませんでした。そのため次のリストは、後からラズパイの実機立上げ後にリストしたものなので /dev/sda となっています。パソコンで作業している時は、外付けなので /dev/sdb として作業しました。

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Rikiki USB 3.0  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xa51bb4e8

Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1  *          2048    4196351    4194304     2G  b W95 FAT32
/dev/sda2          4196352   46139391   41943040    20G 83 Linux
/dev/sda3         46139392   67110911   20971520    10G 82 Linux swap / Solaris
/dev/sda4         67110912 1953525167 1886414256 899.5G  5 Extended
/dev/sda5         67112960  234885119  167772160    80G 83 Linux
/dev/sda6        234887168 1178605567  943718400   450G 83 Linux
/dev/sda7       1178607616 1953525167  774917552 369.5G 83 Linux

次にパーティションにラベルを付けて、以下のように初期化しました。

$ sudo mkfs.ext4 -L rootfs /dev/sdb2    …これがシステムパーティションになる
$ sudo mkswap -L swap /dev/sdb3
$ sudo mkfs.ext4 -L home /dev/sdb5
$ sudo mkfs.ext4 -L share-data /dev/sdb6
$ sudo mkfs.ext4 -L data /dev/sdb7

UUID 等を確認するため blkid コマンドでリストして確認しておきます。以下のリストは控えるのを忘れたため、後から実機上で確認したものなので形式が少し異なっているかもしれません。

$ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="9969-E3D2" TYPE="vfat" PARTUUID="97709164-01"
/dev/sdb2: LABEL="rootfs" UUID="b1be8a91-ebb8-48f9-a617-9ec4d400fe55" TYPE="ext4" PARTUUID="a51bb4e8-02"
/dev/sdb3: LABEL="swap" UUID="223a9d6f-29bf-4e03-8c89-2d2d96334d5b" TYPE="swap" PARTUUID="a51bb4e8-03"
/dev/sdb5: LABEL="home" UUID="b92fd514-5428-4707-a74b-003754b08bca" TYPE="ext4" PARTUUID="a51bb4e8-05"
/dev/sdb6: LABEL="share-data" UUID="220b06fa-d717-4243-8427-879b0621357f" TYPE="ext4" PARTUUID="a51bb4e8-06"
/dev/sdb7: LABEL="data" UUID="7e720f4d-acb1-4cc1-b85a-1da166507375" TYPE="ext4" PARTUUID="a51bb4e8-07"
/dev/mmcblk0: PTUUID="97709164" PTTYPE="dos"
/dev/sdb1: PARTUUID="a51bb4e8-01"

システムパーティションをハードディスクに移動し確認

次にシステムパーティション(P2)をUSBハードでテスクにコピーして、一部設定を変更してシステムが起動することを確認します。

  〜〜microSDの挿入で自動マウントしたのをアンマウント
$ sudo umount /dev/mmcblk0p1
$ sudo umount /dev/mmcblk0p2

  〜〜作業用マウントポイントの確認
$ ls /mnt
  〜〜システムパーティションの転送元と転送先のマウント
$ sudo mount /dev/mmcblk0p2 /mnt/work
$ sudo mount /dev/sdb2 /mnt/sdb2
  〜〜そのままコピー
$ sudo rsync -a /mnt/work/ /mnt/sdb2/

  〜〜次にシステムマウント用の /etc/fstab を編集
$ sudo vi /mnt/sdb2/etc/fstab
  ---------次が編集後の最終結果-----
proc            /proc           proc    defaults          0       0
PARTUUID=97709164-01  /boot           vfat    defaults          0       2
PARTUUID=a51bb4e8-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

  〜〜システム用パーティションをアンマウントし
       起動用パーティションをマウント
$ sudo umount /mnt/work
$ sudo mount /dev/mmcblk0p1 /mnt/work
  〜〜起動用のコマンドライン定義を変更
$ sudo ls /mnt/work
$ sudo vi /mnt/work/cmdline.txt
  ---------次に USBハードディスクのパーティションをシステムに変更
console=serial0,115200 console=tty1 root=PARTUUID=a51bb4e8-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

  〜〜作業したマウントを開放する
$ sudo umount /mnt/work
$ sudo umount /mnt/sdb2

この状態で修正した、microSD と USBハードディスクをラズパイに挿入して、起動できるか確認します。

利用価値のない microSD を起動に活用

この構成で起動できることが確認できましたので、起動に利用する microSD を入替えたいと思います。

入替える理由は、自分の手持ちの中に容量も少なく速度も遅く、ほとんど利用価値のない microSD 4GB Class4 があり、このシステムでは 1度起動されれば稼働中はほとんどが USBハードディスクでの動作になるため、大きな問題が無いと考えてこちらに置き換えます。

まず正常に起動した 32GB の microSD を作業用パソコンに挿入します。そしてdd コマンドで、microSD 全域を1ファイルとして作業用パソコン内に一時ファイルとしてコピーします。そして取り出してから置換える 4GB の microSD を作業用パソコンに挿入してコピーします。

  〜〜元になる 32GB の microSD を作業用パソコンに挿入
  〜〜microSD 全域をファイル名 mmcblk0 としコピー
$ sudo dd if=/dev/mmcblk0 of=mmcblk0 bs=4096
  〜〜置換える 4GB の microSD に交換して
  〜〜ファイル名 mmcblk0 を microSD にフルコピーする
$ sudo dd if=mmcblk0 of=/dev/mmcblk0 bs=4096

実際には、パラメータの bs= の数値を大きくしてコピーするブロックサイズを大きくした方が作業が早くなると思われます。そして、物理的なサイズが違うため、エリアが足らないとエラーになりますが、起動に必要な第1パーティション部分は全く問題なくコピーされています。

7.普段使いのエディタ vim の整備

リモートで操作してコマンドで整備したり利用したりするために、普段常用しているエディタ vim のフルセットを導入して設定を変更しておくことにします。

マウスのクリックで勝手にビジュアルモードになってしまう

マウスを使用して操作することが多いのですが、マウスのクリックで使用することのないビジュアルモードに勝手に移行してしまう問題があります。これを回避する設定が有るようなのでその設定を行います。

vim の定義ファイルが、各ユーザーのホームディレクトリに置かれているので、そのファイル .vimrc に、呪文のような1行を追加しておきます。

$ cat .vimrc
set mouse-=a

コマンドの履歴を確認できる環境へ

ついでに標準のシェル bash の設定にもカスタマイズを加えておきます。通常のシェルとして起動される bash は、ユーザーのホームディレクトリに .bashrc として設定ファイルを持っています。

色々な設定の雛形がコメントとして記述されているので有効にして、再起動するだけで利用できるものもあります。

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=100000
HISTFILESIZE=100000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

   〜〜所々省略してます
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'

# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
   〜〜所々省略してます
export HISTTIMEFORMAT='%F %T '
export PROMPT_COMMAND='history -a; history -c; history -r' # 履歴のリアルタイム反映

色々な設定値を試してみながら、都度カットアンドトライしてみて馴染むものを残せば良いのだと思います。

8.規定値の pi ユーザーを sunao に置き換え

今まで利用しているユーザー名 sunao を複数の既存システムと統一して作業するのに、デフォルトの pi ユーザーのままでは色々と支障が出てきます。そのため uid:1000 を pi から sunao に入替えて、pi は 1001 として残しておきます。

関係するファイルは、rootユーザーで変更してしまいます。実行するコマンドは次のコマンドです。

  • vipw / vipw -s
  • vigr / vigr -s
  • visudo
# vipw
    〜〜前後省略 該当部分のみ〜〜
sunao:x:1000:1000:,,,:/home/sunao:/bin/bash
pi:x:1001:1001:,,,:/home/pi:/bin/bash
    〜〜

:pi から :sunao に置換する場合は、viエディタ内でのコマンド操作で、 :%s/:pi/:sunao/g のように行うと一括で置換されます。

9.リモート認証の鍵生成

ssh を利用してリモート作業を行うのに、パスワード入力の認証は煩わしいのと、外部からパスワードを繰り返しチャレンジされるセキュリティの問題を回避するために、秘密鍵と公開鍵を生成してお互いに接続する環境を整えます。

接続する側をクライアント、接続される側をサーバーと呼び、考え方としてはクライアント側のユーザーが、ssh-keygen コマンドを実行するとデフォルトでは、ユーザーのホームディレクトリに .ssh サブディレクトリが作成されて、その中に秘密鍵と公開鍵のペアが生成されて置かれます。

鍵の生成例

ユーザー名: test で rsa 鍵を生成して、生成された .ssh ディレクトリのリストを表示しています。 id_rsa が秘密鍵で、id_rsa.pub が公開鍵になります。公開鍵の内容イメージも例示しておきます。

test@working:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): 
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WgJ+bZ4WB2zKR8DqhtCeinpQlLgyTtfdCac/OnGnQFw test@working
The key's randomart image is:
+---[RSA 2048]----+
| . . ..          |
|. o   .+ E       |
| +  o.o @ .      |
|=.oo.+ X +       |
|+=.+. * S .      |
|..+ o. X B .     |
|.o .  . O +      |
|o .    + .       |
|o.      .        |
+----[SHA256]-----+


test@working:~$ ls -al .ssh
合計 16
drwx------ 2 test test 4096  4月 13 15:47 .
drwxr-xr-x 3 test test 4096  4月 13 15:47 ..
-rw------- 1 test test 1823  4月 13 15:47 id_rsa
-rw-r--r-- 1 test test  394  4月 13 15:47 id_rsa.pub


test@working:~$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8TsyIMEyb6OSY3V6uqX+kzlcuHowJImBIseyoJcRgSIcJvGtECVxVg9UjN41elMsF213ycDSjOpwnvDbFERfRqdxdyZaqehPO1+sRamgzTl6lzjSwFJIThwkcOM4ybNYHzqiNqKAxnOPgA5/HzJTBQINvmESkW8J4NbIrkjG6QsL2HOffC2ssnunFdvgeFPLSlxUi4mmdeuavX/F0dIa4IfTojirS6l8K9bKNQQ7j8HgaXBfZmIHpG/6iOnl+NvK/dQ53RGG0TVdrfEwxNzhdMVZ5mSPOpwuIs5gnYb3Of4sW6fc2boGr5lMSNx/7NrXzE6YDj1kpKvD1H7dPEfBP test@working

鍵認証でリモートログインするには

鍵を生成したクライアントのユーザーが、リモートで接続するサーバー側ユーザーのホームディレクトリの .ssh に置かれた authorized_keys ファイルに生成した公開鍵の情報を追加で丸コピーします。もしファイルがなければ新規に作成します。

authorized_keys ファイル内にコピーされている公開鍵とペアになる秘密鍵を持つユーザーが鍵認証でリモートログインできるようになります。セキュリティ上の課題はありますが、秘密鍵を流用コピーして接続することが可能です。

生成する鍵には、パスワードやパスフレーズを含めてセキュリティを向上させることは可能ですが、常時稼働する特定のサーバー同士で特定のファイルやディレクトリ等を rsync コマンド等を利用して自動でバックアップコピーさせるような使い方では、お互いの root ユーザーがパスフレーズ無しで認証できれば人手介入の必要がありません。

鍵認証できればパスワード認証禁止へ

鍵認証でのリモートログインの確認ができれば、セキュリティの脅威になるパスワード認証をできないように変更します。パスワードやパスフレーズを省略して生成した鍵認証でのログインはパスワードを求められることもなくストレス無く作業が進められます。

$ sudo vi /etc/ssh/sshd_config
    〜〜該当する部分の近くのみ表示
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
    〜〜

10.リモートで操作するために byobu 設定

リモート接続の環境では意図しない色々な状況で接続が切れます。でも byobu を導入して作業していれば、仮に接続が切れてもサーバー側では処理が継続したままで、再び接続すれば以前の状態に復帰したり、切断した後も実行していた結果を後から確認することも可能になります。

趣味や趣向的な好みの問題でしょうか、byobu と screen の組合せが好きで、仮想端末の byobu をコントロールするキー割り当て (エスケープ文字と呼びます) を Ctrl (コントロール) +B キーにするのが好みでそれに置き換えます。

簡単な操作でリモート接続

byobu は、使い慣れると手放せない機能で、リモートの仮想端末から ssh 接続すると、以前に切断した時の画面に戻って操作の継続が可能になります。再び ssh 接続を終了して切断するのも、単に [F6]キーを押下するだけです。

設定の手順

まず ssh でリモート側から、サーバーの ipアドレス (と必要ならユーザー名) を指定してリモートからログインします。ログインは自動的に行われるため、そのままログインしたサーバー側ユーザーの打鍵待ちとなるプロンプトが表示されます。

最初に byobu [Enter] と打鍵して byobu を起動します。標準では tmux と連携しているので、 byobu+tmux の画面が表示されます。次のように選択して byobu+screen に変更します。

$ byobu-select-backend 

Select the byobu backend:
  1. tmux
  2. screen

Choose 1-2 [1]: 2

エスケープ文字と呼ぶ仮想端末 byobu を制御するためのコマンド文字を変更します。画面は崩れますが、[F9]キーの押下で次のメニューが表示され、そこで Change escape sequence を選択するとエスケープ文字の変更ができます。ここでは A から B に変更しました。 ⇒ Escape key: ctrl-B_

┌────────────────────┤  Byobu Configuration Menu │                                                                      │                                                        
│                                                                      │                      
│     Help -- Quick Start Guide                                        │                      
│     Toggle status notifications                                      │                      
│     Change escape sequence                                           │                      
│     Byobu currently launches at login (toggle off)                   │                      
│                                                                      │                      
└──────────────────────                                                                       

最終的に変更された定義ファイルは、次の内容です。

$ cat .byobu/keybindings
source $BYOBU_PREFIX/share/byobu/keybindings/common
bindkey "^B"
escape "^Bb"
register x "^B"

このままでは、ssh でリモートログインしても自動的に byobu は起動しないので、自動起動と自動終了を有効にする変更を行います。

$ byobu-enable

The Byobu window manager will be launched automatically at each text login.

To disable this behavior later, just run:
  byobu-disable

これで byobu の設定が完了しました。

11.メール転送できる環境を整備

設定用の雛形からコピーして、設定ファイル main.cf を作成します。以前の情報でアナウンスされていた雛形の置き場所以外に、最新のパッケージには .proto の文字列を付加した雛形が同包されているようです。

雛形をコピーして項目の設定

$ sudo cp /etc/postfix/main.cf.proto /etc/postfix/main.cf   # … 雛形をコピー
$ sudo vi /etc/postfix/main.cf
    〜〜コメントも挿入されていて長いので有効行のみ

compatibility_level = 2 command_directory = /usr/sbin daemon_directory = /usr/lib/postfix/sbin data_directory = /var/lib/postfix mail_owner = postfix
myhostname = working.sunao-mita.pgw.jp
mydomain = sunao-mita.pgw.jp
myorigin = $myhostname
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain local_recipient_maps = unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8, [::ffff:127.0.0.0]/104, [::1]/128, 192.168.11.0/24, [240d:1a:34d:7f00::0]/64
relayhost = [smtp.nifty.com]:587
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name (Raspbian)

debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
#html_directory =

#manpage_directory =
#sample_directory =
#readme_directory =
inet_protocols = ipv4, ipv6

# 最終行へ追記:送受信メールサイズを10Mに制限
message_size_limit
= 10485760

# メールボックスサイズを1Gに制限
mailbox_size_limit
= 1073741824

# SMTP-Auth 設定

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/nifty.auth
smtp_sasl_security_options = noanonymous

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination, permit_sasl_authenticated,reject

コピーした時点で最初から有効となっている行と、更新や挿入した行を抽出しています。追加や更新した行は、該当行の文字列を太くして表現しています。

@Nifty でリレーするための認証組込み

@Nifty に作成したメールをリレーしますが、送信する時点で、ユーザー名とパスワードによる認証を必要とします。次のような nifty.auth ファイルを作成して変換すると nifty.auth.db ファイルが生成されます。

$ sudo vi /etc/postfix/nifty.auth
[smtp.nifty.com]:587 --userid--:--password--

sudo postmap /etc/postfix/nifty.auth


$ ls -al /etc/postfix/
合計 176
drwxr-xr-x   5 root root  4096  4月 15 17:06 .
drwxr-xr-x 121 root root 12288  4月 13 16:12 ..
-rw-r--r--   1 root root    60  3月 22 09:42 dynamicmaps.cf
drwxr-xr-x   2 root root  4096  1月 15 23:05 dynamicmaps.cf.d
-rw-r--r--   1 root root 28057  4月 15 16:06 main.cf
-rw-r--r--   1 root root 27122  3月 22 09:42 main.cf.proto
lrwxrwxrwx   1 root root    31  3月 22 09:42 makedefs.out -> /usr/share/postfix/makedefs.out
-rw-r--r--   1 root root  6208  3月 22 09:42 master.cf
-rw-r--r--   1 root root  6208  3月 22 09:42 master.cf.proto
-rw-r--r--   1 root root    41  4月 15 17:06 nifty.auth
-rw-r--r--   1 root root 12288  4月 15 17:06 nifty.auth.db
-rwxr-xr-x   1 root root 29872  1月 15 23:05 post-install
-rw-r--r--   1 root root 10268  1月 15 23:05 postfix-files
drwxr-xr-x   2 root root  4096  1月 15 23:05 postfix-files.d
-rwxr-xr-x   1 root root 11532  1月 15 23:05 postfix-script
drwxr-xr-x   2 root root  4096  1月 15 23:05 sasl

同じ内容のファイルを変換しても、実行結果は同じ内容になるので、すでに動作している認証ファイルを今回はそのままコピーしてきます。ただし、 –userid– の部分と –password– の部分を @Nifty に接続してメールを読み込むための適正なユーザー名とパスワードに置き換えて、手順のコマンドの実行で認証用 db の nifty.auth.db が生成できます。

色々なユーザー宛に作成されたメールも root に集約

続いて各所で発生した通知等が発生した場合に、転送されてきて @Nifty へ集約されて確認ができるように、 aliases ファイルを定義して有効に設定します。

$ sudo vi /etc/aliases

# See man 5 aliases for format
postmaster:    root

# /etc/aliases
mailer-daemon: postmaster
munin: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
csgboxuser: root
webadm: root

pi: sunao
root: sunao
sunao: sunao.mita@nifty.com


$ sudo newaliases
$ sudo systemctl start postfix.service

メール送信テストでエラーとなってしまった

メール送信のテストをしてもログを確認するとエラーが出ているようで、@Nifty には送られていないようです。構築しようとしているラズパイと同じバージョンの公開サーバーでは問題なく送信できているので、/etc/postfix ディレクトリ内のファイルを見比べたり、main.cf と master.cf を同様に修正してみましたが同様のエラーが継続しています。

実績の有るシステムと構成を比較してみる

エラーの内容には、SASL と表示されているため @Nifty の認証時点のエラーのようです。ネットの検索情報から sasl2-bin をインストールしていますが、それ以外にも必要なモジュールが不足しているような気がします。

   〜〜構築中の sasl のインストールリスト〜〜
$ sudo apt list --installed | grep sasl

libgsasl7/stable,now 1.8.0-8+b1 armhf [インストール済み、自動]
libsasl2-2/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
libsasl2-modules-db/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
sasl2-bin/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]

   〜〜公開しているサーバーのインストールリスト〜〜
$ sudo apt list --installed | grep sasl

libauthen-sasl-perl/stable,now 2.1600-1 all [インストール済み]
libgsasl7/stable,now 1.8.0-8+b1 armhf [インストール済み、自動]
libsasl2-2/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
libsasl2-modules-db/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
libsasl2-modules/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
sasl2-bin/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]

比べると相違が有るのは明らかですが、これがエラーの原因だったようです。違いのどちらが原因か、両方必要だったのかは検証していません。

バージョンにより多少パッケージに相違あり

数年前からラズパイのサーバーを家で何台稼働させていますが、Raspbian のバージョンに相違があってパッケージ構成も少し変更されているようです。最新のラズパイに置き換えた公開サーバーと今回設定中のラズパイでは、バージョン 10 ですが、以前のサーバーではバージョン 9 のようです。

なお、master.cf に関しては、雛形の master.cf.proto の内容に戻しても影響なく @Nifty では認証できていました。今回はメールの転送を組込むだけでハマってしまいました。3日以上悩んでやっとの解決でした。

12.システムログを監視する Logwatch の組込み

メール転送機能を動作させられたので、ログを監視してメールでレポートを送信できる機能の組込みを行います。この機能は毎日明方頃に実行されて、前日の色々な処理の履歴から抽出した情報をレポートとして通知してきます。

いつも見ているわけではありませんが、異常に気が付いた時に過去のレポートを見直したりできるので有効な機能だと思っています。

$ sudo apt install logwatch
他のサーバー類と同様に監視メールが届き完了

Logwatch によるメールが、@Nifty の私宛に届いていたので、やっと基本的な機能の組込みが完了しました。これでやっと出発点に辿り着きました。これからが検証用のサーバーとしての設定の始まりです。思っていたより長く時間が掛かりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)