課題
Windows上でアクセスキーを使った作業をよく行っているのだが、GitHub上に作業内容を公開しているので、うっかりアクセスキーをアップしてしまわないとも限らない。
あってはならない事故ではあるが、やらかすときにはやらかすのが事故というものである。実際危険だし、精神衛生上もよくないため、フールプルーフを用意したい。
解決
以下の対応をとる。
- git-secretsを導入する
- アクセスキーをMFA認証必須にする
git-secrets インストールとリポジトリへの設定
以下の手順でgit-secretsをインストールした。
cd C:\MyFile
git clone git@github.com:awslabs/git-secrets.git
cd .\git-secrets\
.\install.ps1
次のファイルが表示されたため、インストールは成功していると確認。
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2022/10/12 20:29 12946 git-secrets
-a--- 2022/10/12 20:29 21381 git-secrets.1
今度はリポジトリのほうに移動し、アクセスキーらしき文字列があったらひっかかるようにする。
cd C:\MyFile\GitHub\tech-know-how
git secrets --install
git secrets --register-aws
git secrets --list
git config --local --list
で確認すれば表示されるはず。
PS C:\MyFile\GitHub\tech-know-how> git config --local --list
(略)
secrets.providers=git secrets --aws-provider
secrets.patterns=(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
secrets.patterns=("|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)("|')?\s*(:|=>|=)\s*("|')?[A-Za-z0-9/\+=]{40}("|')?
secrets.patterns=("|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?("|')?\s*(:|=>|=)\s*("|')?[0-9]{4}\-?[0-9]{4}\-?[0-9]{4}("|')?
secrets.allowed=AKIAIOSFODNN7EXAMPLE
secrets.allowed=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
テスト用のリポジトリでちゃんと除外されるか試してみた。コミット時にこのようなメッセージが出て、ちゃんと除外された。問題なさそうである。
[ERROR] Matched one or more prohibited patterns
Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
しかし、自分の場合はブログによく設定をアップしている。こちらはgitが関係しないので、これだけではフールプルーフが中途半端なのである。というわけでMFAのほうの対応も行う。
CLIもMFA必須に
AWS CLIもMFA必須にする方法だが、MFAを設定した後で IAMユーザーに次のようなポリシーをアタッチするだけ。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "MfaConstraint",
"Effect": "Deny",
"Action": [
"*"
],
"Resource": [
"*"
],
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": false
}
}
}
]
}
もともとマネジメントコンソールにログインする際はMFAを必須にしたユーザーを使っていたため、CLIのほうを対応させるだけでよかった。もしやっていなければMFA対応から実行する必要がある。
マネジメントコンソールからチェックボックス一つで対応、とは行かないのが残念な点だが、ともあれこれでMFAなしのアクセスを制限できる。
PS C:\Users\zento> aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
そしてMFAをCLI利用時に有効化する方法だが、まず古い環境変数を消し
set AWS_ACCESS_KEY_ID=
set AWS_SECRET_ACCESS_KEY=
set AWS_SESSION_TOKEN=
その上で下記のようにする。
aws sts get-session-token --serial-number [MFAデバイスのARN] --token-code [MFA TOKEN]
MFAデバイスのARNは、マネジメントコンソールのIAMユーザーの認証情報のMFA デバイスの割り当てのところにあるARNがそれ。MFA TOKENはそのままMFAのトークンで、6桁の数字のあれである。
例えばこのようなコマンドになる。
aws sts get-session-token --serial-number arn:aws:iam::XXXXXXXXXX:mfa/local-user --token-code 129113
これで下記のようなレスポンスが返るので――git-secretのチェックにひっかかったため一部の文字を全角にしているコミットに――
{
"Credentials": {
"AccessKeyId": "XXXXXXXXXXXXXXXXXXXX",
"secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"sessionToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(長い!)",
"Expiration": "2022-10-13T00:01:14+00:00"
}
}
DOS窓で、PowerShellではなく、DOS窓で、下記のようにセットする。PowerShellでSETコマンドは使わせてくれないからだ。
set AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
set AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
set AWS_SESSION_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
これで無事利用できるようになる。
> aws s3 ls
2020-06-19 04:16:07 cf-templates-xxxxxxxx-ap-northeast-1
とはいえ毎回こんなことをしていたら大変だし、たまにしかやらないと手順を忘れるし、いずれBATファイルなりシェルスクリプトなりにまとめてaws.bat 222224
みたいなコマンドで入れるようにしたいところ(希望)。
また、どういうわけか認証がVSCodeのAWS Toolkitが動作しなくなった。うまく連携できないのかもしれない。デプロイはシェルスクリプト+AWS CLIで行わざるを得ないかもしれない。
そもそも論
アクセスキーを使う運用自体があまりよくないので、なるべくRoleを使った運用にしたいわけだが、ローカル環境でAWSリソースを使ったテストやリソース構築をしたいとなるとどうしてもアクセスキーを用いざるを得ない。次善策としてこれらの対応はしておいたほうがいいと思う。