ちょっと話題の記事

[新機能] CloudFormationでタグベースのアクセス制御が可能になりました

2019.05.31

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

こんにちは、菊池です。

本日ご紹介するアップデートはこちら。

CloudFormationのスタックが、タグによるアクセス制御が可能になっています。作成したスタックに対し、タグによって変更・削除の可否が設定できます。

やってみた

実現したいイメージです。

本番環境のタグ:environment:prodが付与されたスタックは開発者には操作させず、それ以外は自由に操作できるようにします。

まずは、操作を禁止するタグのついたスタックを用意します。

続いて、タグによって制限が適用されたIAMを用意します。以下のように、スタック作成を許可するためのPowerUserAccessと、タグによる操作禁止を設定したインラインポリシーを付与したIAM Roleを用意しました。

インラインポリシーの中身は以下の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "cloudformation:DeleteStack",
                "cloudformation:UpdateStack"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudformation:ResourceTag/environment": [
                        "prod"
                    ]
                }
            }
        }
    ]
}

指定のタグがある場合に、スタックの削除と更新を禁止しています。

このIAM Roleを使って、スタックを削除してみます。

はい、ちゃんとエラーが出て削除が抑止されました。

続いて、更新です。こちらも更新実行時にエラーが出ました。

また、他のタグがないスタックは問題なく削除・更新ができました。意図した通りに操作が抑止できていることがわかりました。

しかし、これだけでは権限分離という意味では問題があります。このIAM Roleですが、CloudFormationからの操作は禁止しているものの、PowerUserAccessの権限を持つため直接リソースの操作ができてしまいます。

そこで、CloudFormation実行時のリソース操作をIAM Roleを指定して行うようにしたいと思います。

参考:いつの間にかCloudFormationがIAM Roleに対応していました!

CloudFormationの実行用IAM Roleにリソース作成の権限を付与し、作業者のIAMにはCloudFormationのスタック操作のみを許可するようにします。PowerUserAccessのポリシーは外し、以下のインラインポリシーを追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:*",
                "s3:*",
                "iam:ListRoles",
                "iam:PassRole"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

実行用のIAM RoleにはAdministratorAccessの権限を付与しておき、スタックの更新を行います。実行時のアクセス権限を選択します。

はい、こちらもちゃんと、タグ付きのスタックは変更が拒否されました。スタック実行時に指定するIAM Roleの権限には関係なく、実行操作者のポリシーにて評価してくれるようです。

最後に

以上、タグによるCloudFormationの権限制御を紹介しました。

1つのAWSアカウント内で複数の環境を運用している場合や、インフラ管理者と開発者でロールを分けるといった場合に、権限分離や誤操作の抑止に使えるのではないでしょうか。