4.4. ネットワークアクセスのセキュア化

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

TCP Wrapper では、単にサービスへのアクセスを拒否する以上のことができます。このセクションでは、TCP Wrapperを使って接続バナーを送信し、特定ホストからの攻撃に対して警告し、ロギング機能を強化する方法について説明します。TCP Wrapper の機能と制御言語については、hosts_options(5) man ページを参照してください。サービスに適用可能なオプションとして機能する利用可能なフラグについては、xinetd.conf(5) man ページを参照してください。

4.4.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/

4.4.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 ディレクティブはどんなシェルコマンドも実行するので、特定のクライアントがサーバーに接続しようとする際に、管理者に通知したり一連のコマンドを実行したりする特別スクリプトを作成するとよいでしょう。

4.4.1.3. TCP Wrapper とロギングの強化

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

4.4.2. リッスンしているポートの確認

ポートを必要以上に開くとシステムの攻撃対象領域を増やすことになるので、避けるべきです。システムがサービスを開始した後で、予期せず開放されたポートがリッスン状態になっている場合は、侵入の形跡である可能性があり、調査が必要になります。
root で以下のコマンドを実行して、ネットワークからの接続をリッスンしているポートを調べます。
~]# netstat -pan -A inet,inet6 | grep -v ESTABLISHED
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address       Foreign Address    State     PID/Program name
tcp        0      0 0.0.0.0:111         0.0.0.0:*          LISTEN    1/systemd
tcp        0      0 192.168.124.1:53    0.0.0.0:*          LISTEN    1975/dnsmasq
tcp        0      0 0.0.0.0:22          0.0.0.0:*          LISTEN    1362/sshd
tcp        0      0 127.0.0.1:631       0.0.0.0:*          LISTEN    1355/cupsd
tcp        0      0 127.0.0.1:25        0.0.0.0:*          LISTEN    1802/master
tcp6       0      0 ::1:111             :::*               LISTEN    1/systemd
tcp6       0      0 :::22               :::*               LISTEN    1362/sshd
tcp6       0      0 ::1:631             :::*               LISTEN    1355/cupsd
tcp6       0      0 ::1:25              :::*               LISTEN    1802/master
raw6       0      0 :::58               :::*               7         791/NetworkManager
netstat コマンドの -l オプションを使用して、リスニングするサーバーソケットのみを表示できます。
~]# netstat -tlnw
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address       Foreign Address     State
tcp        0      0 0.0.0.0:111         0.0.0.0:*           LISTEN
tcp        0      0 192.168.124.1:53    0.0.0.0:*           LISTEN
tcp        0      0 0.0.0.0:22          0.0.0.0:*           LISTEN
tcp        0      0 127.0.0.1:631       0.0.0.0:*           LISTEN
tcp        0      0 127.0.0.1:25        0.0.0.0:*           LISTEN
tcp6       0      0 ::1:111             :::*                LISTEN
tcp6       0      0 :::22               :::*                LISTEN
tcp6       0      0 ::1:631             :::*                LISTEN
tcp6       0      0 ::1:25              :::*                LISTEN
raw6       0      0 :::58               :::*                7
本書執筆時は、-l オプションを使用しても SCTP サーバーが一覧表示されないことに注意してください。
リッスン状態の開放ポートを表示するには、ss ユーティリティーを使用することもできますが、本書執筆時はこのオプションを使用しても SCTP サーバーは表示されません。
~]# ss -tlw
Netid  State      Recv-Q Send-Q Local Address:Port       Peer Address:Port
udp    UNCONN     0      0                 :::ipv6-icmp            :::*
tcp    LISTEN     0      128                *:sunrpc                *:*
tcp    LISTEN     0      5      192.168.124.1:domain                *:*
tcp    LISTEN     0      128                *:ssh                   *:*
tcp    LISTEN     0      128        127.0.0.1:ipp                   *:*
tcp    LISTEN     0      100        127.0.0.1:smtp                  *:*
tcp    LISTEN     0      128              ::1:sunrpc               :::*
tcp    LISTEN     0      128               :::ssh                  :::*
tcp    LISTEN     0      128              ::1:ipp                  :::*
tcp    LISTEN     0      100              ::1:smtp                 :::*
システムで必要なサービスをコマンドの出力で確認して、特に必要でないものや権限が与えられていないものをオフにしてから、繰り返し確認します。次に、ネットワーク経由で最初のシステムに接続している別のシステムから nmap を使用して、外部チェックを行います。これは、firewalld のルールの確認に使用できます。
以下は、ネットワークからの TCP 接続をリッスンしているポートを判断するために、別のシステムのコンソールから発行するコマンドの例です。
~]# nmap -sT -O 192.168.122.1
詳細については、nmap(1) および services(5) の man ページを参照してください。

4.4.3. ソースルーティングの無効化

ソースルーティングはインターネットプロトコルメカニズムで、IP パケットがアドレス一覧の情報を持ち運べるようにします。このアドレスは、パケットが通過する必要のあるパスをルーターに知らせるものです。ルートを移動する際にホップを記録するオプションもあります。「ルート記録」と呼ばれるホップの記録は、宛先にソースまでの帰りのパスを提供します。これによりソースは (つまり送信ホスト)、すべてもしくは一部のルーターのルーティングテーブルを無視して、ルートを厳密もしくは緩やかに特定することができます。これによりユーザーは、不正目的でネットワークトラフィックをリダイレクトすることが可能になります。このため、ソースベースのルーティングは無効にする必要があります。
accept_source_route オプションを使用すると、ネットワークインターフェースが 厳密なソースルート (SSR) もしくは 緩やかなソースルーティング (LSR) オプションセットのあるパケットを受け付けるようになります。ソースルーティングパケットの受け付けは sysctl 設定で制御します。以下のコマンドを root で実行し、SSR または LSR オプションセットのあるパケットを遮断します。
~]# /sbin/sysctl -w net.ipv4.conf.all.accept_source_route=0
パケット転送の無効化は、可能な場合は上記のコマンドと合わせて行うべきです (転送の無効化は仮想化に影響する場合があります)。以下のコマンドを root で発行します。
以下のコマンドはすべてのインターフェースで IPv4 および IPv6 パケットの転送を無効にします。
~]# /sbin/sysctl -w net.ipv4.conf.all.forwarding=0
~]# /sbin/sysctl -w net.ipv6.conf.all.forwarding=0
以下のコマンドはすべてのインターフェースですべてのマルチキャストパケットの転送を無効にします。
~]# /sbin/sysctl -w net.ipv4.conf.all.mc_forwarding=0
~]# /sbin/sysctl -w net.ipv6.conf.all.mc_forwarding=0
ICMP リダイレクトの受信が正当に使用される場合はほとんどありません。ICMP リダイレクトパケットは特に必要でなければ、その受信と送信を無効にしてください。
以下のコマンドはすべてのインターフェースですべての ICMP リダイレクトパケットの受信を無効にします。
~]# /sbin/sysctl -w net.ipv4.conf.all.accept_redirects=0
~]# /sbin/sysctl -w net.ipv6.conf.all.accept_redirects=0
以下のコマンドはすべてのインターフェースでセキュアな ICMP リダイレクトパケットの受信を無効にします。
~]# /sbin/sysctl -w net.ipv4.conf.all.secure_redirects=0
以下のコマンドはすべてのインターフェースですべての IPv4 ICMP リダイレクトパケットの受信を無効にします。
~]# /sbin/sysctl -w net.ipv4.conf.all.send_redirects=0
IPv4 リダイレクトパケットの送信を無効にできるのはディレクティブのみです。IPv4 と IPv6 の差異を生み出している IPv6 Node Requirements の説明については、RFC4294 を参照してください。
設定を永続的なものにするには、その設定を /etc/sysctl.conf に追加する必要があります。
詳細は sysctl の man ページ sysctl(8) を参照してください。ソースベースのルーティングおよびそのバリエーションに関連するインターネットオプションの説明については、RFC791 を参照してください。

警告

イーサネットネットワークは、ARP や MAC アドレススプーフィング、権限のない DHCP サーバー、IPv6 ルーターまたは近隣アドバタイズメントといったトラフィックをリダイレクトする新たな方法を提供します。さらに、ユニキャストトラフィックはブロードキャストの場合もたまにあり、情報の漏洩を引き起こします。これらの脆弱性は、ネットワークオペレーター導入する特定の対策によってのみ、対処可能になります。ホストベースの対応策の有効性は、完全なものではありません。

4.4.4. 逆方向パス転送

逆方向パス転送は、あるインターフェースから着信したパケットが異なるインターフェース経由で去ってしまうことを防ぐために使用されます。送信ルートと着信ルートが異なる場合は、非対称ルーティング と呼ばれる場合もあります。ルーターがパケットをこの方法でルート設定することはよくありますが、ほとんどのホストはこのようなことをする必要はないはずです。例外として挙げられるのは、トラフィックをあるリンクで送信し、異なるサービスプロバイダーから別のリンクでトラフィックを受け取るアプリケーションです。例えば、xDSL との組み合わせで専用回線を使っている場合や、3G モデムを使ったサテライトリンクなどの場合です。このようなシナリオが該当する場合は、着信インターフェースで逆方向パス転送をオフにすることが必要になります。つまり、これが必要だと分かっている場合を除いて、有効にしておくのが最善の方法です。これは、ローカルサブネットからユーザーが IP アドレスをスプーフィングすることを防ぎ、DDoS 攻撃の機会を減らすためです。

注記

Red Hat Enterprise Linux 7 はデフォルトで 厳密な逆方向パス転送 (RPF: Reverse Path Forwarding) を使用します。これは、RFC 3704, Ingress Filtering for Multihomed Networks の厳密な逆方向パスに関する推奨事項に準拠します。

警告

転送が有効になっていれば、(iptables ルールなど) ソースアドレス確認に他の方法がある場合にのみ、逆方向パス転送を無効にしてください。
rp_filter
逆方向パス転送は rp_filter ディレクティブで有効にします。sysctl ユーティリティーを使用すると、稼働中のシステムに変更を加えることができます。永続的な変更は、/etc/sysctl.conf ファイルに行を追加して行えます。rp_filter オプションは、カーネルが 3 つのいずれかのモードから選択することを指示するために使用されます。
一時的なグローバル変更を行うには、root で以下のコマンドを入力します。
sysctl -w net.ipv4.conf.default.rp_filter=integer
sysctl -w net.ipv4.conf.all.rp_filter=integer
ここで、integer は、以下のいずれかになります。
  • 0 — ソース確認なし
  • 1 — RFC 3704 で定義された厳密なモード。
  • 2 — RFC 3704 で定義された緩慢なモード。
この設定は、以下のように net.ipv4.conf.interface.rp_filter コマンドを使用してネットワークインターフェースごとに上書きできます。
sysctl -w net.ipv4.conf.interface.rp_filter=integer
これらの設定を再起動しても保持するには、/etc/sysctl.conf ファイルを変更します。たとえば、すべてのインターフェースのモードを変更するには、 root ユーザーとして実行しているエディターで /etc/sysctl.conf ファイルを開き、以下のような行を追加します。
net.ipv4.conf.all.rp_filter=2
IPv6_rpfilter
IPv6 プロトコルの場合は、firewalld デーモンはデフォルトで逆方向パス転送が適用されます。この設定は、/etc/firewalld/firewalld.conf ファイルで確認できます。IPv6_rpfilter オプションを設定すると firewalld の動作を変更することができます。
逆方向パス転送のカスタム設定が必要な場合には、
ip6tables -t raw -I PREROUTING -m rpfilter --invert -j DROP
のように ip6tables コマンドを使用することで firewalld なし で実行できます。このルールは、すべてのトラフィックに適用されるように、特にステートフルの一致ルールの前で raw/PREROUTING チェーンの開始部分の近くに挿入する必要があります。iptables および ip6tables サービスに関する詳しい情報は「iptables サービスの使用」を参照してください。

4.4.4.1. その他のリソース

以下のリソースでは、逆方向パス転送について詳細な説明が提供されています。
  • インストール済みドキュメンテーション
    /usr/share/doc/kernel-doc-version/Documentation/networking/ip-sysctl.txt - このファイルには、/proc/sys/net/ipv4/ ディレクトリーで使用可能なファイルおよびオプションの完全な一覧が含まれています。初めてカーネルドキュメンテーションにアクセスする場合は、root で以下のコマンドを入力します。
    ~]# yum install kernel-doc
  • オンラインドキュメンテーション
    Ingress Filtering for Multihomed Networks の説明については、RFC 3704 を参照してください。