カピバラ好きなエンジニアブログ

ITのこととか趣味のカメラのことなどを赴くままに書いていきます。カピバラの可愛さこそ至高。

CodeCommitへのアクセスをIPで制限してみる

会社内からのみCodeCommitにアクセスさせたくないという場合、簡単なものとしてIPによる制限が考えられます。
そこで今回は前回のリポジトリタグに加えてIPによるアクセス制限を実施してみます。

↓前回記事↓
capybara-engineer.hatenablog.com

公式の以下のドキュメントにIPアドレスによる制限するJSON設定が書いてあるのでそれを参考にします。
docs.aws.amazon.com

ちなみにこれです

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "codecommit:BatchGetRepositories",
            "codecommit:CreateBranch",
            "codecommit:CreateRepository",
            "codecommit:Get*",
            "codecommit:GitPull",
            "codecommit:GitPush",
            "codecommit:List*",
            "codecommit:Put*",
            "codecommit:Post*",
            "codecommit:Merge*",
            "codecommit:TagResource",
            "codecommit:Test*",
            "codecommit:UntagResource",
            "codecommit:Update*"
         ],
         "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo",
         "Condition": {
            "IpAddress": {
               "aws:SourceIp": [
                  "XXX.XXX.XXX.XXX/16"
               ]
            }
         }
      }
   ]
}


実施作業

IAMポリシー作成

前回の記事で作成したIAMポリシーを元にIPの制限を加えていきます。

以下のDenyの部分が追加箇所です。
設定内容としては、特定のIP以外からのアクセスは全拒否し、特定のリソースタグを持つCodeCommitのリポジトリに対して特定のIPからのアクセス操作を許可する権限を与えています。
※"aws:SourceIp"には自分のPCからアクセスする際のグローバルIPを設定しました。
※CloudformationでIAMポリシー作成したら、Conditionが先頭に表示されて見づらくなってます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "codecommit:ListRepositories"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/TESTKEY": "A"
                }
            },
            "Action": [
                "codecommit:GitPull",
                "codecommit:GitPush"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:12345678912:TestRepoA",
            "Effect": "Allow"
        },
        {
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "XXX.XXX.XXX.XXX/32"
                    ]
                }
            },
            "Action": "*",
            "Resource": "*",
            "Effect": "Deny"
        }
    ]
}


許可端末からのgit clone実施

まずAWSのマネジメントコンソールから取得するリポジトリに指定のリソースタグが設定されているか確認します。
f:id:live-your-life-dd18:20200721143536p:plain

HTTPSのURLを取得します。

https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/TestRepoA


上記URLに対してgit cloneを実行すると、以下のように正常にリポジトリが取得できました。

PS C:\work\codecommit> git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/TestRepoA
Cloning into 'TestRepoA'...
warning: You appear to have cloned an empty repository.
PS C:\work\codecommit> ls


    Directory: C:\work\codecommit

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2020/07/21    14:38                TestRepoA

Gitは認証ヘルパーを使用して認証しています。

PS C:\work\codecommit> git config --list
credential.helper=!aws --profile test-codecommit codecommit credential-helper $@
credential.usehttppath=true


許可端末以外からのgit clone実施

許可されている端末以外からの実行を確認するために、サーバを1台作成します。
f:id:live-your-life-dd18:20200721144306p:plain

使用する認証情報は同じものを設定しています。

[root@ip-XX-XX-XX-XX work_codecommit]# git config --list
credential.helper=!aws --profile test-codecommit --region ap-northeast-1 codecommit credential-helper $@
credential.usehttppath=true

IP制限がかかっているため、別のIPを持つ端末からではgit cloneできませんでした。
f:id:live-your-life-dd18:20200721144628p:plain

感想及び所感

想定通りCodeCommitのリポジトリへアクセス制限をかけることができました。