FreeBSD 12.0の初期設定

2016年9月24日

FreeBSDをサーバー利用するための設定内容をまとめます。具体的にはFEMPでWebサーバーを立てるための設定方法です。

レンタルサーバー・自宅サーバー設定・構築のヒントというサイトの最初にやっておきたいこと(FreeBSD編)を参考にセットアップしました。

OSのメンテナンス

さくらのVPSであればカスタムOSをデフォルト設定でインストール、Vultrなら用意されているOSのインスタンスを作成します。デスクトップ利用ではないのでGUIなどは不要です。

まずはパッチレベルをあげるため、freebsd-updateでセキュリティパッチを適用します。fetchでパッチをダウンロードしてinstallで適用です。

pkg updateしてからfreebsd-updateしたほうがいいかも。

# 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/quarterly, please wait…
Verifying signature with trusted certificate pkg.freebsd.org.2013102301… done

〜中略〜

# freebsd-update fetch
src component not installed, skipped
Looking up update.FreeBSD.org mirrors… 3 mirrors found.

〜中略〜

# freebsd-update install
src component not installed, skipped
Installing updates… done.

ちなみにメジャーバージョンアップの時はこう。

# freebsd-update -r 12.0-RELEASE upgrade

いずれもカーネルセキュリティレベルを上げている場合は-1までレベルダウンする必要があります。

そして今後もセキュリティアップデートを追いかける必要があるので、cronで毎朝3時に確認することにしましょう。crontab -eで次のように設定します。

0     3     *     *     *     /usr/sbin/freebsd-update cron

cronオプションの振る舞いはfetchそのものです。実際にインストールはされません。fetchとの違いはエラーが出たりパッチがダウンロードされたときに、メール通知があるという点です。/etc/freebsd-update.confに送信先をMailToで指定することで任意のアドレスで受信できます。指定なしの場合はcrontabを設定したユーザー宛に通知が届きます。

MailTo mail@address

メールの設定はFreeBSDでsendmailを使ったメール送受信にまとめました。

ファイアウォールの設定

さて、この辺でbashとvimだけでも先にインストールしておきましょう。コマンドやら設定ファイルの編集やら、効率がだいぶ違ってきます。pkg upgradeしてリポジトリを更新してからインストールします。

で、ファイアウォール。必要なポートだけを開けるよう/usr/local/etc/ipfw.rulesにて設定しました。参考サイトのFreeBSDでファイアウォール(ipfw)の設定を丸パクリです。開いたポートは以下のとおり。

  • ssh(20022)
  • mail(25)
  • http(80)
  • dns(53)
  • ntp(123)
  • https(443)

再起動後にファイアウォールが有効になるように/etc/rc.confの設定をします。

firewall_enable="YES"
firewall_script="/usr/local/etc/ipfw.rules"
firewall_logging="YES"

まだ再起動しちゃダメだよ。SSH設定を書き換えてからね。

SSHの設定

さくらのVPSにしろVultrにしろWebブラウザによるコンソール接続が可能ですが、ターミナルからの接続もできるようにします。ただしrootでのssh接続は危ないのでssh接続用ユーザーと認証鍵を作ります

adduserで接続用ユーザーを作り、~/.ssh/authorized_keyファイルに認証鍵を登録したら、/etc/ssh/sshd_configにて以下のような設定を。

Port 20022                  # 接続ポートを標準外にすることで攻撃されにくくします
Protocol 2                  # SSH2接続のみ許可します
PermitRootLogin no          # rootでのログインを拒否します
AllowUsers general_user     # ログインユーザーを限定します
PasswordAuthentication  no  # パスワード認証を拒否します
PermitEmptyPasswords no     # パスワードなしの接続を拒否します

これらコメントアウトされているオプションを有効化し、適宜値を書き換えたらFreeBSDサーバーを再起動します。

# shutdown -r now

ちなみに接続ポートが標準外になると次のようにポート指定をしてssh接続する必要があります

$ ssh general_user@xxx.vs.sakura.ne.jp -p 20022

ntpの設定

/etc/ntp.conf中の参照先NTPサーバーを書き換えます。もともと指定されていた0.freebsd.pool.ntp.orgをコメントアウトして、日本にある適当なサーバーを指定します。

# pool 0.freebsd.pool.ntp.org iburst
pool ntp.jst.mfeed.ad.jp iburst

以前はdriftfileというNTPサーバーとの時刻差分の計算結果を書き込んでおくファイルの設定もしていましたが、デフォルトで/var/db/ntpd.driftを参照するようなので設定を省略しています。

この後、ntpデーモンが自動起動されるように、/etc/rc.confに以下の内容を追記します。

ntpd_enable="YES"

デーモン起動前にタイムゾーンを正しく設定しておきましょう。

不要プロセスの停止

ps auxでプロセス表示すると、仮想コンソールプロセスが動作してしまっているので/etc/ttysにてttyv1からttyv7までをoffに設定変更後、仮想コンソールを再起動します。

# kill -HUP 1

ここまで準備しておけば、リモートでいろいろ環境構築できるようになります。

ここにApacheなりNginxなりをインストールすればWebサーバーとして使えるようになりますよ。

不要な一時ファイルの削除

デフォルトでは/tmpディレクトリ下の一時ファイルは削除されません。/etc/periodic.confで以下の設定をすることで自動削除されるようになります。

daily_clean_tmps_enable="YES"

これでデフォルトでは/tmpディレクトリ下の3日以上前のファイルが削除されるようになります。cronの設定次第ですが、多分毎日早朝。

詳しくはFreeBSDの定期実行コマンドで一時ファイルを削除するにまとめておきました。

スワップファイルの設定

Vultrみたいにあらかじめ用意されているOSを使う時など、スワップパーティションが設定されていないうえ、お金をケチってメモリの少ないプランを使ってWordPressを動かしているとMySQLがハングアップすることがあります。こうなるとMySQLを再起動するまでNginxが500エラーを吐いてサイトへのアクセスができなくなってしまいます。

# service mysql-server restart

FreeBSDではLinuxと違ってmysqldではなくmysql-serverと指定します。

というわけで足りないメモリを補うためにスワップファイルを設定しておきましょう。日本語のハンドブック情報は古いのでオリジナル版のFreeBSDハンドブック情報を当たります。

Raspberry Piのインストールにも使ったddを使ってスワップファイルを作成します。

# dd if=/dev/zero of=/usr/swap bs=1m count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 4.470363 secs (240191182 bytes/sec)

入力デバイスの/dev/zeroはnull文字を出力するデバイスで、ブロックサイズ1MBを1024個分/usr/swapに書き込んだらパーミッションを600に変更します。

# chmod 600 /usr/swap

用意ができたら/etc/fstabファイルに設定します。

md99  none  swap  sw,file=/usr/swap,late 0  0

これでmd99というデバイスにスワップファイルとして/usr/swapが割り当てられました。再起動せずにこれを有効化するためにはswaponします。

# swapon -aL

しばらく使っているとスワップが始まります。利用状況を確認するにはswapinfoを使います。

$ swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/md99         2097152   376820  1720332    18%

当初2GBのスワップを使っていた頃の使用率はだいたい20%前後でした。ちなみにうちのサーバーのメモリは512MB。後日1GBに変更しました。