【FreeBSD】初期設定とセキュリティ設定(ConoHa VPS/14.3-RELEASE)

本記事は、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 で外部から接続するには、コントロールパネル側でポートの開放が必要です。

手順:

  1. ConoHa コントロールパネルにログイン
  2. 対象サーバの「ネットワーク情報」→「セキュリティグループ」を開く
  3. セキュリティグループに「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接続を試します。

  1. Tera Term を起動し、「ホスト」にサーバの IP アドレスを入力
  2. サービスは「SSH」、ポートは「22」を選択して接続
  3. ユーザー名に 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 に切り替わっていれば問題ありません。

補足:
sudodoas を導入して 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 で鍵ペアを生成します。

  1. Tera Term のメニューから「設定」→「SSH鍵生成」を開く
  2. 鍵の種類は「ED25519」を選択(または RSA 4096bit)
  3. 「生成」をクリックし、パスフレーズを設定
  4. 秘密鍵(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 noroot での直接ログインを禁止
PubkeyAuthentication yes公開鍵認証を有効化
AuthorizedKeysFile公開鍵ファイルのパスを明示
AuthenticationMethods publickey認証方式を公開鍵のみに限定
PasswordAuthentication noパスワード認証を無効化
PermitEmptyPasswords no空パスワードでのログインを禁止
KbdInteractiveAuthentication noキーボードインタラクティブ認証を無効化
ChallengeResponseAuthentication noチャレンジレスポンス認証を無効化
UsePAM noPAM 認証を無効化
AllowUsers <ユーザー名>SSH 接続を許可するユーザーを限定
UseDNS noDNS 逆引きを無効化(接続高速化)
MaxAuthTries 3認証試行回数を制限
LoginGraceTime 30ログイン猶予時間を30秒に短縮
MaxSessions 51接続あたりの多重セッション数を制限
MaxStartups 10:30:60未認証の同時接続を制限(10接続から30%の確率で拒否、60で全拒否)
AllowTcpForwarding noTCP ポートフォワーディングを禁止
AllowAgentForwarding noSSH エージェント転送を禁止
X11Forwarding noX11 転送を禁止
PermitTunnel noトンネリングを禁止
PermitUserEnvironment noユーザー環境変数の読み込みを禁止
UseBlacklist noblacklistd 連携を無効化(ipfw で別途制御する場合)
Subsystem sftpSFTP サブシステムの指定

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-updatecron オプションを使うと、パッチの有無を定期的にチェックし、更新がある場合にメールで通知できます。

/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

デフォルトでは以下のように ttyv0ttyv7on になっています。

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.allowsshd のみ .jp から許可、その他は全拒否
時刻同期ntpd で NICT + 日本NTPプールに同期
仮想コンソールttyv0 のみ有効、ttyv1 以降は無効化
不要サービス確認済み、sendmail は Postfix 導入まで維持

サーバとしての基本的な守りはこの時点で整っています。

次回以降は、以下の内容を予定しています。

  • ipfw によるファイアウォール設定:パケットフィルタリングでサーバへのアクセスをさらに制御します
  • pkg / ports の導入と使い方:ソフトウェアのインストール方法を整理します

これらが完了すれば、Postfix や Dovecot などのアプリケーション導入に進む準備が整います。

タイトルとURLをコピーしました