話題の記事

AWSアクセスキーをgitに誤って登録しないようにする

2014.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Gitはとても便利ですが、GitHub上で不適切に公開されている秘密鍵を使ってAWSに不正アクセスする事例が発生 というようにAWSアクセスキー、シークレットキーを誤って登録してしまうととても恐いことになります。利用者側で気をつけられるようにGitのフックをつくってみましたので報告します。

Git フックとは?

Gitにはフックというなにかの操作の前後にスクリプトを実行できるような仕組みがあります。これを使うことにします。コミットの前に気づければよいのでpre-commitを使うことにします。サンプルファイルが .git/hooks/pre-commit.sampleにありますが、今回はシンプルにしたいので、.git/hooks/pre-commitをスクラッチで作ります。

アクセスキー混入防止フック

とてもシンプルです。git diffをしてその中に KEYという行があり、さらにその中にAKIA(これはAWSアクセスキーの接頭語なのですが、ほんとうにAKIAしかないのか? という確証がないです)があればAWSアクセスキーと見なしてコミットを失敗させます。

#!/bin/sh
GREP_RESULT=`git diff --cached | grep KEY | grep AKIA` 
if [ -n "${GREP_RESULT}" ] then 
	echo 'AWS_ACCESS_KEY might be in this index. Please check with git diff --cached' 
	echo ${GREP_RESULT} 
	exit 1 
fi

このファイルをgitプロジェクトの.git/hooks/pre-commitとして保存して、実行権限をつけると動作します。

ためしてみる

pre-commitを設定した後、ファイルに擬似的にアクセスキーを設定します。

$ vi env.sh (アクセスキーをいれてみる)
$ git diff 
diff --git a/env.sh b/env.sh
index f082579..82ed527 100755
--- a/env.sh
+++ b/env.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 export AWS_DEFAULT_REGION=ap-northeast-1
-export AWS_ACCESS_KEY_ID=
+export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXX
 export AWS_SECRET_ACCESS_KEY=

さっそく実行してみましょう。

$ git add env.sh
$ git commit
AWS_ACCESS_KEY might be in this index. Please check with git diff --cached
+export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXX

いい感じでエラーがでましたね。コミットの編集画面になってしまう方は、pre-commitの置く場所(.git/hooks/pre-commit)や実行権限(u+x)を確認されるとよいかとおもいます。

まとめ

gitでAWSキー登録をはじくためのhookを紹介しました。もちろん、これで完璧ではないです。シェル変数経由での設定等されるとすりぬけます。ここは各組織の流儀があるとおもうのでチェックロジックを適宜かえてもらえればとおもいます。これで少しでも誤登録がへるとよいですね。

参考

特定のキーワードがdiffに含まれていたらcommitを失敗させるgit-hook