
Trend Vision OneのTemplate ScannerがTerraform HCLテンプレートをサポートするようになりました
こんにちは、シマです。
皆さんはTrend Vision Oneを使っていますか?Trend Vision Oneには様々な機能がありますが、今回はCloud Postureの中にあるTemplate Scannerについてです。
以前、Template Scannerについての記事を書きましたので、よろしければこちらもご参照ください。
上記記事執筆時点では、Terraformテンプレートのスキャンには「terraform show」コマンドで出力したJSONファイルを使用していました。しかし最近のアップデートで、API経由でTerraform HCL(.tf)テンプレートを直接スキャンできるようになったようです。そこで、実際に試してみました。
やってみた
Trend Vision Oneコンソールの場合
リリースノートには特に記載がありませんでしたが、念のためコンソールからも試してみました。
Trend Vision Oneコンソールで「Cloud Security」→「Cloud Posture」→「Template Scanner」にアクセスし、Terraformのテンプレートファイル(.tf)をZIPに圧縮したものをスキャンしてみましたが、残念ながら前回同様にうまくいきませんでした。
APIでスキャンしてみた場合
まず、APIキーを取得します。
Trend Vision Oneコンソールにログインし、「Administration」→「API Keys」を選択します。表示された画面で「APIキーを追加」をクリックします。
表示される画面から任意の名前、役割、有効期限を設定し、追加ボタンを押下します。
役割については、「Cloud Risk Management」の「View」権限が付与されたものがあれば十分です。
※今回はカスタムロールとして作成した「Cloud Risk Management」の「View」権限のみの役割を使用しています。
表示されたAPIキーをコピーしておきます。
これで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出力に比べて、直接スキャンできるようになったことで、繰り返しスキャンを行う際に非常に便利になりましたね。
本記事がどなたかのお役に立てれば幸いです。