こんにちは、シマです。
セキュリティ要件等でインターネットからAWSサービスへの通信は許可できず、オンプレからの通信のみを許可したいケースがあると思います。今回はCodeCommitへGitオペレーションのアクセスを対象として、オンプレから通信のみを許可する(インターネットからの通信を拒否する)構成を試してみました。
構成
実際にオンプレとの接続環境を用意することが難しかったため、今回は疑似オンプレVPCを作成し、そこからの接続として構成しています。
エンドポイント経由でCodeCommitへアクセスすることで、内部からアクセス可能にしています。CodeCommitエンドポイントを配置するVPCとオンプレ相当VPCはTransitGatewayで接続しています。また、オンプレ相当VPCからCodeCommitエンドポイントの名前解決のために、CodeCommitエンドポイントを配置するVPCにRoute53リゾルバー(インバウンドエンドポイント)を構築し、オンプレ相当VPCはDNS(WindowsServer)を用意しています。オンプレ相当VPCにあるEC2(Client)はDNS(WindowsServer)で名前解決するように設定しています。
必要な設定
既にオンプレとAWSは何らかで接続されていてすでに利用していることを前提として、必要な設定を
1. Gitオペレーション用CodeCommitエンドポイント
CodeCommitエンドポイントを配置するVPCにGitオペレーション用CodeCommitエンドポイントを作成します。
AWSドキュメント記載の通りGitオペレーションのためには、「com.amazonaws.region.git-codecommit」が必要です。
アタッチするセキュリティグループは、インバウンドルールでオンプレのCIDRに対してHTTPSの許可設定をします。
2. Route53リゾルバー
CodeCommitエンドポイントを配置するVPCにRoute53リゾルバー(インバウンドエンドポイント)の設定をします。セキュリティグループはAWS公式ドキュメントの通りに設定しています。
3. オンプレDNSに条件付きフォワーダーの追加
オンプレDNSでCodeCommitの名前解決時にエンドポイントのIPになるようにフォワーダーの設定をします。今回は東京リージョンでの利用なので、「git-codecommit.ap-northeast-1.amazonaws.com」を条件として条件付きフォワーダーを設定します。
転送先IPアドレスはRoute53リゾルバー(インバウンドエンドポイント)画面で表示されているIPアドレスを指定します。
これにより、EC2(Client)からの名前解決結果が以下のようにパブリックIPからローカルIPへ変化します。
before
$ nslookup git-codecommit.ap-northeast-1.amazonaws.com
Server: 10.1.0.44
Address: 10.1.0.44#53
Non-authoritative answer:
Name: git-codecommit.ap-northeast-1.amazonaws.com
Address: 54.240.xxx.xxx
after
$ nslookup git-codecommit.ap-northeast-1.amazonaws.com
Server: 10.1.0.44
Address: 10.1.0.44#53
Non-authoritative answer:
Name: git-codecommit.ap-northeast-1.amazonaws.com
Address: 10.0.0.46
Name: git-codecommit.ap-northeast-1.amazonaws.com
Address: 10.0.0.62
4. IAMユーザのポリシー
これまでの設定でエンドポイント経由でアクセスが可能になりました。しかし、このままではインターネットからのアクセスも許可されたままです。CodeCommitの認証にはIAMユーザの「AWS CodeCommit の HTTPS Git 認証情報」を利用しますので、対象ユーザのポリシー設定において、特定のCodeCommitEndpointからのアクセスのみ許可するように指定します。今回は検証なので、許可ポリシーはマネージドポリシーの「AWSCodeCommitFullAccess」を利用し、拒否ポリシーを以下のように作成してアタッチしています。
CodeCommitDenyPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"codecommit:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-xxxxxx"
}
}
}
]
}
上記設定反映後に、インターネット経由でgit cloneを実行してみた結果が以下のようになっており、期待通りにアクセス拒否できていることが確認できました。
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/TestRepository
Cloning into 'TestRepository'...
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/TestRepository/': The requested URL returned error: 403
最後に
今回、疑似オンプレからgitさせる環境を作ってみました。やはり、実際にやってみると理解が捗ると感じました。本記事の根幹と関係ないため割愛してしまいましたが、この構成を作成するにあたって初めてCDK(Typscript)を利用して作ってみたりしたところが、実は一番苦労したところだったりしました。
本記事がどなたかのお役に立てれば幸いです。