FreeBSD 12で自宅サーバの構築　基本システム編その１

## はじめに
FreeBSD 12を使用した自宅サーバの構築を行った。FreeBSD 12はリリースされて間もない状態ですが、カーネルに標準でVIMAGEが取り込まれDNSの外向きと、内向きを別々のシステム（jail+VIMAGE）が同一ホストで構築できることから採用することにしました。その時の構築手順を備忘録の意味も含め、具体的にいくつかに渡り説明する。

* [基本システム編その１](https://qiita.com/Chun3/items/2f891e5993c91b58ae5c)（この記事）
	- 背景
	- 基本のインストール
	- 日本語環境の設定
* [基本システム編その２](https://qiita.com/Chun3/items/1e8fe5071c4a78d37e66)
	- セキュリティ
	- ftpサーバ
* [基本システム編その３](https://qiita.com/Chun3/items/e5cc6a69542153649dc0)
	- jail
	- 基本システム編おわり
* [jail内基本システム編](https://qiita.com/Chun3/items/4b11b9acdd080ecdab6c)
	- 基本の設定（jail1・jail2共通）
* [DNS編](https://qiita.com/Chun3/items/95ad3113202d111ee53c)
 	- DNSの構築におけるこれまでの問題
 	- bind9インストール
 	- NTPサーバ
* [Let's Encrypt編](https://qiita.com/Chun3/items/4814c25c09756690133f)
 	- Let's Encryptについて
 	- certbotのインストール
 	- 各種設定
 	- 証明書の取得
* [Webサーバ編](https://qiita.com/Chun3/items/286e567952cd9faf279f)
 	- インストール（apache2.4・webalizer・php7.3・postgresql11.2・mysql8.0）
 	- 設定
* [メールサーバ編](https://qiita.com/Chun3/items/dc0e176c9de4f6b4bfb8)
 	- インストール（cyrus-sasl・postfix・dovecot・procmail・pflogsumm・policyd-spf）
 	- 設定・起動
 	- spfレコード送信設定
* [ファイルサーバ編](https://qiita.com/Chun3/items/356b7fadd7aa5280ec65)
 	- sambaの選択
 	- samba3のインストール
* [メールサーバ編その2](https://qiita.com/Chun3/items/4c15ee889b052df67bbd)
 	- 概要
 	- OpenDKIM
 	- OpenDMARC
 	- ClamAV (clamav-milter)
 	- Spamassasin (spamass-milter)

## 背景
これまでに、FreeBSDを使って自宅サーバを構築していましたが、PCを更新するごとに１からインストールしている。バーチャル環境を使ったほうが便利ではあるが、サーバソフトを見直すいい機会になると思い４～５年を目処に１から更新している。
最近の更新は昨年（２０１８年）であるが、その時はあまり時間が取れずサーバソフトを見直さなかったが、今回Let's EncryptによるSSL化を採用したく、サーバソフトを全面的に見直すことにした。また、次回の再構築のために、ここに内容を残すことにした。
## 基本のインストール
### OSのインストール
インストールファイルをダウンロードしインストールをする。この部分の詳細は省略するが要点は以下です。

* 使用しているキーボードの設定
* パーティーションの選択でZFSを選択
* ネットワークの設定
* タイムゾーンの選択
* ユーザを追加（wheelグループに属するようにすることでrootになれる）

インストール時に設定した内容の確認（defaultrouter・nameserverは192.168.1.1にある。キーマップは使用しているキーボードに合わせる）

```/etc/rc.conf
hostname="server1"
keymap="us.kbd"
ifconfig_em0="inet 192.168.1.32 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"
```

```/etc/resolv.conf
search example.jp
nameserver 192.168.1.1
```

今後殆どの作業はrootで行うがプロンプトが'%'の場合は一般ユーザによる操作、'#'の場合はrootによる操作を表す。
sudoコマンドは、自分の感覚にあっていないので以下のようにrootになって作業を行う（suでrootになる場合はwheelのグループにいる必要がある）。

```
% su
Password:
#
```

### sshの設定
デフォルトでsshdは作動しているのが、設定を一部変更する
最初にキーを作成する

```
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5dFO3WW5l4utZHby7gWcLqQn3SOIYeNmNcyvHZiWvZg hoge@server1
The key's randomart image is:
+---[RSA 2048]----+
|                +|
|           . . +.|
|          o o . +|
|         = + . +.|
|        S * o * o|
|       o = % O = |
|        = O % O .|
|       o . B * o.|
|          E o oo |
+----[SHA256]-----+
```

~/.ssh/id_rsaファイルをTeraTermなどに設定することで接続できるようになる。（詳細は省略）
sshd_configファイルをについて以下のように変更する。
現在Protocolは2に固定になっているので設定するところがない。rootのログインについてのみ変更する。
設定できる値は以下である。

| 値 | 説明 |
|:-:|:-:|
| yes | rootユーザのログインを許可 |
| no | rootユーザのログインを拒否 |
| without-password | パスワードを使用したrootユーザのログインを拒否 |
| forced-commands-only | rootユーザのログインは拒否するが、root権限のコマンドはアクセスを許可 |

ここではバックアップ作業を行いたいため以下の設定を追加する

```sh:/etc/ssh/sshd_config
PermitRootLogin forced-commands-only
```

sshdに設定を読み込ませる

```
# service sshd reload
Performing sanity check on sshd configuration.
```

これで、TeraTermなどから広い画面を使って作業ができるようになる。
### OSのアップデート
最初に最新のバージョンにアップデートする

```
# freebsd-update fetch
src component not installed, skipped
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update2.freebsd.org... done.
Fetching metadata signature for 12.0-RELEASE from update2.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 71 patches.....10....20....30....40....50....60....70 done.
Applying patches... done.
Fetching 1 files... done.
以下省略（更新されるファイルなどが表示される）
# freebsd-update install
src component not installed, skipped
Installing updates... done.
# reboot
```

### portsの初期化
今回、パッケージのインストールはpkgコマンドを優先するが、コンパイルオプションを変更したい時はportsから自前でコンパイルすることになる。そこで、portsを準備する。

portsファイルをダウンロードする

```
# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 6 mirrors found.
Fetching public key from ec2-ap-northeast-1.portsnap.freebsd.org... done.
Fetching snapshot tag from ec2-ap-northeast-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Fri Feb 15 09:31:00 JST 2019:
b658f6e10fdde50332f502a8167b717f9d8b92dd4ea98d          84 MB 4259 kBps    20s
Extracting snapshot... done.
Verifying snapshot integrity... done.
Fetching snapshot tag from ec2-ap-northeast-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Updating from Fri Feb 15 09:31:00 JST 2019 to Fri Feb 15 10:06:21 JST 2019.
Fetching 5 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 1 patches.
(1/1) 100.00%  done.
done.
Applying patches...
done.
Fetching 0 new ports or files... done.
# portsnap extract
ports collectionのファイル展開表示される（省略）
Building new INDEX files... done.
```

### OS・portsのメインテナンス
portsの自動メインテナンスを以下のシェルソフトで1日に一回行う。

```sh:/usr/local/sbin/ports_admin.sh
#!/bin/sh
#
#       ports
/usr/sbin/portsnap cron update
/usr/sbin/pkg version -v |/usr/bin/grep -v =
```

実行権限をもたせる

```
# chmod +x /usr/local/sbin/ports_admin.sh
```

portsのアップグレードとOSのアップグレードを行うクローン設定

```sh:/etc/crontab
# Ports update
15      0       *       *       *       root    /usr/local/sbin/ports_admin.sh
30      1       *       *       *       root    /usr/sbin/freebsd-update cron
```

### rootへのメールを自分宛にする

```sh:/etc/aliases
root:           hoge1@exsample.jp
```

```
# newaliases
```

### pkgのレポシトリ
標準で/etc/pkg/FreeBSD.confでquarterlyになっているがlatestを選択することもできる。最新版を追っかける時はlatestに変更する。
しかし、直接このファイルを編集するのではなく/usr/local/etc/repos/FreeBSD.confを作成する書かれている。

```sh:/usr/local/etc/pkg/repos/FreeBSD.conf
FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest" }
```

```
# mkdir -p /usr/local/etc/pkg/repos/
# echo 'FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest" }' > /usr/local/etc/pkg/repos/FreeBSD.conf
# pkg update
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:12:amd64/latest, please wait...
Installing pkg-1.10.5_5...
Extracting pkg-1.10.5_5: 100%
Updating FreeBSD repository catalogue...
pkg: Repository FreeBSD load error: access repo file(/var/db/pkg/repo-FreeBSD.sqlite) failed: No such file or directory
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   1.1MB/s    00:06
Processing entries: 100%
FreeBSD repository update completed. 31955 packages processed.
All repositories are up to date.
```

### portupgradeのインストール
portsのコンパイルはportupgradeを使用すると便利なのでこれをインストールする

```
# pkg install portupgrade
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.10.5_5...
Extracting pkg-1.10.5_5: 100%
Updating FreeBSD repository catalogue...
pkg: Repository FreeBSD load error: access repo file(/var/db/pkg/repo-FreeBSD.sqlite) failed: No such file or directory
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   6.7MB/s    00:01
Processing entries: 100%
FreeBSD repository update completed. 32068 packages processed.
All repositories are up to date.
Updating database digests format: 100%
The following 9 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        portupgrade: 2.4.16,2
        ruby: 2.4.5_1,1
        libyaml: 0.2.1
        libunwind: 20170615
        libffi: 3.2.1_3
        indexinfo: 0.3.1
        libedit: 3.1.20170329_2,1
        ruby24-bdb: 0.6.6_5
        db5: 5.3.28_7

Number of packages to be installed: 9

The process will require 95 MiB more space.
22 MiB to be downloaded.

Proceed with this action? [y/N]: y
以下省略
```

portupgradeのログを残すためにpkgtools.confを変更、デフォルトの設定の最後の部分を以下のように変更する

```/usr/local/etc/pkgtools.conf
-  PORTUPGRADE_ARGS = ENV['PORTUPGRADE']
+  PORTUPGRADE_ARGS = ENV['PORTUPGRADE'] || \
+       '-v -D -L /var/tmp/portupgrade-%s::%s.log'
```

## 日本語環境の設定
日本語コードはEUC-JPを採用する。そろそろUTF-8を考えたほうが良いようだが、これまでの資産などから、なかなか思いきれない。
以下のパッケージをインストールする。

* japanese/less
* libiconv
* 日本語マニュアル

### japanese/less
lessは標準でインストールされている。UTF-8は使えるようですがEUC-JP日本語コードが使えない。そこでjapanese/lessを使うのだが、japanese/lessは既にメインテナンスされていなく、バージョンはjapanese/lessが382に対しlessは530である。このことからも、UTF-8にしたほうが良いと思うが、EUC-JPを使うため以下のようにインストールする。

```
# pkg install japanese/less
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        ja-less: 382.262.03.01

Number of packages to be installed: 1

191 KiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching ja-less-382.262.03.01.txz: 100%  191 KiB 195.8kB/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing ja-less-382.262.03.01...
[1/1] Extracting ja-less-382.262.03.01: 100%
```

jlessをlessで起動できるようエリアスを作成と、言語設定・PAGERの設定を行う。

```~/.cshrc
alias less      /usr/local/bin/jless
setenv  LC_CTYPE        ja_JP.eucJP
setenv  PAGER           /usr/local/bin/jless
```

### libiconv
libiconvは、多くのパッケージで使用されていると思っていましたが、php73-iconv・p5-Locale-libintlとglibのようですが、phpではEUC-JPとUTF-8の変換は必須のためインストールする。加えて、Apply patches to fix CP932, add EUCJP-MSのパッチは必須である。また、iconvコマンドは標準でインストールされていてEUCJP-MSは使える状態になっている。標準とpkgでインストールしたパッケージで比較する。

```
# /usr/bin/iconv -l |grep EUC-JP
EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN EUCJPMS
EUC-JP CSEUCPKDFMTJAPANESE EUCJP IBM-EUCJP
# /usr/local/bin/iconv -l |grep EUCJP
EUC-JP EUCJP EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE CSEUCPKDFMTJAPANESE
```

pkg版はEUC-JP-MSが使えない、パッケージのオプションを見るとPATCHESがoffになっている

```
# pkg info libiconv
libiconv-1.14_11
Name           : libiconv
Version        : 1.14_11
Installed on   : Sun Feb  3 03:07:27 2019 JST
Origin         : converters/libiconv
Architecture   : FreeBSD:12:amd64
Prefix         : /usr/local
Categories     : devel converters
Licenses       : GPLv3
Maintainer     : gnome@FreeBSD.org
WWW            : http://www.gnu.org/software/libiconv/
Comment        : Character set conversion library
Options        :
        DOCS           : on
        ENCODINGS      : on
        PATCHES        : off
以下省略
```

そのためportsからコンパイルする。

```
# portinstall libiconv
省略
```

オプション選択画面でチェックを入れる
![libiconv.jpg](https://qiita-image-store.s3.amazonaws.com/0/233460/5ec6af77-ef61-68ef-8587-cda5c9e90721.jpeg)
確認すると、EUC-JP-MSがサポートされている

```
# /usr/local/bin/iconv -l | grep EUC-JP
EUC-JP EUCJP EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE CSEUCPKDFMTJAPANESE
EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN EUCJPMS
```

pkgコマンドでアップグレードされないようにロックを掛ける

```
# pkg lock libiconv
libiconv-1.14_11: lock this package? [y/N]: y
Locking libiconv-1.14_11
```

### 日本語マニュアル
日本語マニュアルは、正式にpkgになっているのは古いバージョン（FreeBSD 5.4かな？）のもので全てが揃っていないません。

```
# pkg search -f japanese/man-doc
japanese/man-doc
Name           : ja-man-doc
Version        : 5.4.20050911_3
Origin         : japanese/man-doc
Architecture   : FreeBSD:12:amd64
Prefix         : /usr/local
Repository     : FreeBSD [pkg+http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly]
Categories     : japanese
Licenses       :
Maintainer     : kuriyama@FreeBSD.org
WWW            : UNKNOWN
Comment        : Japanese translation of FreeBSD manual pages
Annotations    :
        FreeBSD_version: 1200086
Flat size      : 5.09MiB
Pkg size       : 5.18MiB
Description    :
This is a Japanese translation of FreeBSD manual pages.
Note that to build it, you need the CVS repository in
${CVSROOT} (/home/ncvs by default) on your machine.
```
他には、[小金丸氏が翻訳されている日本語マニュアル](http://www.koganemaru.co.jp/)があります。査読されていないようですが使わしていただいています。このページにあるやり方でインストールしようとすると以下のようにエラーが発生する。

```
# pkg add -f ftp://ftp.koganemaru.co.jp/pub/jman12/ja-cat-doc-12.0.20181218.amd64.txz
Fetching ja-cat-doc-12.0.20181218.amd64.txz: 100%    9 MiB 964.5kB/s    00:10
Installing ja-cat-doc-12.0.20181218.amd64...
pkg: Missing dependency 'ja-man'

Failed to install the following 1 package(s): ftp://ftp.koganemaru.co.jp/pub/jman12/ja-cat-doc-12.0.20181218.amd64.txz
```

ja-manが無いといっている。catpages 形式であればja-manが要らないようなので以下のようにインストールする。また、以前は、japanese/groff、japanese/man コマンドをインストールしman形式を使用していたが、ある時からjapanese/manで英語のmanを整形したときに文字化けするようになった。この時解決できなかったのでそれ以降はcatpages 形式を使っている。

```
# fetch ftp://ftp.koganemaru.co.jp/pub/jman12/ja-cat-doc-12.0.20181218.amd64.txz
ja-cat-doc-12.0.20181218.amd64.txz                    9419 kB  972 kBps    10s
# tar -Pzxf ja-cat-doc-12.0.20181218.amd64.txz
# rm +COMPACT_MANIFEST +MANIFEST ja-cat-doc-12.0.20181218.amd64.txz
# ln -s /usr/share/man/ja /usr/share/man/ja_JP.eucJP
```