githubにAWSアクセスキーをうっかり公開した(しかけた)場合への備えを用意する(Windows)

課題

Windows上でアクセスキーを使った作業をよく行っているのだが、GitHub上に作業内容を公開しているので、うっかりアクセスキーをアップしてしまわないとも限らない。

あってはならない事故ではあるが、やらかすときにはやらかすのが事故というものである。実際危険だし、精神衛生上もよくないため、フールプルーフを用意したい。

解決

以下の対応をとる。

  1. git-secretsを導入する
  2. アクセスキーを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みたいなコマンドで入れるようにしたいところ(希望)。

また、どういうわけか認証がVSCodeAWS Toolkitが動作しなくなった。うまく連携できないのかもしれない。デプロイはシェルスクリプトAWS CLIで行わざるを得ないかもしれない。

そもそも論

アクセスキーを使う運用自体があまりよくないので、なるべくRoleを使った運用にしたいわけだが、ローカル環境でAWSリソースを使ったテストやリソース構築をしたいとなるとどうしてもアクセスキーを用いざるを得ない。次善策としてこれらの対応はしておいたほうがいいと思う。

参考