Trend Vision OneのTemplate ScannerがTerraform HCLテンプレートをサポートするようになりました

Trend Vision OneのTemplate ScannerがTerraform HCLテンプレートをサポートするようになりました

Clock Icon2025.05.08

こんにちは、シマです。
皆さんはTrend Vision Oneを使っていますか?Trend Vision Oneには様々な機能がありますが、今回はCloud Postureの中にあるTemplate Scannerについてです。
以前、Template Scannerについての記事を書きましたので、よろしければこちらもご参照ください。
https://dev.classmethod.jp/articles/202502-v1-template-scanner-01/

上記記事執筆時点では、Terraformテンプレートのスキャンには「terraform show」コマンドで出力したJSONファイルを使用していました。しかし最近のアップデートで、API経由でTerraform HCL(.tf)テンプレートを直接スキャンできるようになったようです。そこで、実際に試してみました。

やってみた

Trend Vision Oneコンソールの場合

リリースノートには特に記載がありませんでしたが、念のためコンソールからも試してみました。
Trend Vision Oneコンソールで「Cloud Security」→「Cloud Posture」→「Template Scanner」にアクセスし、Terraformのテンプレートファイル(.tf)をZIPに圧縮したものをスキャンしてみましたが、残念ながら前回同様にうまくいきませんでした。
20250508shima01

APIでスキャンしてみた場合

まず、APIキーを取得します。
Trend Vision Oneコンソールにログインし、「Administration」→「API Keys」を選択します。表示された画面で「APIキーを追加」をクリックします。
20250508shima02

表示される画面から任意の名前、役割、有効期限を設定し、追加ボタンを押下します。
20250508shima03

役割については、「Cloud Risk Management」の「View」権限が付与されたものがあれば十分です。
20250508shima04
※今回はカスタムロールとして作成した「Cloud Risk Management」の「View」権限のみの役割を使用しています。

表示されたAPIキーをコピーしておきます。
20250508shima05

これでAPIキーの準備は完了です。あとはこのAPIキーを使ってAPIを叩くだけです。以下にサンプルコードを示します。

サンプルコード
import requests
import json
import os

# 環境変数からトークン取得
token = os.environ.get('XDR_API_TOKEN')
if not token:
    raise RuntimeError('APIトークンが設定されていません。')

url_base = 'https://api.xdr.trendmicro.co.jp'
url_path = '/beta/cloudPosture/scanTemplateArchive'
headers = {
    'Authorization': f'Bearer {token}'
}
data = {
    'type': 'terraform-archive'
}
file_path = r"C:\xxxxx\202505-terraform-test.zip"

try:
    with open(file_path, 'rb') as f:
        files = {'file': ('202505-terraform-test.zip', f, 'application/zip')}
        response = requests.post(
            url_base + url_path,
            params={},
            headers=headers,
            data=data,
            files=files,
            verify=True,
            timeout=30  # タイムアウト設定
        )
        response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"リクエストエラー: {e}")
    exit()
except FileNotFoundError:
    print("ファイルが見つかりません。")
    exit()

# レスポンスの処理
try:
    if 'application/json' in response.headers.get('Content-Type', ''):
        data = response.json()
    else:
        print("レスポンスがJSONではありません。")
        exit()
except json.JSONDecodeError:
    print("JSONのパースに失敗しました。")
    exit()

# scanResultsの存在確認
if 'scanResults' not in data:
    print("レスポンスに'scanResults'がありません。")
    exit()

# SUCCESS以外な結果だけ抽出
filtered_results = [result for result in data['scanResults'] if result.get('status') != 'SUCCESS']

# ファイルに保存
output_filename = 'filtered_results.json'
try:
    with open(output_filename, 'w', encoding='utf-8') as f:
        json.dump(filtered_results, f, ensure_ascii=False, indent=4)
except IOError as e:
    print(f"ファイル書き込みエラー: {e}")

上記のコードを実行すると、スキャン結果のうち「成功(SUCCESS)」以外のものだけを抽出し、filtered_results.jsonというファイルに保存します。以下は、実際に得られた一部のスキャン結果の例です。内容としてはALBにログ出力の設定をしていないことを指摘されていますので、意図したスキャン結果が表示されました。

{
  "id": "ccc:OrganisationId:ELBv2-002:ELBv2:us-east-1:aws_lb.web",
  "ruleId": "ELBv2-002",
  "provider": "aws",
  "ruleTitle": "ELBv2 Access Log",
  "riskLevel": "MEDIUM",
  "status": "FAILURE",
  "service": "ELBv2",
  "description": "ELBv2 web doesn't have access logs enabled",
  "resource": "aws_lb.web",
  "resourceType": "elbv2-loadbalancer",
  "resourceId": "aws_lb.web",
  "ignored": false,
  "categories": [
      "security",
      "sustainability"
  ],
  "compliances": [
      "GDPR",
      "AWAF",
      "CIS-V8",
      "NIST4",
      "NIST5",
      "SOC2",
      "NIST-CSF",
      "NIST-CSF-2_0",
      "ISO27001",
      "ISO27001-2022",
      "AGISM",
      "AGISM-2024",
      "HIPAA",
      "HITRUST",
      "ASAE-3150",
      "PCI",
      "PCI-V4",
      "APRA",
      "FEDRAMP",
      "MAS",
      "ENISA",
      "NIS-2",
      "FISC-V9",
      "LGPD"
  ],
  "region": "us-east-1",
  "tags": [
      "env::dev",
      "provision::terraform",
      "system_name::test-system"
  ],
  "notScored": false,
  "resolutionPageUrl": "https://www.cloudconformity.com/knowledge-base/aws/ELBv2/access-log.html"
}

最後に

今回はAPIを使ってTerraform HCL(.tf)テンプレートを直接スキャンしてみました。従来のJSON出力に比べて、直接スキャンできるようになったことで、繰り返しスキャンを行う際に非常に便利になりましたね。

本記事がどなたかのお役に立てれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.