(作成:2006/03)
ネットワークを介してマルチに接続出来るのは、各サービス毎に使うポートが違うから、バッティングしない限り複数のサービスを受けられる。これはつまりクライアント側で1つのネットワーク越しアクセス毎に1024以下の適当なポートを使って遣り取りすることで、情報が錯綜せず上手く遣り繰りできる、と。
しかしサーバ側ではどんなポートでもって訳にはいかず、クライアントが問い合わせ先を固定できるよう、各サービス毎RFCなんかで定められたポートを専有してデータを遣り取りする。 基本的にゃサービス立ち上げなきゃ外部から特定ポート叩かれてもシカトするけど、一応接続要求は受け取るし、ログには残るし、鯖管が把握している以外の預かり知らぬソフトウェアが特定ポートを専有したりする事も有り得る。 不要なポートで接続要求を受け付けたりログを残したりするのは、DoS攻撃なんかの良い標的になるって事。預かり知らぬソフトウェアが特定ポートを専有するのはバックドアだのトロイだので言語道断。
てなわけで、より安全なサーバを立てるなら、必要最低限のポート以外へのアクセスを完全に締め出す必要がある。
てなわけでIPフィルタリングを行なうためにiptables。明示的に必要/不要なポートを制御して、よりセキュアなサーバを組みませう。
iptables 自体は、殆どの場合標準で入っているハズ。
設定
初回設定時
初めて設定する際は、もしiptablesが立ち上がっていたら必ず停止すること。さもないとリアルタイムで更新が反映されちゃう。ssh越しで設定してたりすると目も当てられない。
# /etc/init.d/iptables stop
基本的に、最初は以下のように送信以外を遮断し、設定を初期化してから取り掛かるのが良いと思う。
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -F
ここでは設定例として、ssh接続のみ許可されたサーバ設定をしてみる。 sshを許可するには以下のコマンドを実行。
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
すると以下のような設定になる筈。
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
設定が良いと思ったら保存し、iptablesを起動する。
# /etc/init.d/iptables save
# /etc/init.d/iptables start
保存した設定は /etc/sysconfig/iptables
にて確認することができる。
よく使うポート許可
- http/https許可
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- smtp/pop3許可
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
- dns許可
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
- Proxy許可
# iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
nmapによるポートチェック
ポートチェックには nmap
を用いると判り易い。標準で導入されてないんで apt でインストール。
# apt-get install nmap
ライブラリとか色々入ってないと追加パッケージ多いけど、あまり気にせず。
- 追加パッケージ
libblas-common
libblas3
liblinear3
liblua5.2-0
libpython-stdlib
libpython2.7-minimal
libpython2.7-stdlib
libxslt1.1
lua-lpeg
ndiff
python
python-bs4
python-chardet
python-html5lib
python-lxml
python-minimal
python-pkg-resources
python-six python2.7
python2.7-minimal
以下のオプションで簡単なポートスキャンをしてみる。
# nmap -P0 -sS -F oni.hyakki.local
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on oni.hyakki.local (192.168.1.1):
(The 1149 ports scanned but not shown below are in state: filtered)
Port State Service
22/tcp open ssh
Nmap run completed -- 1 IP address (1 host up) scanned in 651 seconds
オプションの意味は以下の通り。
-P0
ping
によるサーバ動作チェックをしない。-sS
通信を確立しない(ステルス)ポートスキャン。-F
openポートのみリストアップする。