見出し画像

AWS:CodeCommitへのアクセスとIAM設計でハマる

皆さん、こんにちは。ちゃみみです。

さて本日は、またしてもCICD系シリーズ(記事になるということは最近特にはやり始めてる証拠か?!)になるのですが、CodeCommitのリポジトリへのアクセスエラーという事象になります。

発生事象のイメージとしてはこんな感じです。

通常、CodeCommitへ接続する場合には、IAMユーザーからCodeCommit接続用のクレデンシャルを払い出す必要があってそれをもってGitCloneやPushをしていくのですが今回はまぁ、Pushができないと騒がれまして。。。
「fatal: unable to access 'https://git-codecommit.ap-northeast1~~hogehoge : The requested URL returned error:403'」

これ見た感じ、権限の問題じゃ、、、というのは思ったんですがPolicyについてもこのイメージのUser側からの指定のものでして、、、
そこでCodeCommit周りに関連するところで適用されていたPolicyを見てみると以下のような感じでした。
Userには、AllowとDenyという形でPolicyが適用されており以下のような感じ※色々フィクション入れて端折ってますが
こちらがAllowのPolicy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:MergePullRequestBySquash",
                "codecommit:MergePullRequestByThreeWay",
                "codecommit:MergeBranchesByThreeWay",
                "codecommit:MergePullRequestByFastForward",
                "codecommit:CreatePullRequest",
                "codecommit:GitPush",
                "codecommit:DeleteFile",
                "codecommit:DeleteBranch",
                "codecommit:PutFile",
                "codecommit:CreateCommit"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:*:*",
            "Condition": {
                "StringNotEquals": {
                    "codecommit:References": [
                        "refs/heads/master",
                        "refs/heads/release",
                        "refs/heads/main",
                        "refs/heads/develop"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:CreateBranch",
                "codecommit:PostCommentForPullRequest",
                "codecommit:PutCommentReaction",
                "codecommit:PostCommentReply",
                "codecommit:UpdateComment",
                "codecommit:ListBranches",
                "codecommit:UpdateRepositoryDescription",
                "codecommit:UpdatePullRequestDescription",
                "codecommit:ListPullRequests",
                "codecommit:ListRepositories",
                "codecommit:CreatePullRequest",
                "codecommit:UpdatePullRequestTitle",
                "codecommit:ListTagsForResource"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:*:*"
        }
    ]
}

ほんでもってこちらがDenyのPolicy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "codecommit:GitPush"
            ],
            "Condition": {
                "Null": {
                    "codecommit:References": "false"
                },
                "StringEquals": {
                    "codecommit:References": [
                        "refs/heads/master",
                        "refs/heads/release",
                        "refs/heads/main",
                        "refs/heads/develop"
                    ]
                }
            },
            "Effect": "Deny",
            "Resource": "arn:aws:codecommit:ap-northeast-1:*:*"
        }
    ]
}

今回の焦点だったのは、各Policyに記載のある「codecommit:References: ~~~」というところです。
こちらあまり見かけることは無いのですが、開発側のほうだと結構使われているようで説明としては「指定された AWS CodeCommit アクションへの Git 参照でアクセスをフィルタリングします。」とのこと。参照URL:https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awscodecommit.html

そのため、↑のポリシーだと以下のブランチを対象に制限をかけたりしますよということなんですね。
・master
・release
・main
・develop
※その前に記載のあるrefs/heads/は何かよくわからんww

それを踏まえた上でAllowからPolicyを読み解いていくと、
<AllowPolicy>
Effect~~ :Allowであれば許可する
CodeCommitに関するアクション :それぞれの明示的なアクション
StringNotEquals: :StringEqualsだとそのまま直結でOkだが、NotEqualsなので以下の内容以外が適用
⇒CodeCommitに関するアクションは一通り許可されている(GitPush含め)が、StringNotEquals以下で対象のブランチ以外で許可がされている形のPolicyになっている。

<DenyPolicy>
Effect~~~ :Denyであれば拒否する
CodeCommitに関するアクション :それぞれの明示的なアクション
StringEquals: :StringEqualsなのでそのまま直結で適用される

⇒上記のDenyPolicyからGitPushをDenyにしているのは、StringEquals以下のブランチとなる。
・master
・release
・main
・develop

⇒⇒そのため、以下のブランチ以外であればGitPushなども実行ができる



という点でGitPushできる人もいればできない人もいるというよくわからん状態だったわけですが、原因はここにあり指定されたブランチへのGitPushなどはできないけれどもそれ以外では実施ができるということでこういった事象が発生していたようです。


なので、、、というわけでもないですが、「codecommit:References」確かにこの一文でブランチについてまで細かく制御をかけることが可能となって使い勝手というかセキュリティ的な面ではうまく作用する部分はあると思いますが、わかってない人がこれを使うと今回のような事象を招きかねないので注意をしましょう!!

※2022年10月21日のブログ記事をnote用に再投稿したものです。

以下、宣伝です。
仲間も募集中なので、気になる方は↓の記事を覗いてみてくださいませ。
いい会社だと思いますよ。
https://note.com/londsol/n/n136835ff892f

いいなと思ったら応援しよう!