認証情報の漏洩をシステム的に検知する gitleaks を試してみる。

こんにちは k-jun です。今回は git 管理下にある現在のコード、過去のコミット履歴などから包括的に認証情報が漏洩していないかを確認できるツール gitleaks を試してみようと思います。

https://github.com/zricethezav/gitleaks

基本的には gitactions で CI/CD としてセットすることが想定されているみたいですね。 一度 github にあげてしまうと手遅れ感はあるので、それよりは未然に防ぐために手元で git push のエイリアスに設定されていると良いかもしれませんね。

Install

$ brew install gitleak

brew で簡単にインストールできます。

Run

$ gitleaks
INFO[0000] opening .
INFO[0000] scan time: 35 milliseconds 632 microseconds
INFO[0000] No leaks found

適当に実行してみると何やらチェックらしきものが走っています。ではでは検証として適当にパスワードっぽいものを生成して .env なんかに貼り付けてみます。

$ echo "kJutbFnW52aB8C4Al1ph0LuMOvYIYzSP4GZfXXXXX" > .env

~/ghq/github.com/k-jun/playground-pulumi master*
$ gitleaks
INFO[0000] opening .
INFO[0000] scan time: 14 milliseconds 168 microseconds
INFO[0000] No leaks found

あれ...? なにも反応しない...??

$ echo AWS_ACCESS_KEY='XXXXXXbFnW52aB8C4Al1ph0LuMOvYIYzSP4GZfvksdnv/dsa' > .env

~/ghq/github.com/k-jun/playground-pulumi master*
$ gitleaks
INFO[0000] opening .
INFO[0000] scan time: 13 milliseconds 264 microseconds
INFO[0000] No leaks found

うーんこれでも反応しない...。リポジトリの url を直接指定できるようなのでそれで試してみる。

$ gitleaks --repo-url https://github.com/zricethezav/gronit -v
INFO[0000] cloning... https://github.com/zricethezav/gronit
Enumerating objects: 228, done.
Counting objects: 100% (78/78), done.
Compressing objects: 100% (51/51), done.
Total 228 (delta 34), reused 17 (delta 9), pack-reused 150
{
        "line": "const AWSKEY string = \"AKIAIO5FODNN7EXAMPLE\"",
        "lineNumber": 12,
        "offender": "AKIAIO5FODNN7EXAMPLE",
        "offenderEntropy": -1,
        "commit": "034344be2227771ae9f020358ad68230debfbb9d",
        "repo": "gronit",
        "repoURL": "https://github.com/zricethezav/gronit",
        "leakURL": "https://github.com/zricethezav/gronit/blob/034344be2227771ae9f020358ad68230debfbb9d/main.go#L12",
        "rule": "AWS Access Key",
        "commitMessage": "secret\n",
        "author": "Zach Rice",
        "email": "zricer@protonmail.com",
        "file": "main.go",
        "date": "2021-04-20T09:04:44-04:00",
        "tags": "key, AWS"
}

おおお!!! こんな感じに出るのね。リポジトリレベルで指定できるのはかなり有り難いですね。CI がどこで動くかを考えるまもなく、同じコマンドを実行しておけば良いので。 .git/hooks/pre-commit に書き込むとこのように、commit 前にチェックしてくれます。認証情報を万が一 commit した際に備えて設定しておくと良いかもしれませんね。

$ git commit -m 'feat(docs): update readme'
INFO[0000] opening ./
INFO[0000] scan time: 69 milliseconds 727 microseconds
INFO[0000] commits scanned: 62
WARN[0000] leaks found: 7

これでローカルの環境が少しだけ安全になりました。それでは今日はこのへんで...!