--- title: FreeBSD 12で自宅サーバの構築 基本システム編その2 tags: FreeBSD author: Chun3 slide: false --- ## はじめに FreeBSD 12を使用した自宅サーバの構築を行った。FreeBSD 12はリリースされて間もない状態ですが、カーネルに標準でVIMAGEが取り込まれDNSの外向きと、内向きを別々のシステム(jail+VIMAGE)が同一ホストで構築できることから採用することにしました。その時の構築手順を備忘録の意味も含め、具体的にいくつかに渡り説明する。 * [基本システム編その1](https://qiita.com/Chun3/items/2f891e5993c91b58ae5c) - 背景 - 基本のインストール - 日本語環境の設定 * [基本システム編その2](https://qiita.com/Chun3/items/1e8fe5071c4a78d37e66)(この記事) - セキュリティ - ftpサーバ * [基本システム編その3](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を使用する。 例によってい使用宣言 ```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. ```