Changes in title
+FreeBSD 12で自宅サーバの構築 基本システム編その1
Changes in tags
@@ -0,0 +1,425 @@
+## はじめに
+FreeBSD 12を使用した自宅サーバの構築を行った。FreeBSD 12はリリースされて間もない状態ですが、カーネルに標準でVIMAGEが取り込まれDNSの外向きと、内向きを別々のシステム(jail+VIMAGE)が同一ホストで構築できることから採用することにしました。その時の構築手順を備忘録の意味も含め、具体的にいくつかに渡り説明する。
+
+* [基本システム編その1](URL "https://qiita.com/chun3/")(この記事)
+ - 背景
+ - 基本のインストール
+ - 日本語環境の設定
+* [基本システム編その2](URL "https://qiita.com/chun3/")
+ - セキュリティ
+ - ftpサーバ
+* [基本システム編その3](URL "https://qiita.com/chun3/")
+ - jail
+ - 基本システム編おわり
+* [jail内基本システム編](URL "https://qiita.com/chun3/")
+ - 基本の設定(jail1・jail2共通)
+* DNS編
+* Let's Encrypt編
+* Webサーバ編
+* メールサーバ編
+* ファイルサーバ編
+
+## 背景
+これまでに、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
+省略
+```
+
+オプション選択画面でチェックを入れる
+
+確認すると、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.
+```
+他には、[小金丸氏が翻訳されている日本語マニュアル](URL "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
+```
