Skip to content

AWS Organizations Terraform運用設計書

用語補足:

  • マネジメントアカウント: AWS Organizationsを作成したアカウント(awscloud.jp43: 703480710002)
  • fd-security-tooling: セキュリティサービスの委任管理者アカウント(860801568046)
  • fd-log-archive: 監査ログ集約専用アカウント(385800115893)

1. 方針

Terraform管理の範囲

対象Terraform管理管理場所理由
SCPするfd-security-tooling変更が継続的に発生。コードレビューが必要
組織トレイルするfd-security-tooling恒久的な設定
Log Archive S3バケットするfd-log-archiveライフサイクル等の設定が複雑
セキュリティサービス組織設定するfd-security-toolingGuardDuty/Security Hub等の組織統合設定
OU作成 / アカウント作成しないマネジメントアカウント(手動)1回限りの操作
Trusted Access / Delegated Adminしないマネジメントアカウント(手動)1回限りの操作。委任できない

Terraformバージョン

新規アカウント(fd-security-tooling / fd-log-archive)は最新バージョンを使用する。
既存アカウント(1.4.5)とは独立しているため、バージョンを合わせる必要はない。

認証方式

fd-security-toolingアカウントでTerraformを実行する。
マネジメントアカウントにはTerraform用の認証を入れない。

マネジメントアカウントでTerraform運用しない理由(セキュリティ観点):
  ・SCPが効かない唯一のアカウントであり、ガードレールで制限できない
  ・Terraform実行用のIAMロールを作ると、そのロールは制限なしで全操作が可能になる
  ・Organization全体の管理権限(SCP変更・削除、アカウント削除等)に直結する
  ・認証の入口を増やすほど攻撃面が広がる
  ・terraform destroyの事故でSCPやOUが消えた場合、全アカウントのガードレールが消失する

fd-security-toolingで実行するメリット:
  ・SCPが効くため、IAMロールの権限が広くてもSCPで最後の防御ができる(多層防御)
  ・SCP管理はResource-based delegation policyで委任可能
  ・マネジメントアカウントへの認証が不要になり、攻撃面が増えない

SCP管理の流れ:
  fd-security-tooling で terraform apply
    → delegation policy により
    → マネジメントアカウントのOrganizationに対してSCPを作成・適用

  ※ delegation policyの初回作成はマネジメントアカウントで手動実施
  ※ 現時点ではSCP管理のみ委任。将来必要に応じてRCP/Tag Policy等を追加

実行方式

ローカル実行を基本とする。GitHub Actionsは使用しない。

理由:
  ・セキュリティ周りの設定はクリティカルであり、GitHub Actionsは攻撃面になりうる
  ・SCP/セキュリティサービスの設定変更は頻繁に発生しない
  ・ローカルに閉じることで攻撃面を最小化する
  ・SREのみが操作権限を持つため、手動実行で十分

実行フロー:
  1. ローカルでコード変更 → PRオープン
  2. コードレビュー(PR上でdiffを確認)
  3. ローカルで terraform plan を実行して差分確認
  4. PRマージ
  5. ローカルで terraform apply を実行

将来の自動化:
  ・頻度が上がった場合、AWSに閉じたパイプライン(CodePipeline + CodeBuild)を検討
    → 認証がAWS内で完結し、外部からの攻撃面がない(最も安全な方式)
    → ただし構築コストが高いため、変更頻度に見合うかで判断する
  ・GitHub Actionsはセキュリティ設定の管理には使用しない方針を維持
    → ワークロード管理(既存環境)では実績があり問題ないが、
      SCP等のOrganization設定はクリティカルなため外部パイプラインに依存しない

秘匿情報の管理

既存運用と同じ方式:
  ・機密情報はterraform.tfvarsに記載
  ・S3バケット(fd-tfvars-xxx)に保存
  ・download-tfvar.sh / upload-tfvar.sh で取得・更新

2. ディレクトリ構成

terraform_for_aws/
├── fastdoctor-template/       ← 既存(ワークロード管理)
│   ├── common/
│   │   ├── production/
│   │   ├── staging/
│   │   ├── ...
│   │   ├── security-tooling/  ← 新規(fd-security-toolingアカウント)
│   │   │   ├── backend.tf
│   │   │   ├── provider.tf
│   │   │   ├── main.tf        ← アカウント内リソース(IAM, 組織トレイル, GuardDuty等)
│   │   │   ├── scp.tf         ← SCP定義(delegation policy経由で適用)
│   │   │   ├── variable.tf
│   │   │   ├── download-tfvar.sh
│   │   │   └── upload-tfvar.sh
│   │   └── log-archive/       ← 新規(fd-log-archiveアカウント)
│   │       ├── backend.tf
│   │       ├── provider.tf
│   │       ├── main.tf        ← S3バケット、バケットポリシー、ライフサイクル等
│   │       ├── variable.tf
│   │       ├── download-tfvar.sh
│   │       └── upload-tfvar.sh
│   └── services/

ディレクトリの役割

ディレクトリ実行アカウント内容
fastdoctor-template/common/security-tooling/fd-security-toolingアカウント内リソース + SCP管理(delegation policy経由)
fastdoctor-template/common/log-archive/fd-log-archiveS3バケット、バケットポリシー、ライフサイクル等
SCP管理について:
  ・SCPの適用先はOrganization(マネジメントアカウント)だが、
    実行はfd-security-toolingからdelegation policy経由で行う
  ・認証先が同じアカウントなので、ディレクトリも同じsecurity-tooling/に統合

コードオーナー

fastdoctor-template/common/security-tooling/ および
fastdoctor-template/common/log-archive/ のコードオーナーはSREのみとする。

CODEOWNERS:
  /fastdoctor-template/common/security-tooling/ @fastdoctor-jp/sre
  /fastdoctor-template/common/log-archive/ @fastdoctor-jp/sre

3. tfstate管理

S3バケット

既存の命名規則に従う:

アカウントtfstateバケットtfvarバケット
fd-security-tooling (860801568046)fd-tfstate-security-toolingfd-tfvars-security-tooling
fd-log-archive (385800115893)fd-tfstate-log-archivefd-tfvars-log-archive
各アカウント内にS3バケットを作成(手動、初回のみ):
  ・バージョニング: 有効
  ・暗号化: SSE-S3
  ・パブリックアクセス: 完全ブロック

※ DynamoDB Lock は既存環境で使用していないため、合わせて使用しない

stateの分離

state保存先内容
common.tfstatefd-tfstate-security-toolingfd-security-toolingのアカウント内リソース + SCP定義
common.tfstatefd-tfstate-log-archivefd-log-archiveのアカウント内リソース

4. IAMロール設計

fd-security-tooling (860801568046)

ロール認証元権限用途
read-only-role踏み台アカウント(770217130318)からAssumeRoleReadOnlyAccess参照用
administrator-role踏み台アカウント(770217130318)からAssumeRoleAdministratorAccess + IAM操作制限管理用・terraform apply用
terraform実行時の認証:
  ・ローカルからAssumeRole(MFA付き)でfd-security-toolingにアクセス
  ・administrator-roleでplan/applyを実行
  ・SCP管理はdelegation policy経由でOrganization APIを呼び出す

fd-log-archive (385800115893)

ロール認証元権限用途
read-only-role踏み台アカウント(770217130318)からAssumeRoleReadOnlyAccess参照用
administrator-role踏み台アカウント(770217130318)からAssumeRoleAdministratorAccess + IAM操作制限管理用・terraform apply用

5. 初期構築タスク

マネジメントアカウント(最初に実施)

【手動(コンソール or CLI)】
  □ Resource-based delegation policy 作成
    ・SCP管理をfd-security-toolingに委任
  □ fd-security-toolingからSCPの読み取り・作成が可能であることを確認

fd-security-tooling アカウント

【手動(コンソール or CLI)】
  □ tfstate S3バケット作成(fd-tfstate-security-tooling)
    ・バージョニング有効、暗号化SSE-S3、パブリックアクセスブロック
  □ tfvar S3バケット作成(fd-tfvars-security-tooling)
    ・同上
  □ IAMロール作成
    ・read-only-role(踏み台からAssumeRole、ReadOnlyAccess)
    ・administrator-role(踏み台からAssumeRole、AdministratorAccess + IAM制限)
  □ CLIプロファイル追加(~/.aws/config)
  □ AssumeRoleでアクセスできることを確認

【Terraformコード作成】
  □ fastdoctor-template/common/security-tooling/ ディレクトリ作成
  □ backend.tf(fd-tfstate-security-tooling)
  □ provider.tf
  □ variable.tf
  □ download-tfvar.sh / upload-tfvar.sh
  □ terraform init / plan が正常に動作することを確認

【import】
  □ IAMロール(read-only-role, administrator-role)をterraform import
  □ terraform plan で差分がないことを確認
  □ 以降はTerraformで管理

fd-log-archive アカウント

【手動(コンソール or CLI)】
  □ tfstate S3バケット作成(fd-tfstate-log-archive)
  □ tfvar S3バケット作成(fd-tfvars-log-archive)
  □ IAMロール作成
    ・read-only-role(踏み台からAssumeRole、ReadOnlyAccess)
    ・administrator-role(踏み台からAssumeRole、AdministratorAccess + IAM制限)
  □ CLIプロファイル追加(~/.aws/config)
  □ AssumeRoleでアクセスできることを確認

【Terraformコード作成】
  □ fastdoctor-template/common/log-archive/ ディレクトリ作成
  □ backend.tf(fd-tfstate-log-archive)
  □ provider.tf
  □ variable.tf
  □ download-tfvar.sh / upload-tfvar.sh
  □ terraform init / plan が正常に動作することを確認

【import】
  □ IAMロール(read-only-role, administrator-role)をterraform import
  □ terraform plan で差分がないことを確認
  □ 以降はTerraformで管理

リポジトリ設定

  □ CODEOWNERS ファイルにsecurity-tooling / log-archive のエントリを追加
  □ Terraformバージョン指定(.terraform-version ファイル)

動作確認

  □ fd-security-toolingからterraform plan/applyが正常に実行できること
  □ fd-log-archiveからterraform plan/applyが正常に実行できること
  □ fd-security-toolingからSCPの作成・適用ができること(delegation policy経由)