セキュリティ中級編!

もとちゃ

2012年04月30日 15:48


くりかえしますがレンタルサーバーにセキュリティは大切です。

でも「初級の初級」編ですでにSSHへのアタック対策を終えているみなさんは比較的安全と言えると思うんです。

なぜならOpenSimをたちあげている場合、通常レンタルサーバーで稼動しているものとはかなり違ったプロセスを働かせているからです。(少なくともウェブ管理ツールやメーラーを踏み台にした他人に迷惑をおよぼすクラッキングについては気にする必要はないはずです。)

とはいってもセキュリティにやりすぎということはありませんし、わたしたちのやっている対策はほんとの「初級の初級」にすぎません。

そこでさらに安全性を高めるために「ファイアーウォール」構築に挑戦してみましょう。

Windowsと違いLinuxには有料のセキュリティソフトというものはありませんが、かわり自分自身でファイアーウォールを設定することのできるツールが標準で付属しています。

まずターミナルでログインして

sudo iptables -L

といれてみてください。

この画面のようになったはずです。

これはファイアーウォールがまったく設定されていないーーすべてのボートが外部に対してつつぬけである--ことを示しています。(さすがにちょっと不安になってきますね^^;)

本来ならこの「iptables」を直接編集してファイアーウォールを構築しなければなりません。

でもさいわいあなたがUbuntuユーザーなら「ufw」というコマンドを使うことで簡単に各ポートの開閉の設定をおこなうことができます。*

*注 ただしDTIは除きます。以下は「さくら」を含めた(DTI以外の)デフォールトでufwがインストールされているUbuntuの場合です。(DTIについては記事の最後により詳しい解説を追加しました)

こんどはつぎのようにいれてみてください。

sudo ufw default deny



これはすべてのポートを原則「閉ざす」というポリシーを宣言するものです。もしこのまま有効になってしまうとSSHでのアクセスすらできなくなりますけど、ご心配なく、あとで設定を確定しないかぎり有効にはなりませんから^^


つまり最初にすべてのボートを閉じてそれから必要なものだけを開いていくわけです。

まず必要なのはターミナルを使うためのSSHポートですね。これはそれぞれみなさんが決めた番号があると思いますのでそれを開きます。

sudo ufw allow **** (SSHのポート番号)



つぎにOpenSimのリージョンサーバーが使うポート9000を開きます。

sudo ufw allow 9000
    ……
もしふたつ以上シムをたちあげているならその数だけポートを開いてください。


間違いがないことを確認して以下のコマンドで設定を読み込みます。(特にSSHのポート番号を間違えるとターミナルでの接続ができなくなります。*)

sudo ufw enable
このときばかりはさすがにLinuxも確認をしてきます。(y/n)?
間違いなければ y


なんと、これだけですべて設定は完了です。なんだか拍子抜けですね^^ 

いちおうちゃんとできているか確認してみましょう。

sudo ufw status



これで鉄壁のファイアーウォールが立ち上がり、不法侵入しようとするクラッカーはたちまち頭脳を焼かれます(うそです^^)

簡単ですからぜひみなさんも挑戦してみてくださいね!^^

* 注:とはいえその場合でも「さくら」ならVNCコンソールでログイン可能です。修正のためにファイアーウォールを一時的に停止するときは「sudo ufw disable」といれます。(修正する場合はくれぐれもSSHのポートを閉じたまま「enable」しないように気をつけてください)

【記述追加 2012.5.28】

ufwはiptablesに対して「フロントエンド」あるいは「ラッパー」として働きます。「フロントエンド」とは本来の仕事を担当するプロセスとユーザーの間にはいって通常はより設定を手軽かつ簡単にするためのツールです。
UbuntuにかぎらずLinuxのファイアーウォール構築を担うのはiptables(すこし以前はipchains)であり本来はユーザーはこれを直接編集してポートの開閉やマスカレードなどのセキュリティ対策をおこないます。
しかしこの作業はかなり煩雑でかつ外部ネットとホストの間の相互の通信についての正しい知識も必要とされます。
この作業をある程度ユーザーに代わって代行してくれるのがufw("Uncomplicated Firewall")です。

ufwは
# /lib/ufw/ufw-init start
でスタートされるとまず/etc/init/ufw.confを読み込み、つぎに/etc/ufw/ufw.confを読みにいきます。

/etc/ufw/ufw.conf
# set to yes to start on boot

ENABLED=no

# set to one of 'off', 'low', 'medium', 'high'

LOGLEVEL=low

/etc/ufw/ufw.conf



このとき「ufw enable」コマンドが打たれると上の「ENABLED=no」が「ENABLED=yes」にかわり、ufwは「ラッパー」として以下のファイルをさらに読み込みます。

/etc/default/ufw
/etc/ufw/before.rules
/etc/ufw/after.rules
/lib/ufw/user.rules

この時点でiptablesはつぎのように設定されます。

Chain INPUT (policy ACCEPT)
target prot opt source destination
ufw-before-logging-input all -- anywhere anywhere
ufw-before-input all -- anywhere anywhere
ufw-after-input all -- anywhere anywhere
ufw-after-logging-input all -- anywhere anywhere
ufw-reject-input all -- anywhere anywhere
ufw-track-input all -- anywhere anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ufw-before-logging-forward all -- anywhere anywhere
ufw-before-forward all -- anywhere anywhere
ufw-after-forward all -- anywhere anywhere
ufw-after-logging-forward all -- anywhere anywhere
ufw-reject-forward all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ufw-before-logging-output all -- anywhere anywhere
ufw-before-output all -- anywhere anywhere
ufw-after-output all -- anywhere anywhere
ufw-after-logging-output all -- anywhere anywhere
ufw-reject-output all -- anywhere anywhere
ufw-track-output all -- anywhere anywhere

Chain ufw-after-forward (1 references)
target prot opt source destination

Chain ufw-after-input (1 references)
target prot opt source destination
ufw-skip-to-policy-input udp -- anywhere anywhere udp dpt:netbios-ns
ufw-skip-to-policy-input udp -- anywhere anywhere udp dpt:netbios-dgm
ufw-skip-to-policy-input tcp -- anywhere anywhere tcp dpt:netbios-ssn
ufw-skip-to-policy-input tcp -- anywhere anywhere tcp dpt:microsoft-ds
ufw-skip-to-policy-input udp -- anywhere anywhere udp dpt:bootps
ufw-skip-to-policy-input udp -- anywhere anywhere udp dpt:bootpc
ufw-skip-to-policy-input all -- anywhere anywhere ADDRTYPE match dst-type BROADCAST

Chain ufw-after-logging-forward (1 references)
target prot opt source destination
LOG all -- anywhere anywhere limit: avg 3/min burst 10 LOG level warning prefix `[UFW BLOCK] '

Chain ufw-after-logging-input (1 references)
target prot opt source destination
LOG all -- anywhere anywhere limit: avg 3/min burst 10 LOG level warning prefix `[UFW BLOCK] '

Chain ufw-after-logging-output (1 references)
target prot opt source destination

Chain ufw-after-output (1 references)
target prot opt source destination

Chain ufw-before-forward (1 references)
target prot opt source destination
ufw-user-forward all -- anywhere anywhere

Chain ufw-before-input (1 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ufw-logging-deny all -- anywhere anywhere state INVALID
DROP all -- anywhere anywhere state INVALID
ACCEPT icmp -- anywhere anywhere icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere icmp source-quench
ACCEPT icmp -- anywhere anywhere icmp time-exceeded
ACCEPT icmp -- anywhere anywhere icmp parameter-problem
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT udp -- anywhere anywhere udp spt:bootps dpt:bootpc
ufw-not-local all -- anywhere anywhere
ACCEPT all -- base-address.mcast.net/4 anywhere
ACCEPT all -- anywhere base-address.mcast.net/4
ufw-user-input all -- anywhere anywhere

Chain ufw-before-logging-forward (1 references)
target prot opt source destination

Chain ufw-before-logging-input (1 references)
target prot opt source destination

Chain ufw-before-logging-output (1 references)
target prot opt source destination

Chain ufw-before-output (1 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ufw-user-output all -- anywhere anywhere

Chain ufw-logging-allow (0 references)
target prot opt source destination
LOG all -- anywhere anywhere limit: avg 3/min burst 10 LOG level warning prefix `[UFW ALLOW] '

Chain ufw-logging-deny (2 references)
target prot opt source destination
RETURN all -- anywhere anywhere state INVALID limit: avg 3/min burst 10
LOG all -- anywhere anywhere limit: avg 3/min burst 10 LOG level warning prefix `[UFW BLOCK] '

Chain ufw-not-local (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
RETURN all -- anywhere anywhere ADDRTYPE match dst-type MULTICAST
RETURN all -- anywhere anywhere ADDRTYPE match dst-type BROADCAST
ufw-logging-deny all -- anywhere anywhere limit: avg 3/min burst 10
DROP all -- anywhere anywhere

Chain ufw-reject-forward (1 references)
target prot opt source destination

Chain ufw-reject-input (1 references)
target prot opt source destination

Chain ufw-reject-output (1 references)
target prot opt source destination

Chain ufw-skip-to-policy-forward (0 references)
target prot opt source destination
DROP all -- anywhere anywhere

Chain ufw-skip-to-policy-input (7 references)
target prot opt source destination
DROP all -- anywhere anywhere

Chain ufw-skip-to-policy-output (0 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere

Chain ufw-track-input (1 references)
target prot opt source destination

Chain ufw-track-output (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere state NEW
ACCEPT udp -- anywhere anywhere state NEW

Chain ufw-user-forward (1 references)
target prot opt source destination

Chain ufw-user-input (1 references)
target prot opt source destination

Chain ufw-user-limit (0 references)
target prot opt source destination
LOG all -- anywhere anywhere limit: avg 3/min burst 5 LOG level warning prefix `[UFW LIMIT BLOCK] '
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable

Chain ufw-user-limit-accept (0 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere

Chain ufw-user-logging-forward (0 references)
target prot opt source destination

Chain ufw-user-logging-input (0 references)
target prot opt source destination

Chain ufw-user-logging-output (0 references)
target prot opt source destination

Chain ufw-user-output (1 references)


さらにufwはフロントエンドとしてユーザーの個別の設定を読み込んでiptablesに反映します。
たとえば「ufw allow 9000」と入力すると上のufw-user-inputの部分が以下のように追加設定されます。


Chain ufw-user-input (1 references)
target prot opt source destination

ACCEPT tcp -- anywhere anywhere tcp dpt:9000
ACCEPT udp -- anywhere anywhere udp dpt:9000


以上が基本的なufwの動作ですがーーDTIのUbuntu上でapt-get installしたufwに限ってはどうやらこのラッピングがうまく働いていないようなのです。(そんくすのあゆ村SNS「osグリッド情報交換」でのEsse Lemonさん(トピ番135以下)の問題はこれが原因とおもわれます)
http://sl-sns.com/?m=pc&a=page_c_topic_detail&target_c_commu_topic_id=202&page=5

Kimiko Doverさんの対処方法(同178以下)でいちおう動くようですけれど、ファイアーウォールの設定としては完全なものではないかもしれません。

そんなわけでDTIのUbuntuユーザー、あるいはUbuntu以外のLinuxユーザーの方は従来どおりiptablesを直接編集してファイアーウォールを構築したほうがよいでしょう。

ちなみに以下はOSgrid上でOpenSimが動作することが確認ずみのiptables設定の一例です。(清水さんありがとうございます^^)Ubuntu11.04での設定ということですからほかのディストリビューションではディレクトリを多少変更する必要があるかもしれません()。


=======================
$ sudo mkdir /home/vpsuser

$ sudo iptables-save > /home/vpsuser/iptables.orig.rules

$ sudo iptables --flush

$ sudo iptables -A INPUT -i lo -j ACCEPT

$ sudo iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

$ sudo iptables -A OUTPUT -j ACCEPT

$ sudo iptables -A INPUT -p tcp --dport **** -j ACCEPT                //SSHのポート

$ sudo iptables -A INPUT -p tcp --dport 9000 -j ACCEPT               //ひとつめのシム
$ sudo iptables -A INPUT -p udp --dport 9000 -j ACCEPT               //ひとつめのシム

$ sudo iptables -A INPUT -p tcp --dport 2812 -j ACCEPT

$ sudo iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

$ sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

$ sudo iptables -A INPUT -j DROP

$ sudo iptables -A FORWARD -j DROP

$ sudo iptables --list --verbose                      

$ sudo iptables-save > /home/vpsuser/iptables.up.rules        //ルールを保存する

$ sudo vi /etc/network/if-pre-up.d/iptablesload               //シェルをエディターで作成します。

#!/bin/sh
iptables-restore < /home/vpsuser/iptables.up.rules
exit 0

$ sudo chmod 744 /etc/network/if-pre-up.d/iptablesload

$ sudo iptables --flush

$ sudo reboot                                 //システムをリブートします。

$ sudo iptables --list --verbose                      
=======================

) Fedra,CentOSの場合は

# /sbin/chkconfig --add iptables (サービスが削除されている場合)
# service iptables on(startかも) (サービスが停止している場合)

としたうえで、
後半の「//ルールを保存する」以下でーー

# /sbin/iptables-save -c > /etc/sysconfig/iptables

# iptables --flush

# reboot

としてください。

レンタルサーバー