ソースコードを外部公開する時はよくあります。これは特に隠すべきでないものであったり、Git を外部リポジトリとつないでいるから複数人で共用するためにとりあえずなどと理由は様々です。そういった外部公開する際、ソースコードに含めるべきでない情報があります。例えば AmazonWebService の秘密鍵、プログラムがどこかにアクセスするために使う平文パスワードなどです。そういったものを不意に外部公開してしまった場合、即刻削除すべきです(これが原因となって自分の GitHub のリポジトリを削除するはめになったことがあります)。もっとも、よりよいのはそもそも外部公開しないことです。外部公開を防ぐために使える便利ツールとして secretlint というものがあり、これを紹介します。
secretlint は次のリンク先で公開されています。
secretlint/secretlint: Pluggable linting tool to prevent committing credential.
secretlint – npm
使用感を試すには次のコマンドが使えます。このコマンドを実行すると npm で secretlint を動かす一通りがダウンロードされ、実行したディレクトリ以下を検索します。
npx @secretlint/quick-start "**/*"
もし問題が見つかると次の様なメッセージがでます。
> npx @secretlint/quick-start .env C:/xxxx/.env 84:32 error [IncomingWebhook] found Slack Incoming Webhook: https://hooks.slack.com/services/xxxx/xxxx/xxxxxxxx @secretlint/secretlint-rule-preset-recommend > @secretlint/secretlint-rule-slack ✖ 1 problem (1 error, 0 warnings)
この例では Slack(チャットツール)の Webhook に使うための特別 API の URL を検知しました。この様にファイルの中身を探索して問題があればエラーを表示して異常終了、なければ正常終了するツールです。
secretlint は Git のコミット直前に自動実行され、問題のあるファイルのコミットに防ぐことを使用用途として想定されています。例えば次リンクは husky というコミットをはじめとした Git の様々なイベントとスクリプトをつなぐ便利ツール、lint-staged という Git のステージング状態のファイルに lint をかけるためのツール、そして secretlint とを組み合わせる際の説明です。
secretlint/secretlint: Pluggable linting tool to prevent committing credential.#husky–lint-staged
自分の場合は simple-git-hooks と合わせて次の様に導入しました。
toplenboren/simple-git-hooks: A simple git hooks manager for small projects
# 次のコマンドで simple-git-hooks と lint-staged を導入 npm install simple-git-hooks lint-staged --save-dev # package.json に simple-git-hooks の設定を追加 { "scripts": { "pre-commit": "npx lint-staged" }, "simple-git-hooks": { "pre-commit": "npm run pre-commit"// コミット直前に直上で定義してある pre-commit を実行 }, } # 次コマンドで simple-git-hooks を .git 以下に適用して有効化 npx simple-git-hooks # secretlint 本体とお手軽なルールセットをインストール npm install --save-dev secretlint @secretlint/secretlint-rule-preset-recommend # package.json 中の lint-staged の設定に追記 { "scripts": { "pre-commit": "npx lint-staged" }, "simple-git-hooks": { "pre-commit": "npm run pre-commit"// コミット直前に直上で定義してある pre-commit を実行 }, // どのステージングされたファイル相手でも secretlint を実行する "lint-staged": { "*": [ "secretlint" ], "*.{js,ts,vue,jsx,tsx}": [// JavaScript ファイルには ESLint をかける "eslint --fix", "git add" ], }, "dependencies": {/* 省略 */}, "devDependencies": {/* 省略 */} } # secretlint設定ファイルである .secretlintrc.json を追加して完成 { "rules": [ { "id": "@secretlint/secretlint-rule-preset-recommend" } ] }
これでコミットした際にまずい文字列が入っていると secretlint がエラーを出力して、コミットせずに止まってくれます。