AWS Lambda で作る無償の脅威インテリジェンスリレーモジュール

#はじめに
この記事はシスコの同志による <font color="DarkSlateBlue"><B>Cisco Systems Japan Advent Calendar 2018</B></font> の <font color="Red">18 日目</Font>として投稿しました。今年はカレンダーが<font color="Red">２つ</font>あります！！

<B>2020年版(1枚目)</B>: https://qiita.com/advent-calendar/2020/cisco
<B>2020年版(2枚目)</B>: https://qiita.com/advent-calendar/2020/cisco2

<B>2017年版</B>: https://qiita.com/advent-calendar/2017/cisco
<B>2018年版</B>: https://qiita.com/advent-calendar/2018/cisco
<B>2019年版</B>: https://qiita.com/advent-calendar/2019/cisco
<B>2020年版</B>: https://qiita.com/advent-calendar/2020/cisco

このエントリで取り上げるテーマは、「<B>AWS Lambda で作る無償の脅威インテリジェンスリレーモジュール</B>」です。<B>Cisco SecureX</B>という、こちらも無償のCiscoのプラットフォームを利用し、数多くの利用可能な脅威インテリジェンスプラットフォームを組み合わせて、AWS Lambda 上に情報中継用のアプリケーションをデプロイします。以下のステップでまとめます。

- <B><font color="DarkSlateBlue">無償で使えるセキュリティプラットフォーム：Cisco SecureX</B>
- <B><font color="DarkSlateBlue">リレーモジュールの導入ステップ</B>
- <B><font color="DarkSlateBlue">AWS Lambda 環境セットアップ</B>
- <B><font color="DarkSlateBlue">AWS Lambda にリレーモジュールデプロイ</B>
- <B><font color="DarkSlateBlue">Cisco SecureX へのリレーモジュール組み込み</B>

#<B>無償で使えるセキュリティプラットフォーム：Cisco SecureX</B>
Ciscoのセキュリティ製品を利用している誰もが、すぐに、簡単に、サインナップして使える無償のプラットフォームとして、<B>Cisco SecureX</B> が今年の<B>7月1日</B>にリリースされました！Cisco SecureXは日々のセキュリティオペレーションについて、運用の簡素化、可視化の改善、運用の効率化を目指して開発された、<B>「クラウドから提供されるセキュリティ製品のAPIアグリゲータ」</B>です。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/f30b9cfa-c663-a11f-6b46-f4ea20e52551.png)
フリートライアルも含む、例えば Umbrella、AMP、Firepower、Stealthwatch など、どれかを使っていれば Cisco SecureX アカウントによりこれらの製品と連携でき、専用の統合化されたダッシュボードを構築することができます。さらに Cisco SecureX Orchestrator と、ビルドインも含む SecureX 上で新しく設計・設定できるオーケストレーションワークフローを使うことによって、インシデント発生時に行う作業の自動化、インシデントに関わる <B>Observable</B> （怪しいドメイン、IPアドレス、ファイルハッシュなどの観測情報）の調査を劇的に簡素化することが可能になります。

Cisco SecureX はシスコ製品だけでなく、シスコ製品以外のメーカーのセキュリティ製品や、データセンターインフラ、ネットワーク・インフラ、クラウドセキュリティサービスに対してオーケストレーションワークフローを組み込むことが可能です。
<H3>[<B>Cisco SecureX</B> (http://security.cisco.com)](http://security.cisco.com)</H3>
のリンクから、ログイン/サインナップできます！

###無償の脅威インテリジェンスと SecureX リレーモジュール
<B>Cisco SecureX</B> で連携可能な脅威インテリジェンス提供サービス、連携可能な他ベンダー製品は以下より参照可能です。

[<B>Cisco SecureX threat response: Integrations and Partners</B>](https://www.cisco.com/c/en/us/products/security/threat-response/partners-integrations.html#~technology-partner-ecosystem)

<B>VirusTotal</B> は非常に有名で良く使われる方も多いのではないでしょうか？他にも <B>Shodan.io</B> や <B>AbuseIPDB</B> 、 <B>Google Safe Browsing</B> 、 <B>Microsoft Graph Security</B> なども有名です。Cisco SecureX では、このような各インテリジェンス提供サービスと連携させるための<B>「リレーモジュール」</B>が用意されています。

[<B>Cisco Security APIs</B>](https://github.com/CiscoSecurity)

これにより、各インテリジェンスソースをアプリケーションとして展開された AWS Lambda 関数および、 API Gateway により Cisco SecureX に対応した <B>STIX 2.0</B> ベースの <B>CTIM</B> (Cisco Threat Intel Model) に変換し、<B>SecureX Threat Response</B> 機能に情報をエンリッチできます。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/4bebd568-1b55-9878-b4f7-2d7b3e30ab21.png)

#<B>リレーモジュールの導入ステップ</B>
今回はサンプルとして <B>Shodan.io</B> のリレーモジュールを AWS Lambda 上に展開します。基本的にはその他の AWS 上でリレーモジュールを利用するインテリジェンス連携も、作業ステップは同じです。

<B>SecureX Shodan Relay</B>
https://github.com/CiscoSecurity/tr-05-serverless-shodan#shodan-relay-api

- <B>デプロイ用ローカル環境の整備 (python/pip/zappaのインストールと環境設定)</B>（AWS Lambdaを展開する準備)
- <B>AWS Lambda (IAM) 環境セットアップ</B>
- <B>AWS Lambda にリレーモジュールデプロイ</B>
- <B>Cisco SecureX へのリレーモジュール組み込み</B>

以下、導入用の環境を使いました。

<B>CentoOS 6.10</B>

###<B>デプロイ用ローカル環境の整備 (python/pip/zappaのインストールと環境設定)</B>（AWS Lambdaを展開する準備)
<B>python 3.7 インストール</B>

アプリケーション導入に必要な要求事項として、 python は Version 3.7 以上である必要があります。
https://github.com/CiscoSecurity/tr-05-serverless-shodan#shodan-relay-api
> <I>The application has been implemented and tested using Python 3.7. You may try to use any higher versions if you wish as they should be backward-compatible.</I>

python が旧バージョンだったため、 バージョン3.7 をインストールします。

```bash:pyhon3.7
# yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel
# cd /usr/src
# wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

# tar xzf Python-3.7.9.tgz
# cd Python-3.7.9
# ./configure --enable-optimizations
# make altinstall
```
シンボリックリンクの貼り直し等の調整を行いました

```bash:シンボリックリンク調整
# ln -s /usr/local/bin/python3.7 /usr/bin/python3
# ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
```
###Zappaイントール
AWS の PaaS である <B>AWS Lambda</B> + <B>API Gateway</B> として Cisco SecureX リレーモジュールをデプロイします。イベントドリブンであるこの Python ベースのアプリケーションは Zaapa を使って導入ができます。Cisco SecureX リレーモジュールは Python アプリのためのサーバレス Web アプリケーションとなります。もちろんすでに AWS Lambda を利用している方はこのステップは必要ありません。ここでは Zappa をインストールします。

```bash:Zappa
# pip install --upgrade pip
# pip install flask
# pip install zappa

# zappa init
# zappa deploy
```
### awscli インストール
Zappa で導入する AWS Lambda IAM ユーザ環境をセットアップするため、<B>awscli</B>をインストールします。

```bash:awscli
# pip install awscli
```
#<B>デプロイ用ローカル環境のリレーモジュールの導入準備</B>
###リレーモジュールを導入用の環境へコピー
導入用環境 (CentOS) の任意のディレクトリに、リレーモジュールソースコードをコピーします。

```bash:git
# git clone https://github.com/CiscoSecurity/tr-05-serverless-shodan
```
###リレーモジュール導入用環境ファイルの編集

```bash:zappa_settings.json
# cp zappa_settings.json zappa_settings.json.bak
# vi zappa_settings.json
```
 <B>"aws_region"</B> は導入するべき正しい AWS リージョンに変更、<B>"s3_bucket"</B> は AWS Accoun ID 等任意の情報を追加するのが望ましいです。S3 バケットの情報は AWS アカウントに対してユニークである必要があります。同一 AWS アカウント内で展開する AWS Lambda 関数の名前が重複することはできません。

```json:zappa_settings.json
{
    "dev": {
        "app_function": "app.app",
        "aws_region": "ap-northeast-1",
        "exclude": [".*", "*.json", "*.md", "*.txt"],
        "keep_warm": false,
        "log_level": "INFO",
        "manage_roles": false,
        "profile_name": "serverless",
        "project_name": "tr-shodan-relay",
        "role_name": "tr-serverless-relay-ZappaLambdaExecutionRole",
        "runtime": "python3.7",
        "s3_bucket": "zappa-tr-shodan-relay-xxxxxxxx"
    }
}
```

###リレーモジュール導入用 IAM ユーザ Deployment ポリシーファイルの編集
以降のステップで適用する、AWS IAM ユーザの Deployment Policy のテンプレートファイルを編集します。以下のように <ACCOUNT_ID> の項目を "<font color=red>< ></font>" を削除した、前のステップで設定をした AWS IAM ユーザを利用する <B>AWS Account ID</B> に書き換えます。

```bash:ZappaLambdaDeploymentPolicy.json
# cd aws
# vi ZappaLambdaDeploymentPolicy.json
```

```json:ZappaLambdaDeploymentPolicy.json(編集前)
:
            "Resource": [
                "arn:aws:iam::<ACCOUNT_ID>:role/*ZappaLambdaExecutionRole"
            ]
:
```
```json:ZappaLambdaDeploymentPolicy.json(編集後)
:
            "Resource": [
                "arn:aws:iam::9xxxxxxxxxx2:role/*ZappaLambdaExecutionRole"
            ]
:
```
#<B>AWS Lambda 環境セットアップ</B>
###AWS IAM ユーザ作成
以下に従って、AWS IAM ユーザの導入ポリシーとロールのセットアップを行います。２つ目以降のリレーモジュールを展開する場合も含め、この作業は一回のみで終了します。２つ目以降の新規モジュール導入では、このステップを省略できます。
https://github.com/CiscoSecurity/tr-05-serverless-shodan/blob/develop/aws/HOWTO.md

- AWS コンソールにログイン
- コンソールホームから <B>”IAM”</B> を検索
- 左のPaneの <B>”アクセス管理”</B> から <B>”ユーザー”</B> タブを選択
- <B>”ユーザーを追加”</B>（青ボタン）をクリック
 - ユーザ名：<B>serverless</B>
 - アクセスの種類
 - <B>プログラムによるアクセス</B>：<B>チェック</B>
 - <B>”次のステップ：アクセス権限</B>”　をクリック（次へ）
- ”ユーザーを追加” <B> ”次のステップ：タグ”</B>　をクリック（何も選択せず次へ）
- ”ユーザーを追加” "タグの追加オプション"  ： <B>”次のステップ：確認”</B>　をクリック（何も選択せず次へ）
- ”ユーザーを追加”
 - "このユーザにはアクセス権限がありません" と警告が出ますが、問題ありません。
 - <B>”ユーザの作成”</B>　をクリック（次へ）
- ”ユーザーを追加”
 - IAMユーザ作成が成功したステータスが確認できます
 - <B>".csvのダウンロード"</B> を選択しローカルファイルに保存
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/f71256d6-198b-5ab8-f5a3-dad5a092763d.png)

- 保存した .csv ファイルを確認し、作成した<B>serverless</B>ユーザの以下情報を保存します
 - <B>アクセスキー</B> (AWS Access Key ID)
 - <B>シークレットキー</B> (AWS Secret Access Key)

###Deployment ポリシー (ZappaLambdaDeploymentPolicy) の作成とIAMユーザへのアタッチ
- IAM コンソール
 - <B>アクセス管理</B> <B>ポリシー</B> 選択
- <B>ポリシー作成</B> 選択
- <B>JSON</B> タグ選択
 - 既存の設定を削除し、前のステップで編集した <B>ZappaLambdaDeploymentPolicy.json</B> の内容をコピー＆ペーストします。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/7b274875-01d2-e808-a59f-a54617b7e5a0.png)
- <B>ポリシーの確認</B> 選択
- ポリシー名を <B>"ZappaLambdaDeploymentPolicy"</B> に指定
- IAM コンソール <B>アクセス管理</B> <B>ユーザ</B> 選択
- <B>serverless</B> 選択
- <B>アクセス権限の追加</B> 選択
- <B>既存のポリシーを直接アタッチ</B> 選択
- <B>"ZappaLambdaDeploymentPolicy"</B>  選択
- <B>アクセス権限の追加</B> 選択

###IAMロール : tr-serverless-relay-ZappaLambdaExecutionRole 作成
- IAM コンソール
 - <B>アクセス管理</B> <B>ポリシー</B> 選択
- <B>ポリシーの作成</B> 選択
- <B>JSON</B> タグ選択
 - ローカルにクローンした aws/ZappaLambdaExecutionPolicy.json をコピー＆ペースト

```json:ZappaLambdaExecutionPolicy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```
- <B>ポリシーの選択</B> 選択
- <B>ポリシーの作成</B> 選択
- IAM コンソール
 - <B>アクセス管理</B> <B>ロール</B> 選択
- <B>ロールの作成</B> 選択
- <B>AWS サービス</B> <B>Lambda</B> 選択
- <B>次のステップ：アクセス権限</B> 選択
- ZappaLambdaExecutionPolicy を選択
 - 検索ボックスに "Zappa" を入力、表示された
 - ZappaLambdaExecutionPolicy を選択し、チェックボックスにチェック
- <B>次のステップ：タグ</B> <B>次のステップ：確認</B>
- ロール名を <B>tr-serverless-relay-ZappaLambdaExecutionRole</B> としてロール作成
- ロールから <B>tr-serverless-relay-ZappaLambdaExecutionRole</B>  選択
- <B>信頼関係</B> タブ選択
- <B>信頼関係の編集</B> 選択
 - JSONファイルの編集
 - "apigateway.amazonaws.com",　を追加

```JSON:(編集前)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```
```JSON:(編集後)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "apigateway.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```
- <B>信頼ポリシーの更新</B>

#<B>AWS Lambda にリレーモジュールデプロイ</B>
###リレーモジュール導入用ローカル環境のセットアップ (CentOS)
これでリレーモジュールを AWS Lambda に導入する準備が整いました。このステップにてリレーモジュール本体を導入できます。この作業のために Linux root 権限は必要としません。念の為、これまで行った各ステップを再度入念に確認しましょう。

Zappa コマンドにて AWS Lambda にアプリケーションを展開するための AWS IAM アカウント ID 環境を awscli を利用して設定します。

このステップは awscli を利用せず、以下のように指定ディレクトリに環境ファイルをマニュアルで作成することでも対応可能です。初期ステップにて作成した IAM ユーザのユーザ情報ファイル (.csv) から AWS アクセスキー、AWS シークレットアクセスキーを確認し aws コマンドで指定ます。

```BASH:awscli
% aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXAi5VxZyEwK+G+E/+qTjuXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
この結果、<B>~/.aws</B> ディレクトリ内に <B>credentials</B> ファイルと <B>config</B> ファイルが作成されます。以下はそのフォーマットです。

```init:credential
~/.aws/redentials
　[default]
　aws_access_key_id=XXXXXXXXXXXXXXXXXXXX
　aws_secret_access_key=XXXXXXXXXXAi5VxZyEwK+G+E/+qTjuXXXXXXXXXX
```
```init:config
~/.aws/config
　[profile serverless]
　region=ap-northeast-1
　output=json
```
###リレーモジュールを導入
再度 python 3.7 以上であることを確認します。

```bash:python
% python3 --version
```
python 仮想環境をセットアップします。このコマンドを実行したディレクトリ配下に仮想環境用のテンポラリディレクトリが作成されます。このコマンドの実行は展開用リレーモジュールユーザのユーザディレクトリや、クローンしたモジュールのソースコード配下のディレクトリでも構いません。

```bash:python
% python3 -m venv venv
```
仮想環境をアクティベートします

```bash:python
% source venv/bin/activate
```
仮想環境にてpipをアップグレードします

```bash:pip
% pip install --upgrade pip
```
本体アプリケーションに必要なライブラリをインストールします。必要とするライブラリは導入するリレーモジュールによって異なります。このコマンドはソースコードをクローンしたディレクトリ内の <B>requirements.txt</B> を正しく指定する必要があります。

```bash:pip
% pip install --upgrade --requirement requirements.txt
```
いよいよリレーモジュールを導入します。これまでのステップを入念に再度確認します。以下のコマンドは、クローンしたソースコードのディレクトリ上で行う必要があります。

```bash:zappa
% zappa deploy dev

Calling deploy for stage dev..
Downloading and installing dependencies..
 - markupsafe==1.1.1: Downloading
100%|██████████████████████████████████████| 27.5k/27.5k [00:00<00:00, 12.9MB/s]
 - cryptography==3.3.1: Downloading
100%|██████████████████████████████████████| 2.66M/2.66M [00:00<00:00, 11.5MB/s]
 - cffi==1.14.4: Using locally cached manylinux wheel
Packaging project as zip.
Uploading tr-shodan-relay-dev-1607574935.zip (10.6MiB)..
100%|██████████████████████████████████████| 11.1M/11.1M [00:01<00:00, 9.00MB/s]
Uploading tr-shodan-relay-dev-template-1607574945.json (1.6KiB)..
100%|██████████████████████████████████████| 1.66k/1.66k [00:00<00:00, 19.2kB/s]
Waiting for stack tr-shodan-relay-dev to create (this can take a bit)..
100%|████████████████████████████████████████████| 4/4 [00:15<00:00,  3.90s/res]
Deploying API Gateway..
Deployment complete!: https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
```
エラー無くデプロイが完了すると、最後のzappaコマンドのステータスにAWA Lambda API GatewayのURLが出力されますので、これを保存します。

上記 Zappa でのアプリケーションデプロイは、以下リンクの動画のような流れで行われます。
[<B>Zappa - Serverless Python</B>](https://github.com/Miserlou/Zappa)

デプロイエラーが出る場合は、これまでの導入ステップを再度確認し、トラブルシューティングを行います。以下リンクの情報を是非確認ください。

- [<B>untitled (required permission for deploying AWS Lambda)</B>](https://github.com/Miserlou/Zappa/blob/master/example/policy/deploy.json)
- [<B>Zappa throws AccessDenied exception while attempting to upload zip to S3 while AWS CLI can upload files with same profile</B>](https://github.com/Miserlou/Zappa/issues/1972)

###リレーモジュールのステータス確認
AWS Lambda に導入されたリレーモジュールのステータスを確認します。

- AWS コンソールにログイン
- コンソールホームから <B>”Lambda”</B> を検索

デプロイに成功したリレーモジュール "tr-shodan-relay-dev" のLambda関数が確認できます。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/9ddc8666-b730-6d3f-9de8-c3e73fbb0320.png)

#<B>Cisco SecureX へのリレーモジュール組み込み</B>
###Cisco SecureX へのリレーモジュール組み込み
最終フェーズです。<B>Shodan.io</B> のリレーモジュールは Cisco SecureX Integration ページから API Gateway のURL 指定のみで統合が完了します。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/9d142b70-ff38-26d9-dafc-6acd5cf9b1b2.png)

2020/12/12 に Cisco SecureX はVersion 1.6.2 にバージョンアップされ、連携できる製品が大幅に増えました。<B>Shodan.io</B> と同様の連携ステップでその他のリレーモジュールを展開してみます。

##動作確認
Cisco SecureX Ribbon から Threat Response にて調査用のIOCを投入します。JP CERT、Cisco Talos Blog 等、ランサムウェアなどの任意のIOC情報をいくつか投入して確認します。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/bb1e7f07-6727-702b-83c1-87e26052c5ab.png)

統合に成功したリレーモジュールからのエンリッチメントが確認できます。

#おまけ
この機会に現時点で手軽に導入できるだけのリレーモジュールを展開してみました。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311200/70bbb298-467b-3f2c-e1aa-d92736b430dc.png)
合計<B>10以上のアプリケーション</B>を AWS Lambda 上に組み込み、毎日リクエストして使いながら時間が経ちました。AWS Lambda の利用は、EC2で稼働させる定常的にCPUリソースを消費するインスタンスと異なり、実行時（リクエスト時）のみのリソース消費で課金がされます。

[<B>AWS Lambda 料金</B>](https://aws.amazon.com/jp/lambda/pricing/)

<font color=red>100 万件リクエストに対して 0.20USD</font> の課金となるとのこと、10個以上のモジュールをデプロイした私の今月の AWS への請求額は <Font color=red>4円程度</Font>となりました。非常に格安ですね！

# 参照
[0] Cisco SecureX
http://security.cisco.com
[1] SecureX Shodan Relay
https://github.com/CiscoSecurity/tr-05-serverless-shodan#shodan-relay-api
[2] Zappa
https://github.com/Miserlou/Zappa
[3] Cisco Security API
https://github.com/CiscoSecurity
[4] Cisco Threat Intel Model (CTIM)
https://github.com/threatgrid/ctim
[5] Cisco SecureX threat response: Integrations and Partners
https://www.cisco.com/c/en/us/products/security/threat-response/partners-integrations.html#~technology-partner-ecosystem
[6] AWS HOWTO
https://github.com/CiscoSecurity/tr-05-serverless-shodan/blob/develop/aws/HOWTO.md
[7] untitled (required permission for deploying AWS Lambda)
https://github.com/Miserlou/Zappa/blob/master/example/policy/deploy.json
[8] Zappa throws AccessDenied exception while attempting to upload zip to S3 while AWS CLI can upload files with same profile
https://github.com/Miserlou/Zappa/issues/1972
[9] JSON Web Token (JWT)
https://en.wikipedia.org/wiki/JSON_Web_Token
[10] AWS Lambda 料金
https://aws.amazon.com/jp/lambda/pricing/