OpenBSD初期設定

OpenBSDをインストールしたあとの初期設定について。

参考文献

最新版へのアップグレード

ConoHaなどあらかじめテンプレートが用意されているサービスでOpenBSDを使う場合、 かならずしも最新版のOpenBSDが提供されるとは限らない。 多くの場合、アップグレードが必要になるだろう。

アップグレードをする場合、一度再起動し、カーネルをブートするプロンプトで

boot> bsd.rd

と入力する。コンソールへの接続方法は各サービスによって異なるので確認すること。

その後、Upgradeを選択し、最新版のカーネルを指定のサーバからダウンロードする。 例えばlocation of setはftp.jaist.ac.jp、パスは/pub/OpenBSD/6.3と指定する。 カーネルをダウンロードしてインストールした後、一旦再起動する。 ブートプロンプトで再びbsd.rdからブートする。 先程と同じlocation of setとパスを選ぶと、 baseなどの配布物がインストールできるようになる。 あとはインストーラの指示に従えばよい。

再起動後、デフォルトゲートウェイの設定がリセットされている場合がある(ConoHaで確認)ため、 SSHログインがConnection timed outする。 もしそうなった場合、コンソールからログインし、 /etc/mygateに指定すべきデフォルトゲートウェイのIPアドレスを書き、 sh /etc/netstartを実行する。

SSHデーモン

自環境側

SSHでパスワード認証を拒否する。 まず、自環境から公開鍵をscp(1)で転送する。 転送先のIPアドレスxxx.xxx.xxx.xxxは適切に指定すること。

$ scp ~/.ssh/id_rsa.pub root@xxx.xxx.xxx.xxx:~/

ログインする。

$ ssh root@xxx.xxx.xxx.xxx

リモートログイン側

ホームディレクトリに存在する id_rsa.pubの内容を、 ~/.ssh/authorized_keysに追記する。

# mkdir ~/.ssh
# chmod 700 ~/.ssh
# cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

/etc/ssh/sshd_configを編集し、以下の項目とその設定内容を確認する。

PasswordAuthentication no
PermitEmptyPasswords no

編集後、rcctl(8)でSSHデーモンを再起動する。

# rcctl restart sshd

一度ログアウトする。

# exit

自環境側

再度ログインする。

$ ssh root@xxx.xxx.xxx.xxx

今度はパスワード認証ではなく公開鍵認証でログインできるかを確認する。

pf

pfを使い、拒否または許可するサービスを指定する。 rcctl enable pfでpfを有効にする。

/etc/pf.confを以下のようにする。

set limit states 40000
set timeout { adaptive.start 24000, adaptive.end 48000 }
set timeout tcp.established 43200

ext_if = "vio0"

# enabled services
tcp_services = "{ssh}"

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}"

set block-policy drop
set loginterface $ext_if

block all
set skip on lo0
antispoof quick for $ext_if inet
block in quick from urpf-failed

# Normalize all packats
match in all scrub (no-df)

# filter rule
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 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で文法チェックをする。エラーが出力されなければ、 pfctl -f /etc/pf.confで設定を反映する。

この設定では、SSH以外のすべての接続を拒否している。 公開するサービスがあれば、tcp_services = "{ssh, http, https}"のように その都度tcp_servicesに書いていく。 動的に割り振られるIPアドレスの範囲が把握できているのであれば、 anyではなく特定のIPアドレスをCIDR形式で書くのが望ましい。

SSH rootログインの不許可

SSHログイン用のユーザを作成する。

# useradd -m yuuki

ユーザyuukiのホームディレクトリに、 先程作成した .sshディレクトリをコピーする。

# cp -pr ~/.ssh /home/yuuki
# chown -R yuuki:yuuki /home/yuuki/.ssh

/etc/ssh/sshd_configを編集し、

PermitRootLogin no

のように変更する。