FJcloud実践
Trivyを使ってFJcloud-Vで構築した環境の脆弱性チェックを実施
TrivyはAqua Security社が提供している、コンテナイメージなどのセキュリティ脆弱性を検出するためのオープンソースのセキュリティスキャナーです。
元々はコンテナイメージのみに対応していましたが、現在は対象が拡張されファイルシステムやKubernetes、Terraform等にも対応しています。
今回はTrivyを使用して、FJcloud-Vの既存環境の脆弱性チェックを実施します。
目次
前提条件
本記事は、以下の前提知識がある方を想定しています。
- FJcloud-Vの基本的なコントロールパネルの操作、サービスを利用する知識
- Terraformの基本的な操作、知識
Trivyでのスキャン方法・検知内容
スキャン方法
Trivyの使用方法について解説します。
今回はTerraformスクリプトスキャン機能を利用しセキュリティ脆弱性をチェックするため、Terraformスクリプトのスキャン方法について解説します。
他のターゲットに対するスキャン方法はTrivy公式ドキュメントをご確認ください
Terraformのスキャンを実施する場合、以下の4つのフォーマットがサポートされています。
- JSON
- HCL
- Plan Snapshot
- Plan JSON
スキャンするためには`trivy config <ファイル名>`のコマンドを実行します。
フォルダを指定して、フォルダ内のファイルをすべてスキャンも可能です。
FJcloud-Vでの検知内容
FJcloud-VのTerraformをスキャンすると検知できる内容から、一部(コンピューティングとネットワーク)を紹介します。
その他の機能での検知内容はTrivyのnifcloudのページをご確認ください。
- コンピューティング
- CRITICAL
- サーバーにファイアウォールグループが適用されていない
- ファイアウォールルールのIPアドレスがanyとなっているものがある
- LOW
- ファイアウォールグループに説明がない
- ファイアウォールグループのルールに説明がない
- サーバーが共通プライベートLANに接続されている
- CRITICAL
- ネットワーク
- CRITICAL
- ルーターにファイアウォールが適用されていない
- VPNゲートウェイにファイアウォールが適用されていない
- ロードバランサー、マルチロードバランサーでhttpが利用されている
- ロードバランサーでTLSv1.2未満が使用されている
- LOW
- マルチロードバランサーが共通プライベートLANに接続されている
- ルーターが共通プライベートLANに接続されている
- CRITICAL
サンプルでの検証
FJcloud-Vのサーバー作成用のTerraformサンプルを使ってスキャンを実施してみます。
Terraformサンプルをコピーして、.tfファイルを新規作成し任意のフォルダへ配置します。
以下のコマンドを実行します。
> trivy config .\server.tf
実行結果は以下の通りです。
指摘内容はスキャン結果から確認できますが、詳細を知りたい場合は、スキャン結果にあるURLへアクセスして確認してください。
今回はスコアLOWの以下2点の指摘が確認できました。
- ファイアウォールに説明が入力されていない
- 共通プライベートLANに接続されている
スキャン結果を参考に必要に応じてTerraformを修正して、脆弱性を高めることができます。
次章からは既存の環境へのスキャンを検証していきます。
事前準備
検証は以下の実行環境で実施します。
- Windows10
- PowerShell
- Terraform(v1.10.3)
- Trivy(0.58.2)
- 次章でインストール
セキュリティスキャンを実施するFJcloud-Vの環境は以下の構成のものを事前に準備します。
今回はFJcloud-Vの環境構築の手順は割愛します。
Trivyインストール
Trivyの公式ページを参考にインストールしていきます。
今回は以下の手順でWindows10にインストールします。
- 「trivy_0.58.2_windows-64bit.zip」ファイルをダウンロード
2025年1月29日現在の最新版をダウンロードします。 - ダウンロードしたファイルを解凍
- 「c:\windows\」配下に配置
配置場所は環境により異なります。コマンド実行が可能なフォルダに配置してください。 - PowerShellにて「trivy version」を実行しインストールされていることとバージョンを確認
Trivyのバージョン0.58.2がインストールされていることを確認できました。
FJcloud-V環境からHCL形式ファイル生成
FJcloud-V環境をTrivyでセキュリティスキャンするために、構築済みの環境をHCL(HashiCorp Configuration Language)形式でエクスポートします。
今回はtereraformのimportブロックを使用して、HCLのファイルを生成します。
ここで使用するimportブロックはTerraform v1.5.0から導入された機能で、一度に複数のリソースをインポートし、Terraform管理下に置くことができるコマンドです。
本来は既存の環境をTerraform管理下に置く場合に使用します。
今回はTerraform管理にはしませんが、importブロックの構成を生成する機能を使用してHCLで記載したファイルを生成します。
importブロックについての詳細はTerraformの公式ページをご確認ください。
以下の手順で進めます。
1. 事前準備
まずは以下を準備できているか確認します。
- Terraform、Trivyがインストールされていること
- FJcloud-V上でTrivyでスキャンしたい環境が構築されていること
- FJcloud-Vのマルチアカウントを準備されていること(アクセスキー、シークレットアクセスキーを取得)
- 今回はTerraform操作での不慮の変更を防ぐため閲覧権限のみ付与されているアカウントを使用
2. プロバイダー設定用ファイル「provider.tf」作成
Terraformで使用するプロバイダーの設定を記述したファイルを準備します。
以下の内容で記載します。
terraform {
required_providers {
nifcloud = {
source = "nifcloud/nifcloud"
}
}
}
provider "nifcloud" {
region = "jp-east-1" #スキャンしたい環境のリージョン
}
3. インポート用設定ファイル「import.tf」作成
importブロックでインポート用のHCLを記載した設定ファイル「import.tf」を作成します。
スキャンしたい環境の全てのリソースに対して記載する必要があります。
1つのリソースに対しては、id(リソースのid)、to(<リソース種別>.<リソース名>)を指定します。
FJcloud-Vでのリソース種別名はTerraform nifcloudページを参考にしてください。
# サーバー
import {
id = "trivyserver" #サーバー名
to = nifcloud_instance.sample
}
# プライベートLAN
import {
id = "net-xxxxxxxx" #プライべートLAN名ではなくネットワークIDを指定※
to = nifcloud_private_lan.sample
}
# ファイアウォール
import {
id = "trivyfw" #ファイアウォール名
to = nifcloud_security_group.sample
}
# ファイアウォールルール INルール
import {
id = "IN_ANY_-_-_0.0.0.0/0_trivyfw" #_<プロトコル>_<開始ポート>_<終了ポート>__<ファイアウォール名>を指定
to = nifcloud_security_group_rule.sample
}
※ネットワークIDはコントロールパネルから「ネットワーク」ー「対象のプライベートLAN」をクリックし、「ネットワークID」欄を確認
4. 実行用アカウントのキーを設定
PowerShellを起動して以下のコマンドを実行して、実行用アカウントのアクセスキーとシークレットアクセスキーを環境変数に設定します。
$ENV:NIFCLOUD_ACCESS_KEY_ID="<アクセスキー>"
$ENV:NIFCLOUD_SECRET_ACCESS_KEY="<シークレットアクセスキー>"
5. Terraform初期化
PowerShellで`terraform init`を実行しTerraformを初期化します。
6. .tfファイル生成
PowerShellで`terraform plan -generate-config-out="generated.tf"`を実行し、.tfファイルを生成します。
※importブロックの出力結果は.tfファイルを手動で作る際は不要な行も値が「null」として出力されます。
今後修正され不要な行は出力されない可能性があります。
「generated.tf」のファイルが作成されていればOKです。
Trivyスキャン実施
前章で生成した「generated.tf」ファイルを`trivy config generated.tf`のコマンドを実行してスキャンします。
実行結果を確認するとファイアウォールルールでCRITICALの指摘が出ています。
IP/CIDRをANYにしていることがコンピューティングのルールに抵触しています。
※今回の出力結果では、「ファイアウォールの説明が記入されていない点」と「ファイアウォールルールの説明が記入されていない点」が出力されていません。
これは前述した、不要な行も値が「null」として出力されているためです。
上記2点の指摘はスコアLOWの指摘のため、本記事では対応いたしません。
指摘点修正
前章で出た指摘を修正します。
ファイアウォールルールのIP/CIDRがANYになっていたので、接続するIPを指定します。
Terraform管理にする予定はないので、修正はFJcloud-Vのコントロールパネルから実施します。
修正後の構成は以下の通りです。
Trivy再スキャン
まずは再スキャン用の「generated.tf」ファイルを生成しなおします。
FJcloud-Vのコントロールパネルから修正した内容に沿って、「import.tf」を以下の通りに書き直します。
# サーバー
import {
id = "trivyserver"
to = nifcloud_instance.sample
}
# プライベートLAN
import {
id = "net-xxxxxxxx"
to = nifcloud_private_lan.sample
}
# ファイアウォール
import {
id = "trivyfw"
to = nifcloud_security_group.sample
}
# ファイアウォールルール INルール
import {
id = "IN_ANY_-_-_10.0.10.2_trivyfw" #書き直し箇所
to = nifcloud_security_group_rule.sample
}
続いて修正前の「generated.tf」を削除してから、`terraform plan -generate-config-out="generated.tf"`を再実行します。
新しく「generated.tf」が作成されたことを確認します。
`trivy config generated.tf`を再実行し、結果を確認します。
`Detected config files num=1`と出力されていることから、ファイルの検出はされていますが、脆弱性の指摘は出ていません。
修正後は脆弱性の指摘が無いことが確認できました。
最後に
今回はTrivyを使用してFJcloud-Vの既存環境の脆弱性チェックを実施しました。
元々Terraform管理でない環境でも、importブロックを使用することで、Trivyによる脆弱性チェックが実施できることがわかりました。
セキュリティの観点ではそれぞれの基準があると思いますが、Trivyによるチェックを1つの参考にしてみるのはいかがでしょうか。
注意事項
- 本記事の他社サイトへのリンクにつきまして、リンク切れの際はご容赦ください。
- 本記事に記載されている会社名、製品名等の固有名詞は各社の商号、登録商標または商標です。
- 本記事は、2025年2月時点の情報です。ご利用の際は、各サービスの最新情報をご確認ください。