CodeCommitのリポジトリを特定のIPアドレスのみアクセス許可する方法

#はじめに
CodeCommitでgit管理する際、どのIPアドレスでもコミットできると、ユーザー名とパスワードが漏れた場合、リポジトリがアクセスされる可能性がありますので、特定のIPアドレスのみが使用できるようにIAMロールを設定します。


#CodeCommitのセットアップ
下記の記事を参考に、リポジトリをgit cloneできるところまで進めます。
一箇所変更点があり、IAMロールは、`AWSCodeCommitPowerUser`を使用しています。

[CodeCommitをHTTPSとパスワード認証で使いセットアップする](https://www.hacknotes.jp/blog/codecommit-guide/)

#IAMポリシーにIP制限をかける
IP制限をかける方法は、`AWSCodeCommitPowerUser`のポリシー内容をベースに、IP制限をかけたポリシーを新たに作成し、commitユーザーにアタッチするだけです。

新しくポリシーを作成します。
作成画面から、`管理ポリシーのインポート`をクリックし、`AWSCodeCommitPowerUser`管理ポリシーを`インポート`します。

![スクリーンショット 2021-10-23 18.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d6886a0a-c1a0-f42a-654a-197e8fd34539.png)
![スクリーンショット 2021-10-23 18.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/fa43d29d-458e-4510-234c-fba7d6828662.png)
CodeCommitの`リクエスト条件`をクリックすると、`送信元IP`欄がありますので、そこに記載したIPアドレスのみがgit管理できるようになります。
![スクリーンショット 2021-10-23 18.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/9b0efbcd-b8f1-260b-868f-2898fc01214d.png)
jsonタブに切り替えると、`"aws:SourceIp": "111.111.111.111/32"`と、IP制限できていることが分かりました。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "codecommit:ListRepositoriesForApprovalRuleTemplate",
                "codecommit:CreateApprovalRuleTemplate",
                "codecommit:UpdateApprovalRuleTemplateName",
                "codecommit:GetApprovalRuleTemplate",
                "codecommit:ListApprovalRuleTemplates",
                "codecommit:ListRepositories",
                "codecommit:UpdateApprovalRuleTemplateContent",
                "codecommit:UpdateApprovalRuleTemplateDescription"
            ],
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "111.111.111.111/32"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "codecommit:Merge*",
                "codecommit:Get*",
                "codecommit:TagResource",
                "codecommit:BatchAssociateApprovalRuleTemplateWithRepositories",
                "codecommit:BatchGet*",
                "codecommit:GitPull",
                "codecommit:UntagResource",
                "codecommit:BatchDisassociateApprovalRuleTemplateFromRepositories",
                "codecommit:Update*",
                "codecommit:OverridePullRequestApprovalRules",
                "codecommit:Post*",
                "codecommit:EvaluatePullRequestApprovalRules",
                "codecommit:Test*",
                "codecommit:Create*",
                "codecommit:List*",
                "codecommit:DisassociateApprovalRuleTemplateFromRepository",
                "codecommit:Describe*",
                "codecommit:Put*",
                "codecommit:GitPush",
                "codecommit:DeleteFile",
                "codecommit:BatchDescribe*",
                "codecommit:AssociateApprovalRuleTemplateWithRepository",
                "codecommit:DeleteBranch"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:161750041531:wordpress",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "111.111.111.111/32"
                }
            }
        },
        # 以下省略
```


##リソースを制限
ちなみにIAMポリシーに、`使用できるリポジトリを制限`するとよりセキュリティー面が保たれます。
`リソース`をクリックし、`ARNを追加`をクリックし、必要な情報を入力するだけです。
アクセスできるリポジトリは、`wordpress`とします。
![スクリーンショット 2021-10-23 19.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/e8cad795-1aff-e7e2-1f07-151b2646d5c9.png)
![スクリーンショット 2021-10-23 19.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f50f7bcf-3f97-3c51-fbf7-5145a09c71ec.png)
jsonの内容はこのようになりました。CodeCommitのアクション内容には一部、リソースが絞れないものもあるようですね。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "codecommit:ListRepositoriesForApprovalRuleTemplate",
                "codecommit:CreateApprovalRuleTemplate",
                "codecommit:UpdateApprovalRuleTemplateName",
                "codecommit:GetApprovalRuleTemplate",
                "codecommit:ListApprovalRuleTemplates",
                "codecommit:ListRepositories",
                "codecommit:UpdateApprovalRuleTemplateContent",
                "codecommit:UpdateApprovalRuleTemplateDescription"
            ],
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "111.111.111.111/32"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "codecommit:Merge*",
                "codecommit:Get*",
                "codecommit:TagResource",
                "codecommit:BatchAssociateApprovalRuleTemplateWithRepositories",
                "codecommit:BatchGet*",
                "codecommit:GitPull",
                "codecommit:UntagResource",
                "codecommit:BatchDisassociateApprovalRuleTemplateFromRepositories",
                "codecommit:Update*",
                "codecommit:OverridePullRequestApprovalRules",
                "codecommit:Post*",
                "codecommit:EvaluatePullRequestApprovalRules",
                "codecommit:Test*",
                "codecommit:Create*",
                "codecommit:List*",
                "codecommit:DisassociateApprovalRuleTemplateFromRepository",
                "codecommit:Describe*",
                "codecommit:Put*",
                "codecommit:GitPush",
                "codecommit:DeleteFile",
                "codecommit:BatchDescribe*",
                "codecommit:AssociateApprovalRuleTemplateWithRepository",
                "codecommit:DeleteBranch"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:xxxxxxxxx:wordpress",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "111.111.111.111/32"
                }
            }
        },
        # 以下省略
```
そして、IAMポリシーの作成をクリックします。

あとは、作成したポリシーをCodeCommitユーザーにアタッチするだけです。
これによって、作成したポリシーをアタッチしたCodeCommitユーザーは、IPアドレスが`111.111.111.111/32`だった場合に限り、リポジトリ名`wordpress`のみアクセスできる。
ということになります。

#参考
[CodeCommitへのアクセスをIPアドレスで制限](https://qiita.com/kazu00132/items/8c7ed1a5c357aab156ca)

[AWS AWS CodeCommitドキュメント](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/welcome.html)