FreeBSD 8.1 i386 をインストール後の初期設定

FreeBSD を再インストールしたので、備忘録を残す。

インストール直後のデーモンの確認

# netstat -a | grep LISTEN
tcp4       0      0 localhost.smtp         *.*                    LISTEN
tcp4       0      0 *.ssh                  *.*                    LISTEN
tcp6       0      0 *.ssh                  *.*                    LISTEN

sshd しか稼動していないのを確認。

時刻を合わせる

インストール時に時間帯を設定していると思うが、よくシステムの時間がずれているので、時刻を合わせておく。

# ntpdate ntp.nict.jp

ntp.nict.jp については、情報通信機構の「日本標準時プロジェクト」を参照。

CPU の性能

最安プランだと下記の CPU になる。

# sysctl hw.model hw.clockrate kern.smp.cpus
hw.model: Intel(R) Core(TM)2 Duo CPU    T7700 @ 2.40GHz
hw.clockrate: 2659
kern.smp.cpus: 2

FreeBSD 8.1 から 8.2 にアップグレードをする

# uname -a
FreeBSD www.example.com 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon
Jul 19 02:55:53 UTC 2010
root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
# which freebsd-update
/usr/sbin/freebsd-update

freebsd-update は実行可能なので、FreeBSD 8.2-RELEASE Announcement の手順に則り、8.2 へアップグレードをする。
かなりの時間がかかるので、別の作業をしながら進捗を確認して、ひたすら待つ。

# freebsd-update upgrade -r 8.2-RELEASE
# freebsd-update install
# shutdown -r now
# freebsd-update install

再起動後に、再度 freebsd-update install を実行するが、下記のメッセージが表示される。

# freebsd-update install
Run '/usr/sbin/freebsd-update fetch' first

そして、freebsd-update install を実行すると、

# freebsd-update fetch
# freebsd-update install
Run '/usr/sbin/freebsd-update fetch' first

再度「Run '/usr/sbin/freebsd-update fetch' first」とメッセージが出る。新規にインストール直後なので、当然といえば当然のメッセージだ。

At this point, users of systems being upgraded from FreeBSD 7.4-RELEASE or earlier will be prompted by freebsd-update to rebuild all third-party applications (e.g., ports installed from the ports tree) due to updates in system libraries.
After updating installed third-party applications (and again, only if freebsd-update printed a message indicating that this was necessary), run freebsd-update again so that it can delete the old (no longer used) system libraries:

もし、すでに ports ツリーを取得していた場合は、下記のようになる。*1

# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 4 mirrors found.
Fetching metadata signature for 8.2-RELEASE from update4.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.

No updates needed to update system to 8.2-RELEASE-p1.

このまま再起動をする。

# shutdown -r now

そして、バージョンを確認する。

# uname -a
FreeBSD www.example.com 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011     root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

ports ツリーを取得して展開する

初めて ports ツリーを取得する場合は時間がかかるので、他の作業をしながら、ひたすら待つ。

# portsnap fetch extract update
Looking up portsnap.FreeBSD.org mirrors... 5 mirrors found.
Fetching public key from portsnap6.FreeBSD.org... done.
Fetching snapshot tag from portsnap6.FreeBSD.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Thu May 19 09:08:45 JST 2011:
3e7ffdacabc9f457ee87ada2486e7c7fdfbe69541600bc100% of   63 MB  949 kBps 00m00s
Extracting snapshot... done.
Verifying snapshot integrity...

そして、次に今後利用することがなさそうな ports を設定する。通常は、デフォルトで言語関係の ports が「/etc/portsnap.conf」記述されている。

# REFUSE arabic chinese french german hebrew hungarian japanese
# REFUSE korean polish portuguese russian ukrainian vietnamese

そして、ports を最新版に保つために長い付き合いになる portupgrade をインストールしておく。

% whereis portupgrade
portupgrade: /usr/ports/ports-mgmt/portupgrade
% cd /usr/ports/ports-mgmt/portupgrade
% sudo make fetch-recursive
% sudo make install clean

上記の言語から日本語のみを除外して、更新対象外にしてしまう。

# vi /etc/portsnap.conf
REFUSE arabic chinese french german hebrew hungarian
REFUSE korean polish portuguese russian ukrainian vietnamese

それ以外の ports は各自更新対象外にする。例えば、サーバーならば、X11 やエンターテイメント関係の ports は必要ないので、

REFUSE audio games multimedia print
REFUSE x11 x11-clocks x11-drivers x11-fm x11-fonts x11-servers
REFUSE x11-themes x11-toolkits x11-wm

と設定するとディスクの消費量が減る。

sudo をインストールする

まずは sudo をインストールをする。

# whereis sudo
sudo: /usr/ports/security/sudo
# cd /usr/ports/security/sudo
# make fetch-recursive
# make install clean

インストールが完了したら、sudo の設定をする。
まずは、自分が所属しているグループを調べる。

# id littlebuddha
uid=1001(littlebuddha) gid=0(wheel) groups=0(wheel)

wheel グループに所属をしていることがわかる。このグループに所属しているユーザーは sudo を使えるようにする。

# visudo
%wheel ALL=(ALL) ALL

sudo が利用できるかを確認する。次に ssh の設定を行うので、その作業で確認をする。

ssh の設定をする

まずは sudo で設定ファイルのバックアップを作成する。元の「sshd_config」を「sshd_config.orig」という名称でコピーをする。

$ ls -l /etc/ssh
-rw-r--r--  1 root  wheel    3410 May 19 14:37 sshd_config
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
Password:
$ ls -l /etc/ssh/
-rw-r--r--  1 root  wheel    3410 May 19 14:37 sshd_config
-rw-r--r--  1 root  wheel    3410 May 19 15:02 sshd_config.orig

sudo を介してコマンドを実行できたことを確認。次に、sshd_config を編集。

$ sudo vi /etc/ssh/sshd_config
Port 20048
Protocol 2
PermitEmptyPasswords no
StrictModes yes
UsePrivilegeSeparation yes
UsePAM no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 3

それぞれを明示的に設定するためコメントアウトをする、もしくは設定値を変更している。ssh での接続認証をパスワードで行う場合、「UsePAM」は「yes」に設定しないとログインができないことに注意。
設定の内容は、SSHD_CONFIG を参照。

  • ClientAliveCountMax
    sshd が無反応のクライアントに対して Client Alive Message を送ってみる最大数を指定
  • ClientAliveInterval
    sshd が一定時間ごとに、暗号化された通信路を経由してクライアントに応答を要求するメッセージ(Client Alive Message) を送る秒数を指定
  • Port
    sshd が接続を受けつける (Listen する) ポート番号を指定
  • Protocol
    sshd がサポートするプロトコルのバージョンを指定
    必ず 2 を指定すること
  • PermitEmptyPasswords
    空のパスワードを許可するかどうかを指定
    必ず no を指定すること
  • StrictModes
    sshd がログインを許可する前に、ユーザのファイルおよびホームディレクトリの所有権とパーミッションをチェックすべきかどうかを指定
  • UsePAM
    Pluggable Authentication Module (PAM) インターフェイスによる認証を許可するかどうかを指定
  • UsePrivilegeSeparation
    sshd が、受けつけるネットワークトラフィックを処理するためにroot 権限を分離するかどうかを指定
  • X11Forwarding
    X11 転送を許可するかどうかを指定
    サーバーとして運用するならば、通常は no を指定

設定が完了したら、既に ssh 接続をしている場合は接続をしたまま、sshd を再起動する。接続を残すのは、ssh の設定が間違っていた場合に修正をするためである。接続が切れていると、ssh の修正はコンソールから行う必要になる。再起動が完了したら、ssh 接続できるかどうかを確認する。

$ sudo /etc/rc.d/sshd restart
Password:
Stopping sshd.
Starting sshd.

SSH 接続で鍵認証を行う。

まずは、サーバー側で公開鍵を保存するディレクトリなどを作成しておく。

$ mkdir ~/.ssh
$ chmod 0700 ~/.ssh/

次にローカル側で公開鍵と秘密鍵を生成する。

% mkdir ~/.ssh
% chmod 0700 ~/.ssh
% ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/littlebuddha/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/littlebuddha/.ssh/id_rsa.
Your public key has been saved in /Users/littlebuddha/.ssh/id_rsa.pub.
The key fingerprint is:
a1:d0:16:1a:f7:ed:5a:dc:cf:1b:87:29:2b:e4:2c:6a littlebuddha@MacBookPro.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|               =o|
|        o = o o.B|
|       . X = + .+|
|      . E = o o. |
|       o . . . . |
|              .  |
|                 |
|                 |
+-----------------+

% chmod 0600 ~/.ssh/id_rsa
次に、公開鍵をサーバー側に転送して登録をする。

$ ssh-keygen -i -f ~/id_rsa.pub >> ~/.ssh/authorized_keys

上記のやり方でエラーが出た場合は、下記を試してみる。

$ cat ~/id_rsa.pub >> ~/.ssh/authorized_key

そして、他のユーザーから読み取られないように「authorized_keys」の権限を変更する。

$ chmod 0600 ~/.ssh/authorized_keys

権限を変更したら、sshd_config の設定を変更する。

$ sudo vi /etc/ssh/sshd_config
AuthorizedKeysFile   .ssh/authorized_keys
PasswordAuthentication no
PubkeyAuthentication yes
UsePAM no

設定を変更したら、sshd を再起動する。

$ sudo /etc/rc.d/sshd restart
Password:
Stopping sshd.
Starting sshd.

さきほど SSH の設定を変更したように、新たな SSH 接続行い、鍵認証ができるかを確認する。

設定が正しく行えれば、上図のように鍵認証をしない接続を拒否することができるようになる。

pf を設定する

「/etc/rc.conf」に pf が起動時に有効になるように設定をすし、pf のルールを記述したファイルのパスを指定する。また、pf のログを残すための pflogd の設定をしておく。

$ su -
Password:
# cp /etc/rc.conf /etc/rc.conf_20110519
# vi /etc/rc.conf
pf_enable="YES"
pf_rules="/etc/pf_conf/pf.conf"
pflog_enable="YES"

次に NIC の名称を確認する

# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC>
        ether 52:59:00:F1:12:95
        inet 192.168.45.89 netmask 0xfffffe00 broadcast 192.168.45.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

で表示される結果で、この場合、「em0」が NIC 名となる。
pf のルールを記述する。例えば、

# vi /etc/pf_conf/pf.conf
#macros
ext_if       = "em0"
tcp_services = "{80, 443, 20048}"
priv_nets    = "{127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 0.0.0.0, 255.255.255.255}"

# options
set block-policy drop
set loginterface $ext_if

# scrub
# see at http://gd.tuwien.ac.at/.vhost/www.openbsd.org/xxx/faq/pf/ja/scrub.html
scrub in all

# default rules
block all
pass quick on lo0 all
antispoof log quick for $ext_if inet

# filter rules
pass in quick on $ext_if inet proto icmp from any icmp-type echoreq keep state
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state

# pass out all -> ext
pass out quick on $ext_if proto tcp all modulate state flags S/SA
pass out quick on $ext_if proto {udp, icmp} all keep state

そして、ルールの記述形式に誤りがないかを確認する。

# pfctl -nf /etc/pf_conf/pf.conf

Syntax error がなくなるまで修正を行う。このまま、pf を起動しても、下記のエラーが表示される。

# pfctl -f /etc/pf_conf/pf.conf
pfctl: /dev/pf: No such file or directory

なので、OS を再起動させる。

# shutdown -r now

再起動後、kldstat をして pf.ko があれば、pf が起動している。

# kldstat
Id Refs Address    Size     Name
 1    3 0xc0400000 bd97b4   kernel
 2    1 0xc3a1b000 35000    pf.ko

pf.ko がない場合は、設定ファイルのパスなどが間違っている場合もあるので、rc.conf を含め再確認をする。設定内容が反映されているかを確認する。

# pfctl -sr
No ALTQ support in kernel
ALTQ related functions disabled
scrub in all fragment reassemble
block drop all
pass quick on lo0 all flags S/SA keep state
block drop in log quick on ! em0 inet from 192.168.1.0/23 to any
block drop in log quick inet from 192.168.1.42 to any
pass in quick on em0 inet proto icmp all icmp-type echoreq keep state
pass in on em0 inet proto tcp from any to (em0) port = http flags S/SA keep state
pass in on em0 inet proto tcp from any to (em0) port = https flags S/SA keep state
pass in on em0 inet proto tcp from any to (em0) port = 20048 flags S/SA keep state
pass out quick on em0 proto tcp all flags S/SA modulate state
pass out quick on em0 proto udp all keep state
pass out quick on em0 proto icmp all keep state

/etc/rc.conf について

「/etc/rc.conf」は、FreeBSD 起動時に最初に読み込まれる「/etc/defaults/rc.conf」の設定を上書きする。なので、今回、上記で設定している

pf_enable="YES"
pf_rules="/etc/pf_conf/pf.conf"
pflog_enable="YES"

は、「/etc/defaults/rc.conf」と違う値を設定していることになる。詳細は、「/etc/rc.conf」に設定した値と「/etc/defaults/rc.conf」を比較すると、わかるはず。

/etc/rc.conf ファイルは、使用可能なオプション全てのデフォルト設定を指定するファイル /etc/defaults/rc.conf からインクルードされます。オプションを /etc/rc.conf に指定する必要があるのは、システム管理者がこれらのデフォルトを上書きしたい場合だけです。

http://www.jp.freebsd.org/cgi/mroff.cgi?sect=5&cmd=&lc=1&subdir=man&dir=jpman-5.4.0%2Fman&man=rc.conf

newsyslog の設定を確認する

Linux でよく使われている logrotate と同じ役割を果たす。FreeBSD インストール時に標準で入っており、すぐに利用できる。また、ports で logrorate をインストールすることもできるが、newsyslog の方が設定の記述方法がやさしい。
初期設定の内容は、下記の通り。

% less /etc/newsyslog.conf
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  *     JC
/var/log/console.log                    600  5     100  *     J
/var/log/cron                           600  3     100  *     JC
/var/log/daily.log                      640  7     *    @T00  JN
/var/log/debug.log                      600  7     100  *     JC
/var/log/kerberos.log                   600  7     100  *     J
/var/log/lpd-errs                       644  7     100  *     JC
/var/log/maillog                        640  7     *    @T00  JC
/var/log/messages                       644  5     100  *     JC
/var/log/monthly.log                    640  12    *    $M1D0 JN
/var/log/pflog                          600  3     100  *     JB    /var/run/pflogd.pid
/var/log/ppp.log        root:network    640  3     100  *     JC
/var/log/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/xferlog                        600  7     100  *     JC

サーバーで運用するには、ログの保存期間が短いので、保存するログのファイル数を表す「count」値を適宜直す。私は最低でも30日分は残すようにしている。
設定の説明は下記の URL を参照する。

ntpd の設定をする

「/etc/ntp.conf」の設定をする。
LAN に見立てている「192.168.0.1」のネットワークは、適宜利用しているサーバーのネットワーク構成に修正する。

% sudo cp /etc/ntp.conf /etc/ntp.conf_20110505
% sudo vi /etc/ntp.conf
# see at http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=ntp.conf&dir=jpman-5.2.0%2Fman
# see at http://www.jst.mfeed.ad.jp/
server 210.173.160.27  iburst maxpoll 9 # ntp1.jst.mfeed.ad.jp
server 210.173.160.57  iburst maxpoll 9 # ntp2.jst.mfeed.ad.jp
server 210.173.160.87  iburst maxpoll 9 # ntp3.jst.mfeed.ad.jp
# see at http://www.nict.jp/
server 133.243.238.163 iburst maxpoll 9 # ntp.nict.jp

restrict default ignore
restrict 127.0.0.1
restrict 192.168.0.1 mask 255.255.255.0 noquery nopeer notrust
restrict 210.173.160.27  noquery
restrict 210.173.160.57  noquery
restrict 210.173.160.87  noquery
restrict 133.243.238.163 noquery

「/etc/rc.conf」に「ntpd_enable="YES"」を追加する。

% sudo vi /etc/rc.conf
ntpd_enable="YES"

そして、ntpd を起動する。

% sudo /etc/rc.d/ntpd start
Starting ntpd.

ここまでやれば、初期設定はほぼ終わり。あとは用途に合わせた設定を行うだけ。

*1:インストール後にまだ何も追加で ports からインストールしていない場合