さて、この筆者のブログは本日、ThinkPad X240で稼働するArchLinux側に無事にリプレースできたわけですが、
世の中には怖い人たちがおりまして、WEBサーバを閲覧するだけではなくて、WEBサーバを乗っ取って
攻撃の踏み台にしてやろうとか考えてる方々が多いわけで、そこに晒されてしまいます。

こちらの例によれば外部からリモートデスクトップ接続を可能にしたWindowsサーバが6時間程度で乗っ取られてマイニングマシンにさせられたというケースがあります。
https://internet.watch.impress.co.jp/docs/column/shimizu/1195372.html

常にポートスキャンしているボットがいるわけです。
インターネットは恐ろしいですね。
そんなわけで今回は公開WEBサーバを守るための最低限のことを実施していきましょう。

ufwでサーバのセキュリティを強化

旧WEBサーバであるUbuntuLinuxサーバ時にはufw(Uncomplicated FireWall)で設定していました。
今回もそのufwでArchLinuxに設定していきましょう。

Linuxではパケットフィルタリングする仕組みをカーネルのモジュールレベルに組み込んでおり、
iptablesというコマンドで細かく制御できます。

以下で確認できます。

# lsmod |grep ip_tables

ip_tables              36864  9 iptable_filter
x_tables               57344  14 ip6table_filter,xt_conntrack,iptable_filter,xt_LOG,xt_tcpudp,xt_addrtype,xt_recent,ip6t_rt,ip6_tables,ipt_REJECT,ip_tables,xt_limit,xt_hl,ip6t_REJECT

しかし、難点として、複雑で学習コストが掛かります。

この設定を代行してくれるツールがあり、あまり細かく設定せず、
最低限できれば良いいという要望に答えてくれるツールが今回の「ufw」というわけです。

というわけで、今回はArchLinuxでufwを使う際の設定方法について紹介します。


ufwのインストール

さて、まずはufwをインストールしていきましょう。

インストールは以下コマンドで行います。

$ sudo pacman -S ufw

IPV6は無効化

ipv6は使わないので無効化します。
使わないものは無効化しておくに限ります。
rootになり、エディタでufw.confを開き、「IPV6=no」と書き込ます。

$ sudo su -
# vi /etc/ufw/ufw.conf
IPV6=no

許可する通信のルールを追加

以下のように必要なポートを許可してルールを追加します。

# ufw allow 80
# ufw allow 443
# ufw allow 22 

登録されたルールの一覧を確認する

以下コマンドでルール一覧が確認できます。

# ufw status
[root@tpx240 share3]# ufw status
Status: active

To                         Action      From
--                         ------      ----
443                        ALLOW       Anywhere                  
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere 

ufwを有効化する

ufwを有効にします。

# ufw enable

ufwを無効化する

ufwを無効化する。有効化して通信できなくなった場合に、
ufwの設定ミスや不備が原因だと考えられたら無効化してみましょう。

# ufw disable

ufwのルールを削除する

間違った設定や不要なポートを削除したい場合、は以下コマンドでまずは一覧を表示します。

# ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 8080                       ALLOW IN    Anywhere                  
[ 2] 443                        ALLOW IN    Anywhere                  
[ 3] 7080                       ALLOW IN    Anywhere                  
[ 4] 3128                       ALLOW IN    Anywhere 

削除対象の左側の番号を以下コマンドで指定することで一度確認が入り、
yキーで削除できます。

# ufw delete 4

ufw delete 4
Deleting:
 allow 3128
Proceed with operation (y|n)? 

ログの場所について

ArchLinuxの場合、ufwのloggingをオンにしましたが、ログの出力先は以下となっていました。

# ufw logging on

Logging enabled

出力先は「/var/log/everything.log」となります。

しかし、これでは全てのログが含まれてしまうのと、一般ユーザでは閲覧できないので
筆者は以下をcrontabに追加してufwのみを1分毎に吐き出すようにしました。

# crontab -e

*/1 * * * * cat /var/log/everything.log |grep 'UFW BLOCK' | grep -v grep > /var/log/ufw.log && chmod 666 /var/log/ufw.log 

既に2500件以上のブロックログが!

ここでufwのログを確認すると、既に2500件以上のブロックログがありました。
ufwは有効に機能していますね。

$ cat /var/log/ufw.log|wc -l                                                                                                                                                                                                                        
2531

拒否リストに登録するツールを旧WEBサーバで作成していたのですが、
そのスクリプトがログのフォーマットが若干異なるからか動作しないため、
再度作り直しかコードの見直しを急ぐ必要がありそうです。