新しいFreeBSD12.0サーバーの推奨手順
序章
新しいFreeBSDサーバーをセットアップするとき、サーバーをより生産に適した状態にするために実行できるいくつかのオプションのステップがあります。 このガイドでは、最も一般的な例のいくつかを取り上げます。
ほとんどのトラフィックを拒否する、シンプルで構成が簡単なファイアウォールを設定します。 また、サーバーのタイムゾーンがその場所を正確に反映していることを確認します。 サーバーの時刻を正確に保つためにNTPポーリングを設定し、最後に、サーバーにスワップスペースを追加する方法を示します。
このガイドを開始する前に、ログインしてシェル環境を希望どおりに構成する必要があります。 このガイドに従って、これを行う方法を見つけることができます。
シンプルなIPFWファイアウォールを構成する方法
最初のタスクは、サーバーを保護するための単純なファイアウォールを設定することです。
FreeBSDは、3つの別個のファイアウォールをサポートし、含んでいます。 これらは、pf
、ipfw
、およびipfilter
と呼ばれます。 このガイドでは、ファイアウォールとしてipfwを使用します。 ipfw
は、FreeBSDの一部として作成および保守されている、安全でステートフルなファイアウォールです。
基本ファイアウォールの構成
ほとんどすべての構成は/etc/rc.conf
ファイルで行われます。 構成を変更するには、sysrc
コマンドを使用します。これにより、ユーザーは/etc/rc.conf
の構成を安全に変更できます。 このファイル内に、ipfw
ファイアウォールの機能を有効にして制御するためのさまざまな行を追加します。 基本的なルールから始めます。 次のコマンドを実行して開始します。
- sudo sysrc firewall_enable="YES"
sysrc
を実行して構成を変更するたびに、変更を示す出力が表示されます。
Outputfirewall_enable: NO -> YES
ご想像のとおり、この最初のコマンドはipfw
ファイアウォールを有効にし、起動時に自動的に開始し、通常のservice
コマンドで開始できるようにします。
次に、以下を実行します。
- sudo sysrc firewall_quiet="YES"
これは、ipfw
が特定のアクションを実行するときに、標準出力に何も出力しないように指示します。 これは好みの問題のように見えるかもしれませんが、実際にはファイアウォールの機能に影響を与えます。
2つの要素が組み合わさって、これが重要なオプションになります。 1つは、ファイアウォール構成スクリプトがバックグラウンドタスクとしてではなく、現在のシェル環境で実行されることです。 2つ目は、ipfw
コマンドが"quiet"
フラグなしで構成スクリプトを読み取ると、各行を読み取り、標準出力に出力することです。 行を出力すると、すぐに関連するアクションを実行します。
ほとんどのファイアウォール構成ファイルは、最初からやり直すために、スクリプトの上部にある現在のルールをフラッシュします。 ipfw
ファイアウォールがクワイエットフラグなしでこのような回線に遭遇した場合、ファイアウォールはすぐにすべてのルールをフラッシュし、通常はすべての接続を拒否するデフォルトのポリシーに戻ります。 SSH経由でファイアウォールを構成している場合、これにより接続が切断され、現在のシェルセッションが閉じられ、その後のルールは処理されず、サーバーから効果的にロックアウトされます。 クワイエットフラグを使用すると、ファイアウォールはルールを個別に実装するのではなく、ルールをセットとして処理できます。
これらの2行の後で、ファイアウォールの動作の構成を開始できます。 次に、構成するファイアウォールのタイプとして"workstation"
を選択します。
- sudo sysrc firewall_type="workstation"
これにより、ステートフルルールを使用してファイアウォールを構成しているサーバーを保護するようにファイアウォールが設定されます。 ステートフルファイアウォールは、ネットワーク接続の状態を経時的に監視し、これらの接続に関する情報をメモリに短時間保存します。 その結果、ファイアウォールが許可する接続に関するルールを定義できるだけでなく、ステートフルファイアウォールは、以前の接続について学習したデータを使用して、作成できる接続を評価することもできます。
/etc/rc.conf
ファイルでは、firewall_myservices
およびfirewall_allowservices
オプションを使用して、クライアントがアクセスできるようにするサービスをカスタマイズすることもできます。
次のコマンドを実行して、SSH接続用のポート22
や従来のHTTPWebサーバー用のポート80
など、サーバーでアクセスできるはずのポートを開きます。 WebサーバーでSSLを使用する場合は、必ずポート443
を追加してください。
- sudo sysrc firewall_myservices="22/tcp 80/tcp 443/tcp"
firewall_myservices
オプションは、サーバー上でアクセス可能である必要があるTCPポートまたはサービスのリストにスペースで区切られて設定されます。
注:名前でサービスを使用することもできます。 FreeBSDが名前で知っているサービスは、/etc/services
ファイルにリストされています。 たとえば、前のコマンドを次のように変更できます。
- firewall_myservices="ssh http https"
これでも同じ結果になります。
firewall_allowservices
オプションは、提供されたサービスへのアクセスを許可する必要があるアイテムを一覧表示します。 したがって、公開されているサービス(firewall_myservices
から)へのアクセスを特定のマシンまたはネットワーク範囲に制限できます。 たとえば、これは、社内ネットワークのWebコンテンツをマシンでホストする場合に役立ちます。 キーワード"any"
は、すべてのIPがこれらのサービスにアクセスできることを意味し、完全に公開されます。
- sudo sysrc firewall_allowservices="any"
firewall_logdeny
オプションは、/var/log/security
にあるファイルに対して拒否されたすべての接続試行をログに記録するようにipfw
に指示します。 これを設定するには、次のコマンドを実行します。
- sudo sysrc firewall_logdeny="YES"
ファイアウォール構成に加えた変更を確認するには、次のコマンドを実行します。
- grep 'firewall' /etc/rc.conf
/etc/rc.conf
ファイルのこの部分は次のようになります。
Outputfirewall_enable="YES"
firewall_quiet="YES"
firewall_type="workstation"
firewall_myservices="22 80 443"
firewall_allowservices="any"
firewall_logdeny="YES"
firewall_myservices
オプションを調整して、クライアントに公開するサービスを参照することを忘れないでください。
UDP接続の許可(オプション)
/etc/rc.conf
ファイルのfirewall_myservices
オプションにリストされているポートとサービスは、TCP接続へのアクセスを許可します。 UDP を使用して公開したいサービスがある場合は、/etc/rc.firewall
ファイルを編集する必要があります。
- sudo vi /etc/rc.firewall
"workstation"
ファイアウォールタイプを使用するようにファイアウォールを構成したので、次のようなセクションを探します。
. . .
[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
vi
で、i
を押してINSERT
モードに切り替えてコンテンツを追加し、ESC
を押して、ENTER
を押します。 前の例では、接続をすべてのクライアントに許可するか、特定の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
まず、サーバーが配置されている世界の地域を選択するように求められます。
次に、サブリージョンまたは国を選択する必要があります。
注:これらのメニューをナビゲートするには、PAGE UP
およびPAGE DOWN
キーを使用する必要があります。 キーボードにこれらがない場合は、FN
+DOWN
またはFN
+UP
を使用できます。
最後に、サーバーに適した特定のタイムゾーンを選択します。
選択に基づいて表示されるタイムゾーンの選択を確認します。
この時点で、サーバーのタイムゾーンは選択内容と一致している必要があります。
正確な時間を維持するためにNTPを設定する方法
サーバーでタイムゾーンを構成したので、NTPまたはネットワークタイムプロトコルを設定できます。 これにより、サーバーの時刻を世界中の他のサーバーと同期させることができます。 これは、時間に敏感なクライアント/サーバーの相互作用と正確なロギングにとって重要です。
ここでも、/etc/rc.conf
ファイルを調整することで、サーバーでNTPサービスを有効にできます。 次のコマンドを実行して、ntpd_enable="YES"
という行をファイルに追加します。
- sudo sysrc ntpd_enable="YES"
また、起動時にマシンの時刻をリモートNTPサーバーと同期する2行目を追加する必要があります。 これが必要なのは、サーバーが初期化時に通常のドリフト制限を超えることができるためです。 NTPデーモンが起動する前にタイムゾーンが適用され、システム時間が相殺されるため、サーバーは起動時にドリフト制限の範囲外になる可能性があります。
- sudo sysrc ntpd_sync_on_start="YES"
この行がない場合、起動プロセスの前にシステム時間を歪めるタイムゾーン設定が原因で、起動時にNTPデーモンが失敗します。
次のように入力して、ntpd
サービスを開始できます。
- sudo service ntpd start
これにより、/etc/ntp.conf
にリストされているNTPサーバーと同期することにより、サーバーの時間が維持されます。
追加のスワップスペースを構成する方法
DigitalOceanで構成されたFreeBSDサーバーでは、サーバーのサイズに関係なく、1ギガバイトのスワップスペースが自動的に構成されます。 次のように入力すると、これを確認できます。
- sudo swapinfo -g
次のように表示されます。
OutputDevice 1G-blocks Used Avail Capacity
/dev/gpt/swapfs 1 0 1 0%
一部のユーザーとアプリケーションは、これよりも多くのスワップスペースを必要とする場合があります。 これは、スワップファイルを追加することで実現されます。
最初に行う必要があるのは、スワップに使用するファイルにファイルシステムのチャンクを割り当てることです。 truncate
コマンドを使用すると、その場ですばやくスペースを割り当てることができます。
このチュートリアルでは、スワップファイルを/swapfile
に配置しますが、たとえば/var/swapfile
など、任意の場所にファイルを配置できます。 このファイルは、追加の1ギガバイトのスワップスペースを提供します。 -s
オプションに指定された値を変更することにより、この数値を調整できます。
- sudo truncate -s 1G /swapfile
スペースを割り当てたら、ファイルへのアクセスをロックダウンする必要があります。 通常のユーザーは、ファイルにアクセスできないようにする必要があります。
- sudo chmod 0600 /swapfile
次に、疑似デバイスをファイルに関連付け、次のように入力して起動時にマウントするように構成します。
- echo "md99 none swap sw,file=/swapfile,late 0 0" | sudo tee -a /etc/fstab
このコマンドは、次のような行を/etc/fstab
ファイルに追加します。
md99 none swap sw,file=/swapfile,late 0 0
/etc/fstab
ファイルに行が追加されたら、次のように入力して、セッションのスワップファイルをアクティブ化できます。
- sudo swapon -aqL
swapinfo
コマンドを再度使用して、スワップファイルが機能していることを確認できます。
- sudo swapinfo -g
スワップファイルに関連付けられている追加のデバイス(/dev/md99
)が表示されます。
OutputDevice 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同期、適切なスワップスペースなどの基本的な要素を構成することで、サーバーを将来のインストールやサービスの優れたベースとして使用できます。