序章

新しいFreeBSDサーバーをセットアップするとき、サーバーをより生産に適した状態にするために実行できるいくつかのオプションのステップがあります。 このガイドでは、最も一般的な例のいくつかを取り上げます。

ほとんどのトラフィックを拒否する、シンプルで構成が簡単なファイアウォールを設定する方法について説明します。 また、サーバーのタイムゾーンがその場所を正確に反映していることを確認します。 サーバーの時刻を正確に保つためにNTPポーリングを設定し、最後に、サーバーにスワップスペースを追加する方法を示します。

このガイドを開始する前に、ログインしてシェル環境を希望どおりに構成する必要があります。 このガイドに従って、これを行う方法を見つけることができます。

シンプルなIPFWファイアウォールを構成する方法

最初に取り組むタスクは、サーバーを保護するための単純なファイアウォールを設定することです。

FreeBSDは、実際には3つの個別のファイアウォールをサポートしており、それぞれに長所と短所があります。 これらは、pfipfw、およびipfilterと呼ばれます。 このガイドでは、ipfwを使用します。これは、安全でステートフルなファイアウォールを使用して簡単に稼働できるためです。

基本ファイアウォールの構成

ほとんどすべての構成は/etc/rc.confファイルで行われます。 エディターでsudo特権を使用してそのファイルを開きます。

sudo vi /etc/rc.conf

内部では、ipfwファイアウォールがどのように機能するかを有効にして制御するために、いくつかの異なる行を追加する必要があります。 基本的なルールから始めましょう。 これらをファイルの最後に追加します。

. . .

firewall_enable="YES"
firewall_quiet="YES"

ご想像のとおり、最初の行でipfwファイアウォールが有効になり、起動時に自動的に開始され、通常のserviceコマンドで開始できるようになります。

2番目のコマンドは、ipfwに、特定のアクションを実行するときに標準出力に何も出力しないように指示します。 これは好みの問題のように見えるかもしれませんが、実際にはファイアウォールの機能に影響を与えます。

2つの要素が組み合わさって、これが重要なオプションになります。 1つは、ファイアウォール構成スクリプトがバックグラウンドタスクとしてではなく、現在のシェル環境で実行されることです。 2つ目は、ipfwコマンドが「quiet」フラグなしで構成スクリプトを読み取ると、各行を読み取り、標準出力に出力することです。 行を出力すると、すぐに関連するアクションを実行します。

ほとんどのファイアウォール構成ファイルは、クリーンな状態から始めるために、スクリプトの上部にある現在のルールをフラッシュします。 ipfwファイアウォールがクワイエットフラグなしでこのような回線に遭遇した場合、ファイアウォールはすぐにすべてのルールをフラッシュし、通常はすべての接続を拒否するデフォルトのポリシーに戻ります。 SSH経由でファイアウォールを構成している場合、これにより接続が切断され、現在のシェルセッションが閉じられ、その後のルールは処理されず、サーバーから効果的にロックアウトされます。 クワイエットフラグを使用すると、ファイアウォールは基本的に、ルールを個別に実装するのではなく、ルールをセットとして処理できます。

これらの2行の後で、ファイアウォールの動作の構成を開始できます。

. . .

firewall_type="workstation"
firewall_myservices="22 80"
firewall_allowservices="any"
firewall_logdeny="YES"

まず、構成するファイアウォールの種類として「ワークステーション」を選択します。 これはステートフルファイアウォールであり、デフォルトで適切に動作します。 また、firewall_myservicesおよびfirewall_allowservicesオプションを使用して、クライアントがアクセスできるようにするサービスを簡単にカスタマイズできます。 最後に、構成されたルールによって拒否された接続をログに記録するようにipfwを構成します。

firewall_myservicesオプションは、サーバーでアクセスできるTCPポートまたはサービスのリストにスペースで区切って設定する必要があります。 ここにあるように、ポートを使用できます(SSH接続用にポート22を構成し、従来のHTTP Webサーバー用にポート80を構成しました)。 名前でサービスを使用することもできます。 FreeBSDが名前で知っているサービスは、/etc/servicesファイルにリストされています。 たとえば、上記を次のように変更できます。

firewall_myservices="ssh http"

これでも同じ結果になります。 WebサーバーでSSLを使用する場合は、必ずポート443またはhttpsサービスをこのリストに追加してください。

firewall_allowservicesリスト項目は、提供されたサービスへのアクセスを許可する必要があるクライアントです。 キーワード「any」は、すべてのクライアントがこれらのサービスにアクセスできることを意味します。 サービスに接続できるクライアントを制限したい場合は、ここで行うことができます。

firewall_logdenyオプションは、/var/log/securityにあるファイルに対して拒否されたすべての接続試行をログに記録するようにipfwに指示します。

まとめると、/etc/rc.confファイルのこの部分は次のようになります。

. . .

firewall_enable="YES"
firewall_quiet="YES"
firewall_type="workstation"
firewall_myservices="22 80"
firewall_allowservices="any"
firewall_logdeny="YES"

firewall_myservicesオプションを調整して、クライアントに公開するサービスを参照することを忘れないでください。 終了したら、ファイルを保存して閉じます。

UDP接続の許可

/etc/rc.confファイルのfirewall_myservicesオプションにリストされているポートとサービスは、TCP接続へのアクセスを許可します。 UDPを使用して公開したいサービスがある場合は、/etc/rc.firewallファイルを編集する必要があります。

sudo vi /etc/rc.firewall

「ワークステーション」ファイアウォールタイプを使用するようにファイアウォールを構成したので、次のようなセクションを探します。

. . .

[Ww][Oo][Rr][Kk][Ss][Tt][Aa][Tt][Ii][Oo][Nn])

. . .

このブロック内には、設定したfirewall_allowservicesおよびfirewall_myservices値の処理専用のセクションがあります。 次のようになります。

for i in ${firewall_allowservices} ; do
  for j in ${firewall_myservices} ; do
    ${fwcmd} add pass tcp from $i to me $j
  done
done

このセクションの後に、次のような行を追加することで、UDPパケットを受け入れる必要のあるサービスまたはポートを追加できます。

${fwcmd} add pass udp from any to me port_num

上記の例では、接続をすべてのクライアントに許可するか、特定のIPアドレスまたはネットワーク範囲に変更する必要がある場合は、「any」キーワードを残すことができます。 上記のport_numは、UDPアクセスを許可するポート番号またはサービス名に置き換える必要があります。 たとえば、DNSサーバーを実行している場合は、次のような行が必要になる場合があります。

for i in ${firewall_allowservices} ; do
  for j in ${firewall_myservices} ; do
    ${fwcmd} add pass tcp from $i to me $j
  done
done

${fwcmd} add pass udp from 192.168.2.0/24 to me 53

これにより、192.168.2.0/24ネットワーク範囲内のすべてのクライアントが、標準ポート53で動作するDNSサーバーにアクセスできるようになります。 この例では、DNSサーバーがより長い応答に使用するため、このポートをTCP接続用に開くこともできます。

終了したら、ファイルを保存して閉じます。

ファイアウォールの開始

構成が完了したら、次のように入力してファイアウォールを開始できます。

sudo service ipfw start

ファイアウォールは正しく起動し、許可されたサービスとポートを順守しながら不要なトラフィックをブロックする必要があります。 このファイアウォールは、起動するたびに自動的に起動します。

また、ログに記録するIPアドレスごとの拒否数の制限を構成する必要があります。 これにより、単一の永続的なユーザーからログがいっぱいになるのを防ぐことができます。 これは、/etc/sysctl.confファイルで実行できます。

sudo vi /etc/sysctl.conf

ファイルの下部で、次を追加することにより、ログを「5」に制限できます。

net.inet.ip.fw.verbose_limit=5 

終了したら、ファイルを保存して閉じます。 これにより、次回の起動時にその設定が構成されます。

現在アクティブなセッションにこれと同じ動作を実装するには、次のようにsysctlコマンド自体を使用できます。

sudo sysctl net.inet.ip.fw.verbose_limit=5

これにより、このブートの制限がすぐに実装されます。

サーバーのタイムゾーンを設定する方法

サーバーのタイムゾーンを正しく設定することをお勧めします。 これは、次のセクションでNTP時間同期を構成する際の重要なステップです。

FreeBSDには、タイムゾーンを設定するためのtzsetupと呼ばれるメニューベースのツールが付属しています。 サーバーのタイムゾーンを設定するには、sudo権限で次のコマンドを呼び出します。

sudo tzsetup

ハードウェアクロックがUTCに設定されているか現地時間に設定されているかを尋ねる最初のメニュー画面が表示されます。

FreeBSD UTC or local time

ここで「いいえ」を選択します。 次に、サーバーが配置されている世界の地域を選択するように求められます。

FreeBSD region of the world

次に、サブリージョンまたは国を選択する必要があります。

FreeBSD country

最後に、サーバーに適した特定のタイムゾーンを選択します。

FreeBSD time zone

選択に基づいて表示されるタイムゾーンの選択を確認します。

この時点で、サーバーのタイムゾーンは選択内容と一致している必要があります。

正確な時間を維持するためにNTPを設定する方法

サーバーでタイムゾーンを構成したので、サーバーでNTP(Network Time Protocol)を設定できます。 これにより、サーバーの時刻を世界中の他のサーバーと同期させることができます。 これは、時間に敏感なクライアント/サーバーの相互作用と正確なロギングにとって重要です。

ここでも、/etc/rc.confファイルを調整することで、サーバーでNTPサービスを有効にできます。 sudo権限でこれを開きます。

sudo vi /etc/rc.conf

このファイル内に、次の行を追加します。

ntpd_enable="YES"

また、マシンの時刻を起動時にリモートNTPサーバーと同期する2行目を追加する必要があります。 これが必要なのは、サーバーが初期化時に通常のドリフト制限を超えることができるためです。 NTPデーモンが起動する前にタイムゾーンが適用されるため、サーバーは起動時にドリフト制限の範囲外になる可能性があります。これにより、システム時間が相殺されます。

ntpd_enable="YES"
ntpd_sync_on_start="YES"

この行がない場合、起動プロセスの前にシステム時間を歪めるタイムゾーン設定が原因で、起動時にNTPデーモンが失敗します。

終了したら、ファイルを保存して閉じます。

次のように入力して、ntpdサービスを開始できます。

sudo service ntpd start

これにより、/etc/ntp.confにリストされているNTPサーバーと同期することにより、サーバーの時間が維持されます。

追加のスワップスペースを構成する方法

DigitalOceanで設定されたFreeBSDサーバーでは、サーバーのサイズに関係なく、1ギガバイトのスワップスペースが自動的に設定されます。 次のように入力すると、これを確認できます。

sudo swapinfo -g

次のように表示されます。

Device          1G-blocks     Used    Avail Capacity
/dev/gpt/swapfs         1        0        1     0%

一部のユーザーとアプリケーションは、これよりも多くのスワップスペースを必要とする場合があります。 これは、スワップファイルを追加することで簡単に実行できます。

最初に行う必要があるのは、スワップに使用するファイルにファイルシステムのチャンクを割り当てることです。 truncateコマンドを使用します。これにより、その場ですばやくスペースを割り当てることができます。

このガイドでは、スワップファイルを/swapfileに配置しますが、ファイルシステム内の任意の適切な場所を使用できます。 このファイルは、追加の1ギガバイトのスワップスペースを提供します。 -sオプションに指定された値を変更することにより、この数値を調整できます。

sudo truncate -s 1G /swapfile

スペースを割り当てたら、ファイルへのアクセスをロックダウンする必要があります。 通常のユーザーは、ファイルにアクセスできないようにする必要があります。

sudo chmod 0600 /swapfile

次に、疑似デバイスをファイルに関連付け、次のように入力して起動時にマウントするように構成します。

sudo sh -c 'echo "md99 none swap sw,file=/swapfile,late 0 0" >> /etc/fstab'

上記のコマンドは、/etc/fstabファイルに次のような行を追加します。

md99 none swap sw,file=/swapfile,late 0 0

/etc/fstabファイルに行が追加されたら、次のように入力して、セッションのスワップファイルをアクティブ化できます。

sudo swapon -aqL

swapinfoコマンドを再度使用して、スワップファイルが機能していることを確認できます。

sudo swapinfo -g

スワップファイルに関連付けられている追加のデバイス(/dev/md99)が表示されます。

Device          1G-blocks     Used    Avail Capacity
/dev/gpt/swapfs         1        0        1     0%
/dev/md99               1        0        1     0%
Total                   2        0        2     0%

このスワップファイルは、起動するたびに自動的にマウントされます。

結論

このガイドで概説されているステップは、FreeBSDサーバーをより本番環境に対応した状態にするために使用できます。 ファイアウォール、NTP同期、適切なスワップスペースなどの基本的な要素を構成することで、サーバーを将来のインストールやサービスの優れたベースとして使用できます。