2.2. サーバーのセキュリティ

システムは、公開ネットワーク上のサーバーとして使われる際には攻撃対象となります。このため、システム管理者にとってはシステムを堅牢にし、サービスをロックダウンすることは、最重要事項になります。
特定の問題を詳細に見る前に、以下に挙げるサーバーセキュリティを強化する一般的なヒントについて概説します。
  • 最新の脅威から保護するために、すべてのサービスを最新に保つ
  • できるだけ安全なプロトコルを使う
  • できるだけマシン 1 台あたり 1 種類のネットワークサービスのみを実行する
  • 不審なアクティビティがないか、すべてのサーバーを注意深く監視する

2.2.1. TCP Wrapperおよび xinetd によるサービスのセキュア化

TCP Wrapper は、幅広いサービスにアクセス制御を提供します。SSH や Telnet、FTP といった現在のネットワークサービスのほとんどは TCP Wrapperを使用します。TCP Wrapperは、着信する要求と要求されたサービスの間の防護機能を提供します。
TCP Wrapper の利点は、追加のアクセス、ロギング、リダイレクション、リソース使用制御を提供するスーパーサーバーの xinetd と合わせて使うことで高まります。

注記

TCP Wrapper と xinetd を iptables ファイアウォールルールとともに使用して、サービスアクセス制御内に冗長性を作成するとよいでしょう。iptables コマンドを使ってファイアウォールを実装する方法の詳細情報は、「ファイアウォール」 を参照してください。
以下のサブセクションでは、各トピックについての基本的な情報があることを前提としており、特定のセキュリティオプションについてフォーカスしています。

2.2.1.1. TCP Wrapper によるセキュリティ強化

TCP Wrapper では、単にサービスへのアクセスを拒否する以上のことができます。このセクションでは、TCP Wrapperを使って接続バナーを送信し、特定ホストからの攻撃に対して警告し、ロギング機能を強化する方法を説明します。TCP Wrapper の機能と制御言語についての情報は、hosts_options man ページを参照してください。サービスに適用可能なオプションとして機能する利用可能なフラグについては、オンラインの http://linux.die.net/man/5/xinetd.conf にある xinetd.conf man ページを参照してください。
2.2.1.1.1. TCP Wrapper と接続バナー
システム管理者が警戒していることを潜在的な攻撃者に知らせるには、ユーザーがサービスに接続する際に適切なバナーを表示させるのがよい方法です。また、ユーザーに対してシステムのどの情報を表示させるかを制御することもできます。サービスに TCP Wrapper のバナーを実装するには、banner オプションを使用します。
以下の例では、vsftpd にバナーを導入します。最初にバナーファイルを作成します。これはシステム上のどこでも構いませんが、デーモンと同じ名前にする必要があります。例えば、ファイル名 /etc/banners/vsftpd には以下の行が含まれます。
220-Hello, %c 
          220-All activity on ftp.example.com is logged.
          220-Inappropriate use will result in your access privileges being removed.
%c トークンは、ユーザー名およびホスト名、またはユーザー名および IP アドレスなどの幅広いクライアント情報を提供し、接続をより威圧的なものにします。
このバナーを受信接続に表示させるには、以下の行を /etc/hosts.allow ファイルに追加します。
vsftpd : ALL : banners /etc/banners/
2.2.1.1.2. TCP Wrapper と攻撃警告
特定のホストまたはネットワークによるサーバーへの攻撃が検出された場合、TCP Wrapper は spawn 指示文を使ってそのホストまたはネットワークからのその後の攻撃について管理者に警告することができます。
以下の例では、206.182.68.0/24 ネットワークからのクラッカーがサーバーに攻撃を仕掛けようとしていることが検出されたとします。/etc/hosts.deny ファイルに以下の行を挿入すると、そのネットワークからの接続の試みが拒否され、特別ファイルにログ記録されます。
ALL : 206.182.68.0 : spawn /bin/echo `date` %c %d >> /var/log/intruder_alert
%d トークンは、攻撃者がアクセスを試みるサービス名を提供します。
接続とログインを許可するには、 spawn 指示文を /etc/hosts.allow ファイル内に置きます。

注記

spawn 指示文はどんなシェルコマンドも実行するので、特定のクライアントがサーバーに接続しようとする際に、管理者に通知したり一連のコマンドを実行したりする特別スクリプトを作成するとよいでしょう。
2.2.1.1.3. TCP Wrapper とロギングの強化
特定の種類の接続が他のものよりも懸念される場合は、severity オプションを使うと該当サービスに対するログレベルを高めることができます。
以下の例では、FTP サーバーのポート 23 (Telnet ポート) への接続はクラッカーによるものとします。これを示すために、デフォルトのフラグである info の代わりに emerg フラグをログファイルに置いて接続を拒否します。
これを実行するには、以下の行を /etc/hosts.deny に挿入します。
in.telnetd : ALL : severity emerg
これはデフォルトの authpriv ロギング機能を使用しますが、優先順位をデフォルト値の info から emerg に引き上げ、ログメッセージを直接コンソールに投稿します。

2.2.1.2. xinetd を使用したセキュリティの強化

このセクションでは、xinetd を使用してトラップサービスを設定し、特定の xinetd サービスで利用可能なリソースレベルを制御する方法にフォーカスしています。サービスに対するリソースの制限設定は、サービス拒否 (DoS) 攻撃の防止に役立ちます。利用可能なオプション一覧は、xinetd および xinetd.conf の man ページを参照してください。
2.2.1.2.1. トラップの設定
xinetd の重要な機能の一つは、ホストをグローバルの no_access リストに追加することです。このリスト上のホストは、xinetd が管理するサービスに特定の期間または xinetd が再起動するまで、接続が拒否されます。SENSOR 属性を使うとこれを実行できます。サーバー上のポートをスキャンしようとするホストをブロックするには、これが簡単な方法です。
SENSOR の設定における最初のステップでは、使用しない予定のサービスを選択します。この例では、Telnet を使います。
/etc/xinetd.d/telnet ファイルを編集して flags 行を以下のように変更します。
flags           = SENSOR
以下の行を追加します。
deny_time       = 30
これにより、当該ホストによるポートへのさらなる接続の試みを 30 分間拒否します。deny_time で利用可能な別の属性には FOREVER があり、これは実際には xinetd が再起動するまで接続を禁止します。また、NEVER は、接続を許可してログ記録します。
最後に、最終行は以下のようにします。
disable         = no
これでトラップ自体が有効になります。
SENSOR を使用して望ましくないホストからの接続を検出、停止することはよい方法ですが、マイナス面が 2 つあります。
  • ステルススキャンに対しては効果がありません。
  • SENSOR が実行中であることを攻撃者が認識している場合、特定ホストの IP アドレスを偽造し、禁止されているポートに接続することで、このホストに対するサービス拒否攻撃を仕掛けることが可能です。
2.2.1.2.2. サービスリソースの制御
xinetd のもう一つの重要な機能は、制御下にあるサービスに対するリソース制限を設定することです。
以下の指示文でこれを実行します。
  • cps = <number_of_connections> <wait_period> — 受信接続の割合を制限します。この指示文は 2 つの引数を取ります。
    • <number_of_connections> — 1 秒あたりに処理する接続数です。受信接続数がこの割合よりも高い場合、このサービスは一時的に無効になります。デフォルト値は 50 です。
    • <wait_period> — サービスが無効になった後に再度有効になるまでの秒数です。デフォルトの間隔は 10 秒です。
  • instances = <number_of_connections> — サービスへ許可される接続数の合計を指定します。この指示文は整数値もしくは UNLIMITED を受け付けます。
  • per_source = <number_of_connections> — ホスト毎に許可される接続数を指定します。この指示文は整数値もしくは UNLIMITED を受け付けます。
  • rlimit_as = <number[K|M]> — サービスが占有可能なメモリアドレス領域の量をキロバイトもしくはメガバイトで指定します。この指示文は整数値もしくは UNLIMITED を受け付けます。
  • rlimit_cpu = <number_of_seconds> — あるサービスが CPU を占有できる時間を秒数で指定します。この指示文は整数値もしくは UNLIMITED を受け付けます。
これらの指示文を使用することで、 xinetd サービスの 1 つがシステムを圧倒し、サービス拒否になることを防ぐ手助けとなります。