lsofを使ってリモート端末のポートの状態を監視する。

isaaxアドベントカレンダー2018の20日目の記事です。   この記事ではPythonプログラムからlsofコマンドを呼び出して、isaaxで常駐化させ、Raspberry Piなどリモートの端末内のポートの状況を把握する方法を解説します。   まずは、lsofer.pyについて解説します。

import datetime
import time
import subprocess
from time import sleep
cmd = ["sudo", "lsof", "-nP", "-iTCP"]
while True:
    print(datetime.datetime.now())
    subprocess.call(cmd)
    sleep(20)
上記の様にシンプルにUNIXコマンドをPython内部で呼び出すという構成になっています。 lsofコマンドについて詳しくはこちらをご覧ください。 *極めてパワフルなコマンドなので、ヘルプオプションを読むだけでも少々時間がかかります(苦笑)。   次にRaspberry Pi内部でisaaxが司るプロセスを定義したisaax.jsonを解説します。
{
  "name": "python-app",
  "version": "Nothing test",
  "author": "Nanami Setoyama",
  "language":"python",
  "license": "",
  "scripts": {
     "start": "python3 -u lsofer.py"
    }
}
基本的に重要なのは”start”以降の部分になります。 後はgitにpushしてisaaxでデプロイするだけです。 実際に実行した結果はこんな感じになります。   この様な感じでisaaxのダッシュボードで簡単にLOGを見ることができます。 ちなみにログの内容も下に貼り付けて起きます。
2018-12-20 09:50:55.543866
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     619 root    3u  IPv4  59715      0t0  TCP *:22 (LISTEN)
sshd     756   pi    3u  IPv4  60107      0t0  TCP 192.168.0.134:22->192.168.0.125:49943 (ESTABLISHED)
sshd     619 root    4u  IPv6  59717      0t0  TCP *:22 (LISTEN)
sshd     739 root    3u  IPv4  60107      0t0  TCP 192.168.0.134:22->192.168.0.125:49943 (ESTABLISHED)
isaaxd  1407 root    3u  IPv4  67961      0t0  TCP 192.168.0.134:47608->40.115.254.120:1883 (ESTABLISHED)
isaaxd  1407 root   21u  IPv4  68686      0t0  TCP 192.168.0.134:48386->40.115.227.80:443 (ESTABLISHED)
isaaxd  1407 root    5u  IPv6  67032      0t0  TCP *:1226 (LISTEN)
isaaxd  1407 root   19u  IPv4  67035      0t0  TCP 127.0.0.1:8880 (LISTEN)
isaadxが1883番ポートが使用していますが、これはisaaxのクラウドと通信をする為のMQTTで利用しているポートです。IoT以外ではあまり見かけないポート番号ですね。 今回は簡単にポートの状態についても解説しておきます。  
CLOSED ソケットが使われていない状態。(ここでいうソケットは所謂UNIXドメインソケット)
LISTEN ソケットが接続待ち状態。
SYN SENT ソケットが接続確立のためにネゴシエーションしてる状態。
SYN RECV 接続がイニシャライズ中の状態。
ESTABLISHED ソケットは接続を確立して、セッションを結んでる状態(最も多く見かけますね)。
FIN WAIT-1 ソケットは終了して、接続は切断中の状態。
FIN WAIT-2 接続は終了して、ソケットはリモートクライアント側から切断要求を待っている状態。
CLOSING 自分と相手側の両方のソケットは終了したが、全てのデータを受信していない状態。
TIME WAIT ソケットは終了して、リモートクライアント側からの切断要求が再送されるのを待っている状態。
CLOSE WAIT リモートクライアント側が切断されたので、ソケットが終了するのを待っている状態。
LAST ACK リモートクライアント側が切断されソケットも終了しているが、ACK(確認のための返事)が来るのを待っている状態。
実際にはESTABLISHEDとLISTEN以外はあまり見かけないですね。 以上の様にリモート端末のポートの状態を監視して、マルウェアやバックドアが無いか調べるのはIoTにおいて重要かもしれません。(これだけではセキュリティとしては不十分ですが。笑)        ]]>

上部へスクロール