![Organizations連携を使って、Amazon Inspector を組織レベルで有効化する [Terraform]](https://devio2023-media.developers.io/wp-content/uploads/2022/08/amazon-inspector.png)
Organizations連携を使って、Amazon Inspector を組織レベルで有効化する [Terraform]
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どうも、ちゃだいん(@chazuke4649)です。
基本的にTerraformで、Amazon Inspector を組織レベルで有効化してみたいと思います。
以下ブログで紹介していることを、極力Terraformでやってみるといった感じです。
前提
- すでにAWS Organizationsは有効化済み
- Inspector管理者はAuditアカウントへ委任する
- スキャンタイプは全て有効化する
- 対象リージョンは、2リージョン(東京とバージニア北部)
組織管理アカウント
- AccountId: 000000000000
- Terraform: v1.0.10
- aws provider: v4.63.0
Auditアカウント
- AccountId: 999999999999
- Terraform: v1.0.10
- aws provider: v4.67.0
ディレクトリ構成
組織管理アカウントとAuditアカウントで、Stateファイルおよび実行単位は分割している状態です。
% tree -L 2 . ├── audit │ ├── backend.tf │ ├── provider.tf │ └── inspector.tf ├── master │ ├── backend.tf │ ├── provider.tf │ ├── org.tf │ └── inspector.tf
手順
組織管理アカウントとAuditアカウントの両方で作業が必要となりますが、手順は以下の通りです。
[コンソール操作]とコメントがないものは、Terraformにて実施します。
- 組織管理アカウント) 信頼されたアクセスを有効化する
- 組織管理アカウント) Inspectorの有効化・管理アカウントの委任する
- Auditアカウント) Inspectorの有効化する
- Auditアカウント) 組織設定を追加する
- Auditアカウント) Lambdaコードスキャンを有効化する [コンソール操作] ※最近でたやつなのでTerraform未サポート
- 組織設定を変更する
- Auditアカウント自体に適用する
 
- Auditアカウント) メンバーアカウントを追加する [コンソール操作]
1. 組織管理アカウント)信頼されたアクセスを有効化する
AWS OrgazationsのAWSサービス連携にて、Inspectorの信頼されたアクセスを有効化させます。
既存のTerraformコードの当該箇所に、 inspector2.amazonaws.com を追加します。
###############################################################################
# AWS Organizations
###############################################################################
resource "aws_organizations_organization" "org" {
  aws_service_access_principals = [
    "config.amazonaws.com",
    "member.org.stacksets.cloudformation.amazonaws.com",
    "ram.amazonaws.com",
    "sso.amazonaws.com",
    "guardduty.amazonaws.com",
    "securityhub.amazonaws.com",
    "cloudtrail.amazonaws.com",
    "config-multiaccountsetup.amazonaws.com",
    "malware-protection.guardduty.amazonaws.com",
    "inspector2.amazonaws.com", ## <== ここを追加する
  ]
  enabled_policy_types = [
    "SERVICE_CONTROL_POLICY"
  ]
  feature_set = "ALL"
}
これを適用すると、以下の通りになります。

2. 組織管理アカウント) Inspectorの有効化・Inspector管理アカウントの委任する
2023.8.31追記)Service linked Roleが必要なため、組織管理アカウント自体のInspectorの有効化も行なっていましたが、委任完了後に `aws_inspector2_enabler`リソースに対するプランがAccess Denyされることが判明しました(組織管理アカウントのアクティブ化もAuditからしか操作できなくなるため)。暫定対応として当該リソースをTerraform管理外に外せば解消されますが、そもそも当該工程はTerraformで実行・管理する相性が良くないと思われます。結論としては、2.の工程は「マネジメントコンソールから実施する」をオススメします。コンソールからの手順は先述のブログか公式ドキュメントをご覧ください。参考までに当初内容は以下残しておくこととします。
続いて、Inspectorの有効化とInspector管理アカウントをAuditアカウントへ委任します。
作業前に、Inspectorコンソールを確認すると以下の通り、何もさわっていない状態です。

さらに左ペインから「アクティブ化」を開くと、アクティブ化がされていなく、委任された管理者も未設定であることがわかります。

Terraformコードは以下2点です。
provider "aws" {
  region = "ap-northeast-1"
}
provider "aws" {
  alias  = "us-ea-1"
  region = "us-east-1"
}
###############################################################################
# Inspector
###############################################################################
#--------------------------------------------------
# Tokyo
#--------------------------------------------------
resource "aws_inspector2_enabler" "ap_ne_1" {
  account_ids    = ["000000000000"]
  resource_types = ["EC2", "ECR", "LAMBDA"]
}
resource "aws_inspector2_delegated_admin_account" "ap_ne_1" {
  account_id = "999999999999"
  depends_on = [aws_inspector2_enabler.ap_ne_1]
}
#--------------------------------------------------
# Virginia
#--------------------------------------------------
resource "aws_inspector2_enabler" "us_ea_1" {
  account_ids    = ["000000000000"]
  resource_types = ["EC2", "ECR", "LAMBDA"]
}
resource "aws_inspector2_delegated_admin_account" "us_ea_1" {
  provider   = aws.us-ea-1
  account_id = "999999999999"
  depends_on = [aws_inspector2_enabler.us_ea_1]
}
今回は対象が2リージョンなので、2リージョン分のproviderブロックを用意し、resourceブロックも2リージョン分作成します。
これを適用すると、以下の通りAuditアカウントへ管理者が委任されました。

※ 管理者を委任したためか、組織管理アカウントのInspectorアクティブ化は完了していません。これはこの後Auditアカウント側から行います。
3. Auditアカウント) Inspectorの有効化する
マネジメントコンソールやTerraform実行環境・ディレクトリ・認証情報をAuditアカウントに切り替えます。
AuditアカウントのInspectorコンソールを開くと、まだアクティブ化されていません。(※マネジメントコンソール操作のみであれば、管理者委任時と同時にアクティブ化もされます)

それではTerraformコードは以下となります。 また、便宜上「4. Auditアカウント) 組織設定を追加する」の手順も一緒にやってしまいます。
※ Auditアカウント側でもprovider.tfは組織管理アカウントと同様に、2つ用意しています。
###############################################################################
# Inspector
###############################################################################
#--------------------------------------------------
# Tokyo
#--------------------------------------------------
resource "aws_inspector2_enabler" "ap_ne_1" {
  account_ids    = ["999999999999"]
  resource_types = ["EC2", "ECR", "LAMBDA"]
}
resource "aws_inspector2_organization_configuration" "ap_ne_1" {
  auto_enable {
    ec2    = true
    ecr    = true
    lambda = true
  }
  depends_on = [aws_inspector2_enabler.ap_ne_1]
}
#--------------------------------------------------
# Virginia
#--------------------------------------------------
resource "aws_inspector2_enabler" "us_ea_1" {
  provider       = aws.us-ea-1
  account_ids    = ["999999999999"]
  resource_types = ["EC2", "ECR", "LAMBDA"]
}
resource "aws_inspector2_organization_configuration" "us_ea_1" {
  provider = aws.us-ea-1
  auto_enable {
    ec2    = true
    ecr    = true
    lambda = true
  }
  depends_on = [aws_inspector2_enabler.us_ea_1]
}
これを適用すると、Inspectorがアクティブ化されました。

組織設定もONになっています。

5. Auditアカウント) Lambdaコードスキャンを有効化する [コンソール操作]
今回現時点でのすべてのスキャンを有効化したいのですが、現時点のaws providerではLambdaのコードスキャンは未サポートでした。
よって、そこはコンソール操作にて実施します。
まず、「アカウント管理」にて、外れていた「Lambdaコードスキャン」にチェックを入れて、保存します。

続いて、Auditアカウント自体もLambdaコードスキャン」はOFF状態になっているため

Auditアカウントを選択し、「アクティブ化」ボタンにて、Lambdaコードスキャンを選択し、submitします。

これによって、Lambda標準スキャンもコードスキャンもアクティブ化されました。

この作業を、対象リージョン分(今回は東京とバージニア北部)だけ、繰り返し実施する必要があります。
6. Auditアカウント) メンバーアカウントを追加する [コンソール操作]
さて、最後に、コンソールからメンバーアカウントをアクティブ化させてます。
今回は、組織管理アカウントを含む3アカウントを選択し、全てのスキャンでsubmitします。

実行すると、ステータスがActivatingになり

最終的に3つのアカウントが正常にアクティブ化されました。

この作業を、対象リージョン分(今回は東京とバージニア北部)だけ、繰り返し実施する必要があります。
おまけ)メンバーアカウントを非アクティブ化する
コスト削減などでInspector利用アカウントをしぼる場合、Auditアカウントのコンソールから簡単に行えます。
対象の1アカウントを選択し、「アクション」から「全てのスキャン」を選択し

「非アクティブ化」を実行します。

そうすれば、対象アカウントはDeactivatedなステータスに変更されました。

まとめ
できるだけTerraformにて組織レベルでInspectorを有効化してみました。
Security HubやGuardDutyと同様に、現時点ではTerraformのみではなく、マネコンやCLIを組み合わせて実施するのが現実的と思われました。(いつかTerraform一撃でできる日に期待)
それでは今日はこの辺で。ちゃだいん(@chazuke4649)でした。










