
Flan Scanは軽量なネットワーク脆弱性スキャナーです。Flan Scanを使用すると、ネットワーク上のオープンポートを簡単に見つけ、サービスとそのバージョンを特定し、ネットワークに影響を与える関連CVEのリストを取得できます。
Flan ScanはNmapとvulnersスクリプトのラッパーであり、Nmapを本格的なネットワーク脆弱性スキャナーに変えます。Flan Scanを使用すると、Nmapをコンテナ内にローカルに展開し、結果をクラウドにプッシュし、Kubernetes上にスキャナーを展開するのが簡単になります。
このリポジトリをクローンする
Dockerがセットアップされていることを確認してください:
$ docker --version
スキャンしたいIPアドレスまたはCIDRSのリストをshared/ips.txtに追加します。
コンテナをビルドする:
$ make build
$ make start
デフォルトではflanはLatexレポートを作成します。他のフォーマットを取得するには、次のコマンドを実行します:
$ make html
追加でサポートされているフォーマットは md(マークダウン)、html、json です。
スキャンが終了すると、スキャンの要約レポートが shared/reports にあります。また、Nmapからの生のXML出力は shared/xml_files で確認できます。
デフォルトでは、Flan Scanは次のNmapコマンドを実行します:
$ nmap -sV -oX /shared/xml_files -oN - -v1 $@ --script=vulners/vulners.nse <ip-address>
-oXフラグはスキャン結果のXMLバージョンを/shared/xml_filesディレクトリに追加し、-oN -フラグは「通常の」Nmap結果をコンソールに出力します。-v1フラグは詳細度を1に上げ、-sVフラグは(NmapのデフォルトのポートスキャンやSYNスキャンに加えて)サービス検出スキャンを実行します。--script=vulners/vulners.nseは、検出されたサービスを関連するCVEと照合するスクリプトです。
NmapではUDPスキャンやIPv6アドレスのスキャンも可能です。これらや他のフラグをFlan ScanのNmapコマンドに追加するには、make buildを実行した後、コンテナを実行して次のようにNmapフラグを渡します:
$ docker run -v $(CURDIR)/shared:/shared flan_scan <Nmap-flags>
Flan Scanは現在、Latexレポートと生のXML Nmap出力ファイルをGCSバケットまたはAWS S3バケットにプッシュすることをサポートしています。Flan Scanは結果をクラウドにプッシュするために2つの環境変数を必要とします。1つ目はuploadで、gcpまたはawsのいずれかの値を取ります。2つ目はbucketで、その値は結果をアップロードするS3またはGCSバケットの名前です。環境変数を設定するには、make buildを実行した後、コンテナを実行して次のように環境変数を設定します:
$ docker run --name <container-name> \
-v $(CURDIR)/shared:/shared \
-e upload=<gcp or aws> \
-e bucket=<bucket-name> \
-e format=<optional, one of: md, html or json> \
flan_scan
以下は、必要なAWSまたはGCP認証キーをコンテナ内の環境変数として追加する例です。ただし、これはKubernetesのシークレットを使用して必要な環境変数を公開するか、他のシークレット管理ツールを使用しても実現できます。
サービスアカウントのGCS秘密鍵を/sharedファイルにコピーします
$ cp <path-to-local-gcs-key>/key.json shared/
GOOGLE_APPLICATION_CREDENTIALS環境変数をGCSキーへのパスとして設定してコンテナを実行します
$ docker run --name <container-name> \
-v $(CURDIR)/shared:/shared \
-e upload=gcp \
-e bucket=<bucket-name> \
-e GOOGLE_APPLICATION_CREDENTIALS=/shared/key.json
-e format=<optional, one of: md, html or json> \
flan_scan
AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEY環境変数を、S3サービスアカウントの対応する変数に設定します。
docker run --name <container-name> \
-v $(CURDIR)/shared:/shared \
-e upload=aws \
-e bucket=<s3-bucket-name> \
-e AWS_ACCESS_KEY_ID=<your-aws-access-key-id> \
-e AWS_SECRET_ACCESS_KEY=<your-aws-secret-access-key> \
-e format=<optional, one of: md, html or json> \
flan_scan
Flan ScanをKubernetesなどのコンテナオーケストレーションシステムにデプロイする場合、コンテナが/ディレクトリにあるips.txtというファイルにアクセスできるようにする必要があります。Kubernetesでは、ConfigMapを使用してこれを実現できます。ConfigMapはローカルファイルシステム上のファイルをボリュームとしてマウントし、デプロイ後にコンテナがアクセスできるようにします。kustomization.yamlファイルには、shared-filesというConfigMapを作成する例があります。このConfigMapはdeployment.yamlファイルでボリュームとしてマウントされます。
KubernetesでFlan Scanをデプロイするための簡単な手順は次のとおりです:
kustomization.yamlにローカルのips.txtファイルへのパスを追加し、その後kubectl apply -k .を実行します。kubectl get configmapを実行して、ConfigMapが正しく作成されたことを確認します。deployment.yaml内に設定します。kubectl apply -f deployment.yamlを実行して、Flan Scanを実行するデプロイメントを起動します。Flan ScanがKubernetes上で正常に実行されているはずです!