いわさです。
CodeCommitにはいくつか認証方法のオプションがあり、SSHキーでアクセスすることが可能です。
IAMポリシーでMFAを強制する設定を行うことが多いと思いますが、このポリシーをAWSドキュメント記載のまま設定するとSSHキーでのgit操作が出来なくなります。
CodeCommitアクションをポリシーに例外登録することで操作が可能になります。
CodeCommitへSSHアクセス出来るよう構成する
CodeCommitにおける SSH接続のセットアップ手順は以下を参考に実施しました。
IAMからSSHパブリックキーをアップロードし、設定ファイルを作成します。
マネコンIAMからSSHキーIDを取得して、configファイルをローカルに作成します。
iwasa.takahito@hoge ~ % vi ~/.ssh/config
iwasa.takahito@hoge ~ % cat ~/.ssh/config
Host git-codecommit.*.amazonaws.com
User AAAAAAAAAAAAAAAAAAAA
IdentityFile ~/.ssh/codecommit_rsa
ここまでで、一旦SSHでのgit操作が出来る状態となりました。
iwasa.takahito@hoge src % git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_mfa
Cloning into 'repo_mfa'...
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 220 bytes | 110.00 KiB/s, done.
MFAポリシーを適用する
以下の手順に従い、MFAを強制するポリシーを適用します。
MFAを使って認証されてない場合、MFA登録操作など以外のアクションはすべて拒否されます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListActions",
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowIndividualUserToListOnlyTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:ListMFADevices"
],
"Resource": [
"arn:aws:iam::*:mfa/*",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowIndividualUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ListUsers",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
MFA割り当てをし、MFAでの認証を行います。
AWSマネージメントコンソールからCodeCommitへはアクセス出来る状態です。
ローカル端末からのgit操作が出来なくなりました。
iwasa.takahito@hoge repo_mfa % git pull
Access denied: User: arn:aws:iam::123456789012:user/commit-mfa is not authorized to perform: codecommit:GitPull on resource: arn:aws:codecommit:ap-northeast-1:123456789012:repo_mfa with an explicit deny
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
ポリシー修正
CodeCommit操作をMFA未認証時の例外アクションとして追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListActions",
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowIndividualUserToListOnlyTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:ListMFADevices"
],
"Resource": [
"arn:aws:iam::*:mfa/*",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowIndividualUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ListUsers",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"codecommit:*"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
git操作してみます。
iwasa.takahito@hoge repo_mfa % git pull
Access denied: User is not authorized for the KMS default master key for CodeCommit 'alias/aws/codecommit' in your account
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
CodeCommitアクション許可するだけでは操作出来ません。
CodeCommitレポジトリは、AWSマネージドCMKで暗号化されています。
"kms:ViaService" をポリシーに追加し、サービスのKMS操作は許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListActions",
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowIndividualUserToListOnlyTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:ListMFADevices"
],
"Resource": [
"arn:aws:iam::*:mfa/*",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowIndividualUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ListUsers",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"codecommit:*"
],
"Resource": "*",
"Condition": {
"Null": {
"kms:ViaService": "true"
},
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
git操作確認出来ました。
iwasa.takahito@hoge repo_mfa % git pull
Warning: Permanently added the RSA host key for IP address '1.2.3.4' to the list of known hosts.
Already up to date.
iwasa.takahito@hoge repo_mfa % git checkout -b hogehoge
Switched to a new branch 'hogehoge'
iwasa.takahito@hoge repo_mfa % git branch
* hogehoge
main
iwasa.takahito@hoge repo_mfa % vi hoge.txt
iwasa.takahito@hoge repo_mfa % git add .
iwasa.takahito@hoge repo_mfa % git commit -m "modify hogehoge"
[hogehoge d20d22c] modify hogehoge
1 file changed, 1 insertion(+), 1 deletion(-)
iwasa.takahito@hoge repo_mfa % git push --set-upstream origin hogehoge
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 257 bytes | 257.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_mfa
* [new branch] hogehoge -> hogehoge
Branch 'hogehoge' set up to track remote branch 'hogehoge' from 'origin'.
マネージドコンソールからリモートブランチの反映も確認出来ました。
さいごに
今回はSSHアクセスの設定からポリシーの変更、どういったエラーになるのかなどをご紹介しました。
MFAの拒否設定を緩和している形ですので、別の認証方法を採用する、git-remote-codecommitを導入するなどのそもそもの部分も検討しましょう。