だいち
2024.05.30
1340
こんにちは!だいちです。
最近はCI/CDパイプラインの構築をしています。
ソースコードにはたくさんの情報が詰まっていますが、つい機密情報をハードコーディングしてしまってしまうと、悪意ある目に晒される可能性もあります。安全にソースコードを運用し、セキュリティを確保することが大切です。
ということで、今の案件でのgitleaksの運用方法についてまとめます。
結論から言うと、git commit、git pushの2回のタイミングで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
今回は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
今回は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)
こちらは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.
こちらの内容は
というものです。
動作確認
次は機密情報がソースコードに無い状態で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コマンドが実行されていることが確認できました。
husky
というライブラリを使用することで、コミット時のハードコードを自動検出することができる。何事もダブルチェックが大事ですね。
11
原
2024.07.31
64
原
2024.07.31
1,081
タム
2024.04.15