git-secretsを使ってAWSのアクセスキーをコミットできないようにする

みなさん、こんにちは。AWSのアクセスキー漏洩による不正使用で多額の請求を受けているまるりんです(ジョークです)。

AWSのアクセスキー(アクセスキーIDとシークレットアクセスキー)を含んだファイルをGitにコミットしないようにするにはどうすればよいでしょうか。 git-secretsというツールを用います。

macOSでは以下の手順で導入できます。

$ brew install git-secrets
$ cd /path/to/my/repo
$ git secrets --install
$ git secrets --register-aws

ちなみにgit secrets --register-aws --globalにすると~/.gitconfigに適用されて、グローバル設定されるのでお勧めです。

この状態でAWSのアクセスキーを含んだファイルをコミットするとどうなるでしょうか。 結果は以下のように弾かれます。

$ cat aws_access_keys.txt
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ git commit aws_access_keys.txt
/path/to/aws_access_keys.txt:1:aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
/path/to/aws_access_keys.txt:2:aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[ERROR] Matched one or more prohibited patterns
    :

ソースコードの場合はどうなのかGoのプログラムで確認してみました。

$ cat main.go
package main

func main() {
        id := "AKIAXXXXXXXXXXXXXXXX"
        awsSecretAccessKey := "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

        println(id)
        println(awsSecretAccessKey)
}
$ git commit main.go
/path/to/main.go:4: id := "AKIAXXXXXXXXXXXXXXXX"

[ERROR] Matched one or more prohibited patterns
    :

シークレットアクセスキーには反応しませんでした。どうやら:=演算子に対応してないようです。 =に変更すると以下のようになりました。

$ git commit main.go
/path/to/main.go:4: id := "AKIAXXXXXXXXXXXXXXXX"
/path/to/main.go:5: awsSecretAccessKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

[ERROR] Matched one or more prohibited patterns
    :

すべてをガードできるわけではなさそうですが、ほとんどの記述には対応できそうな感じです。 なお、アクセスキーを含めていても強制的にコミットしたい場合はgit commit --no-verifyを使います。