Service-Linked RoleによるAuto Scaling Groupsで暗号化されたEBSボリュームを使用する

2018.04.24

先日Auto Scaling Groupsは Service-Linked Roles のサポートが追加されました。

Amazon EC2 Auto Scaling (日本語) がサービスにリンクされたロールのサポートを追加

Auto Scaling の Service-Linked Roles はAuto Scalingによって事前定義されていて、AWSサービスを呼び出すために必要なすべての権限を含みます。 事前定義された権限には、AWS Key Management Service (KMS) 、AWS 管理の CMK (AWS managed Customer Master Keys)へのアクセスも含みます。 しかしながら、顧客管理の CMK(Customer Managed Keys)は含まれていません。

Auto Scaling グループが顧客管理の CMKでEBSを暗号している場合、Auto Scaling の Service-Linked Role がAuto Scaling グループのインスタンスを起動するためには追加設定が必要です。

試しに顧客管理の CMKでEBSを暗号しているEC2を使用してAuto Scaling グループを作成しましたところ、 EC2の起動が失敗しました。

画像 画像

追加設定の方法が Discussion Forums | Using Encrypted EBS Volumes in Auto Scaling Groups with Service-Linked Role にポストされていますのでご紹介します。

以下、2のパターンでの設定の追加方法が記載されていますのでそれぞれの対応方法をみていきます。

  1. Auto Scaling groupが、同じAWSアカウントが所有するCMKを使用する場合
  2. Auto Scaling groupが、別のAWSアカウントが所有するCMKを使用する場合

ケース1: Auto Scaling groupが、同じAWSアカウントが所有するCMKを使用する場合

ステップ1: Auto Scaling groupのためのEC2 Auto Scaling service-linked roleを決める

デフォルトのEC2 Auto Scaling service-linked role または カスタム接尾辞付きEC2 Auto Scaling service-linked roleを作成します。

次の例では新しくEC2 Auto Scaling service-linked role AWSServiceRoleForAutoScaling_CMK を作成しています。

aws iam create-service-linked-role \
--aws-service-name autoscaling.amazonaws.com \
--custom-suffix CMK

ステップ2: EC2 Auto Scaling の Service-Linked Role で CMKが使用できるようにする

EC2 Auto Scaling service-linked role を CMKキーポリシーのキーユーザーとして追加します。

暗号化されたEBSボリュームを起動するために必要な権限をCMKの既存の主要ポリシーに追加する必要があります。

  • Encrypt
  • Decrypt
  • ReEncryptFrom
  • ReEncryptTo
  • GenerateDataKey
  • GenerateDataKeyWithoutPlaintext
  • DescribeKey
  • CreateGrant

キーポリシーについては以下ドキュメントをご参照ください。

AWS KMS でのキーポリシーの使用

次の例で、AWSServiceRoleForAutoScaling_CMK Service-Linked RoleがCMKを使用できるようにするポリシーステートメントを示しています。 キーポリシーに以下ポリシーステートメントを追加します。

{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling_CMK"
    ]
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
  ],
  "Resource": "*"
}
{
  "Sid": "Allow attachment of persistent resources",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling_CMK"
    ]
  },
  "Action": [
    "kms:CreateGrant"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": true
    }
  }
}

ステップ3: Auto Scaling グループでEC2 Auto Scaling service-linked roleを使用する

新しいAuto Scaling グループを作成するか、既存のAuto Scaling グループを更新してEC2 Auto Scaling service-linked roleを使用します。

次の例では、AWSServiceRoleForAutoScaling_CMK service-linked roleを使用する新しいAuto Scaling グループmy-cmk-asgを作成します。 my-lcは、CMKを使用して暗号化されたEBSボリュームを定義する起動設定です。

aws autoscaling create-auto-scaling-group \
--region us-west-2 \
--auto-scaling-group-name my-cmk-asg \
--launch-configuration-name my-lc \
--availability-zones "us-west-2a" "us-west-2b" \
--service-linked-role-arn arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling_CMK \
--max-size 5 --min-size 1 --desired-capacity 2

先ほど作成したAuto Scaling グループがあるので、更新してみました。

aws autoscaling update-auto-scaling-group \
    --auto-scaling-group-name my-cmk-asg \
    --launch-configuration-name my-lc \
    --service-linked-role-arn arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling_CMK \
    --max-size 1 --min-size 1 --desired-capacity 1

先ほどはEC2インスタンスの起動に失敗していましたが、AWSServiceRoleForAutoScaling_CMK service-linked roleを使用するように設定をしたので EC2インスタンスが無事に立ち上がりました。

画像 画像

ケース2: Auto Scaling groupが、別のAWSアカウントが所有するCMKを使用する場合

  • 解決策1 は、Auto Scaling groupと同じアカウントが所有するCMKを使用して、EBSスナップショットを再暗号化します。ケース1の手順に従いservice-linked roleで新しいCMKを使用できるようにします。

  • 解決策2 はそのまま別のAWSアカウントでCMKを使用し続ける方法です。

こちらの追加設定を実施しないままAuto Scalingを設定すると先ほどと同じように、EC2インスタンスの起動が失敗します。

画像

解決策2の方法をみてみましょう。

ステップ1: Auto Scaling groupのためのEC2 Auto Scaling service-linked roleを決定する

デフォルトのEC2 Auto Scaling service-linked role または カスタム接尾辞付きEC2 Auto Scaling service-linked roleを作成します。

次の例ではAuto Scaling groupのあるAWSアカウント111122223333に新しくEC2 Auto Scaling service-linked role AWSServiceRoleForAutoScaling_CMK を作成しています。

aws iam create-service-linked-role \
--aws-service-name autoscaling.amazonaws.com \
--custom-suffix CMK

ステップ2: CMKのキーポリシーでAuto Scaling groupのAWSアカウントで顧客管理の CMKが使用できるようにする

Auto Scalingアカウント(ルートユーザー)をCMKキーポリシーのキーユーザーとして追加する

暗号化されたEBSボリュームを起動するために必要な権限をCMKの既存の主要ポリシーに追加する必要があります。

  • Encrypt
  • Decrypt
  • ReEncryptFrom
  • ReEncryptTo
  • GenerateDataKey
  • GenerateDataKeyWithoutPlaintext
  • DescribeKey
  • CreateGrant

次の例は、Auto Scaling groupを所有するAWSアカウント111122223333がAWSアカウント444455556666のCMKのキーユーザーとして許可されるポリシーステートメントを示しています。

{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::111122223333:root"
    ]
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
  ],
  "Resource": "*"
}
{
  "Sid": "Allow attachment of persistent resources",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::111122223333:root"
    ]
  },
  "Action": [
    "kms:CreateGrant"
  ],
  "Resource": "*"
}

ステップ3: IAMユーザー、IAMロールを定義して権限を作成する

Auto Scaling groupを所有するAWSアカウントのIAMユーザまたはIAMロールに対するIAM権限を追加または変更して、顧客管理CMKの権限を作成します。

次のIAMポリシーの例では、AWSアカウント111122223333のIAMユーザまたはIAMロールが、AWSアカウント444455556666のCMKの権限を作成することができます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCreationOfGrant",
      "Effect": "Allow",
      "Action": "kms:CreateGrant",
      "Resource": "arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d"
    }
  ]
}

ステップ4: 顧客管理CMKを使用する権限を作成する

Auto Scaling groupを所有するAWSアカウントのIAMユーザまたはIAMロールを使用して、EC2 Auto Scaling service-linked roleが顧客管理CMKを使用できるようにするために許可設定をします。

次の例では、EC2 Auto Scaling service-linked roleを付与された顧客管理CMKへの権限を、被付与者プリンシパルとして作成します。 被付与者プリンシパル: 権限を受け取る側ですね。

create-grantコマンドは、アカウント111122223333のIAMユーザーまたはIAMロールで実行します。

aws kms create-grant \
--region us-west-2 \
--key-id arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d \
--grantee-principal arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling_CMK \
--operations "Encrypt" "Decrypt" "ReEncryptFrom" "ReEncryptTo" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "DescribeKey" "CreateGrant"

ステップ5: Auto Scaling groupでEC2 Auto Scaling service-linked roleを使用する

新しいAuto Scaling グループを作成するか、既存のAuto Scaling グループを更新してEC2 Auto Scaling service-linked roleを使用します。

次の例では、AWSServiceRoleForAutoScaling_CMK service-linked roleを使用するアカウント111122223333に新しいAuto Scaling group my-cmk-asgを作成します。 my-lcは、顧客管理CMKを使用して暗号化されたEBSボリュームを定義する起動設定です。

aws autoscaling create-auto-scaling-group \
--region us-west-2 \
--auto-scaling-group-name my-cmk-asg \
--launch-configuration-name my-lc \
--availability-zones "us-west-2a" "us-west-2b" \
--service-linked-role-arn arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling_CMK \
--max-size 5 --min-size 1 --desired-capacity 2

これで別のAWSアカウントが所有するCMKを使用する場合の設定ができました。

画像

まとめ

Auto Scaling Groupsで Service-Linked Role がサポートされましたが 顧客管理の CMK(Customer Managed Keys)を使用するためには追加アクションが必要ですのでご注意ください。

参考URL