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.
ここまでやれば、初期設定はほぼ終わり。あとは用途に合わせた設定を行うだけ。