🔑

機密情報の検知ツールの導入

2024/04/12に公開

目的

意図せずにgit上に機密情報をコミットしてしまうことを防ぎたい

ツールの候補

実現したいことと各ツールの対応状況

やりたいこと git-secrets Gitleaks Secretlint
コミット時にすべてのファイルをスキャンする機能 △(コミット対象のファイルのみ)
GitHub Actionsでプッシュ/プルリクエスト時にスキャンしてアラートする機能

コミット時にすべてのファイルをスキャンする機能だけでもほとんどカバーされると思っていますが、GitHub Actionsでプッシュ/プルリクエスト時にスキャンしてアラートする機能を追加することで、不意なコミット(GitHub上で直接書き換えるなど)にも対応できると判断し、この2つの機能が実現できるツールをSecretlintを採用しました

インストール

基本的には公式のインストールに従うのですが、公式ではgitの差分のみ検査する方法となっています

大規模開発の場合などは別途考慮する必要がありそうですが、基本的には何らかの方法でgit上に入ってくるとも限らないし、検査自体はさほど時間がかかるものでもないので、毎回全スキャンで良いかなという思いから、一部変更したインストールをします

手順

公式に従い、下記を行います

Dockerを使う場合

docker run -v pwd:pwd -w pwd --rm -it secretlint/secretlint secretlint "**/*"

Node.jsを使う場合

Node.js 18+ が必要

npm install secretlint @secretlint/secretlint-rule-preset-recommend --save-dev
npx secretlint --init
npx secretlint "**/*"

コミットをフックに起動させる設定

ここで公式と少し違うのですがBashスクリプトを使って下記のように設定します

Dockerを使う場合

#!/bin/sh
docker run -v `pwd`:`pwd` -w `pwd` --rm -it secretlint/secretlint secretlint "**/*"

RET=$?
if [ $RET -eq 0 ] ;then
    exit 0
else
    exit 1
fi

Node.jsを使う場合

#!/bin/sh
npx @secretlint/quick-start "**/*"

RET=$?
if [ $RET -eq 0 ] ;then
    exit 0
else
    exit 1
fi

個別にルールをインストールしている場合はスキャンのスクリプトを下記にします

npx secretlint "**/*"

実行結果

GitHub Actionsの登録

公式同様に.github/workflows/secretlint.ymlをリポジトリに置きます

name: Secretlint
on: [push, pull_request]
permissions:
  contents: read
jobs:
  test:
    name: "Secretlint"
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v3
      - name: setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install
        run: npm install
      - name: Lint with Secretlint
        run: npx secretlint "**/*"

実行結果

Discussion