--- title: FreeBSD 12で自宅サーバの構築 基本システム編その1 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) ## 背景 これまでに、FreeBSDを使って自宅サーバを構築していましたが、PCを更新するごとに1からインストールしている。バーチャル環境を使ったほうが便利ではあるが、サーバソフトを見直すいい機会になると思い4~5年を目処に1から更新している。 最近の更新は昨年(2018年)であるが、その時はあまり時間が取れずサーバソフトを見直さなかったが、今回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 ```