以下の netstat の出力からの一行の引用で、 二つのコンピュータの間の典型的な接続を見ることができます:
tcp 30 0 169.254.179.139:1359 18.29.1.67:21 CLOSE_WAIT |
さて、上の例を用いてまとめてみましょう。 我々はサーバ(rpmfind.net)にクライアント(私)を接続し、 その接続は両端のそれぞれのポートによって定義され制御されます。 データはパケットによって送られ制御されます。 サーバは"特権"ポート(つまり、1024 未満の番号のポート) を用いて、ポートを開き接続のために耳をすませています。 私のクライアントによって用いられている私の側の端の "非特権"ポートは一時的なもので、 接続が持続している間だけ開いていて、 接続の他端のサーバのポートへの応答だけを行います。 一般的に言って、このタイプのポートは攻撃や侵入の弱点にはなりません。 サーバのポートはそれが開き続けているがゆえに危険なのです。 FTP サーバの管理者はサーバが安全であるように、 適切な警戒をしている必要があります。 他のインターネット接続、例えば web サーバやメイルサーバのような接続は、 サーバのポート番号は違いますが、上の例と同じ様に働いています。 SMTP メイルサーバは 25 番ポートを用いますし、 web サーバは典型的には 80 番を使います。 他のよく用いられているポート番号やそのサーヴィスについては、 ポートの章を参照してください。
ポートについてのポイントをもう一つ: ポートはそこに耳をすませている何かがあるときに、 アクセス可能であるだけです。 もしそこで耳をすませているサーヴィスやデーモンがいて、 入ってくる接続要求に応えるよう待ち受けていないならば、 誰もポートを開くように強制することはできません。 閉じているポートはまったく安全なのです。
クライアントとサーバの間の違いについての最後のポイント。 上の例では netstat のLISTENER の箇所に telnet や ftp などの項目がありませんでした。 言い換えれば、このようなサーバはローカルに走っていないのです。 誰か他の telnet または ftp サーバに接続するために、 telnet や ftp のサーバデーモンを走らせる必要はありません。 これらは接続しようとする他の人たちに対して、 サーヴィスを提供するためにあるのです。 ほとんどの場合、本当にそうしたい人は少ないでしょう。 サーバを走らせていなくても、 telnet と ftp のクライアントソフトウェアを使用するのに、 何の問題もないのです。
1番から19番と、それらに結びついたプロトコルの多くは古臭くて、 おそらくそのどれも現代のシステムでは必要ないでしょう。 もしあなたがそれらが何なのかどれも知らないなら、確実に必要ありません。 7番ポートの echo サーヴィスを 通常の ping プログラムと混同してはいけません。 これら全てをオフのままにしておいてください。 |
20番ポート(FTP-DATA)。"アクティブな" FTP 接続は 二つのポートを使います:21 番ポートは制御用ポートで、 20 番ポートはデータが通るために用いられます。 受動的な FTP は全く 20 番ポートを用いません。 リスクは小さいですが、以下を見てください。 |
21 番ポート(FTP サーバポート、すなわちファイル転送プロトコル)。 システム間でファイルを転送するための、非常に確立されたプロトコルです。 大変危険が大きく、ナンバーワンの攻撃ターゲットかもしれません。 |
22 番ポート(SSH, Secure Shell, または時に PCAnywhere プロトコル)。 危険は低いか中程度。(もちろん、いわゆる"安全な" サーヴィスに対してさえ攻撃はあります) |
23 番ポート(Telnet サーバ)。LAN での使用のみに。 安全でない環境においては、 代わりに ssh を用いてください。危険は中程度。 |
25 番(SMTP, Simple Mail Transfer Protocol, またはメイルサーバポート) はメイルを外に送るためと、メイルをある場所から他のところへ 転送するために用いられます。危険は中程度。 これは長い間、酷い攻撃にさらされてきましたが、 最近改善されてきています。 |
37 番ポート(time サーヴィス)。これは組み込みの inetd time サーヴィスです。 危険度は低。LAN での使用のみに。 |
53 番ポート(DNS, Domain Name Server ポート)。 ネームサーバはこのポートで耳をすませ、ホスト名を IP アドレスに 解決するための問い合わせに応えます。危険度は高。 |
67 番(UDP)ポート(BOOTP, DHCP のサーバポート)。危険度は低。 もし LAN で DHCP を用いるなら、 これをインターネットにさらす必要はありません。 |
68 番(UDP)ポート(BOOTP または DHCP のクライアントポート)。危険度は低。 |
69 番ポート(tfpt, Trivial File Transfer Protcol)。 極めて危険。本当に、本当に必要なら、LAN のみで使ってください。 |
79 番ポート(finger, システムとログインしているユーザの情報を提供するために用いられる)。 クラックの標的としては危険度は低いが、あまりに多くの情報を流すため、 走らせるべきではない。 |
80 番ポート(WWW または HTTP 標準 web サーバポート)。 インターネットでもっとも通常に用いられるサーヴィス。危険度は低い。 |
98 番ポート(Linuxconf web アクセス管理ポート)。 もし、本当に必要ならば、LAN のみで。 |
110 番ポート (POP3 つまり Post Office Protocol, メイルサーバポート)。 POP メイルでは、ユーザがリモートシステムからメイルを取り出します。 危険度は低。 |
111 番ポート(sunrpc, Sun Remote Procudure Call, または portmapper ポート)。 NFS (Network File System), NIS (Network Information Service), そして様々の関係サーヴィスに用いられます。 危険そうに聞こえますし、実際危険度は高です。 LAN の使用のみで。クラッカーたちのお気に入りの標的です。 |
113 番ポート(identd または auth サーバポート)。 古いスタイルのサーヴィス(SMTP や IRC のような)で、 接続を許可するために用いられることがあり、時に必要です。 おそらくほとんどの場合では必要ではなく、 危険度は低いですが、攻撃者にあまりに多くのシステム情報を 与えてしまう可能性があります。 |
119 番ポート(nntp またはニュースサーバポート)。危険度は低。 |
123 番ポート(高い精度が必要な time サーバで同期をするための Network Time プロトコル)。 危険度は低いですが、おそらくほとんどのユーザには必要でないでしょう。 システムクロックを更新するには、 rdate を用いるのがより簡単で安全です。 そして、LAN システムを同期するためには time サーヴィス にビルドされた inetd を使うという 選択もあるでしょう。 |
137 から139 番ポート(NetBios (SMB) サーヴィス)。 ほとんどの場合、Windows 関係です。 Linux では危険度は低いですが、LAN での使用のみにしてください。 137 番への攻撃は非常に良く見られます。 多くは無害ではありますがたくさんのノイズを生成することで、 非難されがちな Redmond 産プロトコルです。 |
143 番ポート(IMAP, Interim Mail Access Protocol)。 これもまた、メイル受信プロトコル。危険度は低から中。 |
161 番ポート(SNMP, Simple Network Management Protocol)。 ルータやスイッチが統計や重大なサインをモニタするために もっとも普通に用いられます。ほとんどの場合には必要でなく、 危険度も低いです。 |
177 番ポート(XDMCP, X サーバにリモート接続するための X Display Management Control Protocol)。 危険度は低いですが、LAN での使用のみにすることをお勧めします。 |
443 番ポート(HTTPS, 広く用いられている安全な HTTP (WWW) プロトコル)。 危険度は低。 |
465 番ポート(SSL 経由のSMTP (secure mail server protocol) )。 危険度は低。 |
512 番(TCP)ポート(netstatでは exec と表示されますが、実際、 その適切な呼び方はリモートでの実行のための rexec です。) 危険そうに聞こえるでしょうし、実際危険です。 危険度は高く、どんな場合でも LAN での使用のみにしてください。 |
512 番(UDP)ポート(biff, メイル通知プロトコル)。 危険度は低。LAN のみで。 |
513 番ポート(login, 実際 rlogin つまり リモートログイン)。 いつもログインする時に用いている標準の /bin/login とは何の関係もありません。 これは危険そうに聞こえるでしょうし、実際危険です。 危険度は高、本当に必要なときにだけ LAN のみで用いてください。 |
514 番(TCP)ポート(shell がその別名で、 netstat ではそう示されます。 実際、rsh が "Remote Shell" のための アプリケーションです。) すべての "r" コマンドたちと同様に、 古き良き、紳士的だった時代への先祖返りです。 まったく安全でなく、危険度は高。 どんな場合にも LAN での使用のみにしてください。 |
514 番(UDP)ポート(syslog デーモンのポートで、 リモートログイン目的のためにのみ用いられる)。 平均的なユーザには必要ありません。おそらく危険度は低いでしょうが、 本当に必要な時にでも絶対に LAN 使用で。 |
515 番ポート(lp つまりプリントサーバポート)。 高リスク。もちろん LAN のみで。 世界の反対側にいる誰かはあなたのプリンタを本来の目的で使いはしません! |
587 番ポート(MSA, つまり"投函"、メイル投函エージェント (Mail Submission Agent)プロトコル)。 ほとんどの MTA (メイルサーバ) によってサポートされている新しいメイル運用プロトコル。 危険度は低。 |
631 番ポート(CUPS (プリントデーモン) web マネージメントポート)。 LAN のみの使用で。危険度は低。 |
635 番ポート(mountd, NFS の一部)。LAN のみの使用で。 |
901 番ポート(SWAT, Samba Web 管理ツールポート)。 LAN のみの使用で。 |
993 番ポート(SSL 経由のIMAP, 安全な IMAP メイルサーヴィス)。 危険度は非常に低い。 |
995 番ポート(SSL 経由の POP, 安全な POP メイルサーヴィス)。 危険度は非常に低い。 |
1024 番ポート(これは最初の"非特権"ポートで、 要求があったアプリケーションに対しカーネルによって動的に割り当てられる)。 これはほとんど何にでもなれます。上のポートらの記述に同じ。 |
1080 番ポート(Socks Proxy サーバ)。クラッカーのお気に入りの標的です。 |
1243 番ポート(SubSeven Trojan)。Windows のみの問題です。 |
1433 番ポート(MS SQL サーバポート)。 時に標的になります。Linux には適用されません. |
2049 番ポート(nfsd, つまり Network File Service Daemon ポート)。 危険度は高。LAN だけで使用することを勧めます。 |
3128 番ポート(squid proxy サーバポート)。 危険度は低いですが、ほとんどの場合は LAN での使用のみにすべきです。 |
3306 番ポート(MySQL サーバポート)危険度は低いですが、 ほとんどの場合 LAN での使用のみにすべきです。 |
5432 番ポート(PostgreSQL サーバポート)LAN のみで。比較的低リスク。 |
5631 番(TCP), 5632 番(UDP)ポート(PCAnywhere ポート)。 Windows のみ。PCAnywhere は大変"ノイズの多い" ものになりえますし、広い範囲のアドレスにブロードキャストします。 |
6000 番ポート(リモート接続のための X11 TCP ポート)。 危険度は低から中程度ですが、やはり、LAN での使用のみにすべきです。 実際、X は複数のディスプレイと各ディスプレイ毎に自身のポートを 持つことをサポートしているので、 これは 6000 番から 6009 番のポートも含む可能性があります。 ssh の X11 フォワーディングは 6010 番からポートを使い始めます。 |
6346 番ポート(gnutella)。 |
6667 番ポート(ircd, つまり Internet Relay Chat Daemon)。 |
6699 番ポート(napster)。 |
7100-7101 番ポート(フォントサーバにこれらのポートを使うものがあります)。 危険度は低いですが、LAN での使用のみで。 |
8000 番と 8080 番ポート(通常 web キャッシュとプロキシのサーバポート)。 LAN のみ。 |
10000 番ポート(webmin, つまり web ベースのシステム管理ユーティリティ)。 この点では危険度は低。 |
27374 番ポート(SubSeven, つまり Windows のみの Trojan で 使用されます)。1243 番ポートもそうです。 |
31337 番ポート(Back Orifice, つまり、また別の良く見られる Windows のみの Trojan で使われます)。 |
さらに多くのサーヴィスと対応するポート番号は /etc/services で見ることができます。 また、"公式の"リストは http://www.iana.org/assignments/port-numbers にあります。
これらと他のポートへのプローブが何を意味しているかについては、 Robert Graham による素晴らしい解析が以下にあります: http://www.linuxsecurity.com/resource_files/firewalls/firewall-seen.html これは非常に良い文献です。
ここでのもう一つのポイントは、 これらが標準のポート指定だということです。 どのサーヴィスも特定のポートで走っていると言える法則はありません。 通常は標準ポートを使っていますが、常にそうであるとは限りません。
自分のファイアーウォールのログに これらのタイプのポートが見つかったからと言って、 突然大慌てする必要はないということを覚えておいてください。 前述のステップ1から3に従って、 ファイアーウォールが正しく働いていることを確認していれば、 まずは安全です。 この通信の多くは"流れ弾"かも知れません、 つまりインターネットの背景ノイズか、どこかのクライアントかルータの設定ミス、 ノイズの多い Windows 関連ソフトから来たものかも知れないのです。
$ netstat -tua Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:printer *:* LISTEN tcp 0 0 bigcat:8000 *:* LISTEN tcp 0 0 *:time *:* LISTEN tcp 0 0 *:x11 *:* LISTEN tcp 0 0 *:http *:* LISTEN tcp 0 0 bigcat:domain *:* LISTEN tcp 0 0 bigcat:domain *:* LISTEN tcp 0 0 *:ssh *:* LISTEN tcp 0 0 *:631 *:* LISTEN tcp 0 0 *:smtp *:* LISTEN tcp 0 1 dsl-78-199-139.s:1174 64.152.100.93:nntp SYN_SENT tcp 0 1 dsl-78-199-139.s:1175 64.152.100.93:nntp SYN_SENT tcp 0 1 dsl-78-199-139.s:1173 64.152.100.93:nntp SYN_SENT tcp 0 0 dsl-78-199-139.s:1172 207.153.203.114:http ESTABLISHED tcp 1 0 dsl-78-199-139.s:1199 www.xodiax.com:http CLOSE_WAIT tcp 0 0 dsl-78-199-139.sd:http 63.236.92.144:34197 TIME_WAIT tcp 400 0 bigcat:1152 bigcat:8000 CLOSE_WAIT tcp 6648 0 bigcat:1162 bigcat:8000 CLOSE_WAIT tcp 553 0 bigcat:1164 bigcat:8000 CLOSE_WAIT udp 0 0 *:32768 *:* udp 0 0 bigcat:domain *:* udp 0 0 bigcat:domain *:* udp 0 0 *:631 *:* |
ここで、"サーヴィス名"への変換をさせないために、 "-n" フラッグをつけて同じことをしてみると、 実際に以下のようにポート番号を見ることができます:
$ netstat -taun Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 192.168.1.1:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 1 169.254.179.139:1174 64.152.100.93:119 SYN_SENT tcp 0 1 169.254.179.139:1175 64.152.100.93:119 SYN_SENT tcp 0 1 169.254.179.139:1173 64.152.100.93:119 SYN_SENT tcp 0 0 169.254.179.139:1172 207.153.203.114:80 ESTABLISHED tcp 1 0 169.254.179.139:1199 216.26.129.136:80 CLOSE_WAIT tcp 0 0 169.254.179.139:80 63.236.92.144:34197 TIME_WAIT tcp 400 0 127.0.0.1:1152 127.0.0.1:8000 CLOSE_WAIT tcp 6648 0 127.0.0.1:1162 127.0.0.1:8000 CLOSE_WAIT tcp 553 0 127.0.0.1:1164 127.0.0.1:8000 CLOSE_WAIT udp 0 0 0.0.0.0:32768 0.0.0.0:* udp 0 0 192.168.1.1:53 0.0.0.0:* udp 0 0 127.0.0.1:53 0.0.0.0:* udp 0 0 0.0.0.0:631 0.0.0.0:* |
tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN |
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN |
次の三つのエントリでは、また全ての可能なインターフェースの上で 耳をすませるように戻っています:
tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN |
tcp 0 0 192.168.1.1:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN |
最後の三つは LISTENER、 つまりポートで耳をすませているエントリです:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN |
次のグループは確立された接続です。我々の目的には、 最後のコラムで示されている接続の状態はそれほど重要ではありません。 これは man ページで詳しく説明されています。
tcp 0 1 169.254.179.139:1174 64.152.100.93:119 SYN_SENT tcp 0 1 169.254.179.139:1175 64.152.100.93:119 SYN_SENT tcp 0 1 169.254.179.139:1173 64.152.100.93:119 SYN_SENT tcp 0 0 169.254.179.139:1172 207.153.203.114:80 ESTABLISHED tcp 1 0 169.254.179.139:1199 216.26.129.136:80 CLOSE_WAIT tcp 0 0 169.254.179.139:80 63.236.92.144:34197 TIME_WAIT tcp 400 0 127.0.0.1:1152 127.0.0.1:8000 CLOSE_WAIT tcp 6648 0 127.0.0.1:1162 127.0.0.1:8000 CLOSE_WAIT tcp 553 0 127.0.0.1:1164 127.0.0.1:8000 CLOSE_WAIT |
netstat に -t と -u オプションの両方をつけたので、 TCP と UDP の両方の耳をすませているサーバが表示されています。 最後の数行は UDP のものです:
udp 0 0 0.0.0.0:32768 0.0.0.0:* udp 0 0 192.168.1.1:53 0.0.0.0:* udp 0 0 127.0.0.1:53 0.0.0.0:* udp 0 0 0.0.0.0:631 0.0.0.0:* |
# netstat -tap Active Internet connections (servers and established) Local Address Foreign Address State PID/Program name *:printer *:* LISTEN 988/inetd bigcat:8000 *:* LISTEN 1064/junkbuster *:time *:* LISTEN 988/inetd *:x11 *:* LISTEN 1462/X *:http *:* LISTEN 1078/httpd bigcat:domain *:* LISTEN 956/named bigcat:domain *:* LISTEN 956/named *:ssh *:* LISTEN 972/sshd *:631 *:* LISTEN 1315/cupsd *:smtp *:* LISTEN 1051/master |
$ /bin/ps ax |grep 1051 |grep -v grep 1051 ? S 0:24 /usr/libexec/postfix/master |
ps を--forest フラッグ (省略形は -f )とともに使うと、 どのプロセスが親プロセスか子プロセスかまた別のものなのか 決定するのに便利です。以下はその一例です(編集してあります):
$ /bin/ps -axf 956 ? S 0:00 named -u named 957 ? S 0:00 \_ named -u named 958 ? S 0:46 \_ named -u named 959 ? S 0:47 \_ named -u named 960 ? S 0:00 \_ named -u named 961 ? S 0:11 \_ named -u named 1051 ? S 0:30 /usr/libexec/postfix/master 1703 ? S 0:00 \_ tlsmgr -l -t fifo -u -c 1704 ? S 0:00 \_ qmgr -l -t fifo -u -c 1955 ? S 0:00 \_ pickup -l -t fifo -c 1863 ? S 0:00 \_ trivial-rewrite -n rewrite -t unix -u -c 2043 ? S 0:00 \_ cleanup -t unix -u -c 2049 ? S 0:00 \_ local -t unix 2062 ? S 0:00 \_ smtpd -n smtp -t inet -u -c |
もしこのどれも何の光も投げかけてくれないなら、 さらに locate を使ってみる手もあるでしょう:
$ locate /master /etc/postfix/master.cf /var/spool/postfix/pid/master.pid /usr/libexec/postfix/master /usr/share/vim/syntax/master.vim /usr/share/vim/vim60z/syntax/master.vim /usr/share/doc/postfix-20010202/html/master.8.html /usr/share/doc/postfix-20010202/master.cf /usr/share/man/man8/master.8.gz |
find コマンドはおそらくもっとも自由度の高い ファイルを探すユーティリティですが、 locate がするようにデータベースを使わないので、 ずっと遅いです:
$ find / -name master /usr/libexec/postfix/master |
もし lsof がインストールされていれば、 誰がプロセスやポートを所有しているか見つけるのに便利な また一つのコマンドです:
# lsof -i :631 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME cupsd 1315 root 0u IPv4 3734 TCP *:631 (LISTEN) |
# fuser -v -n tcp 631 USER PID ACCESS COMMAND 631/tcp root 1315 f.... cupsd |
fuser と lsof コマンドの文法については man ページを参照してください。
# grep rpc.statd /etc/init.d/* /etc/init.d/nfslock: [ -x /sbin/rpc.statd ] || exit 0 /etc/init.d/nfslock: daemon rpc.statd /etc/init.d/nfslock: killproc rpc.statd /etc/init.d/nfslock: status rpc.statd /etc/init.d/nfslock: /sbin/pidof rpc.statd >/dev/null 2>&1; STATD="$?" |
# ls -l /proc/1315/exe lrwxrwxrwx 1 root root 0 July 4 19:41 /proc/1315/exe -> /usr/sbin/cupsd |
# netstat -aup Active Internet connections (servers and established) Local Address Foreign Address State PID/Program name *:32768 *:* 956/named bigcat:domain *:* 956/named bigcat:domain *:* 956/named *:631 *:* 1315/cupsd |
つまり我々のこの仮想的な状況においては、 大きな驚きは何もなかったということです。
Warning |
もしあなたが既に侵入されているかもしれないと疑っているのでしたら、 netstat や ps の出力を 信じないでください。 他のシステム要素もそうですが、 既にこれらも改竄されてしまっていて、 その出力が信用できなくなっている可能性が充分にあります。 |
この章では、 あちこちでよく見かけられる脅威とテクニックについて簡単に紹介して、 いくらかの見通しを与えましょう。
しかし、 これは標的にするシステムについて何かを知ることが重要でない場合、 "DoS" 攻撃(以下を参照)の可能性を確かに持っています。 そして同様に、ある種のいたずらにも使われるかもしれません。
他の関連文書は Linux ドキュメントプロジェクトで見つけられます:
Security HOWTO: http://tldp.org/HOWTO/Security-HOWTO.html (JF日本語版http://www.linux.or.jp/JF/JFdocs/Security-HOWTO.html) |
Firewall HOWTO: http://tldp.org/HOWTO/Firewall-HOWTO.html (JF日本語版http://www.linux.or.jp/JF/JFdocs/Firewall-HOWTO.html) |
Ipchains HOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html (JF日本語版http://www.linux.or.jp/JF/JFdocs/IPCHAINS-HOWTO.html) |
User Authentication: http://tldp.org/HOWTO/User-Authentication-HOWTO/index.html, これは PAM についての素晴らしい議論を含んでいます。 (JF日本語版http://www.linux.or.jp/JF/JFdocs/User-Authentication-HOWTO.txt) |
VPN (Virtual Private Network): http://tldp.org/HOWTO/VPN-HOWTO.html と http://tldp.org/HOWTO/VPN-Masquerade-HOWTO.html (JF日本語版http://www.linux.or.jp/JF/JFdocs/VPN-HOWTO.txt) |
The Remote X Apps Mini HOWTO, http://www.tldp.org/HOWTO/mini/Remote-X-Apps.html, には X Window をセキュアに実装するための素晴らしい議論が含まれています。 |
The Linux Network Administrators Guide: http://tldp.org/LDP/nag2/index.html, はネットワークと TCP/IP とファイアーウォールについての良い 概観説明を含んでいます。 |
The Linux Administrator's Security Guide: http://www.seifried.org/lasg/, は、ファイアーウォール、パスワード、認証、PAM などなどについての、 興味深い多くのトピックを含んでいます。 |
Securing Red Hat: http://tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/index.html |
ipchains と iptables ファイアーウォールスクリプトのカスタム設定を作るためのツール:
Firestarter: http://firestarter.sourceforge.net |
二つの関連プロジェクト: http://seawall.sourceforge.net/ (ipchains), http://shorewall.sourceforge.net/ (iptables). |
netfilter ディベロッパーからの netfilter と iptables の文書 (多くの他の言語でも入手可能):
ポート番号割り当て、スキャナーがスキャンするかもしれないものについて:
http://www.linuxsecurity.com/resource_files/firewalls/firewall-seen.html |
http://www.sans.org/newlook/resources/IDFAQ/oddports.htm |
http://www.iana.org/assignments/port-numbers, 公式のポート番号割り当て。 |
一般的なセキュリティサイト。 これらには全て、文書、警告、ニュースレター、メイリングリスト、 そのほかの情報源についてのコーナーがあります。
Linux Security.com: http://www.linuxsecurity.com, 良い情報が集められている。Linux 固有の情報。 良い文書が沢山: http://www.linuxsecurity.com/docs/ |
CERT, http://www.cert.org |
The SANS Institute: http://www.sans.org/ |
The Coroner's Toolkit (TCT)(検視官の道具箱): http://www.fish.com/security/, 侵入のその後の問題(侵入者が侵入して最初にすること)についての 議論とツール群。 |
Junkbuster: http://www.junkbuster.com, web プロキシ、クッキーマネージャ。 |
PGP: http://www.gnupg.org/ |
Linux Security.com: http://www.linuxsecurity.com/docs/ |
Linux Newbie: http://www.linuxnewbie.org/nhf/intel/security/index.html |
The comp.os.linux.security FAQ: http://www.linuxsecurity.com/docs/colsfaq.html |
The Internet Firewall FAQ: http://www.interhack.net/pubs/fwfaq/ |
The Site Security Handbook RFC: http://www.ietf.org/rfc/rfc2196.txt |
http://www.bastille-linux.org, Mandrake と Redhat のみ。 |
SAINT: http://www.wwdsi.com/saint/, システムセキュリティ解析。 |
SSL: http://www.openssl.org/ |
SSH: http://www.openssh.org/ |
自分自身をスキャン:http://www.hackerwhacker.com |
PAM: http://www.kernel.org/pub/linux/libs/pam/index.html |
トロイの木馬をしかけられた Linux カーネルモジュールを検出: http://members.prestige.net/tmiller12/papers/lkm.htm |
ルートキット・チェッカーhttp://www.chkrootkit.org |
ポートスキャン・ツール nmap のホームページ: http://www.insecure.org |
Nessus(単なるポートスキャナー以上のもの): http://www.nessus.org |
tripwire, 侵入検出ツール: http://www.tripwire.org |
snort, スニッファー、その他: http://www.snort.org |
http://www.mynetwatchman.com と http://dshield.org は"分散侵入検出システム"です。 これは前もって用意した"エージェントたち" によってログを集め、 データを解析することで邪悪な活動を見つけて報告してくれます。 反撃したいなら、これをチェックしましょう。 |
ファイルには非常に様々なタイプがありますが、 ここでは無理に二つのかなり広い族に分けてみます:
ここでまさにあなたが読んでいるテキストファイルと、
それとは異なるものであるバイナリファイル。
バイナリファイルはマシンが読むもので、 テキストファイルは人間によって容易に編集でき、 一般的には人間が読むものです。 しかし、テキストファイルはマシンにも読むことが可能で、 実際しばしばそうしています。 その例は設定ファイルやスクリプト群ということになるでしょう。
*nix では様々に異なったテキストエディタが使用可能です。 二、三のものは全てのシステムにあります。 '/bin/ed' と '/bin/vi' はそうでしょう。 'vi' はたいていの場合、ライセンスの問題によって 'vim' のようなクローンになっています。 'vi' と 'ed' の問題点は、それらは恐ろしくユーザーに優しくない、 ということです。 また一つのよくみられるエディタは 'emacs' ですが、 常にデフォルトでインストールされているとは限りません。 これはより多くの機能と能力を持っていますが、 これも同様に学ぶのが易しくありません。
「ユーザに優しい」エディタとしては、 'mcedit' と 'pico' は始めるのに良い選択です。 これらはしばしば *nix に慣れていない人たちにとっては、 他のものよりずっと易しいものです。
最初に学ぶべきことは、いかに編集のセッションを終了するか、 いかにファイルの変更を保存するか、 そして折り返すべきでない長い一行の折り返しを避けるにはどうするか (ラップ、つまり行の折り返しの問題)でしょう。
'vi' エディタ
'vi' は Unix の世界では最も普通のテキストエディタの一つで、 ほとんど全ての *nix システム上に見られます。 実際は、ライセンスの問題によって、Linux システム上の'/bin/vi' は常に 'elvis' や 'nvi', 'vim' といった「クローン」です (他にもあります)。これらのクローンはオリジナルの 'vi' とまったく同様にふるまいますが、 たいていの場合は追加機能があり、 使えなくもないようになっています。
'vi' がそんなに恐ろしい代物なら、 どうしてそれを学ぶ必要があるのでしょうか? 二つの理由があります。 まず第一に、前述のように、 それはほとんど確実にインストールされていることが保証されていて、 他の(もっとユーザに優しい)エディタはデフォルトでインストールされて いるとは限らないからです。 第二の理由は、 その「コマンド」の多くが他のアプリケーションでも働くことです (例えば man ページを見るためにも用いられている 'less' のような)。 'less' を使っているときに、うっかり 'v' のキーを押してしまうと、 ほとんどの実装では 'vi' がスタートしてしまいます。
'vi' には二つのモードがあります。 一つは「コマンドモード」で、 キーボード入力はコマンドとして解釈されます。 もう一つのモードは「挿入モード」で、 ほとんど全てのキーボード入力は挿入するテキストとして解釈されます。
==> 'vi' を強制終了する方法 1. コンピュータがビープ音を鳴らすか、 スクリーンがフラッシュするまで、 <esc> キーを三回押します。 2. :q! <Enter> とキー入力する。
つまり、コロン、文字の Q, そしてエクスクラメーションマーク、 最後にエンター(改行)キーです。
'vi' コマンドは以下のようになっています。 これらは全て「コマンドモード」内で使います。
a カーソルの後から挿入モードに入る。
A 現在いる行の終わりで挿入モードに入る。
i カーソルの前で挿入モードに入る。
o 現在いる行の「下に」新しい行を開き挿入モードに入る。
O 現在いる行の「上に」新しい行を開き挿入モードに入る。
h カーソルを一文字分、左に移動する。
l カーソルを一文字分、右に移動する。
j カーソルを一行分、下に移動する。
k カーソルを一行分、上に移動する。
/ほにゃらら そのテキストの前方で、次に文字列「ほにゃらら」が現れた箇所
にカーソルを移動する。
?ほにゃらら そのテキストをさかのぼって、次に文字列「ほにゃらら」が現れた箇所
にカーソルを移動する。
n 前回のサーチを繰り返す(同じことをするのに「ほにゃらら」抜きで、
? または / )。
u 最後に行った変更を取り消す。
^B ウィンドウ一つ後ろにスクロール。
^F ウィンドウ一つ前にスクロール。
^U ウィンドウ半分スクロールアップ。
^D ウィンドウ半分スクロールダウン。
:w ファイルに保存。
:wq ファイルに保存して、終了。
:q 終了。
:q! 保存せずに終了。
<esc> 挿入モードを終えてコマンドモードに。
注意:四つの「矢印」キーは「コマンドモード」でも「挿入モード」 でもほとんど常に使えます。
'ed' エディタ
'ed' エディタはラインエディタです。 アプリケーションにはこれを必要とするものがあるとは言え、 全ての *nix コンピュータ上で使えることが仮想的に 保証されているという事実以上には、 これには社会的にはまったく値打ちのある機能がありません。 1975 年以来こいつを置き換えようとたくさん、 たくさんのものが提供されています。
'ed' の強制終了
1. それ自身で一行のピリオドをタイプし、 <Enter> を押す。 これでコマンドモードに入るか、 もしあなたが既にコマンドモードにいたとすれば一行のテキストを印字します。 2. q をタイプし、<Enter> を押す。 ファイルに何の変更もなかったなら、この動作で 'ed' を抜け出ます。 もし '?' と表示されたなら、これはファイルに変更があったことを意味し、 'ed' が変更を保存するかどうかあなたに尋ねているのです。 q を押して<Enter> として、 この二回目であなたが本当に終了したいということが確認されます。
'pico' エディタ
'pico' はワシントン大学(アメリカ合衆国) で開発された Pine メイル/ニュース パッケージに含まれています。 これは非常にユーザに優しいエディタですが、 一つ小さな短所があります。 'pico' は一行が(普通)74 文字を超えた時に、 黙って改行文字を挿入して行を折り返してしまいます。 これはメイルやニュース記事やメモをとる分には結構なことですが、 システムファイルを作る時にはしばしば致命的な問題になります。 この問題の解決策は簡単です。プログラムを呼び出すときに、 以下のように -w オプションをつけましょう:
pico -w file_2_edit
'pico' はとてもユーザに優しいので、これ以上の説明は必要ありません。 それは実際、とても、簡単です(必要なコマンドはスクリーンの下にあります)。 さらなるヘルプ機能もあります。 'pico' はほとんど全てのディストリビューションで使用可能ですが、 デフォルトでインストールされていないかもしれません。
==> 'pico' の強制終了
<Ctrl> キーを押しながら文字 x を押してください。 もしファイルに変更がされていないなら、これで 'pico' を終了します。 もし変更がされていれば、それを保存するかどうか訊ねられます。 n を押して終了してください。
'mcedit' エディタ
'mcedit' は Unix ライクなシステムのための完全な機能を持つ ビジュアルシェルプログラム、Midnight Comander shell program に含まれています。 これはコマンドラインから直接アクセスできますし (mcedit file_2_edit), また 'mc' の一部としても使えます (矢印キーを使って編集するファイルを選択し、 F4 キーを押します)。
'mcedit' はおそらく最も直感的に使えるエディタで、 拡張ヘルプもついています。「コマンド」は F* キーで操作します。 Midnight Commander はほとんど全てのディストリビューションで使用可能ですが、 デフォルトでインストールされていないかもしれません。
==> 'mcedit' の強制終了
F10 キーを押します。ファイルに変更がなされていなければ、 これで 'mcedit' を終了します。もし変更がなされていれば、 この動作をキャンセルするかどうか訊ねてきます。 n を押して終了します。
# nmap localhost Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) Interesting ports on bigcat (127.0.0.1): (The 1507 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 25/tcp open smtp 37/tcp open time 53/tcp open domain 80/tcp open http 3000/tcp open ppp Nmap run completed -- 1 IP address (1 host up) scanned in 2 seconds |
もう少し強力なスキャンをしてみましょう。 今度は、全てのポート、TCP も UDP も、をチェックします。
# nmap -sT -sU -p 1-65535 localhost Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) Interesting ports on bigcat (127.0.0.1): (The 131050 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 25/tcp open smtp 37/tcp open time 53/tcp open domain 53/udp open domain 80/tcp open http 3000/tcp open ppp 8000/tcp open unknown 32768/udp open unknown Nmap run completed -- 1 IP address (1 host up) scanned in 385 seconds |
# nmap bigcat Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) Interesting ports on bigcat (192.168.1.1): (The 1520 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 3000/tcp open ppp Nmap run completed -- 1 IP address (1 host up) scanned in 1 second |
# nmap bigcat Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) Note: Host seems down. If it is really up, but blocking our ping probes, try -P0 Nmap run completed -- 1 IP address (0 hosts up) scanned in 30 seconds |
おっと、今度は私が仕事をしている間に、 ICMP (ping) をブロックしてしまったようです。 もう一回:
# nmap -P0 bigcat Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) All 1523 scanned ports on bigcat (192.168.1.1) are: filtered Nmap run completed -- 1 IP address (1 host up) scanned in 1643 seconds |
#!/bin/sh # # Configure kernel sysctl run-time options. # kernel sysctl ランタイムオプション設定 ################################################################### # Anti-spoofing blocks # アンチ・スプーフィングがブロック for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $i done # Ensure source routing is OFF # ソースルーティングをオフに for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $i done # Ensure TCP SYN cookies protection is enabled # TCP SYN クッキープロテクションを可能に [ -e /proc/sys/net/ipv4/tcp_syncookies ] &&\ echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Ensure ICMP redirects are disabled # ICMP リダイレクトを不可能に for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $i done # Ensure oddball addresses are logged # おかしなアドレスはログを取る [ -e /proc/sys/net/ipv4/conf/all/log_martians ] &&\ echo 1 > /proc/sys/net/ipv4/conf/all/log_martians [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] &&\ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] &&\ echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ## Optional from here on down, depending on your situation. ############ # ここから下はシステムに応じたオプション。 # # Ensure ip-forwarding is enabled if # we want to do forwarding or masquerading. # フォワーディングかマスカレーディングをするなら ip-forwarding を可能に。 [ -e /proc/sys/net/ipv4/ip_forward ] &&\ echo 1 > /proc/sys/net/ipv4/ip_forward # On if your IP is dynamic (or you don't know). # IP が動的である(またはどうか知らない)時はオン。 [ -e /proc/sys/net/ipv4/ip_dynaddr ] &&\ echo 1 > /proc/sys/net/ipv4/ip_dynaddr # eof |
#!/bin/sh # # ipchains.sh # # An example of a simple ipchains configuration. This script # can enable 'masquerading' and will open user definable ports. # 単純な ipchains 設定の例。このスクリプトは「マスカレーディング」 # が可能で、ユーザ定義ポートを開く。 ################################################################### # Begin variable declarations and user configuration options ###### # 変数宣言とユーザ設定オプション # Set the location of ipchains (default). # ipchains (デフォルト)の場所を設定。 IPCHAINS=/sbin/ipchains # Local Interfaces # ローカルインターフェース # This is the WAN interface, that is our link to the outside world. # これは WAN インターフェース、外の世界に我々をつなげる。 # For pppd and pppoe users. # pppd と pppoe ユーザのため。 # WAN_IFACE="ppp0" WAN_IFACE="eth0" # # Local Area Network (LAN) interface. # ローカルエリアネットワーク(LAN)インターフェース #LAN_IFACE="eth0" LAN_IFACE="eth1" # Our private LAN address(es), for masquerading. # 我々のプライベート LAN アドレス(たち)、マスカレーディングのための。 LAN_NET="192.168.1.0/24" # For static IP, set it here! # スタティック IP のため。ここで設定せよ! #WAN_IP="1.2.3.4" # Set a list of public server port numbers here...not too many! # These will be open to the world, so use caution. The example is # sshd, and HTTP (www). Any services included here should be the # latest version available from your vendor. Comment out to disable # all PUBLIC services. # ここでパブリックサーバのポート番号のリストを設定。多すぎないように! # これらは世界に向けて開かれるので、要注意。この例は sshd, HTTP(www). # ここのどのサーヴィスもヴェンダの最新バージョンにすべき。 # 全てのパブリックサーヴィスを不可能にするためにはコメントアウトせよ。 #PUBLIC_PORTS="22 80 443" PUBLIC_PORTS="22" # If we want to do port forwarding, this is the host # that will be forwarded to. # もしポートフォワーディングしたいなら、これがフォワードされる先のホスト #FORWARD_HOST="192.168.1.3" # A list of ports that are to be forwarded. # フォワードされるべきポートのリスト #FORWARD_PORTS="25 80" # If you get your public IP address via DHCP, set this. # もし DHCP を通じてパブリックな IP アドレスを設定するなら、ここで。 DHCP_SERVER=66.21.184.66 # If you need identd for a mail server, set this. # メイルサーバのために identd が必要ならここで。 MAIL_SERVER= # A list of unwelcome hosts or nets. These will be denied access # to everything, even our 'PUBLIC' services. Provide your own list. # 望まぬ客のホストとネットのリスト。これらは全てへのアクセス、 # 我々のパブリックサーヴィスさえも、拒否される # 自分自身のリストを用意せよ。 #BLACKLIST="11.22.33.44 55.66.77.88" # A list of "trusted" hosts and/or nets. These will have access to # ALL protocols, and ALL open ports. Be selective here. # 「信用できる」ホストと/またはネットのリスト。これらは全ての # プロトコルと全ての開いたポートにアクセスできる。 # これは精選して。 #TRUSTED="1.2.3.4/8 5.6.7.8" ## end user configuration options ################################# ## エンドユーザ設定オプション ################################################################### # The high ports used mostly for connections we initiate and return # traffic. # トラフィックを初期化、返信のための接続に主に用いられる # 高番号ポート。 LOCAL_PORTS=`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f1`:\ `cat /proc/sys/net/ipv4/ip_local_port_range |cut -f2` # Any and all addresses from anywhere. # 任意の場所からの全てのアドレス ANYWHERE="0/0" # Start building chains and rules ################################# # チェインと規則の設定の始まり # Let's start clean and flush all chains to an empty state. # まず全てのチェインを空の状態に。 $IPCHAINS -F # Set the default policies of the built-in chains. If no match for any # of the rules below, these will be the defaults that ipchains uses. # 組み込みのチェインのデフォルトポリシーを設定。以下のルールのどれにも # 一致しなければ、これらが ipchains の使うデフォルトになる。 $IPCHAINS -P forward DENY $IPCHAINS -P output ACCEPT $IPCHAINS -P input DENY # Accept localhost/loopback traffic. # localhost/loopback トラフィックを受け入れる。 $IPCHAINS -A input -i lo -j ACCEPT # Get our dynamic IP now from the Inet interface. WAN_IP will be our # IP address we are protecting from the outside world. Put this # here, so default policy gets set, even if interface is not up # yet. # ここで Inet インターフェースから我々のダイナミック IP を取得。 # WAN_IP は外の世界から我々が守る IP アドレスになる。 # インターフェースがまだ立ち上がっていなくても、ここにおいているので、 # デフォルトのポリシーが準備される。 [ -z "$WAN_IP" ] &&\ WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \ -f 1` # Bail out with error message if no IP available! Default policy is # already set, so all is not lost here. # どの IP も可能でないならエラーメッセージとともに抜け出る。 # デフォルトポリシーは既に設定されているので、すべてがここで # 失われるわけではない。 [ -z "$WAN_IP" ] && echo "$WAN_IFACE not configured, aborting." && exit 1 WAN_MASK=`ifconfig $WAN_IFACE | grep Mask | cut -d : -f 4` WAN_NET="$WAN_IP/$WAN_MASK" ## Reserved IPs: # 予約 IP: # We should never see these private addresses coming in from outside # to our external interface. # 外部から我々の外部インターフェースへ、これらのプライベートアドレスが # 入ってくることは決してあるべきではない。 $IPCHAINS -A input -l -i $WAN_IFACE -s 10.0.0.0/8 -j DENY $IPCHAINS -A input -l -i $WAN_IFACE -s 172.16.0.0/12 -j DENY $IPCHAINS -A input -l -i $WAN_IFACE -s 192.168.0.0/16 -j DENY $IPCHAINS -A input -l -i $WAN_IFACE -s 127.0.0.0/8 -j DENY $IPCHAINS -A input -l -i $WAN_IFACE -s 169.254.0.0/16 -j DENY $IPCHAINS -A input -l -i $WAN_IFACE -s 224.0.0.0/4 -j DENY $IPCHAINS -A input -l -i $WAN_IFACE -s 240.0.0.0/5 -j DENY # Bogus routing # 偽もののルーティング $IPCHAINS -A input -l -s 255.255.255.255 -d $ANYWHERE -j DENY ## LAN access and masquerading # LAN アクセスとマスカレーディング # # Allow connections from our own LAN's private IP addresses via the LAN # interface and set up forwarding for masqueraders if we have a LAN_NET # defined above. # LAN インターフェスを通じての、我々自身の LAN のプライベート IP アドレス # からの接続を許可し、上で LAN_NET が定義されていればマスカレーダーの # フォワーディングを設定する。 if [ -n "$LAN_NET" ]; then echo 1 > /proc/sys/net/ipv4/ip_forward $IPCHAINS -A input -i $LAN_IFACE -j ACCEPT $IPCHAINS -A forward -s $LAN_NET -d $LAN_NET -j ACCEPT $IPCHAINS -A forward -s $LAN_NET -d ! $LAN_NET -j MASQ fi ## Blacklist hosts/nets # ブラックリスト hosts/nets # # Get the blacklisted hosts/nets out of the way, before we start opening # up any services. These will have no access to us at all, and will be # logged. # ブラックリストにのったホスト/ネットを、どのサーヴィスも開かれ # る前に閉め出す。これらはまったく我々にアクセスを持たず、 # ログをとられる。 for i in $BLACKLIST; do $IPCHAINS -A input -l -s $i -j DENY done ## Trusted hosts/nets # 信用できるホスト/ネット # # This is our trusted host list. These have access to everything. # 信用するホストのリスト。これらは全てへのアクセス権を持つ。 for i in $TRUSTED; do $IPCHAINS -A input -s $i -j ACCEPT done # Port Forwarding # ポートフォワーディング # # Which ports get forwarded to which host. This is one to one # port mapping (ie 80 -> 80) in this case. # NOTE: ipmasqadm is a separate package from ipchains and needs # to be installed also. Check first! # どのポートがどのホストへフォワードされるか。これはこの場合 # 一対一のマッピング(つまり、80 から 80 へ)。 # 注意: ipmasqadm は ipchains とは別のパッケージで、これも # インストールする必要がある。まずチェックすること。 [ -n "$FORWARD_HOST" ] && ipmasqadm portfw -f &&\ for i in $FORWARD_PORTS; do ipmasqadm portfw -a -P tcp -L $WAN_IP $i -R $FORWARD_HOST $i done ## Open, but Restricted Access ports/services # 開いた、しかし制限されたアクセスのポート/サーヴィス # # Allow DHCP server (their port 67) to client (to our port 68) UDP traffic # from outside source. # 外部ソースからクライアントの(我々の68番ポートへの)UDP トラフィック # へ DHCP サーバ(67番ポート)を許可する。 [ -n "$DHCP_SERVER" ] &&\ $IPCHAINS -A input -p udp -s $DHCP_SERVER 67 -d $ANYWHERE 68 -j ACCEPT # Allow 'identd' (to our TCP port 113) from mail server only. # メイルサーバのみから(我々の TCP 113 番ポートへの)'identd' を許可 [ -n "$MAIL_SERVER" ] &&\ $IPCHAINS -A input -p tcp -s $MAIL_SERVER -d $WAN_IP 113 -j ACCEPT # Open up PUBLIC server ports here (available to the world): # ここで PUBLIC サーバポートを開く(世界へ繋げるため): for i in $PUBLIC_PORTS; do $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $i -j ACCEPT done # So I can check my home POP3 mailbox from work. Also, so I can ssh # in to home system. Only allow connections from my workplace's # various IPs. Everything else is blocked. # こうしておけば仕事場から自宅の POP3 メイルボックスをチェックできる。 # また、自宅システムへ ssh で入ることもできる。仕事場のさまざまな # IP アドレスからの接続を許可するだけ。他は全てブロックされる。 $IPCHAINS -A input -p tcp -s 255.10.9.8/29 -d $WAN_IP 110 -j ACCEPT # Uncomment to allow ftp data back (active ftp). Not required for 'passive' # ftp connections. # ftp データバック(アクティブ ftp)を許可するときはコメントアウトを外す。 # パッシブ ftp 接続については必要ない。 #$IPCHAINS -A input -p tcp -s $ANYWHERE 20 -d $WAN_IP $LOCAL_PORTS -y -j ACCEPT # Accept non-SYN TCP, and UDP connections to LOCAL_PORTS. These are # the high, unprivileged ports (1024 to 4999 by default). This will # allow return connection traffic for connections that we initiate # to outside sources. TCP connections are opened with 'SYN' packets. # We have already opened those services that need to accept SYNs # for, so other SYNs are excluded here for everything else. # LOCAL_PORTS への非 SYN TCP と UDP 接続を受け入れる。これらは # 番号の高い非特権ポート(デフォルトでは 1024 から 4999番)。 # これは外部のソースへ初期化する接続のための返信接続トラフィックを # 許可する。TCP 接続は 'SYN' パケットとともに開かれている。 # SYN を受け入れる必要のあるそれらのサーヴィスは既に開いているので、 # 他の SYN はそれ以外の全てについてここで拒絶する。 $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS ! -y -j ACCEPT # We can't be so selective with UDP since that protocol does not know # about SYNs. # UDP は SYN について知らないので、それほど選択的にできない。 $IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS -j ACCEPT # Allow access to the masquerading ports conditionally. Masquerading # uses it's own port range -- on 2.2 kernels ONLY! 2.4 kernels, do not # use these ports, so comment out! # 場合によってはマスカレードしているポートへの接続を許可する。 # マスカレーディングは自身のポート範囲を用いる(2.2 カーネルのみで!)。 # 2.4 カーネルはこれらのポートを使わないので、コメントアウトするように! [ -n "$LAN_NET" ] &&\ $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP 61000: ! -y -j ACCEPT &&\ $IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP 61000: -j ACCEPT ## ICMP (ping) # # ICMP rules, allow the bare essential types of ICMP only. Ping # request is blocked, ie we won't respond to someone else's pings, # but can still ping out. # ICMP の規則、ICMP のむき出しの本質的なタイプだけを許可。 # Ping 要求はブロックされる。つまり、他の誰かの ping には答えないが、 # 自分は ping out することができる。 $IPCHAINS -A input -p icmp --icmp-type echo-reply \ -s $ANYWHERE -i $WAN_IFACE -j ACCEPT $IPCHAINS -A input -p icmp --icmp-type destination-unreachable \ -s $ANYWHERE -i $WAN_IFACE -j ACCEPT $IPCHAINS -A input -p icmp --icmp-type time-exceeded \ -s $ANYWHERE -i $WAN_IFACE -j ACCEPT ####################################################################### # Set the catchall, default rule to DENY, and log it all. All other # traffic not allowed by the rules above, winds up here, where it is # blocked and logged. This is the default policy for this chain # anyway, so we are just adding the logging ability here with '-l'. # Outgoing traffic is allowed as the default policy for the 'output' # chain. There are no restrictions on that. # なんでも箱をおき(デフォルトルールは DENY)、その全てのログをとる。 # 上のルールで許可されていない他の全てのトラフィックを、ここで # 始末をつけ、ブロックしログをとる。これはこのチェインについての # デフォルトのポリシーだから、ここでは '-l' でログ能力を追加するのみ。 # 外に向かうトラフィックは 'output' チェインについてのデフォルト # ポリシーとして許可されている。これについては何の制限もおかない。 $IPCHAINS -A input -l -j DENY echo "Ipchains firewall is up `date`." ##-- eof ipchains.sh |
#!/bin/sh # # iptables.sh # # An example of a simple iptables configuration. This script # can enable 'masquerading' and will open user definable ports. # 単純な ipchains 設定の例。このスクリプトは「マスカレーディング」 # が可能で、ユーザ定義ポートを開く。 ################################################################### # Begin variable declarations and user configuration options ###### # 変数宣言とユーザ設定オプション # Set the location of iptables (default). # ipchains (デフォルト)の場所を設定。 IPTABLES=/sbin/iptables # Local Interfaces # ローカルインターフェース # This is the WAN interface that is our link to the outside world. # これは WAN インターフェース、外の世界に我々をつなげる。 # For pppd and pppoe users. # pppd と pppoe ユーザのため。 # WAN_IFACE="ppp0" WAN_IFACE="eth0" # # Local Area Network (LAN) interface. # ローカルエリアネットワーク(LAN)インターフェース #LAN_IFACE="eth0" LAN_IFACE="eth1" # Our private LAN address(es), for masquerading. # 我々のプライベート LAN アドレス(たち)、マスカレーディングのための。 LAN_NET="192.168.1.0/24" # For static IP, set it here! # スタティック IP のため。ここで設定せよ! #WAN_IP="1.2.3.4" # Set a list of public server port numbers here...not too many! # These will be open to the world, so use caution. The example is # sshd, and HTTP (www). Any services included here should be the # latest version available from your vendor. Comment out to disable # all Public services. Do not put any ports to be forwarded here, # this only direct access. # ここでパブリックサーバのポート番号のリストを設定。多すぎないように! # これらは世界に向けて開かれるので、要注意。この例は sshd, HTTP(www). # ここのどのサーヴィスもヴェンダの最新バージョンにすべき。 # 全てのパブリックサーヴィスを不可能にするためにはコメントアウトせよ。 # フォワードされるポートはどれもここにおかないこと、これは直接の # アクセスのみ。 #PUBLIC_PORTS="22 80 443" PUBLIC_PORTS="22" # If we want to do port forwarding, this is the host # that will be forwarded to. # もしポートフォワーディングしたいなら、これがフォワードされる先のホスト。 #FORWARD_HOST="192.168.1.3" # A list of ports that are to be forwarded. # フォワードされるべきポートのリスト #FORWARD_PORTS="25 80" # If you get your public IP address via DHCP, set this. # もし DHCP を通じてパブリックな IP アドレスを設定するなら、ここで。 DHCP_SERVER=66.21.184.66 # If you need identd for a mail server, set this. # メイルサーバのために identd が必要ならここで。 MAIL_SERVER= # A list of unwelcome hosts or nets. These will be denied access # to everything, even our 'Public' services. Provide your own list. # 望まぬ客のホストとネットのリスト。これらは全てへのアクセス、 # 我々のパブリックサーヴィスさえも、拒否される # 自分自身のリストを用意せよ。 #BLACKLIST="11.22.33.44 55.66.77.88" # A list of "trusted" hosts and/or nets. These will have access to # ALL protocols, and ALL open ports. Be selective here. # 「信用できる」ホストと/またはネットのリスト。これらは全ての # プロトコルと全ての開いたポートにアクセスできる。 # これは精選して。 #TRUSTED="1.2.3.4/8 5.6.7.8" ## end user configuration options ################################# ## エンドユーザ設定オプション ################################################################### # Any and all addresses from anywhere. # 任意の場所からの全てのアドレス ANYWHERE="0/0" # These modules may need to be loaded: # これらのモジュールを読み込む必要があるかも。 modprobe ip_conntrack_ftp modprobe ip_nat_ftp # Start building chains and rules ################################# ## チェインと規則の設定の始まり # Let's start clean and flush all chains to an empty state. # まず全てのチェインを空の状態に。 $IPTABLES -F $IPTABLES -X # Set the default policies of the built-in chains. If no match for any # of the rules below, these will be the defaults that IPTABLES uses. # 組み込みのチェインのデフォルトポリシーを設定。以下のルールのどれにも # 一致しなければ、これらが IPTABLES の使うデフォルトになる。 $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P INPUT DROP # Accept localhost/loopback traffic. # localhost/loopback トラフィックを受け入れる。 $IPTABLES -A INPUT -i lo -j ACCEPT # Get our dynamic IP now from the Inet interface. WAN_IP will be the # address we are protecting from outside addresses. # ここで Inet インターフェースから我々のダイナミック IP を取得。 # WAN_IP は外の世界から我々が守る IP アドレスになる。 [ -z "$WAN_IP" ] &&\ WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \ -f 1` # Bail out with error message if no IP available! Default policy is # already set, so all is not lost here. # どの IP も可能でないならエラーメッセージとともに抜け出る。 # デフォルトポリシーは既に設定されているので、すべてがここで # 失われるわけではない。 [ -z "$WAN_IP" ] && echo "$WAN_IFACE not configured, aborting." && exit 1 WAN_MASK=`ifconfig $WAN_IFACE |grep Mask |cut -d : -f 4` WAN_NET="$WAN_IP/$WAN_MASK" ## Reserved IPs: # 予約 IP: # We should never see these private addresses coming in from outside # to our external interface. # 外部から我々の外部インターフェースへ、これらのプライベートアドレスが # 入ってくることは決してあるべきではない。 $IPTABLES -A INPUT -i $WAN_IFACE -s 10.0.0.0/8 -j DROP $IPTABLES -A INPUT -i $WAN_IFACE -s 172.16.0.0/12 -j DROP $IPTABLES -A INPUT -i $WAN_IFACE -s 192.168.0.0/16 -j DROP $IPTABLES -A INPUT -i $WAN_IFACE -s 127.0.0.0/8 -j DROP $IPTABLES -A INPUT -i $WAN_IFACE -s 169.254.0.0/16 -j DROP $IPTABLES -A INPUT -i $WAN_IFACE -s 224.0.0.0/4 -j DROP $IPTABLES -A INPUT -i $WAN_IFACE -s 240.0.0.0/5 -j DROP # Bogus routing # 偽もののルーティング $IPTABLES -A INPUT -s 255.255.255.255 -d $ANYWHERE -j DROP # Unclean $IPTABLES -A INPUT -i $WAN_IFACE -m unclean -m limit \ --limit 15/minute -j LOG --log-prefix "Unclean: " $IPTABLES -A INPUT -i $WAN_IFACE -m unclean -j DROP ## LAN access and masquerading #LAN アクセスとマスカレーディング # Allow connections from our own LAN's private IP addresses via the LAN # interface and set up forwarding for masqueraders if we have a LAN_NET # defined above. # LAN インターフェスを通じての、我々自身の LAN のプライベート IP アドレス # からの接続を許可し、上で LAN_NET が定義されていればマスカレーダーの # フォワーディングを設定する。 if [ -n "$LAN_NET" ]; then echo 1 > /proc/sys/net/ipv4/ip_forward $IPTABLES -A INPUT -i $LAN_IFACE -j ACCEPT # $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_NET -d $LAN_NET -j ACCEPT $IPTABLES -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IFACE -j MASQUERADE fi ## Blacklist # ブラックリスト # Get the blacklisted hosts/nets out of the way, before we start opening # up any services. These will have no access to us at all, and will # be logged. # ブラックリストにのったホスト/ネットを、どのサーヴィスも開かれ # る前に閉め出す。これらはまったく我々にアクセスを持たず、 # ログをとられる。 for i in $BLACKLIST; do $IPTABLES -A INPUT -s $i -m limit --limit 5/minute \ -j LOG --log-prefix "Blacklisted: " $IPTABLES -A INPUT -s $i -j DROP done ## Trusted hosts/nets #信用できるホスト/ネット # This is our trusted host list. These have access to everything. # 信用するホストのリスト。これらは全てへのアクセス権を持つ。 for i in $TRUSTED; do $IPTABLES -A INPUT -s $i -j ACCEPT done # Port Forwarding #ポートフォワーディング # Which ports get forwarded to which host. This is one to one # port mapping (ie 80 -> 80) in this case. # どのポートがどのホストへフォワードされるか。これはこの場合 # 一対一のマッピング(つまり、80 から 80 へ)。 [ -n "$FORWARD_HOST" ] &&\ for i in $FORWARD_PORTS; do $IPTABLES -A FORWARD -p tcp -s $ANYWHERE -d $FORWARD_HOST \ --dport $i -j ACCEPT $IPTABLES -t nat -A PREROUTING -p tcp -d $WAN_IP --dport $i \ -j DNAT --to $FORWARD_HOST:$i done ## Open, but Restricted Access ports #開いた、しかし制限されたアクセスのポート/サーヴィス # Allow DHCP server (their port 67) to client (to our port 68) UDP # traffic from outside source. # 外部ソースからクライアントの(我々の68番ポートへの)UDP トラフィック # へ DHCP サーバ(67番ポート)を許可する。 [ -n "$DHCP_SERVER" ] &&\ $IPTABLES -A INPUT -p udp -s $DHCP_SERVER --sport 67 \ -d $ANYWHERE --dport 68 -j ACCEPT # Allow 'identd' (to our TCP port 113) from mail server only. # メイルサーバのみから(我々の TCP 113 番ポートへの)'identd' を許可 [ -n "$MAIL_SERVER" ] &&\ $IPTABLES -A INPUT -p tcp -s $MAIL_SERVER -d $WAN_IP --dport 113 -j ACCEPT # Open up Public server ports here (available to the world): # ここで PUBLIC サーバポートを開く(世界へ繋げるため): for i in $PUBLIC_PORTS; do $IPTABLES -A INPUT -p tcp -s $ANYWHERE -d $WAN_IP --dport $i -j ACCEPT done # So I can check my home POP3 mailbox from work. Also, so I can ssh # in to home system. Only allow connections from my workplace's # various IPs. Everything else is blocked. # これによって仕事場から自宅の POP3 メイルボックスをチェックできる。 # また、自宅システムへ ssh で入ることもできる。仕事場のさまざまな # IP アドレスからの接続を許可するだけ。他は全てブロックされる。 $IPTABLES -A INPUT -p tcp -s 255.10.9.8/29 -d $WAN_IP --dport 110 -j ACCEPT ## ICMP (ping) # # ICMP rules, allow the bare essential types of ICMP only. Ping # request is blocked, ie we won't respond to someone else's pings, # but can still ping out. # ICMP の規則、ICMP のむき出しの本質的なタイプだけを許可。 # Ping 要求はブロックされる。つまり、他の誰かの ping には答えないが、 # 自分は ping out することができる。 $IPTABLES -A INPUT -p icmp --icmp-type echo-reply \ -s $ANYWHERE -d $WAN_IP -j ACCEPT $IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable \ -s $ANYWHERE -d $WAN_IP -j ACCEPT $IPTABLES -A INPUT -p icmp --icmp-type time-exceeded \ -s $ANYWHERE -d $WAN_IP -j ACCEPT # Identd Reject # Identd 拒否 # # Special rule to reject (with rst) any identd/auth/port 113 # connections. This will speed up some services that ask for this, # but don't require it. Be careful, some servers may require this # one (IRC for instance). # 全ての identd/auth/port 113 接続を (rst と)拒否する特別規則。 # これを要求するが必要とはしないサーヴィスをスピードアップする。 # 要注意、これを必要とするサーヴィス(IRC など)もある。 #$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset ################################################################### # Build a custom chain here, and set the default to DROP. All # other traffic not allowed by the rules above, ultimately will # wind up here, where it is blocked and logged, unless it passes # our stateful rules for ESTABLISHED and RELATED connections. Let # connection tracking do most of the worrying! We add the logging # ability here with the '-j LOG' target. Outgoing traffic is # allowed as that is the default policy for the 'output' chain. # There are no restrictions placed on that in this script. # ここであつらえのチェインを構築し、DROP へのデフォルトを設定。 # 上の規則で許可されない他のトラフィックは全て、最終的にここで # 始末をつけ、ESTABLISHED と RELATED 接続についてのステイトフル規則 # をパスしていない限り、ブロックしログをとる。接続追跡機能に心配事の # ほとんどをやらせましょう!ここでは '-j LOG' ターゲットでログ機能を # 追加する。外に向かうトラフィックは 'output' チェインについての # デフォルトポリシーなので許可されている。このスクリプトでは # 何の制限もおかない。 # New chain... # 新しいチェイン $IPTABLES -N DEFAULT # Use the 'state' module to allow only certain connections based # on their 'state'. # その 'state' に基づいてある種の接続を許可するために # 'state' モジュールを使う。 $IPTABLES -A DEFAULT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A DEFAULT -m state --state NEW -i ! $WAN_IFACE -j ACCEPT # Enable logging for anything that gets this far. # これが成功したものは全てログをとる。 $IPTABLES -A DEFAULT -j LOG -m limit --limit 30/minute --log-prefix "Dropping: " # Now drop it, if it has gotten here. # ここでつかまれば、今ドロップ。 $IPTABLES -A DEFAULT -j DROP # This is the 'bottom line' so to speak. Everything winds up # here, where we bounce it to our custom built 'DEFAULT' chain # that we defined just above. This is for both the FORWARD and # INPUT chains. # これがいわば、「結論」。全てをここで始末をつけ、まさに上で # 定義したあつらえで作った 'DEFAULT' チェインに押し込める。 # これは FORWARD と INPUT チェインの両方のため。 $IPTABLES -A FORWARD -j DEFAULT $IPTABLES -A INPUT -j DEFAULT echo "Iptables firewall is up `date`." ##-- eof iptables.sh |
"ほとんどの人は単にインターネットへの PPP 接続一つを 持っているだけで、誰にも自分のネットワークやファイアーウォールに 入ってきてもらいたくない:"
## Insert connection-tracking modules (not needed if built into kernel). ## 接続追跡モジュールを挿入(カーネル組み込みなら不要)。 insmod ip_conntrack insmod ip_conntrack_ftp ## Create chain which blocks new connections, except if coming from inside. ## 内側から来るもの以外、新しい接続をブロックするチェインを作成。 iptables -N block iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT iptables -A block -j DROP ## Jump to that chain from INPUT and FORWARD chains. ## INPUT と FORWARD チェインからそのチェインへジャンプ。 iptables -A INPUT -j block iptables -A FORWARD -j block |
この単純なスクリプトは我々が初期化した全ての外向きの接続 つまり、すべての NEW 接続を許可します (ACCEPT のデフォルトのポリシーは変更されていないので)。 そして、これらについて"ESTABLISHED" と "RELATED" された全ての通信も許可します。 さらに、WAN 側のインターフェース、ppp0, から入ってきたのではない全ての接続も許可されます。 これは lo か、または eth1 のような LAN インターフェースでしょう。 ですから我々がしたいことは何であれ全て可能ですが、 インターネットからの、望まぬ、中に入ってくる接続試行は全て許可しません。 何一つ。
また、このスクリプトはあつらえのチェインの作成例を示してもいます。 ここでは "block" と定義されていて、 INPUT と FORWARD チェインの両方に用いられています。