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

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

リポジトリタグでCodeCommitのリポジトリへのアクセスを制御してみた

AWSでコード管理をするとなると真っ先に出てくるのはCodeCommitですが、複数のリポジトリを管理しているときに一部ユーザには別のリポジトリを参照させたくない、という場面もあるかと思います。

今回はCodeCommitのリポジトリタグを使用して、アクセス先のリポジトリを制御してみます。

実施作業

リポジトリ作成

まずは別々の値を設定したTESTKEYタグを持つ2つのリポジトリを作成します。
以下のtest-a-repoとtest-b-repoはそれぞれTESTKEYタグを持っており、AとBという異なる値が設定されています。
f:id:live-your-life-dd18:20200702162555p:plain
f:id:live-your-life-dd18:20200702162610p:plain

IAMポリシー作成

次にIAMグループに設定するIAMポリシーを作成していきます。
actionにはcodecommitに対してすべての権限を許可するように設定します。
ただし、ConditionでリソースタグTESTKEYがAを持つリソースにしか操作できないように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "codecommit:*",
            "Resource": "arn:aws:codecommit:ap-northeast-1:12345678912:*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/TESTKEY": "A"
                }
            }
        }
    ]
}

IAMグループ作成

先ほど作成したIAMポリシーを新しく作成したIAMグループにアタッチします。
f:id:live-your-life-dd18:20200702163624p:plain

IAMユーザ作成

IAMグループまでできたら実際にCodeCommitの操作を行うIAMユーザを作成します。

今回はIAMユーザにはコンソールへのアクセスは不要なので、プログラムによるアクセスに限定します。
f:id:live-your-life-dd18:20200702163827p:plain

アクセス許可の設定では、作成したIAMグループにチェックを入れます
f:id:live-your-life-dd18:20200702164015p:plain

IAMユーザにはタグは設定しないので、そのまま作成します。
※アクセスキーとシークレットキーをメモするのを忘れないようにしてください。
f:id:live-your-life-dd18:20200702164146p:plain

開発端末でのCodeCommitへの接続設定

IAMユーザまで設定出来たら開発端末で設定をしていきます。
gitを使って開発するような方だとMacとかLinux使ってそうな気がしますが、今回は敢えてWindowsでの設定を実施していきます。

CodeCommitへのアクセス方法としてSSH認証かHTTPS認証の2通りありますが、SSH認証だとSSHパブリックキーのアップロードが必要、HTTPS認証だとIAMユーザごとに認証情報を生成が必要、といったように少し手間がかかります。

git-remote-codecommitを使えばIAMユーザのアクセスキーとシークレットキーがあればCodeCommitへアクセスができるようになりますが、前提条件としてPython、pip、Gitのインストールが必須なので設定に少し手間がかかります。
michimani.net

そこで今回はGitとAWS CLIの認証情報ヘルパーを使用してCodeCommitへアクセスするように設定していきます。
nopipi.hatenablog.com

AWS CLIのインストール

最初に設定に必要なAWS CLIを以下の手順に従ってインストールします。
docs.aws.amazon.com

ダウンロードしたMSIインストーラを実行してAWS CLIをインストールします。
※画面に従って進めればインストールできるので割愛ます。
f:id:live-your-life-dd18:20200702213224p:plain

インストールできたらコマンドプロンプトPowerShellを起動して、以下のコマンドを実行してhelpが表示されることを確認します。

# aws

f:id:live-your-life-dd18:20200702213518p:plain

インストールができたら以下のコマンドを実行して、作成したIAMユーザのアクセスキー、シークレットキー、リージョン、アウトプットフォーマットをAWS CLIの認証情報を設定します

# aws configure --profile test-codecommit
AWS Access Key ID [None]: ABCDEFGHIJKLMNOPQRSTUVWXYZ
AWS Secret Access Key [None]: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Default region name [None]: ap-northeast-1
Default output format [None]: json


Gitのインストール

AWS CLI設定ができたら、次はCodeCommitへのアクセスに必須なGitを以下からダウンロードしてインストールしていきます。
git-scm.com

インストールできたらコマンドプロンプトPowerShellを起動してgitコマンドを実行し、helpが表示されることを確認します。
f:id:live-your-life-dd18:20200702215808p:plain

git設定

コンソールで以下のコマンドを実行し、gitの設定をします。

# git config --global user.email "xxxx.xxxx@gmail.com"
# git config --global user.name "xxxx.xxxx"
# git config --global push.default simple
# git config --global -l

次に以下のコマンドを実行してgit認証ヘルパーが設定できたらCodeCommitへの接続設定は完了です。
にはAWS CLIの設定をしたときに指定したprofile名を入れます

git config --global credential.helper '!aws --profile <profile name> codecommit credential-helper $@'
git config --global credential.UseHttpPath true


CodeCommitからのgit clone

ここまで設定出来たらCodeCommit上のリポジトリからgit cloneでファイルを取得するのですが、取得したことがわかりやすいようにテストファイルを作成しておきます。
f:id:live-your-life-dd18:20200702221543p:plain

ファイルが作成できたら、git cloneする用のURLを取得します。
今回はHTTPSのクローンを選択します。
f:id:live-your-life-dd18:20200702221751p:plain

クローンしたURLをコンソールで実行したら、対象のリポジトリが取得され...

# git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-a-repo

あれ?何故か認証ポップアップが出てきてますね。
f:id:live-your-life-dd18:20200702224408p:plain

以下の手順を見ると、Gitインストール時にGit 認証情報マネージャーユーティリティをインストールしていると、AWS CLIの認証情報を確認しにいかずにうまくいかないことがあるそうです。
docs.aws.amazon.com

CodeCommitからのgit clone(2回目)

一度Gitをアンインストールして、インストール時に以下のチェックを外してGitを再インストールします。
f:id:live-your-life-dd18:20200702224833p:plain

Git初期設定をもう一度行って、再度git cloneコマンドを実行します。
何故かもう一度認証情報を聞かれましたが、キャンセルしたらその後にgit cloneが実行されました。
f:id:live-your-life-dd18:20200702230306p:plain

問題なく指定したリポジトリのソースを取得することができているようです。

PS C:\work\test-repo-a> ls

    ディレクトリ: C:\work\test-repo-a
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/07/02     13:58                test-a-repo

※ちなみに認証情報を聞かれた件は、以下の設定を実施したら解消しました。
qiita.com

※既に認証情報を保存してしまった人は以下から対象の認証情報を削除してから再度git cloneを実行してください
 コントロールパネル>すべてのコントロール パネル項目>資格情報マネージャー>Windows資格情報

権限のないリポジトリへのアクセス許可設定

作成したIAMユーザが権限的にアクセスできないリポジトリをクローンしようとした場合、403エラーで失敗します。

PS C:\work\test-repo-b> git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-b-repo
Cloning into 'test-b-repo'...
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-b-repo/': The requested URL returned error: 403

そのもう一つのリポジトリにアクセスするためのIAMポリシーを作成します。
f:id:live-your-life-dd18:20200702231822p:plain

作成したIAMポリシーをIAMグループにアタッチし、今回作成・設定していたIAMユーザを追加します。
※追加してから反映されるまで若干のラグがあります。
f:id:live-your-life-dd18:20200702231913p:plain

再度git cloneすると、先ほどクローン出来なかったリポジトリのソースが取得されました。
f:id:live-your-life-dd18:20200702232140p:plain

これでアクセスさせたいリポジトリの権限を付けたIAMグループに、指定のIAMユーザを追加するだけでアクセス先を制御できるようになりました。

感想及び所感

今回はActionにCodeCommitを設定していましたが、同じ設定は他のサービスでも利用できると思うので、応用の幅は広そうです。