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
を使います。