ファイアウォールの設定(2)

作成:

前回、ipchainsによって設定されているディフォルトのファイアウォールについて何が設定されているのか見てみました。

簡単にまとめると、出力についてはチェックしない、フォアードパケットはマスカレード、 入力については、宛先ポート番号0~1023番つまりサーバーに使われるポートはすべて拒否(よって通信はできなくする)、 宛先が他のポートについては接続要求パケットを拒否(TCPのみだが、外部から開始される通信ができなくする)、 ICMPパケットのecho-requestを拒否、といった内容でした。

今回は、そのままではうまくいかない部分や、今後サーバを立てる上で必要な設定について述べてみたいと思います。
それと、私が具体的にどのような設定をしたのかは書かないつもりです。 いくらセキュリティに気を配っても、穴は必ずあるものですから。(とくに私のように素人に毛が生えた程度の知識ではなおさらです) 進入されても私だけの被害ですむのならたいしたことないんですが、インターネットはそんなに甘くない・・・ (まあ、こんなの書いてる時点で詳しい人が読めば、どこらへんに穴があるのか分かっちゃうだろうけど)

なぜ、FTPが使えなかったのか?

IP マスカレードについて設定したとき、FTPがモジュールを組み込んでも使えませんでした。
FTPをIPマスカレードを通して利用可能にするには、モジュールが必要になるといったところでちょっと話しましたが、 FTPというプロトコルは2つのコネクションを使うプロトコルなのです。
一つはユーザからサーバに接続するときに使われるコネクションで、これはコントロール用に使われます。 もう一つはユーザの要求によって接続をするコネクションで、これはデータ転送用に使われるコネクションです。 ファイル転送はもちろんのこと、dirコマンドなどの情報取得コマンドの結果もこのコネクションを用いて転送されるため、 二つのコネクションが確立できない状況では、全く使い物にならないのです。

後者のコネクションの張り方には2種類あって、アクティブモードとパッシブモードと呼ばれます。

通常はアクティブモードが使われます。
これは、データ用のコネクションをサーバからユーザに接続する形態です。 つまり、接続要求パケットはサーバからユーザにやってきます。
デフォルトのファイアウォールの設定で、「外部からの接続要求パケットはすべて拒否する」という設定がありました。 この設定のおかげで、データ用のコネクションを張ることができなくなっていたのです。
(外部からの接続があるのに、モジュールを組み込めばIPマスカレードが可能な訳は、 データ用のコネクションに使うポート番号はFTPのコントロール用のコネクションを通じてやりとりされるため、 この通信を監視しておけば、外部からの接続であっても、その接続をどのホストにつないでやればいいのかが分かるからです)

このときユーザ側が使用するポート番号は不定で、一般にWell-known ports以外です。 もしアクティブモードFTPを使えるようにしたいのなら、不正アクセスの危険性が増しますが、 1024番以降のポートに対する、外部からの接続要求パケットを受け入れるように設定し直さないといけません。

しかし、もう一つ方法があります。 パッシブモードを使う方法です。
パッシブモードは、データ用のコネクションもユーザ側から接続します。 この方法ならば、ファイアウォールの設定をゆるめることなくFTPが使用できます。
ただし、外部からの接続要求パケットを拒否しているので、このサーバがFTPサービスを提供する側になると、 今度は外部に対してパッシブモードFTPのサービスを提供できなくなります。 (サーバー側が使うデータ用コネクションのポートは、 アクティブモードFTPはポート20番を使いますが、パッシブモードFTPでは1024番以降のようです。)

アクティブモードを使用可能にする方法をとっても、セキュリティー的にはほとんど影響がないでしょうし、 ファイアウォール設定をそのままでFTPサーバを立てたい場合でも、アクティブモードFTPは外部に提供できますので、 どちにするかは、お好み次第です。(FTPなんて使わないっていうのなら考えなくてもいいし(笑))

というわけで、アクティブモードFTPを使いたい場合(パッシブモードFTPサービスを提供したい場合)は 外部からの接続要求パケットを拒否する設定の行を削除するか、コメントアウトします。(行の頭に#を書く)

おそらくほとんどのFTPツールには、アクティブモードかパッシブモードかを選択できるようになっていると思います。
パッシブモードを使うようにしたいときは、 IEの場合、「ツール→インターネットオプション→詳細設定→パッシブFTP(ファイアウォールおよびDSLモデム互換用)を使用する」 にチェックを入れると可能になります。
私の使っているフリーのFTPソフト「ffftp」は「ホストの設定→拡張→PASVモードを使う」にチェックを入れると可能になります。
LinuxのコマンドラインFTPは起動後にpassiveと入力すると、パッシブモードのON/OFFができます。
ただし、WindowsのコマンドラインFTPはアクティブモードのみしかサポートしていないようです。

ポートに穴をあける

さて、FTPのようなプロトコルの問題を解決してしまえば、 ディフォルトの設定は強固なセキュリティーが設定されているため、 何もいじらなくてもインターネットを利用する側にとってはほとんど問題ありません。
しかし、サーバーをインターネットに公開するとなると、そのままでは不可能です。
なぜなら、ディフォルトの設定で、 宛先ポート番号0~1023番つまりサーバーに使われるポート宛のパケットはすべて拒否、 となっているからです。 だからといって、この設定をはずすのは危険です。 外部に提供するサーバーが利用するポートのみをあけるように設定しないといけません。

# Deny TCP and UDP packets to privileged ports
ipchains -A input -l -i $EXTIF -d $ANY 0:1023 -p udp -j DENY
ipchains -A input -l -i $EXTIF -d $ANY 0:1023 -p tcp -j DENY

ここで0~1023番まで一気に拒否というルールを書いています。 たとえば80番(HTTP)をあけるのに0~79番までと81~1023番までを拒否と書き換えるのかというと、そうではありません。 そんなことをしていたら、一つや二つならかまいませんが、 数が多くなると収集がつかなくなりますし、スマートではありません。 これはルールは番号が若い順に適用されていくという規則を利用して、 このルールよりも前に受け取るべきポート向けのパケットを受け取るというルールを追加してやります。 例えばHTTPサーバを運用したいというときには80番ポート宛のパケットは受け取るようにしないといけません。
そのためには、

ipchains -A input -i $EXTIF -d $ANY 80 -p tcp -j ACCEPT

というルールを先ほどのルールの前に追加します。
IPアドレスが固定の場合は$ANYではなく、そのグローバルIPアドレスを指定した方がいいと思います。
もし動的にルールを変更したい場合は

# ipchains -I input 1 -i ppp0 -d 0.0.0.0/0 80 -p tcp -j ACCEPT

というコマンドを打ちます、-Iオプションはルールの挿入を意味し、 この場合、inputチェインの1番目(先頭)のルールの前に新しくルールを追加するという意味になります。
もしくは変更したfirewall-masqファイルの設定をそのまま有効にしたい場合は、

# source /etc/ppp/firewall-masq

という風なコマンドを入力します。sourceというコマンドは、シェルスクリプトファイルを実行する命令です。 本来はパーミッションを変更して実行可能にしてから、コマンドとしてそのシェルスクリプトファイルを呼び出すのですが、 こうすると一時的に実行することができます。

こんな感じで、公開したいサーバのポート番号を受け取るように設定してください。
サーバプロトコルがどのポートを利用するのかは http://www.iana.org/assignments/port-numbers をみると、予約されているポート番号がわかりますので、調べてください。 (直接ポート番号を指定しなくてもプロトコル名で指定できるそうですが・・・)

さてこれから・・・

さて、こんな感じで設定していくわけですが、 使いたいサーバーのポートをあけて、怪しいパケットをはじく、というルールを付け加えていくだけです。
これ以上はばらさないようにしておきましょう。

簡単にipchainsの使い方やオプションについてまとめていこうかと思いましたが、全部 JM Project に書いてありますので・・・
だいたいの概念がつかめてしまえば非常に単純なことですし、 このマニュアルも非常に詳しくかつわかりやすく書かれているので、私が書こうとすると丸写しになってしまいますから。