NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

CodeCommitリポジトリのブランチごとにgit pullのアクセス制御をしようとして失敗した話

はじめまして。新卒入社2年目の大林です。 本記事ではCodeCommitリポジトリのブランチごとにgit pullのアクセス制御をしようとして失敗した話を紹介します。

やろうとしたこと

  1. ローカル環境からIAMユーザーにログインする。
  2. 環境操作権限があるIAMロールにスイッチして、環境サービス内のEC2インスタンスに接続する。
  3. 本番環境サービス内のEC2インスタンスは本番環境サービス内のEC2インスタンス用IAMロールに、開発環境サービス内のEC2インスタンスは開発環境サービス内のEC2インスタンス用IAMロールにスイッチする。
  4. CodeCommitリポジトリへのgit pullを行う。

本番環境サービス内のEC2インスタンス用IAMロールに付与した権限
masterブランチへのgit pullを許可、developブランチへのgit pullを拒否

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "codecommit:GitPull"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:*",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/master"
                    ]
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Deny",
            "Action": [
                "codecommit:GitPull"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:*",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/develop"
                    ]
                }
            }
        }
    ]
}


開発環境サービス内のEC2インスタンス用IAMロールに付与した権限
developブランチからのgit pullを許可、masterブランチへのgit pullを拒否

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "codecommit:GitPull"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:*",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/master"
                    ]
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "codecommit:GitPull"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:*",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/develop"
                    ]
                }
            }
        }
    ]
}

テスト実施/結果

テスト
本番環境サービス内のEC2インスタンスから本番環境サービス内のEC2インスタンス用のIAMロールにスイッチして、git cloneを実行する。

期待動作
masterブランチからはcloneできるが、developブランチからはcloneできない。

結果
どちらのブランチからもcloneできなかった。

$ git clone -b master https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/y-obayashi-test
Cloning into 'y-obayashi-test'...
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/y-obayashi-test/': The requested URL returned error: 403
$ git clone -b develop https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/y-obayashi-test                                              
Cloning into 'y-obayashi-test'...
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/y-obayashi-test/': The requested URL returned error: 403

開発環境サービス内のEC2インスタンスからもgit cloneを実行しましたが、ブランチごとの制御はうまくいきませんでした。

結論

サポートに問い合わせたところ、「アクション GitPull が条件キー codecommit:References に対応していないため、特定のブランチに対する制御ができない」との回答をいただきました。 そのため、CodeCommitリポジトリにアクセスできるIAMロールを作成して、CodeCommitリポジトリにアクセスするときはその都度IAMロールをスイッチして作業をすることにしました。 上記のIAMロールには、どのブランチでもgit pullを実行できる権限を付与しました。

さいごに

今回は、CodeCommitリポジトリのブランチごとにgit pullのアクセス制御をしようとして失敗した話を紹介しました。
AWSの学習は知識として覚えるだけではなく、実際に手を動かしてみることが大事だと思いました。

執筆者大林 優斗

クラウドエンジニア
AWSを活用したシステムの設計と開発をやらせていただいています。


執筆記事一覧:https://tech.nri-net.com/archive/author/y-obayashi