AWS CodeCommit の接続元IPアドレス制限の設定メモ

# はじめに
AWS CodeCommit でソース管理をしている物があり、大規模なネットワーク変更で接続元IPアドレスで制限をかけていたものを修正したので、メモ書きです。

![CodeCommit_Torticegit.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/00679eca-708c-24f9-09dc-9b48f82adfef.png)

TortoiseGitで利用したいので、HTTPS認証に、接続元IPアドレス制限をかけて利用したいと思います。

# ポリシー（CodeCommitを使うための絞った許可ポリシー）

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:ListRepositories"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:BatchGet*",
                "codecommit:Get*",
                "codecommit:List*",
                "codecommit:Create*",
                "codecommit:DeleteBranch",
                "codecommit:Describe*",
                "codecommit:Put*",
                "codecommit:Post*",
                "codecommit:Merge*",
                "codecommit:Test*",
                "codecommit:Update*",
                "codecommit:GitPull",
                "codecommit:GitPush"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:XXXXXXXXXX:XXXXXXXXXXXXX"
        },
        {
            "Sid": "CloudWatchEventsCodeCommitRulesAccess",
            "Effect": "Allow",
            "Action": [
                "events:DeleteRule",
                "events:DescribeRule",
                "events:DisableRule",
                "events:EnableRule",
                "events:PutRule",
                "events:PutTargets",
                "events:RemoveTargets",
                "events:ListTargetsByRule"
            ],
            "Resource": "arn:aws:events:*:*:rule/codecommit*"
        },
        {
            "Sid": "SNSTopicAndSubscriptionAccess",
            "Effect": "Allow",
            "Action": [
                "sns:Subscribe",
                "sns:Unsubscribe"
            ],
            "Resource": "arn:aws:sns:*:*:codecommit*"
        },
        {
            "Sid": "SNSTopicAndSubscriptionReadAccess",
            "Effect": "Allow",
            "Action": [
                "sns:ListTopics",
                "sns:ListSubscriptionsByTopic",
                "sns:GetTopicAttributes"
            ],
            "Resource": "*"
        },
        {
            "Sid": "LambdaReadOnlyListAccess",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions"
            ],
            "Resource": "*"
        },
        {
            "Sid": "IAMReadOnlyListAccess",
            "Effect": "Allow",
            "Action": [
                "iam:ListUsers"
            ],
            "Resource": "*"
        },
        {
            "Sid": "IAMReadOnlyConsoleAccess",
            "Effect": "Allow",
            "Action": [
                "iam:ListAccessKeys",
                "iam:ListSSHPublicKeys",
                "iam:ListServiceSpecificCredentials",
                "iam:ListAccessKeys",
                "iam:GetSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "IAMUserSSHKeys",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSSHPublicKey",
                "iam:GetSSHPublicKey",
                "iam:ListSSHPublicKeys",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "IAMSelfManageServiceSpecificCredentials",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceSpecificCredential",
                "iam:UpdateServiceSpecificCredential",
                "iam:DeleteServiceSpecificCredential",
                "iam:ResetServiceSpecificCredential"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        }
    ]
}
```

# 接続元IPアドレス制限のポリシー

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "XXX.XXX.XXX.XXX/32",
                        "XXX.XXX.XXX.XXX/32"
                    ]
                },
                "Null": {
                    "kms:ViaService": "true"
                }
            }
        }
    ]
}
```

# ポイント
この２つのポリシーを付与することで接続元IPアドレス制限をかけることが出来ました。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip

2重否定なので、ちょっと分かりにくいですが、、、
+ 条件に該当する全ての操作は許可しない
+ + 指定したIPアドレスからの接続ではない場合
+ + かつ
+ + kms:ViaServiceを使用して、CMKを呼び出していないとき

に、アクセスが拒否されます。

# 「kms:ViaServiceを使用して、CMKを呼び出していない」って何？という話

![CodeCommit_イメージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/526c8a36-2119-2106-231c-1ea8bda67c98.png)

ということで、CodeCommit操作を実行しているんだけど、内部的に別のAWSサービスを呼ぶときにも接続元IPアドレスの制限がかかってしまうので、入口の操作だけ接続元IPアドレスで制限をかけるための、おまじないである。と理解しています。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/