Control Towerのアカウント発行をService Catalogの権限に絞ったポリシーでやってみた

2022.05.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Control Towerでアカウントを発行するとき、毎回Administratorの権限でアカウントファクトリーから実行していたのですが、実際に運用する際には権限が広すぎる点が気になります。

そこで権限を抑えて実行できないか考えていたのですが、Control Tower有効化後にAWS SSOで作成されるデフォルトのアクセス許可セットを思い出しました。

AWSServiceCatalogEndUserAccess:このグループは、Account Factory を使用して新しいアカウントをプロビジョニングするためにこのアカウントでのみ使用されます。

引用:AWS Single Sign-On によるユーザーとアカウントの管理 - AWS Control Tower

説明文からするとやりたいことがそのままできそうな感じがしたので、このアクセス許可セットでアカウント発行を試してみます。

AWSServiceCatalogEndUserAccessのアクセス許可セットについて

AWSServiceCatalogEndUserAccessのアクセス許可セットはAWSServiceCatalogEndUserFullAccessのマネージドポリシーがアタッチされています。

参考:AWS Service Catalog の Identity and Access Management - AWS Service Catalog

具体的な権限は以下の通りです。(2022/05/25時点)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:SetStackPolicy",
                "cloudformation:ValidateTemplate",
                "cloudformation:UpdateStack",
                "cloudformation:CreateChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:ListChangeSets",
                "cloudformation:DeleteChangeSet",
                "cloudformation:TagResource",
                "cloudformation:CreateStackSet",
                "cloudformation:CreateStackInstances",
                "cloudformation:UpdateStackSet",
                "cloudformation:UpdateStackInstances",
                "cloudformation:DeleteStackSet",
                "cloudformation:DeleteStackInstances",
                "cloudformation:DescribeStackSet",
                "cloudformation:DescribeStackInstance",
                "cloudformation:DescribeStackSetOperation",
                "cloudformation:ListStackInstances",
                "cloudformation:ListStackResources",
                "cloudformation:ListStackSetOperations",
                "cloudformation:ListStackSetOperationResults"
            ],
            "Resource": [
                "arn:aws:cloudformation:*:*:stack/SC-*",
                "arn:aws:cloudformation:*:*:stack/StackSet-SC-*",
                "arn:aws:cloudformation:*:*:changeSet/SC-*",
                "arn:aws:cloudformation:*:*:stackset/SC-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:GetTemplateSummary",
                "servicecatalog:DescribeProduct",
                "servicecatalog:DescribeProductView",
                "servicecatalog:DescribeProvisioningParameters",
                "servicecatalog:ListLaunchPaths",
                "servicecatalog:ProvisionProduct",
                "servicecatalog:SearchProducts",
                "ssm:DescribeDocument",
                "ssm:GetAutomationExecution",
                "config:DescribeConfigurationRecorders",
                "config:DescribeConfigurationRecorderStatus"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "servicecatalog:DescribeProvisionedProduct",
                "servicecatalog:DescribeRecord",
                "servicecatalog:ListRecordHistory",
                "servicecatalog:ListStackInstancesForProvisionedProduct",
                "servicecatalog:ScanProvisionedProducts",
                "servicecatalog:TerminateProvisionedProduct",
                "servicecatalog:UpdateProvisionedProduct",
                "servicecatalog:SearchProvisionedProducts",
                "servicecatalog:CreateProvisionedProductPlan",
                "servicecatalog:DescribeProvisionedProductPlan",
                "servicecatalog:ExecuteProvisionedProductPlan",
                "servicecatalog:DeleteProvisionedProductPlan",
                "servicecatalog:ListProvisionedProductPlans",
                "servicecatalog:ListServiceActionsForProvisioningArtifact",
                "servicecatalog:ExecuteProvisionedProductServiceAction",
                "servicecatalog:DescribeServiceActionExecutionParameters"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "servicecatalog:userLevel": "self"
                }
            }
        }
    ]
}

Service Catalogで製品を起動するのに必要な一通りの権限が許可されていますね。CloudFormationが許可されているのは、Service Catalog自体がCloudFormationをパッケージングしているサービスだからだと思います。

利用する際はControl Towerから作成されているAWSAccountFactoryというSSOグループとAWSServiceCatalogEndUserAccessのアクセス許可セットが紐づけられているので、SSOユーザーをAWSAccountFactoryに所属させて下さい。

AWS Control Tower Account Factory を使用すると、クラウド管理者と AWS Single Sign-On エンドユーザーは、ランディングゾーンでアカウントをプロビジョニングできます。デフォルトでは、アカウントをプロビジョニングする AWS SSO ユーザーは AWSAccountFactory グループまたは管理グループに属している必要があります。

引用:Account Factory でのアカウントのプロビジョニングと管理 - AWS Control Tower

では実際にこの権限でアカウント発行をやってみます。

やってみる

AWSServiceCatalogEndUserAccess を使って管理アカウントへログイン

AWS SSOを使って管理アカウントへAWSServiceCatalogEndUserAccessのアクセス許可セットでログインします。

今回はService Catalogの権限しか持っていないロールのため、Control Towerのアカウントファクトリーは利用できません。Control Towerのコンソールは権限不足でひらけませんでした。

というわけで、Control Towerからではなくアカウントファクトリーの実態であるService Catalogから行う必要があります。

Service Catalogからアカウントを発行する

Service Catalogの製品を開くと、AWS Control Tower Account Factoryという製品が確認できます。Control Towerのコンソールからアカウントファクトリーを実行すると、裏ではこの製品が動く仕組みになっています。

もちろんControl Towerからではなく、Service Catalogからも実行できます。クリックすると製品の詳細が開けるので、右上の製品を起動をクリックしてください。

すると、以下のような入力画面へ遷移します。ここで必要な情報を入力すればアカウントをControl Tower配下に作成することができます。

ここで入力できる情報ですが、Control Towerのコンソールから見るアカウントファクトリーとほぼ同じであることがわかります。

一応比較すると以下のような表になります。入力欄が英語になっているだけで全て内容は同じです。(Control Tower側に製品名を入力する欄がありませんが、表示名に入れたアカウント名がそのまま製品名になるようです。)

Control Tower Service Catalog
入力欄なし(表示名がそのまま入力される) プロビジョニングされた製品の名前
アカウント E メール AccountEmail
表示名 AccountName
親 OU ManagedOrganizationalUnit
AWS SSO E メール SSOUserEmail
AWS SSO ユーザー名:名 SSOUserFirstName
AWS SSO ユーザー名:性 SSOUserLastName

というわけで、Service Catalogからアカウントを発行してみます。各値を入力して起動すると、アカウントの発行が始まりました。

同時に別権限でControl Towerのコンソールも確認してみましたが、Control Tower配下に登録処理が行われていました。

この後無事に登録済みのステータスとなったので、AWSServiceCatalogEndUserAccessのアクセス許可セットでも問題なくアカウント発行が確認できました。

おわりに

Service Catalogの権限を許可したアクセス許可セットを使って、Control Towerへのアカウント発行を試してみました。最小権限の原則に従うのであれば、アカウントの発行についてもAWSServiceCatalogEndUserFullAccessのポリシーを使って実施するのがベストかと思います。 Control Towerを利用している環境で、アカウント発行を行う際は検討してみてください。

参考