本記事は、FreeBSD の設定手順を解説するシリーズの一部です。
ここでは、インストール直後に行う初期設定とセキュリティの基本設定を記録します。
検証環境は FreeBSD 14.3-RELEASE(ConoHa VPS)を使用しています。
前回のインストール手順は以下の記事を参照してください。
→ 【FreeBSD】インストール手順(ConoHa VPS/14.3-RELEASE)
この記事でやること・やらないこと
本記事で扱う範囲は以下のとおりです。
- SSH接続の準備とセキュリティ設定
- 一般ユーザーの作成と運用切り替え
- OSセキュリティアップデート
- hosts.allow によるアクセス制限
- 時刻同期(NTP)の設定
- 仮想コンソール・不要サービスの整理
ファイアウォール(ipfw)の設定や、pkg / ports の導入については別記事で扱います。
なお、本記事に記載した設定内容は、筆者の環境と運用方針に基づく一例です。
セキュリティ設定に「唯一の正解」はなく、環境や目的によって最適な構成は異なります。
あくまで参考としてご覧ください。
ConoHa VPS 側の準備(SSH接続できる状態にする)
ConoHa VPS(Ver.3.0)では、初期状態ではすべてのポートが閉じられています。
SSH で外部から接続するには、コントロールパネル側でポートの開放が必要です。
手順:
- ConoHa コントロールパネルにログイン
- 対象サーバの「ネットワーク情報」→「セキュリティグループ」を開く
- セキュリティグループに「IPv4v6-SSH」を追加する
これにより、TCP 22番ポートへの外部アクセスが許可されます。
※ セキュリティグループの仕様は ConoHa VPS のバージョンによって異なります。本記事は Ver.3.0 を前提としています。
SSH のポート番号を後から変更する場合は、セキュリティグループのカスタムルールで該当ポートを追加し、22番を削除する必要があります。
ポート変更の手順は「SSHのセキュリティ設定」のセクションで扱います。
なお、VNC コンソールからの操作には影響しないため、設定を誤った場合でも VNC 経由で復旧できます。
SSHサービスの有効化と接続確認
まず、ConoHa コントロールパネルの VNC コンソールから root でログインします。
インストール時にサービスの選択で sshd を有効にしている場合、/etc/rc.conf には以下の記述が含まれています。
sshd_enable="YES"
念のため確認します。
# grep sshd_enable /etc/rc.conf
記述がなければ追記します。
# sysrc sshd_enable="YES"
sshd の起動状態を確認します。
# service sshd status
停止している場合は起動します。
# service sshd start
確認できたら、Tera Term からSSH接続を試します。
- Tera Term を起動し、「ホスト」にサーバの IP アドレスを入力
- サービスは「SSH」、ポートは「22」を選択して接続
- ユーザー名に
root、パスフレーズにインストール時に設定したパスワードを入力
ここではまだ root でのパスワード認証による接続です。
一般ユーザーの作成と鍵認証への切り替えは、以降のセクションで行います。
一般ユーザーでの運用を前提にする
日常の運用では root を直接使用せず、一般ユーザーでログインしてから必要に応じて root に切り替える運用が推奨されます。
インストール時にユーザーを作成済みであれば、この手順はスキップして構いません。
ユーザーの作成:
# adduser
対話形式で進みます。以下のポイントを押さえておけば、他はデフォルトで問題ありません。
Username:任意のユーザー名を入力Login group:そのまま Enter(ユーザー名と同名のグループが作成される)Invite user into other groups?:wheelを入力Login shell:/bin/shまたは好みのシェル
wheel グループに所属させることで、su による root への切り替えが可能になります。
作成したユーザーで su が使えることを確認:
Tera Term から作成したユーザーで SSH 接続し、以下を実行します。
$ su -
Password: (rootのパスワードを入力)
プロンプトが # に変わり、root に切り替わっていれば問題ありません。
補足:sudo や doas を導入して root 権限を管理する方法もあります。
本記事では最小構成として su を使用しますが、複数ユーザーで運用する場合や、操作ログを残したい場合は doas(FreeBSD では pkg install doas で導入可能)の利用も検討してください。
SSHのセキュリティ設定
SSH はサーバへの入口であり、最も攻撃を受けやすいポイントです。
ここでは、最低限実施しておきたい設定を順に行います。
すべての設定は /etc/ssh/sshd_config を編集して行います。
# vi /etc/ssh/sshd_config
ポート番号の変更
デフォルトの 22 番ポートは自動スキャンの標的になりやすいため、別のポートに変更します。
Port 10022
※ ポート番号は一例です。1024〜65535 の範囲で、他のサービスと重複しない番号を選んでください。
変更後は、ConoHa コントロールパネルのセキュリティグループも忘れずに更新します。
- カスタムルールで新しいポート(例:10022/TCP)を許可
- 「IPv4v6-SSH」(22番)を削除
公開鍵認証の準備
パスワード認証はブルートフォース攻撃の対象になるため、公開鍵認証に切り替えます。sshd_config の変更前に、先に鍵の配置を済ませておきます。
まず、Tera Term で鍵ペアを生成します。
- Tera Term のメニューから「設定」→「SSH鍵生成」を開く
- 鍵の種類は「ED25519」を選択(または RSA 4096bit)
- 「生成」をクリックし、パスフレーズを設定
- 秘密鍵(
id_ed25519)と公開鍵(id_ed25519.pub)をローカルに保存
次に、サーバ側に公開鍵を配置します。作成した一般ユーザーで SSH 接続し、以下を実行します。
$ mkdir -p ~/.ssh
$ chmod 700 ~/.ssh
$ vi ~/.ssh/authorized_keys
Tera Term で保存した公開鍵ファイルの中身を貼り付けて保存します。
$ chmod 600 ~/.ssh/authorized_keys
公開鍵で接続できることを確認してから、以降の sshd_config の変更に進んでください。
sshd_config の設定内容
以下に、本環境で設定している項目をまとめて掲載します。
# --- 認証 ---
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AuthenticationMethods publickey
# --- パスワード認証の無効化 ---
PasswordAuthentication no
PermitEmptyPasswords no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# --- アクセス制御 ---
AllowUsers <ユーザー名>
UseDNS no
# --- 接続制限 ---
MaxAuthTries 3
LoginGraceTime 30
MaxSessions 5
MaxStartups 10:30:60
# --- 不要な機能の無効化 ---
AllowTcpForwarding no
AllowAgentForwarding no
X11Forwarding no
PermitTunnel no
PermitUserEnvironment no
# --- その他 ---
UseBlacklist no
Subsystem sftp /usr/libexec/sftp-server
各項目の概要は以下のとおりです。
| 項目 | 内容 |
|---|---|
PermitRootLogin no | root での直接ログインを禁止 |
PubkeyAuthentication yes | 公開鍵認証を有効化 |
AuthorizedKeysFile | 公開鍵ファイルのパスを明示 |
AuthenticationMethods publickey | 認証方式を公開鍵のみに限定 |
PasswordAuthentication no | パスワード認証を無効化 |
PermitEmptyPasswords no | 空パスワードでのログインを禁止 |
KbdInteractiveAuthentication no | キーボードインタラクティブ認証を無効化 |
ChallengeResponseAuthentication no | チャレンジレスポンス認証を無効化 |
UsePAM no | PAM 認証を無効化 |
AllowUsers <ユーザー名> | SSH 接続を許可するユーザーを限定 |
UseDNS no | DNS 逆引きを無効化(接続高速化) |
MaxAuthTries 3 | 認証試行回数を制限 |
LoginGraceTime 30 | ログイン猶予時間を30秒に短縮 |
MaxSessions 5 | 1接続あたりの多重セッション数を制限 |
MaxStartups 10:30:60 | 未認証の同時接続を制限(10接続から30%の確率で拒否、60で全拒否) |
AllowTcpForwarding no | TCP ポートフォワーディングを禁止 |
AllowAgentForwarding no | SSH エージェント転送を禁止 |
X11Forwarding no | X11 転送を禁止 |
PermitTunnel no | トンネリングを禁止 |
PermitUserEnvironment no | ユーザー環境変数の読み込みを禁止 |
UseBlacklist no | blacklistd 連携を無効化(ipfw で別途制御する場合) |
Subsystem sftp | SFTP サブシステムの指定 |
AllowUsers には一般ユーザーの作成で設定したユーザー名を記述してください。
複数ユーザーを許可する場合はスペース区切りで列挙します。
設定の反映と接続テスト
設定を保存したら、sshd を再起動します。
# service sshd restart
⚠ 重要:今開いている Tera Term のセッションは閉じないでください。
新しい Tera Term ウィンドウを開き、変更後のポート番号・一般ユーザー・公開鍵で接続できることを確認してから、古いセッションを閉じます。
接続できない場合は、既存のセッションから設定を見直すか、VNC コンソールから修正できます。
OSセキュリティアップデート
FreeBSD では、freebsd-update コマンドでセキュリティパッチや修正を適用できます。
インストール直後は未適用のパッチが存在する可能性があるため、早めに実施しておきます。
パッチの取得:
# freebsd-update fetch
パッチの適用:
# freebsd-update install
適用後、現在のバージョンを確認します。
# freebsd-version -u
カーネルの更新が含まれていた場合は、再起動が必要です。
# shutdown -r now
定期的なパッチ確認の自動化:
freebsd-update の cron オプションを使うと、パッチの有無を定期的にチェックし、更新がある場合にメールで通知できます。
/etc/crontab に以下の行を追加します(例:毎日午前4時に実行)。
0 4 * * * root /usr/sbin/freebsd-update cron
cron オプションは fetch と同様にパッチの取得のみを行い、自動では適用しません。
通知を受けたら、手動で freebsd-update install を実行して適用してください。
なお、cron オプションでは実行タイミングにランダムな遅延が加わるため、サーバ間でアクセスが集中しない仕組みになっています。
freebsd-update はバイナリベースの更新で、OS 標準のベースシステムのみが対象です。
pkg でインストールしたパッケージは別途 pkg update && pkg upgrade で管理します(別記事で扱います)。
/etc/hosts.allow の修正
FreeBSD では、TCP Wrappers によるアクセス制御を /etc/hosts.allow で行います。
デフォルトでは以下の設定になっており、すべてのサービスへの接続が許可されています。
ALL : ALL : allow
この状態ではサービス単位でのアクセス制御がされていないため、必要なサービスだけを許可する構成に変更します。
設定例:
# vi /etc/hosts.allow
以下のように書き換えます。
# SSH:国内(.jp)からのみ許可
sshd : .jp : allow
# それ以外はすべて拒否
ALL : ALL : deny
補足:
.jp の指定は、接続元の逆引きホスト名が .jp で終わるかどうかで判定されます。
逆引きが設定されていないホストからの接続はこのルールにマッチしないため、拒否されます。
海外からの接続が必要な場合や、逆引きが存在しない IP から接続する場合は、IP アドレスやネットワーク範囲での指定も可能です。
sshd : 192.168.1.0/255.255.255.0 : allow
ルールは上から順に評価され、最初にマッチした行が適用されます。
設定変更後は sshd の再起動は不要で、即座に反映されます。
⚠ 注意: 設定ミスで自分自身の接続が拒否される可能性があります。変更前に VNC コンソールからアクセスできることを確認しておいてください。
時刻同期の設定と確認
サーバの時刻がずれていると、ログの整合性や証明書の検証、cron の実行タイミングに影響します。
NTP による時刻同期を設定しておきます。
インストール時に ntpd を有効にしている場合、/etc/rc.conf には ntpd_enable="YES" が記述済みです。
起動時の即時同期を有効にするため、以下を追記します。
# sysrc ntpd_sync_on_start="YES"
確認します。
# grep ntpd /etc/rc.conf
ntpd_enable="YES"
ntpd_sync_on_start="YES"
NTP 同期先の設定:
/etc/ntp.conf を編集します。
# vi /etc/ntp.conf
以下の内容に書き換えます。
# === 時刻選択パラメータ ===
tos minclock 3 maxclock 6
# === 同期先(主系:NICT Stratum 1) ===
pool ntp.nict.jp iburst
# === 同期先(副系:日本NTPプール) ===
pool 0.jp.pool.ntp.org iburst
pool 1.jp.pool.ntp.org iburst
# === アクセス制御 ===
restrict default limited kod nomodify notrap noquery nopeer
restrict source limited kod nomodify notrap noquery
restrict 127.0.0.1
restrict ::1
# === うるう秒 ===
leapfile "/var/db/ntpd.leap-seconds.list"
各設定の概要は以下のとおりです。
| 項目 | 内容 |
|---|---|
tos minclock 3 maxclock 6 | 時刻選択に使用するソース数の範囲を指定 |
pool ntp.nict.jp iburst | 主系として NICT(国立研究開発法人 情報通信研究機構)の Stratum 1 サーバを使用 |
pool *.jp.pool.ntp.org iburst | 副系として日本の NTP プールサーバを使用 |
restrict default ... | 外部からの不要なアクセスを制限 |
restrict source ... | 同期先サーバからのアクセスも最小限に制限 |
restrict 127.0.0.1 / restrict ::1 | ローカルからの制御を許可 |
leapfile | うるう秒情報ファイルのパスを指定 |
ntpd の再起動と同期確認:
# service ntpd restart
しばらく待ってから、同期状態を確認します。
# ntpq -p
reach の値が 0 以外になり、先頭に *(同期中)や +(候補)が表示されていれば正常に同期できています。
仮想コンソール(tty)の数調整
FreeBSD はデフォルトで 8 個の仮想コンソール(tty)が有効になっています。
VPS 環境では直接コンソールを複数使うことはほとんどないため、1 個に減らしておきます。
/etc/ttys を編集します。
# vi /etc/ttys
デフォルトでは以下のように ttyv0 〜 ttyv7 が on になっています。
ttyv0 "/usr/libexec/getty Pc" xterm on secure
ttyv1 "/usr/libexec/getty Pc" xterm on secure
ttyv2 "/usr/libexec/getty Pc" xterm on secure
...
ttyv7 "/usr/libexec/getty Pc" xterm on secure
ttyv1 以降を off に変更します。
ttyv0 "/usr/libexec/getty Pc" xterm on secure
ttyv1 "/usr/libexec/getty Pc" xterm off secure
ttyv2 "/usr/libexec/getty Pc" xterm off secure
ttyv3 "/usr/libexec/getty Pc" xterm off secure
ttyv4 "/usr/libexec/getty Pc" xterm off secure
ttyv5 "/usr/libexec/getty Pc" xterm off secure
ttyv6 "/usr/libexec/getty Pc" xterm off secure
ttyv7 "/usr/libexec/getty Pc" xterm off secure
設定を反映するには、init に設定の再読み込みを指示します。
# kill -HUP 1
不要なリソース消費を抑えるとともに、使われない tty を経由したアクセスの可能性を減らす意味もあります。
不要なサービスの確認と整理
インストール直後の状態では、使用しないサービスが有効になっている場合があります。
現在有効なサービスを確認し、不要なものがあれば無効化しておきます。
有効なサービスの一覧を確認:
# service -e
出力例:
/etc/rc.d/syslogd
/etc/rc.d/ntpd
/etc/rc.d/sshd
/etc/rc.d/sendmail
/etc/rc.d/cron
この時点で確認しておきたいポイントは以下のとおりです。
| サービス | 判断 |
|---|---|
sshd | 必要。そのまま有効 |
ntpd | 必要。時刻同期のセクションで設定済み |
syslogd | 必要。ログ管理に使用 |
cron | 必要。定期実行に使用 |
sendmail | 現時点では維持。Postfix 導入時に置き換え予定 |
sendmail については、インストール編でも記載したとおり、cron やセキュリティ通知などのローカルメール配送に使われています。
Postfix を導入するまでは無効化せず、そのまま残しておきます。
不要なサービスがある場合は、以下の手順で無効化できます。
# sysrc <サービス名>_enable="NO"
# service <サービス名> stop
判断に迷うサービスは、無理に停止せず残しておいて問題ありません。
サービスの役割が分からない場合は、man サービス名 で確認できます。
この時点での状態まとめ
ここまでの設定で、以下の初期設定とセキュリティ対策が完了しています。
| 項目 | 状態 |
|---|---|
| SSH 接続 | 公開鍵認証のみ、ポート変更済み、root ログイン禁止 |
| ユーザー運用 | 一般ユーザーで接続し、必要時に su で root に切り替え |
| OS アップデート | セキュリティパッチ適用済み、freebsd-update cron で定期チェック |
| hosts.allow | sshd のみ .jp から許可、その他は全拒否 |
| 時刻同期 | ntpd で NICT + 日本NTPプールに同期 |
| 仮想コンソール | ttyv0 のみ有効、ttyv1 以降は無効化 |
| 不要サービス | 確認済み、sendmail は Postfix 導入まで維持 |
サーバとしての基本的な守りはこの時点で整っています。
次回以降は、以下の内容を予定しています。
- ipfw によるファイアウォール設定:パケットフィルタリングでサーバへのアクセスをさらに制御します
- pkg / ports の導入と使い方:ソフトウェアのインストール方法を整理します
これらが完了すれば、Postfix や Dovecot などのアプリケーション導入に進む準備が整います。
