4.4. ネットワークアクセスのセキュア化
4.4.1. TCP Wrapper と xinetd を使用したサービスの保護
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. リッスンしているポートの確認
使用されていないポートは、攻撃の可能性を避けるために閉じることが重要です。リスニング状態にある予期せぬポートについては、侵入の可能性がないか調査する必要があります。
開いているポートスキャンでの 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 リスニングモードのポートを示します。
外部システムから、ss 出力に示されるすべての IP アドレス(localhost 127.0.0.0 または ::1 範囲を除く)に対してスキャンを行います。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 接続スキャン
(-sT)
は、TCP SYN スキャン (-sS)
がオプションでない場合のデフォルトの TCP スキャンタイプです。-O
オプションは、ホストのオペレーティングシステムを検出します。
netstat と ss を使用して開いている SCTP ポートのスキャン
netstat ユーティリティーは、Linux ネットワークサブシステムに関する情報を出力します。開いている Stream Control Transmission Protocol (SCTP)ポートのプロトコル統計を表示するには、
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 *:*
詳細は、ss(8)、netstat(8)、nmap(1)、および services(5) の man ページを参照してください。
4.4.3. ソースルーティングの無効化
ソースルーティングは、IP パケットが情報 (アドレスのリスト) を伝送できるようにするインターネットプロトコルメカニズムであり、パケットがたどる必要のあるパスをルーターに通知します。ルートが通過するときにホップを記録するオプションもあります。取得されたホップのリストである "route record" は、宛先に送信元へのリターンパスを提供します。これにより、送信元 (送信ホスト) は、一部またはすべてのルーターのルーティングテーブルを無視して、大まかにまたは厳密にルートを指定できます。これにより、ユーザーは悪意のある目的でネットワークトラフィックをリダイレクトできます。このため、ソースベースのルーティングは無効にする必要があります。
accept_source_route
オプションを使用すると、ネットワークインターフェイスが Strict Source Routing (SSR) または Loose Source Routing (LSR) のオプションが設定されたパケットを受け入れます。ソースルーティングされたパケットの受け入れは、sysctl の設定によって制御されます。SSR または LSR オプションが設定されたパケットをドロップするために、root で次のコマンドを発行します。
~]# /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 リダイレクトパケットの送信を無効にするディレクティブは 1 つのみです。このような 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 はデフォルトで Strict Reverse Path Forwarding を使用します。これは、RFC 3704, Ingress Filtering for Multihomed Networks の厳密な逆方向パスに関する推奨事項に準拠します。
警告
転送が有効になっている場合、逆方向パス転送は、(たとえば iptables ルールなど)ソースアドレス検証の他の手段がある場合にのみ無効にする必要があります。
-
rp_filter
- 逆方向パス転送は、
rp_filter
ディレクティブによって有効になります。sysctl ユーティリティーを使用すると、実行中のシステムに変更を加えることができます。永続的な変更は、行を/etc/sysctl.conf
ファイルに追加することで実行できます。rp_filter
オプションは、カーネルに 3 つのモードのうち 1 つを選択するよう指示するために使用されます。一時的なグローバル変更を行うには、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 コマンドを使用して、firewalld デーモン なし でこれを実行できます。ip6tables -t raw -I PREROUTING -m rpfilter --invert -j DROP
このルールは、特にステートフルマッチングルールの前にすべてのトラフィックに適用されるように、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-バージョン/Documentation/networking/ip-sysctl.txt
: このファイルには、ディレクトリーで利用可能なファイルとオプションの完全なリストが含まれています。カーネルのドキュメントに初めてアクセスする前に、root
で以下のコマンドを入力します。~]# yum install kernel-doc
- オンラインドキュメントマルチホームネットワークの Ingress フィルターリングの説明については、RFC 3704 を参照してください。