Midnight Monologues

日々勉強したことを書いてきます

ハニーポット構築(iptablesの設定)

5/23 に開催されたSECCON Beginners 2020は散々な成績だった。
いつものことながら硝子のハートはぼろぼろである。

合間の時間で以前から設定したかったT-PotへFirewall設定を追加した。
今回はその際の手順を簡単に記載する。

実施したこと

 ・運用ポートのFilter設定
  T-Potでは以下のPortが提供されている。

   64294:CockpitのAdmin UI用  
   64295:ssh接続用  
   64297:KibanaのWeb UI用    

  ⇒利用しているさくらのVPSではパケットフィルタに
   接続許可制限できるPort範囲が1〜32767までであり
   上記の64290番台のPortへの通信は制限できない。
   そのためiptablesを使用してFirewall設定を実施した。

vps-news.sakura.ad.jp

詳細内容

 ・自宅端末の回線IPからのみ64294、64295、64297の接続を受け付ける。
 ・自宅端末の回線IP以外からは64294、64295、64297の接続は拒否する。

手順

 iptablesの設定について調べながら設定をした。
 以下2つの手順が実施可能であり今回は手順1で設定した。

手順1.rules.shで管理する場合

 以下のQ&Aを参考にした。
  github.com

 T-Potでは今回のような特定IPからの接続を拒否する設定の
 永続化用に/opt/tpot/bin/rules.shを提供している。
 そのため今回もrules.shに必要な設定を導入してみる。

①T-Potへのログイン

 T-Potへssh接続する。その後、rootユーザへ変更する。

$ sudo su -
#
②/opt/tpot/bin/rules.shのバックアップ取得

 変更するrules.shのバックアップを取得する。

# cd /opt/tpot/bin/
# cp -p rules.sh rules.sh.org
③/opt/tpot/bin/rules.shへのiptablesルールの追加

 自宅回線の接続IPアドレスの許可設定をrules.shに追加する。
 INPUTルールに以下を追加
 ・<自宅回線の接続IPアドレス>からの64294,64295,64297のTCP/UDP通信を許可
 ・<自宅回線の接続IPアドレス>以外からの64294,64295,64297のTCP/UDP通信を拒否

# vi rules.sh

#20200524 ADD IP Filter Rule
/usr/sbin/iptables-legacy -w -A INPUT -s <自宅回線の接続IPアドレス> -p tcp --dport 64294:64295 -j ACCEPT
/usr/sbin/iptables-legacy -w -A INPUT -s <自宅回線の接続IPアドレス> -p udp --dport 64294:64295 -j ACCEPT
/usr/sbin/iptables-legacy -w -A INPUT -s <自宅回線の接続IPアドレス> -p tcp --dport 64297 -j ACCEPT
/usr/sbin/iptables-legacy -w -A INPUT -s <自宅回線の接続IPアドレス> -p udp --dport 64297 -j ACCEPT
/usr/sbin/iptables-legacy -w -A INPUT -p tcp --dport 64294:64295 -j REJECT
/usr/sbin/iptables-legacy -w -A INPUT -p udp --dport 64294:64295 -j REJECT
/usr/sbin/iptables-legacy -w -A INPUT -p tcp --dport 64297 -j REJECT
/usr/sbin/iptables-legacy -w -A INPUT -p udp --dport 64297 -j REJECT
④サーバ再起動

 サーバを再起動する。

# shutdown -r now
⑤設定値の確認

 自宅回線の利用PCで64294,64295,64297で接続し、エラーが出力されないことを確認する。
 携帯電話から公衆回線経由でアクセスし、エラーが出力されてアクセスできないことを確認する。

 ただしこの方法だとT-Potのupdateを実施した場合に設定が上書きされるため、
 更新の度に設定し直す必要がある。
 またiptablesの確認に使用するiptables -Lコマンドでの設定値の確認もできない。

# iptables -L
Chain INPUT (policy ACCEPT) ・・・★INPUTのChainに何も表示されない。
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            

     <中略>

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (33 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.20.0.2           tcp dpt:10001
ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:5555

     <中略>

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            

     <中略>


Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (17 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            

     <中略>

# Warning: iptables-legacy tables present, use iptables-legacy to see them

手順2.iptables-persistentで管理する場合 

 一般的に紹介されているiptables-persistentを使って、iptablesを管理する。

①T-Potへのログイン

 T-Potへssh接続する。その後、rootユーザへ変更する。

$ sudo su -
#
iptables-persistentのインストール

 iptablesの設定永続化のため、iptables-persistentをインストールする。
 (※古いOSの場合はapt-getで実施する)

# apt install iptables-persistent
ipv4.ruleのバックアップ取得

 iptables-persistentをインストールすると/etc/iptablesフォルダ配下にrules.v4とrules.v6が作成される。
 この内、rules.v4のバックアップを取得する。

# cd /etc/iptables
# cp -p rules.v4 rules.v4.org
ipv4.ruleへのiptablesルールの追加

 iptablesの定義をipv4.ruleのINPUTルールへ追加する。

# vi rules.v4

*filter
:INPUT ACCEPT [0:0]
-A INPUT -s <自宅回線の接続IPアドレス> -p tcp --dport 64294:64295 -j ACCEPT
-A INPUT -s <自宅回線の接続IPアドレス> -p udp --dport 64294:64295 -j ACCEPT
-A INPUT -s <自宅回線の接続IPアドレス> -p tcp --dport 64297 -j ACCEPT
-A INPUT -s <自宅回線の接続IPアドレス> -p udp --dport 64297 -j ACCEPT
-A INPUT -p tcp --dport 64294:64295 -j REJECT
-A INPUT -p udp --dport 64294:64295 -j REJECT
-A INPUT -p tcp --dport 64297 -j REJECT
-A INPUT -p udp --dport 64297 -j REJECT

:FORWARD DROP [0:0]

     <中略>

 設定完了後、リロードを実施して設定を反映する。

 # /etc/init.d/iptables-persistent save 
 # /etc/init.d/iptables-persistent reload
⑤サーバ再起動

 サーバを再起動する。

# shutdown -r now
⑥設定値の確認

 自宅回線の利用PCで64294,64295,64297で接続し、エラーが出力されないことを確認する。
 携帯電話から公衆回線経由でアクセスし、エラーが出力されてアクセスできないことを確認する。

 この方法だとT-Potのupdateを実施した場合でも設定が上書きされないため、設定をし直す必要がない。  またiptablesの確認に使用するiptables -Lコマンドでの設定値の確認もできるのでこちらの方が良いだろう。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  <自宅回線の接続IPアドレス>  anywhere             tcp dpts:64294:64295
ACCEPT     udp  --  <自宅回線の接続IPアドレス> anywhere             udp dpts:64294:64295
ACCEPT     tcp  --  <自宅回線の接続IPアドレス>  anywhere             tcp dpts:64297
ACCEPT     udp  --  <自宅回線の接続IPアドレス> anywhere             udp dpts:64297
REJECT     tcp  --  anywhere             anywhere             tcp dpts:64294:64295 reject-with icmp-port-unreachable
REJECT     udp  --  anywhere             anywhere             udp dpts:64294:64295 reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             tcp dpts:64297 reject-with icmp-port-unreachable
REJECT     udp  --  anywhere             anywhere             udp dpts:64297 reject-with icmp-port-unreachable

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere              

     <中略>

最後に

・設定の開始時にiptablesで制限するPort範囲を64200-64300で設定しようとしていたが、
 KibanaやES headへのアクセスが制限されたため64294,64295,64297に絞って設定した。
 上記の設定直後に白い画面が出てきて焦ったのが今回のハマりポイントだった。
・6/1ぐらいまでの期間限定で自宅学習用にAutoSpyやKibanaの無料講習が各社様から提供されているので  この機に積極的に受講してレベルアップを図りたい。
・5/12 に開催された第42回OWASP Sendai ミーティングにオンライン参加できて良かった。
 この時に紹介されたspiderfootがT-Potにも含まれているため月次報告の際に有効利用する。