Organizations連携を使って、Amazon Inspector を組織レベルで有効化する [Terraform]

2023.08.17

どうも、ちゃだいん(@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にて実施します。

  1. 組織管理アカウント) 信頼されたアクセスを有効化する
  2. 組織管理アカウント) Inspectorの有効化・管理アカウントの委任する
  3. Auditアカウント) Inspectorの有効化する
  4. Auditアカウント) 組織設定を追加する
  5. Auditアカウント) Lambdaコードスキャンを有効化する [コンソール操作] ※最近でたやつなのでTerraform未サポート
    1. 組織設定を変更する
    2. Auditアカウント自体に適用する
  6. Auditアカウント) メンバーアカウントを追加する [コンソール操作]

1. 組織管理アカウント)信頼されたアクセスを有効化する

AWS OrgazationsのAWSサービス連携にて、Inspectorの信頼されたアクセスを有効化させます。
既存のTerraformコードの当該箇所に、 inspector2.amazonaws.com を追加します。

org.tf

###############################################################################
# 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.tf

provider "aws" {
  region = "ap-northeast-1"
}

provider "aws" {
  alias  = "us-ea-1"
  region = "us-east-1"
}

inspector.tf

###############################################################################
# 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.tf

###############################################################################
# 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)でした。