Mac OS X Tiger でマニアックにファイアウォールを設定してみる

さて、サーバ(と言えるほどのものでも無いですが)の監査を受けるに当たって、OpenSSH関連と同じ位問題になったのが、ファイアウォールの設定。Mac OS Xには標準でファイアウォール機能があるので、それを使っていれば大丈夫だーみたいな感じでいい加減にやったら文句言われて終了、という事を繰り返す事数回、どうやらその原因は、「あるポート番号を開けるように設定すると、全ての通信元からの(そのポート経由の)アクセスを受け入れてしまう仕様になっている」という事である事が判明。それファイアウォールとして意味あんの? と思いつつ、まあどうにかしないといけないわけで、やっぱり何も知らない所から孤独な作業が始まりましたと。

以下ではそこで得られた知見をまとめ。一応この方法で、特定の場所から特定のポート経由のアクセスだけを受け入れる(パケットフィルタリングというらしい)、という設定が可能っぽい。で、その結果監査側からのアクセスブロックに成功し、監査のガイドラインを変更へ追いやったみたいです。一歩間違うとサイバーテロの標的にされかねない環境(研究機関なので)である以上、監査のレベルもそれなりに高いはずである、という憶断に従えば、この事からある程度信頼性の高い方法という事になりますね。元知識がゼロなので何ともいえませんが。

Panther以前の仕様は知りません。Tigerだけのような気がする。あと、ぶっ壊れたら御愁傷様。

その前に、Mac OS Xにおけるファイアウォール関係の設定をおさらい。
・「システム環境設定」→「共有」で設定できる。
・「ファイアウォール」タブを選択し、「開始」でファイアウォール機能が「入」になる(デフォルトでは外からのアクセスを原則全て(tcp)遮断)。「切」にしておくメリットはほとんど無いと思う。
・ポートの開け閉めは「サービス」タブと連動。「サービス」の意味は、サーバソフトを立ち上げるかどうかという意味。例えば、「リモートログイン」を「入」にするとSSHのサーバソフト(sshd)が起動して、ファイアウォールが入になっていればSSHが使うポート番号「22」が開けられる。つまり、サービスが切になっているものに関しては、いくらポートが開いていてもアクセス不能(アクセスを処理できるものがいないので)。という事は、不正アクセスを防ぐ最終手段は、外部と通信するソフトを全て切る、という事だろうな。だから、後述の方法を使うと「ファイアウォール」タブは使えなくなってしまうけれど、必要なものは「サービス」タブから「入」にはしておかないとどんな設定でも徒労に終わる。
・ソフトによって使用するポート番号は決まっている。ここのリストとかを使うと便利。
http://www.vwnet.jp/mura/tcpip-port.htm

で、本題。Mac OS XはUNIX系のOSをベースにしているので、GUIで設定できる項目でもその実体はただのUNIXのソフトだった、という事は多いです。ファイアウォールに関してもきっとそうに違いない、という事でいろいろ調べて、どうやらそれがipfwというものだという所までたどり着く(これがかなり大変だった)。で、次にipfwの設定方法を調べて読むと、やっぱり特定通信元からのアクセスのみを受け入れる、という事は可能っぽい。でも、そうした解説ページのほとんどはファイアウォールを一から構築する事を目的として書かれていて、素人には意味分からん、というオチ。

そこでOS Xの標準設定をパクって使えば良いんじゃね? という結論に至る。以下その具体的なやり方。

・上記方法に基づき、ファイアウォールを「入」にする。この時、詳細を選択し、「UDPトラフィックをブロック」「ファイアウォールのログを記録」「ステルスモードを使用」にチェックを入れておく。今回は例示のために「サービス」タブから「リモートログイン」と「FTPサービス」、あと「ファイアウォール」タブから「ネットワークタイム」を入にしておく。

・ターミナルから以下のように入力。
$ sudo ipfw list

ipfwコマンドを使うときには必ず管理者権限で、という事で頭にsudo。listで現在の設定を一覧で出力してくれる。今の設定の場合、出力はこんな感じ。
02000 allow ip from any to any via lo*
02010 deny ip from 127.0.0.0/8 to any in
02020 deny ip from any to 127.0.0.0/8 in
02030 deny ip from 224.0.0.0/3 to any in
02040 deny tcp from any to 224.0.0.0/3 in
02050 allow tcp from any to any out
02060 allow tcp from any to any established
02070 allow tcp from any to any dst-port 22 in
02080 allow tcp from any to any dst-port 21 in
12190 deny log tcp from any to any
20000 deny log icmp from any to me in icmptypes 8
20310 allow udp from any to any dst-port 53 in
20320 allow udp from any to any dst-port 68 in
20321 allow udp from any 67 to me in
20322 allow udp from any 5353 to me in
20340 allow udp from any to any dst-port 137 in
20350 allow udp from any to any dst-port 427 in
20360 allow udp from any to any dst-port 631 in
20370 allow udp from any to any dst-port 5353 in
22000 allow udp from any to any dst-port 123 in
30510 allow udp from me to any out keep-state
30520 allow udp from any to any in frag
35000 deny log udp from any to any in
65535 allow ip from any to any


1行あたり一つのルールを意味しているらしい。これの組み合わせで表現する。
太字にした部分が、サービスとかから有効にした結果変わった部分。それ以外は基本設定のようなものだから良く分からなくてもOKという事にした。以下のURLでいろいろな設定の場合のサンプルが見れる。

http://www.hc.keio.ac.jp/itc/manual/mac/Security/

つまり、太字の部分をいじれば望みのアクセス制限がかけられるという訳。

実際に設定する前に、ルールの意味を。こんな風に解釈してみる。

[行番号] [allow or deny (log)] [tcp or udp] from [どこからのアクセス?] to [どこへのアクセス?] dst-port [ポート番号] [in or out]

[行番号]:ルールを適用する順番を決める。数字の大きい方から適用されていく。つまり、数字の少ないルールほど優先される。ちなみに、65535はデフォルトであって、「全てのアクセスを受け入れる」という意味。これより小さい番号を設定しなければならない。つまり、これは一番優先度が低いという事。

[allow or deny (log)]:そのまま。このアクセスを許可するか拒否するか。deny logとするとログを取るようになる。

[tcp or udp]:tcpかudpか。ポート番号と普通セットで書かれているので、それに準じれば良い。あとicmpとかいうのもあるらしいが、デフォルトで全拒否となっていて、それで問題無いっぽいので無視。

[どこからのアクセス?], [どこへのアクセス?]:anyとすると何でもOKとなる。IPとかホスト名とかを指定すればそれのみ有効。「システム環境設定」ではこの部分の変更が効かないから問題だったのだね。具体的な指定方法は後述。

[ポート番号]:どのプロトコルか。先に挙げたリストを使うなりして何とかしてほしい。

[in or out]:ファイアウォールの外側からのアクセス(in)か内側からのアクセス(out)か。普通inを気にするものだと思う、のでinしか使わない。

若干これに従わないものが混じっていますが、それは全無視で。

実際の設定は、こう。

$ sudo ipfw [add or delete or flush] ルール

addで追加、deleteで削除(行番号指定だけでOK)、flushでルールの全削除(確認有り)。つまり、「システム環境設定」経由でひな形を作っておけばコピペが有効。

以上を踏まえて、最初のリストに戻る。太字の部分を解説すると、2070行はSSH(ポート番号がtcpの22だから)、2080行はFTP(ポート番号がtcpの21だから)、22000行はネットワークタイム(ポト番号がudpの123だから)をそれぞれあらゆる場所から許可する、という意味になる。では、これをちょっといじって、SSHはIPアドレス110.1.2.3と111.4.5.6からのみ許可する、としてみる。
$ sudo ipfw delete 2070
$ sudo ipfw add 2070 allow tcp from 110.1.2.3,111.4.5.6 to any dst-port 22 in

カンマで区切ることでアドレス指定はいくつもつなげられる。

ちょっと応用。FTPは192.168.10.0から192.168.10.254の255個のアドレス全てから受け入れる、としてみる。
$ sudo ipfw delete 2080
$ sudo ipfw add 2080 allow tcp from 192.168.10.0/24 to any dst-port 21 in

W.X.Y.0/24という書き方で、W.X.Y.0からW.X.Y.254まで全部、という意味。下記のURLを参考に。
http://www.networkworld.jp/b-course/-/17982.html
この界隈の人間は世界の常識であるかのようにこういう書き方をするが、こんなの一般人に分かるかボケ <解読するまでにもの凄く時間がかかった人

こういう調子で、開けたいポートに関して(デフォルトでは全遮断、12190行と35000行にそう書いてある)tcp関連は2061〜12189行の範囲、udp関連は20371〜30509行の範囲に書いていけば良い。

注意点が一つ。一回ipfwコマンドで設定をいじると、「システム環境設定」からファイアウォールがいじれなくなります(他のファイアウォールソフトが有効になっていると設定ができないようになっていて、ターミナルから操作することは何故かそれに当たっているらしい)。ごちゃごちゃやって復帰できなくなったら再起動(ログアウトするだけじゃまだ残っているからダメ)で。再起動で全部消えます。

ネタ。
「システム環境設定」からApple Remote Desktopを有効にすると3283と5900のtcp, udp両方が開くけど、最低限必要なものはtcpの5900番(これはVNCソフトで一般に必要とされるポート)だけっぽい。これだけでもリモート制御は可能。じゃあ3283番は何なんだ、という事になるが、これはApple Remote Desktopの「レポート機能」というものを使う時に必要となる。でもこれも使っているのはudpの3283番で、tcpの3283番は使ってなさそう。意味分からん。

こうやって苦労して作った設定も、再起動すると全部消えやがるので、シェルスクリプトでも書いておいた方が良いです。こんな昔のファミコンソフトみたいな事しなくても、どこかに設定ファイルとかで残しておく場所があるんじゃないの? と思って調べても現状分からず。南無。
[PR]
by fyama_tani | 2006-07-09 16:33 | 雑記