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)

## セキュリティ
### ファイヤーウォール
ファイヤーウォールには、後の節で説明するblacklistdと連携できることから、今回ipfwを使用する。もこのipfwは基本的機能以外にNATや帯域制限が使えるようですが、今回はパケットフィルタ機能についてのみ使用する。また、設定を失敗するとsshでログインができなくなるので確認ができるまではconsoleで行うとよい。
まず、rc.confに使用することを宣言する。

```sh:/etc/rc.conf
firewall_enable="YES"
firewall_type="/etc/firewall.tab"
firewall_logging="YES"
```

firewall_typeはOS起動時に設定するフィルターテーブルです。また、firewall_loggingは、フィルターテーブルに設定することで特定のパケットをログすることができる。以下の8000番のように指定すると/var/log/securityに100件までログされる。また、この後の節で説明する予定のDNS・NTP・web・メールサーバなどのポートを開ける。
jailに外部からアクセスできないことが判明しfirewall.tabを変更（2019.2.17）

```sh:/etc/firewall.tab
add 5000 allow ip from 192.168.1.0/24 to any
add 5200 allow tcp from any to 192.168.1.0/24 established
# hosts,DNS,NTP
add 6000 allow udp from any to 192.168.1.0/24 53,123
add 6100 allow udp from any 53,123 to 192.168.1.0/24
add 6400 allow tcp from any to 192.168.1.0/24 53,123
add 6500 allow tcp from any 53,123 to 192.168.1.0/24
# ftp,ssh,smtp,http,https,smtps,smtp,imaps,pop3s
add 7000 allow tcp from any to 192.168.1.0/24 20-22,25,80,443,465,587,993,995
#
add 60000 deny tcp from any to 192.168.1.0/24
add 60100 deny udp from any to 192.168.1.0/24
add 60400 deny ip from any to 192.168.1.0/24
```

ipfwを開始する

```
# service ipfw start
```

ログの機能を使って、サーバが勝手に外の80番ポートに読みに行っていないかログに残すには以下のように5000番の前にテンポラリーに挿入する。

```
ipfw add 4000 allow log logamount 100 tcp from me to any 80
```

再起動するとなくなるが、不要になった場合は以下のようにする。

```
ipfw delete 4000
```

現在の状況を確認するには以下のコマンドでできる。

```
# ipfw show
00100    0      0 allow ip from any to any via lo0
00200    0      0 deny ip from any to 127.0.0.0/8
00300    0      0 deny ip from 127.0.0.0/8 to any
00400    0      0 deny ip from any to ::1
00500    0      0 deny ip from ::1 to any
00600    5    432 allow ipv6-icmp from :: to ff02::/16
00700    0      0 allow ipv6-icmp from fe80::/10 to fe80::/10
00800    2    232 allow ipv6-icmp from fe80::/10 to ff02::/16
00900    0      0 allow ipv6-icmp from any to any icmp6types 1
01000    0      0 allow ipv6-icmp from any to any icmp6types 2,135,136
05000 4806 952813 allow ip from 192.168.1.0/24 to any
05200    0      0 allow tcp from any to 192.168.1.0/24 established
06000    0      0 allow udp from any to me 53,123
06100    0      0 allow udp from any 53,123 to me
06400    0      0 allow tcp from any to me 53,123
06500    0      0 allow tcp from any 53,123 to me
07000    0      0 allow tcp from any to me 20-22,25,80,443,465,587,993,995
60000    0      0 deny tcp from any to me
60100    0      0 deny udp from any to me
60400    0      0 deny ip from any to me
65535    1    419 deny ip from any to any
```

カウントを初期化する場合

```
# ipfw zero
Accounting cleared.
```

firewall.tabで設定していないループバック関係の設定が最初に挿入され、最後に全てを禁止する設定が挿入される。また、blacklistdが2000番代に挿入するので5000番から始めている。
### blacklistd
ftp・ssh・smtpなどのDoS攻撃を防止する方法としてblacklistdを使用する。

機器更新時にこの記事を元にインストールしてもblacklistdが上手く動かないことに気が付き、この記事を書いた当時書き忘れたものと思われます。
balacklistdとipfwを連携する設定を以下に追加する（2022年1月15日）

```
# touch /etc/ipfw-blacklist.rc
```

例によってい使用宣言

```sh:/etc/rc.conf
blacklistd_enable="YES"
blacklistd_flags="-r"
```

-rフラグは、システムを再起動しても再度ルールを適用してブロックを開始する。なお、-fを指定すると再起動時に消去される。ルールはデフォルから追加している。

```/etc/blacklistd.conf
# $FreeBSD: releng/12.0/usr.sbin/blacklistd/blacklistd.conf 336977 2018-07-31 16:39:38Z brd $
#
# Blacklist rule
# adr/mask:port type    proto   owner           name    nfail   disable
[local]
ssh             stream  *       *               *       3       24h
ftp             stream  *       *               *       3       24h
smtp            stream  *       *               *       3       24h
smtps           stream  *       *               *       3       24h
submission      stream  *       *               *       3       24h
imaps           stream  *       *               *       3       24h
pop3s           stream  *       *               *       3       24h

#6161           stream  tcp6    christos        *       2       10m
*               *       *       *               *       3       60

# adr/mask:port type    proto   owner           name    nfail   disable
[remote]
#129.168.0.0/16 *       *       *               =       *       *
#6161           =       =       =               =/24    =       =
#*              stream  tcp     *               =       =       =
```

sshdをblacklistdと連携する

```sh:/etc/rc.conf
sshd_flags="-o UseBlacklist=yes"
```

開始する

```
# service blacklistd start
Starting blacklistd.
# service sshd restart
Performing sanity check on sshd configuration.
Stopping sshd.
Performing sanity check on sshd configuration.
Starting sshd.
```

運用状況を確認するにはいかのコマンドを入力する（-rは残り時間、まだ適用されていないのでリストが出ていない）

```
# blacklistctl dump -ar
        address/ma:port id      nfail   remaining time
```

運用すると以下のようにルールが適用されポートについて、ipfwのルールに追加される。

```
02022     311     24408 deny tcp from table(port22) to any 22
02025     836     42388 deny tcp from table(port25) to any 25
02465     427     26130 deny tcp from table(port465) to any 465
02587     788     47004 deny tcp from table(port587) to any 587
```

tableの内容を確認したい場合は以下のコマンドで確認できる

```
# ipfw table port22 list
--- table(port22), set(0) ---
・・・
```

## ftpサーバ

ftpについては、以下の設定をすることによりftpが使用でき連携される。最初に使用宣言。

```/etc/rc.conf
inetd_enable="YES"
```

最後の-Bはデフォルトでは無くblacklistdと連携するためのオプションである

```/etc/inetd.conf
ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l -B
```

```
# service inetd start
Starting inetd.
# service blacklistd restart
Stopping blacklistd.
Waiting for PIDS: 83976.
Starting blacklistd.
```