Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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

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

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

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. リッスンしているポートの確認

攻撃の可能性を回避するために、未使用のポートを閉じることが重要です。リッスンしている状態における予期しないポートについて、侵入の可能性を調査する必要があります。

開いているポートスキャンに対する netstat 使用

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
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      1829/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1176/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1177/cupsd
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1664/master
sctp              0.0.0.0:2500                                      LISTEN   20985/sctp_darn
udp        0      0 192.168.124.1:53        0.0.0.0:*                           1829/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           977/dhclient
...
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 :::111                  :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 ::1:631                 :::*                    LISTEN
tcp6       0      0 ::1:25                  :::*                    LISTEN
raw6       0      0 :::58                   :::*                    7

開いているポートスキャンに対する ss の使用

もしくは、ss ユーティリティーを使用して、リッスンしている状態で開いているポートの一覧を表示します。netstat を使用するよりも、TCP およびステータス情報の量が多くなります。
~]# ss -tlw
etid 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                   :::sunrpc                              :::*
tcp   LISTEN     0      128                   :::ssh                                 :::*
tcp   LISTEN     0      128                  ::1:ipp                                 :::*
tcp   LISTEN     0      100                  ::1:smtp                                :::*
~]# ss -plno -A tcp,udp,sctp
Netid State      Recv-Q Send-Q       Local Address:Port                      Peer Address:Port
udp   UNCONN     0      0            192.168.124.1:53                                   *:*                   users:(("dnsmasq",pid=1829,fd=5))
udp   UNCONN     0      0                 *%virbr0:67                                   *:*                   users:(("dnsmasq",pid=1829,fd=3))
udp   UNCONN     0      0                        *:68                                   *:*                   users:(("dhclient",pid=977,fd=6))
...
tcp   LISTEN     0      5            192.168.124.1:53                                   *:*                   users:(("dnsmasq",pid=1829,fd=6))
tcp   LISTEN     0      128                      *:22                                   *:*                   users:(("sshd",pid=1176,fd=3))
tcp   LISTEN     0      128              127.0.0.1:631                                  *:*                   users:(("cupsd",pid=1177,fd=12))
tcp   LISTEN     0      100              127.0.0.1:25                                   *:*                   users:(("master",pid=1664,fd=13))
...
sctp  LISTEN     0      5                        *:2500                                 *:*                   users:(("sctp_darn",pid=20985,fd=3))
UNCONN は、UDP をリッスンしているモードでポートを表示します。
外部システムから (localhost 127.0.0.0 または ::1 範囲外で) ss 出力における各 IP アドレスに対してスキャンします。IPv6 アドレスをスキャンする -6 オプションを使用します。
次に、ネットワーク経由で最初のシステムに接続した別のリモートマシンから nmap ツールを使用して外部チェックを行います。これは、firewalld でのルールを確認するために使用できます。以下は、TCP 接続にどのポートをリッスンしているかを確認する例です。
~]# nmap -sT -O 192.168.122.65
    Starting Nmap 6.40 ( http://nmap.org ) at 2017-03-27 09:30 CEST
    Nmap scan report for 192.168.122.65
    Host is up (0.00032s latency).
    Not shown: 998 closed ports
    PORT    STATE SERVICE
    22/tcp  open  ssh
    111/tcp open  rpcbind
    Device type: general purpose
    Running: Linux 3.X
    OS CPE: cpe:/o:linux:linux_kernel:3
    OS details: Linux 3.7 - 3.9
    Network Distance: 0 hops

    OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
    Nmap done: 1 IP address (1 host up) scanned in 1.79 seconds
TCP SYN スキャン (-sS) がオプションでない場合に、TCP SYN スキャン (-sT) はデフォルトの TCP スキャンのタイプとなります。-O オプションは、ホストのオペレーティングシステムを検出します。

netstat および ss を使用して、SCTP のオープンポートに対してスキャン

netstat ユーティリティーは、Linux ネットワーキングサブシステムの情報を出力します。SCTP (Stream Control Transmission Protocol) のオープンポートでプロトコルの統計を表示するために、root で以下のコマンドを実行します。
~]# netstat -plnS
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address  State    PID/Program name
sctp                127.0.0.1:250                    LISTEN   4125/sctp_darn
sctp       0      0 127.0.0.1:260   127.0.0.1:250    CLOSE    4250/sctp_darn
sctp       0      0 127.0.0.1:250   127.0.0.1:260    LISTEN   4125/sctp_darn
~]# netstat -nl -A inet,inet6 | grep 2500
sctp                0.0.0.0:2500                                    LISTEN
ss ユーティリティーは、SCTP のオープンポートを表示できます。
~]# ss -an | grep 2500
sctp   LISTEN     0      5         *:2500                  *:*
詳細は、man ページの ss(8)netstat(8)nmap(1)services(5) を参照してください。

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

重要

net.ipv4.conf.all.send_redirects オプションまたは net.ipv4.conf.interface.send_redirects オプションのいずれかまたは両方を有効に設定すると、ICMP リダイレクトの送信が有効のままになります。各 インターフェース で、net.ipv4.conf.interface.send_redirects オプションを 0 に設定します。新しいインターフェースを追加するたびに、ICMP リクエストの送信を自動的に無効にするには、以下のコマンドを実行します。
~]# /sbin/sysctl -w net.ipv4.conf.default.send_redirects=0
ディレクティブだけが、IPv4 リダイレクトパケットの送信を無効にできます。IPv4 と IPv6 の差異を生み出している IPv6 Node Requirements の説明は、RFC4294 を参照してください。

注記

このような設定が再起動後も持続するようにするには、/etc/sysctl.conf ファイルを修正します。たとえば、すべてのインターフェースで IPv4 ICMP リダイレクトパケットの許可を無効にするには、root 権限でエディターを実行して /etc/sysctl.conf ファイルを開きます。追加する行は
net.ipv4.conf.all.send_redirects=0
のようになります。
詳細は sysctl の man ページ sysctl(8) を参照してください。ソースベースのルーティングおよびそのバリエーションに関連するインターネットオプションの説明については、RFC791 を参照してください。

警告

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

4.4.3.1. 逆方向パス転送

逆方向パス転送は、あるインターフェースから着信したパケットが異なるインターフェース経由で去ってしまうことを防ぐために使用されます。送信ルートと着信ルートが異なる場合は、非対称ルーティング と呼ばれる場合もあります。ルーターがパケットをこの方法でルート設定することはよくありますが、ほとんどのホストはこのようなことをする必要はないはずです。例外として挙げられるのは、トラフィックをあるリンクで送信し、異なるサービスプロバイダーから別のリンクでトラフィックを受け取るアプリケーションです。たとえば、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 を使用して IP セットの設定および制御」を参照してください。
パケット転送の有効化
別の外部ホストに転送したシステム外から到着したパケットを有効にするには、カーネルで IP 転送が有効になっている必要があります。root でログインし、/etc/sysctl.conf ファイルの net.ipv4.ip_forward = 0 を読み込む行を以下のように設定します。
net.ipv4.ip_forward = 1
/etc/sysctl.conf ファイルから変更をロードするには、以下のコマンドを実行します。
/sbin/sysctl -p
IP 転送が有効になっているのを確認するには、root で以下のコマンドを実行します。
/sbin/sysctl net.ipv4.ip_forward
このコマンドが 1 を返す場合は、IP 転送が有効になっています。0 を返す場合は、以下のコマンドを実行して手動で有効にできます。
/sbin/sysctl -w net.ipv4.ip_forward=1

4.4.3.2. その他のリソース

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