LAC WATCH

セキュリティとITの最新情報

RSS

株式会社ラック

メールマガジン

サイバーセキュリティや
ラックに関する情報をお届けします。

ラックピープル | 

Terraform Cloudの認証情報にIAMロールを使用してAWSを構築する

クラウドインテグレーションサービス部 吉川です。

昨今、データの管理・制御やデータの局所性の確保、コストの最適化などの理由からマルチクラウドや、Infrastructure as Code(以下、IaC)への関心が高まり、TerraformをIaCツールとして選定する機会が増えてきました。しかし、TerraformでAWS環境を構築する場合、認証情報としてアクセスキーが必要になるため、敷居が高いと思う人も多いのではないでしょうか。

アクセスキーはなるべく使わない方針とする理由の一つに、万が一アクセスキーが漏洩してしまうと、AWS環境へ不正にアクセスされる恐れがあるため、顧客情報の漏洩や高額な利用料を請求されるといったセキュリティリスクがある点が挙げられます。また、アクセスキーを払い出すと、キーのローテーションや、漏洩の検知、キーを削除する仕組みなどを作りこむ必要があるため、時間やコスト、人的リソース確保の観点から、なかなか対応が難しいと思います。

実はラックのAWS検証環境も原則アクセスキーを払い出さない方針にしています。本記事では、Terraform Cloudの認証情報にアクセスキーを払い出すのではなく、AWSのサービスに対して操作権限を付与する「IAMロール」を使用してAWSリソースを構築する方法を紹介します。

AWS Security Token Serviceを使用してIAMロールを引き受けることで、一時的かつ動的なセキュリティ認証情報を使用でき、アクセスキーの管理・運用から解放されることが利点になります。

OpenID Connect IDプロバイダの作成

OpenID Connect IDプロバイダの作成手順を説明します。

※ IAM権限があるIAMユーザで作業をしてください。

AWSマネジメントコンソールにサインインし、IAMサービス画面を開きます。左側メニューから[IDプロバイダ]を選択し、[プロバイダを追加]をクリックします。

AWSマネジメントコンソールのIAMサービス画面

1. プロバイダの設定

以下の通り設定します。
プロバイダのタイプは[OpenID Connect]を選択します。
プロバイダのURLは[https://app.terraform.io]を入力します。
[サムプリントを取得]をクリックします。

追加するプロバイダの設定

対象者に[aws.workload.identity]を入力します。

アプリのプロバイダIDによって発行されたクライアントIDを指定

タグは任意で設定し、[プロバイダを追加]をクリックします。

タグは任意で設定

OpenID Connect IDプロバイダが作成されたことを確認します。

OpenID Connect IDプロバイダの作成完了

2. IAMロールの作成

AWSマネジメントコンソール上部にある[ロールの割り当て]をクリックします。

AWSマネジメントコンソール画面。「ロールの割り当て」をクリック。

Terraform Cloud用のIAMロールを新規に作成するために、[新しいロールを作成]を選択し、[次へ]をクリックします。

Terraform Cloud用のIAMロールを新規作成。「新しいロールを作成」を選択。

Audienceに[aws.workload.identity]を入力し、[次のステップ:アクセス権限]をクリックします。

※ ウェブIDとIDプロバイダはデフォルトの状態です。

Audienceに「aws.workload.identity」を入力

ロールにアタッチする任意のポリシーを選択します。今回は検証のため[PowerUserAccess]を選択しました。

ロールにアタッチする任意のポリシーを選択

今回は検証のためアクセス権限の境界の設定は特にせず、[次のステップ:タグ]をクリックします。

※ PowerUserAccessはIAM、Organizations、AWSアカウントの操作以外の権限があります。権限を絞りたいときにアクセス権限の境界を設定します。(保有する権限とアクセス権限の境界で設定した権限が重複した権限のみ許可されます。)

検証のためアクセス権限の境界の設定はしない

タグは任意で設定し、[次のステップ:確認]をクリックします。

タグは任意で設定

ロール名やアタッチするポリシーなどを確認し、[ロールの作成]をクリックします。

ロール名やアタッチするポリシーなどを確認し、「ロールの作成」をクリック

IAMロールが作成されたことを確認します。

IAMロールの作成完了

信頼ポリシーの編集

TerraformCloudがIAMロールを引き受けられるように信頼ポリシーを編集します。

AWSマネジメントコンソールのIAMサービス画面を開きます。左側メニューからロールを選択し、前手順で作成したロールをクリックします。

左側メニューからロールを選択し、前手順で作成したロールをクリック

[信頼関係]タブを選択し、[信頼ポリシーを編集]をクリックします。

「信頼関係」タブを選択し、「信頼ポリシーを編集」をクリック

現在設定されているポリシーをすべて削除し、後述しているポリシーに修正します。
[ポリシーを更新]をクリックします。

設定済みのポリシーをすべて削除、新しくポリシーを設定

信頼ポリシーは以下のように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "①arn:aws:iam::【12桁のアカウントID】:oidc-provider/app.terraform.io"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "②app.terraform.io:aud": "③aws.workload.identity",
                    "②app.terraform.io:sub": "organization:④【組織名】:project:⑤【プロジェクト名】:workspace:⑥【ワークスペース名 ※今回はaws_test】:run_phase:⑦*"
                }
            }
        }
    ]
}

各設定値の説明です。

  • OpenID Connect IDプロバイダのARN
  • Terraform Cloudのアドレスからhttps://を削除したもの(例:app.terraform.io)
  • Terraform Cloudの環境変数[TFC_AWS_WORKLOAD_IDENTITY_AUDIENCE]の値

    ※ 環境変数を定義していない場合は、デフォルトだとaws.workload.identityを設定。

  • このポリシーを適用するTerraform Cloudの組織名
  • このポリシーを適用するプロジェクト名
  • このポリシーを適用するワークスペース名
  • このポリシーを適用する実行フェーズ(planまたはapply、もしくはアスタリスク)

    ※ 今回はplanもapplyも同じロールを使用したいので、run_phaseはアスタリスクで設定しています。また、ワイルドカードを使用しない場合は、StringLikeではなく、StringEqualsを使用できます。

各設定値の確認方法です。
AWSマネジメントコンソール→IAMサービス画面→IDプロバイダ→前手順で作成したOpenID Connect IDプロバイダを選択し、①~③の設定値を確認します。

作成したOpenID Connect IDプロバイダの設定値を確認

Terraform Cloudにサインインして④~⑥の設定値を確認します。

作成したOpenID Connect IDプロバイダの設定値を確認

[信頼関係]タブを選択し、表示されたポリシーが更新されていることを確認します。
以上でOpenID Connect IDプロバイダの設定は完了です。

Terraform Cloudの環境変数設定

Terraform Cloudの環境変数設定手順を説明します。

※ すでにワークスペースがある前提の手順となっています。ワークスペースがない場合は、ワークスペースの作成からお願いします。今回使用しているワークスペースはCLI環境になります。

Terraform Cloudにサインインし、ワークスペースを選択します。左側メニューから[Variables]を選択します。

左側メニューから「Variables」を選択

[+ Add variable]をクリックします。

「+ Add variable」をクリック

以下の通り設定します。
Select variable categoryは[Environment variable]を選択します。
Keyには[TFC_AWS_PROVIDER_AUTH]を入力します。
Valueには[true]を入力します。
[Add variable]をクリックします。

Terraform Cloudの環境変数を設定

Variablesの画面に戻るので、再び[+ Add variable]をクリックします。

再び「+ Add variable」をクリック

以下の通り設定します。
Select variable categoryは[Environment variable]を選択します。
Keyには[TFC_AWS_RUN_ROLE_ARN]を入力します。
Valueには[IAMロールのARN]を入力します。
※ IAMロールのARNは、AWSマネジメントコンソール→IAMサービス画面→ロール→前手順で作成したロールを選択→ARNからコピーしてください。[Add variable]をクリックします。

Terraform Cloudの環境変数を設定

2種類の環境変数が追加されたことを確認します。以上でTerraform Cloudの環境変数設定は完了です。

2種類の環境変数が追加されたことを確認

動作確認

tfファイルの準備

テスト用のtfファイルを作成します。今回はVPCを作成するコードを用意しました。

※【】部分は各自の環境に読みかえてください。

#組織とワークスペース名の設定
terraform {
  cloud {
    organization = "【組織名】"
    
    workspaces {
      name = "【ワークスペース名 ※今回はaws_test】"
    }
  }
}
 
#リージョンの設定
provider "aws" {
  region = "ap-northeast-1"
}
 
#VPC作成
resource "aws_vpc" "main" {
  cidr_block              = "10.0.0.0/16"
  enable_dns_hostnames = true
 
  tags = {
    Name = "terraformcloud_vpc"
  }
}

VPC作成・削除の動作確認

※ ローカルPCにTerraformがインストールされている前提の手順になっています。

1. VPC作成

Terraform CloudのワークスペースはCLI環境で作成しているので、コマンドプロンプトを使用して動作確認を行います。
コマンドプロンプトで[terraform login]コマンドを実行すると、ブラウザが自動で立ち上がり、トークンの有効期限を求められます。トークンの有効期限を任意の期間で設定し、[Generate token]をクリックします。今回は動作確認なので、有効期限を1時間で設定しています。

user tokenの作成

ブラウザ上でトークンが払い出されるので、コピーしてコマンドプロンプトに貼り付けます。[Welcome to Terraform Cloud!]の画面が表示されたら、Terraform Cloudを使用することができます。

払い出されたトークンをコマンドプロンプトに貼り付ける

テスト用のtfファイルを格納しているフォルダに移動し、[terraform init]コマンドを実行します。[Terraform Cloud has been successfully initialized!]と表示されたことを確認します。

「terraform init」コマンドを実行

[terraform apply]コマンドを実行します。
[Apply complete!]と表示されたことを確認します。

「terraform apply」コマンドを実行

AWSマネジメントコンソールにサインインして、VPCが作成されているか確認します。テスト用のtfファイルで定義したVPCが作成されているのがわかると思います。

VPCの作成を確認

2. VPC削除

削除の方も動作確認してみます。
[terraform destroy]コマンドを実行します。
[Apply complete!]と表示されたことを確認します。

「terraform destroy」コマンドを実行

AWSマネジメントコンソールを確認すると、VPCが削除されたことがわかります。以上で動作確認は完了です。

VPCの削除を確認

最後に

Terraform Cloudの認証情報にIAMロールを使用してAWSリソースを構築することができました。アクセスキーを払い出さなければ、アクセスキーの漏洩は発生しないためセキュリティリスクは低減します。また、キーの管理も必要ないため、キーのローテーションや漏洩を検知する仕組みを作りこむ必要がなく、コスト、人的リソースを削減できます。

セキュリティ面、コスト面それぞれに対し利点のあるIAMロールを使用したAWSリソース構築、検討してみてはいかがでしょうか。

参考資料

この記事は役に立ちましたか?

はい いいえ