Deep Dive CloudFormation Guard～社内ルール準拠のAWS自動チェック～

Cloud Operator Days Tokyo 2024
ダイキン工業 TICデータ活用推進G 角田潤也
1

アジェンダ•社内ルール準拠のAWS自動チェックの実現に、カスタムルールが必要な理由
手動チェックやAWS Security Hubのデフォルト自動チェックでは満足できない理由•

カスタムルールを、なぜCloudFormation Guardを使って実装したか
ツールの選定理由や、他ツールにはない利点•

Deep Dive CloudFormation Guard
Guardの記法についての説明や、最新のアップデート情報•【会場限定】IaCだけでなく実リソースも自動チェック、結果をダッシュボード化
社内に意外と多い未IaC化リソースも確認可能にする

2

自己紹介
• 角田 潤也 (Junya Tsunoda)• ダイキン工業株式会社 テクノロジー・イノベーションセンター(R&D)• 実行支援チーム（ITインフラ整備/セキュリティ整備/開発チーム支援）アカウント100超・ユーザー300人超のAWSアカウント群を管理• 経歴：• 2019年：新卒入社(工学部 非情報系)• ～2020年度上期： ダイキン情報技術大学• 2020年度下期：• 2021年度～：

通常業務を2年間免除、ダイキンは企業内大学で「Π型人材」を徹底育成 | 日経クロステック（xTECH） (nikkei.com)

AWSベンダーに長期出張
現在の所属に【動画】「ダイキン情報技術大学」における製造業
DXに向けたデジタル人材育成の先進事例 - 株式会社サーバーワークス (serverworks.co.jp)

3ダイキン工業をあらわすキーワード
創業1924年100年の歴史

人を基軸におく経営

グローバル生産拠点
110ヵ所以上4兆円以上170ヵ国以上へ

海外売上高比率

事業展開

全社売上高

空調機器と冷媒を両方手がけている

総合空調メーカー

9.6

従業員万人
海外従業員比率は8割以上

85％
4社内ルール準拠のAWS自動チェックの実現に、カスタムルールが必要な理由

5

社内ルール準拠のAWS自動チェックにカスタムルールが必要な理由
R&D部門の課題：開発フロー内で、いつ社内ルールの準拠状況をチェックするか？
①手戻り手動チェック

As Is チェックがリリース前に集中
要件定義

設計

To Be 全フェーズでみる

開発実装

PoC

①自動チェック

セキュリティ
ジャッジ

手動チェック②リリース後の不用意な変更修正

運用②自動チェック

シフトレフトシフトライト

PoCから都度確認

リリース後の変更も追跡

対応工数が増えるので、自動チェックの活用が不可欠

6

社内ルール準拠のAWS自動チェックにカスタムルールが必要な理由
まず、AWS Security Hub（AWS公式で用意された自動チェック）を利用→社内チェックリストのうち、5/２８件（18%)しか自動化できなかった→カスタムルールで9件を追加対応し、14/２８件（50%)を自動化した■社内チェックリスト(２８件）の内訳

運用体制
周り
10件

見送り

見送り

アプリ
周り
4件

AWSインフラ
周り
14件

対応

未対応

5件

9件

①Security Hub非対応サービス(認証用のCognito）のルール②AND条件やOR条件を扱うルール
例：社内からのアクセスに制限するため、接続元IPアドレス制限 OR 認証した？

定型設定なので自動化できる※詳細は投影なしスライドに記載

7

カスタムルールを、なぜCloudFormation
Guardを使って実装したか10

カスタムルールを、なぜCloudFormation Guardを使って実装したか
カスタムルールを実装するツールの星取表を作った
要件

AWSサービス OSSツール：AWS公式ワークショップ(※)を基に選定
Security
Hub

AWS製

それ以外

cfn-lint

cfn-guard OPA

Checkov

ルール実装しやすさ〇:専用言語で書く△:汎用の言語で書く

実装不可△
Python

〇
独自DSL

〇
Rego

〇
Yaml

チェック
対象

IaCテンプレ×〇〇〇 Regula

〇

実リソース

〇

×〇

△

×

デフォルトルールの充実度合い

〇

〇

××

〇

AWS/CFn以外の対応

×××

〇

〇

VSCodeの拡張機能

--×〇

〇

※：https://github.com/aws-samples/policy-as-code11星取表 詳細情報： ほしい機能は何か？（他理由は投影なしスライドに記載）
要件

AWSサービス OSSツール：AWS公式ワークショップ(※)を基に選定
Security
HubAWS製

それ以外

cfn-lint

cfn-guard OPA

Checkov

ルール実装しやすさ〇:専用言語で書く△:汎用の言語で書く

実装不可△Python

〇
独自DSL

〇
Rego〇
Yaml

チェック
対象

IaCテンプレ×〇〇〇 Regula〇

実リソース〇

×〇△×

デフォルトルールの充実度合い

〇

〇

××

〇

AWS/CFn以外の対応

×

VSCodeの拡張機能-

×IaCテンプレと実リソースのチェックに両対応
×〇〇- 弊社は一部チームでIaC化できていない為、×〇〇
実リソース対応はとても嬉しい※：https://github.com/aws-samples/policy-as-code12

Deep Dive CloudFormation Guard

18

CloudFormation Guard（以下、cfn-guard）の記法について
カスタムルール特化型、CloudFormation（CFｎ)テンプレート静的解析ツール# CFn Template (YAML)でインフラを定義# template.yaml
ALBListener:
Type:"AWS::ElasticLoadBalancingV2::Listener"
Properties:
Protocol: HTTP
# Guard Rule (Guard DSL)でルールを定義# rule.guard

let elbV2LoadBalancer = Resources.*[ Type =='AWS::ElasticLoadBalancingV2::LoadBalancer’ ]let elbV2Listener = Resources.*[ Type =='AWS::ElasticLoadBalancingV2::Listener' ]rule TEST1 when %elbV2LoadBalancer !empty {%elbV2Listener.Properties {Protocol == "HTTPS"}
IaCテンプレートでの設定状況}（望ましい値か？）をみる

Rustが動く環境(開発用PCや、CI環境）
CloudFormation Guard
cfn-guard validate ¥-–data template.yaml –rules rule.guard# Validation Result19

“cfn-guard”の記法チートシート# リソース定義
let elbV2LoadBalancer = Resources.*[ Type == ‘AWS::ElasticLoadBalancingV2::LoadBalancer’ ]let elbV2Listener = Resources.*[ Type == ‘AWS::ElasticLoadBalancingV2::Listener’ ]# リソースを定義して、そのリソースが存在する場合のみ評価を行わせる# ALBが、Cognitoと連携されているか？
Rule ALB_CognitoAssociated when %elbV2LoadBalancer !empty {%elbV2Listener.Properties {some DefaultActions[*] {Type == "authenticate-cognito“ <<ALBとCognitoが紐づいていません>>}}# some <配列名>[*] で、配列内のどれかがルールに則っていれば準拠}# <<コメント>>で、エラー時のコメントを書ける# Cognitoにて、MFAが有効化されているか？
rule Cognito_MfaEnabled when %cognitoUserPool !empty {%cognitoUserPool.Properties {MfaConfiguration == "ON"EnabledMfas[*]{'Fn::GetAtt' exists OR 'Fn::Ref' exists OR 'Fn::ImportValue' exists OR 'Fn::Sub' exists OR 'Fn::If' exists}OR# <配列名>[*] で、配列内の全要素が準拠しないといけない
EnabledMfas[*] in [“SMS_MFA”, “SOFTWARE_TOKEN_MFA”]}# CloudFormationの!Ref等を列挙しないといけない}# ALBが、MFAの有効化されたCognitoと連携されているか？
rule ALB_AuthIsConfigured when %elbV2LoadBalancer !empty {ALB_CognitoAssociatedCognito_MfaEnabled# ルールを並べるとANDになる}# 社内アクセスに限る為、接続元IPアドレス制限 OR 認証を設けた？
rule A1_ALB when %elbV2LoadBalancer !empty {ALB_IPRestrictionIsConfigured OR
ALB_AuthIsConfigured# ORも可能20}

cfn-guard アップデート情報：SARIFフォーマットでの出力
年度
リリース
2024/3 “cfn-guard 3.10”がリリース 結果をSARIFフォーマットで出力可能に
アップデートノート記載を見ても、ピンとこない…

SARIFフォーマットとは？
静的解析ツール向けの標準規格
結果を後段のツールに渡しやすい

エディタの拡張機能
cfn-guard

SARIF

CIの拡張機能※従来の出力はスペース・改行で成形しており、ツールからするとパースが大変
21

SARIFで出力すると何がうれしい？
■色々なところで使える■■エディタ上①設定ミスがある
ファイルを保存■■ CIツール③SARIF Viewerに指摘が表示
非準拠時にCI停止②保存時に自動でコマンドが走る
パスを相対指定している箇所が補完される

24

【会場限定】IaCだけでなく実リソースも自動チェック、結果をダッシュボード化年度
2022/8リリース“cfn-guard”のDSLで、AWS Config のルールを定義可能に• CloudFormationのテンプレートではなく、実リソースを評価■Configルールの種類
大種別

マネージドルール

カスタムルール

小種別（AWS側で作成）

LambdaCloudFormation Guard

概要

AWS側で作成済みのルールを選択する

最も柔軟だが最も管理が大変
Lambda内に自分でロジックを書いて評価

ある程度柔軟でありながら、管理の煩雑さを低減■しんどいところ• ①：CFｎを評価する為のルールをそのまま使いまわせない• ②：AWSデフォルトの、結果の確認画面が分かりづらい26

【会場限定】IaCだけでなく実リソースも自動チェック、結果をダッシュボード化
しんどいところ①：CFｎを評価する為のルールをそのまま使いまわせない■実リソース用(Configルール）とIaC用（素のcfn-guard）でKey/Valueが異なる# Configが取得しているALBの設定情報# CFn Template (YAML)でのALBの定義{ALBListener:
Type:"AWS::ElasticLoadBalancingV2::Listener"
Properties:
Protocol: HTTP

"resourceType":"AWS::ElasticLoadBalancingV2::Listener","configuration": {"Protocol": "HTTP"}}#対応するGuard DSL
Configuration.Protocol == "HTTPS"■解決方法：ルールを手修正する≠# 対応するGuard DSL
let elbV2Listener = Resources.*[ Type =='AWS::ElasticLoadBalancingV2::Listener' ]%elbV2Listener.Properties.Protocol == "HTTPS"

手修正してでも使うべきと判断（社内に未IaC化リソースが多い為、実リソースのチェックの需要が大）27

【会場限定】IaCだけでなく実リソースも自動チェック、結果をダッシュボード化
しんどいところ②：AWSデフォルトの、結果の確認画面が分かりづらい■デフォルトの確認画面（AWS Config）の場合フィルタリングが「準拠or非準拠」のみ

順序がバラバラ
SecurityHubのマネージドルールと混ざって表示される

アカウント跨ぎで確認できない28

【会場限定】IaCだけでなく実リソースも自動チェック、結果をダッシュボード化
しんどいところ②：AWSデフォルトの、結果の確認画面が分かりづらい■解決方法：ダッシュボードを自作し、必要な機能を実装する■■ダッシュボード（QuickSight）
アカウント跨ぎで確認 アカウント毎フィルタリングも可能

非準拠の総数を表示

大本のExcelチェックリストと同じ順序で整列非準拠項目を表示
29

【会場限定】IaCだけでなく実リソースも自動チェック、結果をダッシュボード化
しんどいところ②：AWSデフォルトの、結果の確認画面が分かりづらい■解決方法：ダッシュボードを自作し、必要な機能を実装する■■AWSマネージドで構築
ある程度の運用しやすさを担保しつつ、高い拡張性・安価なランニングコストを実現
アカウント跨ぎでの集約基盤は、SecurityLakeを使用してボタン一発で構築
Athenaでクエリ
ダッシュボードはQuickSightを用いることでノーコード・インフラ管理不要で構築
3rdPartyのSaaSと比べてランニングコストが安価
・QuickSightの費用：
閲覧者が$3/月/人、編集者が$24/月/人・SecurityLakeの費用：
30
TIC内全アカウントのログを保存しても、$2/月/人程度

まとめ
■発表内容
• 社内ルール準拠のAWS自動チェックの実現には、自社向けカスタムルールが必要
SecurityHubでは社内ルールの18%のみ→カスタムルール作成し50%に対応• カスタムルールを実装するツールとして、cfn-guardを選定した
最大の理由は、IaCテンプレと実リソースに両対応、IaC未普及なチームも使える• cfn-guardの記法や使いこなし方についてDeepDiveした記法がわかりやすく、結果の表示もやりやすい■余談（プロジェクトの中での学び）• ルールを書いて動作チェックするのは思ったよりしんどい• エディタ・CI/CDの環境を整備し、効率的にルールを書けた• 自動化してはじめて、元々のチェックリストの要件漏れに気づくことがある• 元々のExcelに立ち戻り、リストの修正リクエストを出した• SARIFという標準のフォーマットの便利さを実感

31

【会場のみ】今後やりたいこと要件

AWSサービス OSSツール：AWS公式ワークショップ(※)を基に選定
Security
Hub

AWS製

それ以外

cfn-lint

cfn-guard OPA

Checkov

ルール実装しやすさ〇:専用言語で書く△:汎用の言語で書く

実装不可△
Python

〇
独自DSL

〇
Rego〇
Yaml

チェック対象IaCテンプレ×〇〇〇 Regula〇

実リソース

〇

×〇

△

×

デフォルトルールの充実度合い

〇

〇

××〇

AWS/CFn以外の対応

×××〇

〇

VSCodeの拡張機能

--×〇

〇

本取り組み中で、必要最低限は用意したが、不満はある
シンタックスハイライト/Linterなどが、VSCode拡張として欲しい…

32