Show Table of Contents
このページには機械翻訳が使用されている場合があります (詳細はこちら)。
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 を参照してください。
このページには機械翻訳が使用されている場合があります (詳細はこちら)。