機密情報の漏洩を防ごう!~gitleaksの運用方法~

だいち

2024.05.30

5

こんにちは!だいちです。

最近はCI/CDパイプラインの構築をしています。

ソースコードにはたくさんの情報が詰まっていますが、つい機密情報をハードコーディングしてしまってしまうと、悪意ある目に晒される可能性もあります。安全にソースコードを運用し、セキュリティを確保することが大切です。

ということで、今の案件でのgitleaksの運用方法についてまとめます。


結論から言うと、git commit、git pushの2回のタイミングでgitleaksによる機密情報漏れがないかのチェックを行っています。

この記事では、以下の項目の詳細について書いてあります。もし興味があれば続きも読んでみてください。

  • そもそもgitleaksって何ぞや
  • gitleaksのインストール手順
  • git commit時にハードコーディングがないかをチェックする方法
  • git push時にハードコーディングがないかをチェックする方法


そもそもgitleaksって何ぞや

Gitleaksは、機密情報をハードコードすることを防ぐ静的解析ツールです。

つまり、クレデンシャルなどの情報がソースコード上にあった場合、「そんな大切な情報載せてええんか!?」って叱ってくれます。

例えば、gitleaks detect -vとコマンドを打つと、検出された機密情報が表示されます。 以下は直打ちしたCognitoのClient IDが入っていた場合です。

 $ gitleaks detect -v

    ○
    │╲
    │ ○
    ○ ░
    ░    gitleaks

Finding:     clientId: 'XXXXXXXXXXXXXXXXXX',
Secret:      XXXXXXXXXXXXXXXXXX
RuleID:      generic-api-key
Entropy:     4.209867
File:        nuxt.config.ts
Line:        12
Commit:      e9d73...
Author:      daichiccchi
Email:       daichi.aoki@example.com
Date:        2024-05-07T06:21:24Z
Fingerprint: e9d73d2236826a222ef27386b9ce7aa2cd6a1821:nuxt.config.ts:generic-api-key:12

8:11AM INF scan completed in 541ms
8:11AM WRN leaks found: 1


gitleaksのインストール手順

今回はCloud9(Amazon Linux 2)にインストールしていきます。

# 1.ダウンロード
$ curl -OL  https://github.com/zricethezav/gitleaks/releases/download/v8.13.0/gitleaks_8.13.0_linux_x64.tar.gz

# 2.解凍
$ tar -zxvf gitleaks_8.13.0_linux_x64.tar.gz 
LICENSE
README.md
gitleaks
$ ls
gitleaks  gitleaks_8.13.0_linux_x64.tar.gz  LICENSE  README.md

# 3.実行権限付与
$ chmod +x gitleaks

# 4.パスの通っているディレクトリに移動
$ sudo mv gitleaks /usr/local/bin/

# 5.動作確認(バージョンが表示されればOK)
$ gitleaks version
8.13.0

git commit時にハードコーディングがないかをチェックする方法

今回はhuskyというライブラリを使用しました。

$ mkdir project-dir
$ cd project-dir
$ git init
$ npm init -y
# huskyをインストール
$ npx husky-init && npm install

ここまでコマンドを実行すると、project-dir直下に.husky/pre-commitファイルが作成されます。このファイルに記述したコマンドがgit commitの際に実行されます。

.husky/pre-commitファイルを下記のように修正して、コミット時に機密情報を検出するようにします。 (ちなみに--staged オプションでgit add 済みのファイルを検出の対象としています。)

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

gitleaks protect --staged // 追記


動作確認

試しに機密情報を載せた状態でコミットしてみます。

コミット時にgitleaksコマンドが実行されており、「そんな情報載せたコードのコミットなんて許しまへんで」と、しっかり怒られました。コミットもされていません。

$ git commit -m 'test'

    ○
    │╲
    │ ○
    ○ ░
    ░    gitleaks

Finding:     clientId: 'XXXXXXXXXXXXXXXXXX',
Secret:      XXXXXXXXXXXXXXXXXX
RuleID:      generic-api-key
Entropy:     4.209867
File:        nuxt.config.ts
Line:        12
Commit:      e9d73...
Author:      daichiccchi
Email:       daichi.aoki@example.com
Date:        2024-05-07T06:21:24Z
Fingerprint: e9d73d2236826a222ef27386b9ce7aa2cd6a1821:nuxt.config.ts:generic-api-key:12

8:11AM INF scan completed in 541ms
8:11AM WRN leaks found: 1
husky - pre-commit hook exited with code 1 (error)


git push時にハードコーディングがないかをチェックする方法

こちらはGithubActionsを使ってワークフローに組み込んでいきます。


ワークフローを記述するファイルを作成

.github/workflows/ci-gitleaks.ymlをリポジトリに置きます。

以下のようにファイルを編集します。

name: CI-gitleaks
on:
  push: // 1.
jobs:
  asciidoctor_job:
    runs-on: self-hosted
    name: Scan secrets using gitleaks
    steps:
    - name: Check out code
      uses: actions/checkout@v3   // 2.
    - name: gitleaks
      run: |
        gitleaks detect -v --redact  // 3.

こちらの内容は

  1. プッシュしたときに
  2. リポジトリを引っ張ってきて
  3. gitleaksコマンドで検出するよ

というものです。


動作確認

次は機密情報がソースコードに無い状態でgitleaksが動くことを確認します。

まずはコミット

$ git add .
$ git commit -m 'テスト'
    ○
    │╲
    │ ○
    ○ ░
    ░    gitleaks

8:32AM INF scan completed in 605ms
8:32AM INF no leaks found


次にプッシュします。

$ git push origin feature/gitleaks

無事にプッシュ後、GithubActionsのワークフロー上でgitleaksコマンドが実行されていることが確認できました。

まとめ

  • gitleaksとは、機密情報をハードコードすることを防ぐ静的解析ツールである。
  • huskyというライブラリを使用することで、コミット時のハードコードを自動検出することができる。
  • GithubActionsのワークフローに組み込むことで、プッシュ時のハードコードを自動検出することができる。


何事もダブルチェックが大事ですね。

この記事をシェアする