AWS CodeCommitの特定リポジトリだけ接続許可する環境を作る

こんにちは、ひろかずです。

研究の成果をGitで管理したいけど、外部リポジトリへの持ち出しが心配…
そんな、インターネットをやりながらインターネットを辞めたいという声が聞こえてきたので一筆書きます。

tl;dr的な何か

  • AWS CodeCommitのPrivate Linkにアクセスポリシーを設定するという話です
  • AWS CodeCommit初心者向けに簡単な設定手順を掲載しています
  • アクセスポリシーだけ見たい人は末尾[2. プライベートリンクを作成]へジャンプ

参考ドキュメント

ざっくり構成

工程

  1. 準備作業
    1-0. 作業環境の準備
    1-1. CodeCommitにリポジトリを作成
    1-2. CodeCommitを利用するIAMユーザーを作成
    1-3. SSH鍵ペアを作成し、公開鍵をIAMユーザーに登録
    1-4. 作業環境の.ssh/configに接続情報を登録
    1-5. 接続確認

  2. プライベートリンクを作成
    2-1. プライベートリンクを作成
    2-2. 動作確認

1. 準備作業

1-0. 作業環境の準備

パブリックサブネットに踏み台EC2を作成

  • 手順は省略します
  • Session Managerを利用することで踏み台EC2の作成を省略できます
  • Session Managerを利用する時は、ログ出力を設定することをお勧めします

プライベートサブネットに作業環境EC2を作成

  • 手順は省略します
  • 今回は以下AMI使用しました
  • amzn2-ami-hvm-2.0.20190313-x86_64-gp2 (ami-061392db613a6357b)
  • gitコマンドをインストール済みのAMIからインスタンスを起動してもいいでしょう

gitコマンドをインストール

  • このタイミングでパブリックサブネットにNAT Gatewayが必要です(ざっくり構成図では省略)
$ sudo yum install git

1-1. CodeCommitにリポジトリを作成

AWSコンソールのCodeCommit管理画面を開く

  • [Source – Repositories] > [Create repositoriy]を選択

リポジトリ名を設定して、[Create]を選択

Clone用のURLを取得

1-2. SSH鍵ペアを作成

踏み台EC2、またはSession Manager経由で作成したEC2にログインし、以下コマンドを打鍵

  • 今回は、Session Manager経由で接続しています
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ssm-user/.ssh/id_rsa): /home/ssm-user/.ssh/codecommit_rsa
Created directory '/home/ssm-user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ssm-user/.ssh/codecommit_rsa.
Your public key has been saved in /home/ssm-user/.ssh/codecommit_rsa.pub.
The key fingerprint is:
SHA256:8B0VvfBQLL4vfHHe23IYl5KI/jffsM6rW/iJG7XeDRE ssm-user@ip-172-18-2-141.us-west-2.compute.internal
The key's randomart image is:
+---[RSA 2048]----+
|            o=.  |
|           .+ o  |
|      .   .. =E. |
|       o . .. o. |
|        S o ..+ .|
|         . ..=o+o|
|        .  .o.*B.|
|         .  oX=*B|
|          ..*B@**|
+----[SHA256]-----+

公開鍵の内容を控える

$ cat ~/.ssh/codecommit_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPoUMePO62qtaryx9WpMsJL8rH1lzXB0YbfeshIUOLoda+HNAYidLX2ByVvbQsoV0IWGEyce59I4EdGlJuABc+YK4dctdEMkjS2eEs7bBYWQkWa+MmX5RnJpvnxD1A1WRn8nphPV3I5AlUJV0WBp+NK22B/OgqpDdCkPuhvfikRt+/8YBtLv9rfXPMywfMXk4Pz/ghXIdEKDV64oRdw4o3lhsedfF63JB4WJT4Is57ewFaqmkUMg3lnxBr8sm+prvZJpqVqWgCsI9tHNS3YrnOtLJcALzZWsjQZq9zebi64Qo3sh72PWzIJvNOaz6NfdrTep3SjD9da+JtChdUGyv5 ssm-user@ip-172-18-2-141.us-west-2.compute.internal

1-2. CodeCommitを利用するIAMユーザーを作成し、公開鍵を登録

CodeCommit利用者向けのIAMグループを作成し、CodeCommitを利用するIAMポリシーを付与

  • 詳細な手順は省略します
  • 今回は、[AWSCodeCommitFullAccess]を付与しました
  • 本番では、必要な権限に絞ることをお勧めします

IAMユーザーを作成

  • 便宜上、Programmatic Accessを選択していますが、CodeCommitでGit操作を行う上ではアクセスキー情報は不要です

[Update SSH publick key]を選択して、控えた公開鍵の内容を登録

  • SSH key IDを控えておきます

1-4. 作業環境の.ssh/configに接続情報を登録

.ssh/configに以下情報を登録

  • <your ssh key id> の内容は、控えておいた値を設定してください
$ vi ~/.ssh/config

Host git-codecommit.*.amazonaws.com
  User <your ssh key id>
  IdentityFile ~/.ssh/codecommit_rsa

$ chmod 600 ~/.ssh/config

2. プライベートリンクを作成

2-1. プライベートリンクを作成

AWSコンソールからVPC管理画面を開いて、ナビゲーションペインの[Endpoints] > [Create Endpoint]を選択

  • 画面遷移は省略
  • Service catecoryは、[AWS services]を選択
  • Service Nameは、[com.amazonaws.us-west-2.git-codecommit]を選択

作業環境EC2を作成したVPCサブネットを選択

  • VPC内に外部から参照されるDNSサーバ(Active Directoryなど)がなければ、[Enable for this endpoint]を選択

Security Groupを設定

  • Security Group作成の詳細な手順は省略
  • Security Groupは、作業環境EC2からの通信のみを許可する設定を検討してください

Policyにて、[Custom]を選択し、アクセスポリシーを登録

  • Resource arnは適宜置き換えてください
  • arnの命名規則は、以下を参照
  • arn:aws:codecommit:<region>:<your aws account id>:<your repository name>
  • リポジトリ名まで宣言しているので、登録外のリポジトリへのアクセスはできません
{
    "Statement": [
        {
            "Action": "*",
            "Effect": "Allow",
            "Resource": "arn:aws:codecommit:us-west-2:123456789012:dev-hirokazu",
            "Principal": "*"
        }
    ]
}

2-2. 動作確認

git-codecommitエンドポイントへの疎通確認

  • 応答がない場合は、Security Groupの設定を見直してください
  • エラーが帰ってくる場合は、gitにおけるSSH接続性の問題の可能性があります。IAMユーザーへの公開鍵の登録状況や.ssh/configの設定状況を見直してください
$ ssh git-codecommit.us-west-2.amazonaws.com
The authenticity of host 'git-codecommit.us-west-2.amazonaws.com (52.119.161.60)' can't be established.
RSA key fingerprint is SHA256:0pJx9SQpkbPUAHwy58UVIq0IHcyo1fwCpOOuVgcAWPo.
RSA key fingerprint is MD5:a8:68:53:e3:99:ac:6e:d7:04:7e:f7:92:95:77:a9:77.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'git-codecommit.us-west-2.amazonaws.com,52.119.161.60' (RSA) to the list of known hosts.
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.us-west-2.amazonaws.com closed by remote host.
Connection to git-codecommit.us-west-2.amazonaws.com closed.

許可リポジトリへの接続確認

$ git clone ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/dev-hirokazu
Cloning into 'dev-hirokazu'...
Warning: Permanently added the RSA host key for IP address '52.119.168.71' to the list of known hosts.
warning: You appear to have cloned an empty repository.

$ ls -l
total 0
drwxr-xr-x 3 ssm-user ssm-user 18 May  1 06:59 dev-hirokazu

許可外リポジトリへの接続不可確認

$ git clone ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/another-repo
Cloning into 'another-repo'...
Access denied: User: arn:aws:iam::123456789012:user/hirokazu-code is not authorized to perform: codecommit:GitPull on resource: arn:aws:codecommit:us-west-2:123456789012:another-repo
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

許可リポジトリのみ接続できることを確認できました。

今日はここまでです。
お疲れ様でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です