keygate 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. keygate-0.1.0/CHANGELOG.md +18 -0
  2. keygate-0.1.0/LICENSE +21 -0
  3. keygate-0.1.0/MANIFEST.in +8 -0
  4. keygate-0.1.0/PKG-INFO +254 -0
  5. keygate-0.1.0/README.md +225 -0
  6. keygate-0.1.0/pyproject.toml +48 -0
  7. keygate-0.1.0/setup.cfg +4 -0
  8. keygate-0.1.0/src/keygate/__init__.py +0 -0
  9. keygate-0.1.0/src/keygate/cli.py +135 -0
  10. keygate-0.1.0/src/keygate/config.py +40 -0
  11. keygate-0.1.0/src/keygate/diff/__init__.py +0 -0
  12. keygate-0.1.0/src/keygate/diff/parser.py +64 -0
  13. keygate-0.1.0/src/keygate/hook/__init__.py +0 -0
  14. keygate-0.1.0/src/keygate/hook/installer.py +44 -0
  15. keygate-0.1.0/src/keygate/models.py +42 -0
  16. keygate-0.1.0/src/keygate/policy/__init__.py +0 -0
  17. keygate-0.1.0/src/keygate/policy/allowlist.py +15 -0
  18. keygate-0.1.0/src/keygate/policy/baseline.py +55 -0
  19. keygate-0.1.0/src/keygate/policy/inline.py +22 -0
  20. keygate-0.1.0/src/keygate/scanner/__init__.py +0 -0
  21. keygate-0.1.0/src/keygate/scanner/context.py +82 -0
  22. keygate-0.1.0/src/keygate/scanner/entropy.py +24 -0
  23. keygate-0.1.0/src/keygate/scanner/rules.py +195 -0
  24. keygate-0.1.0/src/keygate/scanner/scoring.py +98 -0
  25. keygate-0.1.0/src/keygate.egg-info/PKG-INFO +254 -0
  26. keygate-0.1.0/src/keygate.egg-info/SOURCES.txt +43 -0
  27. keygate-0.1.0/src/keygate.egg-info/dependency_links.txt +1 -0
  28. keygate-0.1.0/src/keygate.egg-info/entry_points.txt +2 -0
  29. keygate-0.1.0/src/keygate.egg-info/requires.txt +5 -0
  30. keygate-0.1.0/src/keygate.egg-info/top_level.txt +1 -0
  31. keygate-0.1.0/tests/__init__.py +0 -0
  32. keygate-0.1.0/tests/conftest.py +9 -0
  33. keygate-0.1.0/tests/test_diff/__init__.py +0 -0
  34. keygate-0.1.0/tests/test_diff/test_parser.py +75 -0
  35. keygate-0.1.0/tests/test_hook/__init__.py +0 -0
  36. keygate-0.1.0/tests/test_hook/test_installer.py +32 -0
  37. keygate-0.1.0/tests/test_policy/__init__.py +0 -0
  38. keygate-0.1.0/tests/test_policy/test_allowlist.py +32 -0
  39. keygate-0.1.0/tests/test_policy/test_baseline.py +81 -0
  40. keygate-0.1.0/tests/test_policy/test_inline.py +34 -0
  41. keygate-0.1.0/tests/test_scanner/__init__.py +0 -0
  42. keygate-0.1.0/tests/test_scanner/test_context.py +173 -0
  43. keygate-0.1.0/tests/test_scanner/test_entropy.py +28 -0
  44. keygate-0.1.0/tests/test_scanner/test_rules.py +145 -0
  45. keygate-0.1.0/tests/test_scanner/test_scoring.py +158 -0
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.1.0] - 2026-04-22
6
+
7
+ Initial public release on PyPI.
8
+
9
+ ### Features
10
+
11
+ - Pre-commit hook for detecting secrets in staged diff
12
+ - Rule-based detection for AWS / OpenAI / GitHub / Slack / Stripe / SendGrid / JWT / PEM / URL credentials
13
+ - Entropy-based detection (Shannon entropy) for high-entropy strings
14
+ - Context-based scoring with keyword tiers (HIGH/MID), assignment detection, and sensitive path recognition
15
+ - Combo bonus scoring for multi-signal detection
16
+ - Rule policy classification (`must_block` / `public_exposable`)
17
+ - Exception handling: inline ignore (with required reason), path/pattern allowlist, baseline fingerprinting
18
+ - Commands: `keygate scan`, `keygate install-hook`, `keygate baseline create|update`
keygate-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yuichi Kaneko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,8 @@
1
+ include README.md
2
+ include LICENSE
3
+ include CHANGELOG.md
4
+ include pyproject.toml
5
+ recursive-include src *.py
6
+ recursive-include tests *.py
7
+ global-exclude __pycache__
8
+ global-exclude *.py[cod]
keygate-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,254 @@
1
+ Metadata-Version: 2.4
2
+ Name: keygate
3
+ Version: 0.1.0
4
+ Summary: Git pre-commit hook for preventing accidental secret commits
5
+ Author: Yuichi Kaneko
6
+ License: MIT
7
+ Keywords: git,pre-commit,secrets,security,scanner,hook,devtools
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: POSIX :: Linux
13
+ Classifier: Operating System :: MacOS
14
+ Classifier: Operating System :: Microsoft :: Windows
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Security
20
+ Classifier: Topic :: Software Development :: Version Control :: Git
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: click>=8.1
25
+ Provides-Extra: dev
26
+ Requires-Dist: pytest>=7.4; extra == "dev"
27
+ Requires-Dist: pytest-cov>=4.1; extra == "dev"
28
+ Dynamic: license-file
29
+
30
+ # keygate
31
+
32
+ **APIキーやパスワードを誤って Git にコミットしてしまう事故を防ぐツール**です。
33
+
34
+ ---
35
+
36
+ ## なぜ必要なのか
37
+
38
+ 開発中、コードに API キーやパスワードを直接書いてしまうことがあります。それをそのまま `git commit` すると、リポジトリの履歴に永久に残ってしまいます。
39
+
40
+ たとえ後で削除しても、過去のコミットからは取り出せるため、GitHub などに公開されるとすぐに悪用されます。AWS のキーが漏れて高額請求された事例も多くあります。
41
+
42
+ `keygate` は **コミット直前に自動でチェック** し、危険なものが含まれていれば止めてくれます。
43
+
44
+ ---
45
+
46
+ ## 検知できるもの
47
+
48
+ - AWS アクセスキー
49
+ - OpenAI API キー
50
+ - GitHub トークン
51
+ - Slack トークン
52
+ - 秘密鍵(PEM 形式)
53
+ - JWT トークン
54
+ - ランダムに見える長い文字列(高エントロピー検知)
55
+ - `api_key`, `password`, `secret` などの変数名 + 値
56
+
57
+ ---
58
+
59
+ ## はじめかた
60
+
61
+ ### ステップ1: インストール
62
+
63
+ `keygate` は Python 製のコマンドラインツールです。`pipx` というツールでインストールするのが一番簡単です。
64
+
65
+ ```bash
66
+ pipx install keygate
67
+ ```
68
+
69
+ > `pipx` がない場合は `pip install pipx` でインストールできます。
70
+ > `pipx` を使うと、どのプロジェクトのフォルダからでも `keygate` コマンドが使えるようになります。
71
+
72
+ ### ステップ2: フックを有効化する
73
+
74
+ 「フック」とは、Git が特定のタイミングで自動的に実行してくれる仕組みのことです。`keygate install-hook` を実行すると、`git commit` のたびに `keygate` が自動で動くようになります。
75
+
76
+ ```bash
77
+ cd path/to/your-project # 自分のプロジェクトに移動
78
+ keygate install-hook
79
+ ```
80
+
81
+ これで準備完了です。
82
+
83
+ ### ステップ3: 実際に使ってみる
84
+
85
+ 普段通り `git add` と `git commit` をするだけです。危険なものが含まれていなければ、何も起きません。
86
+
87
+ 危険なものが含まれていると、こんなふうにコミットが止まります:
88
+
89
+ ```
90
+ [BLOCK] High confidence secret detected
91
+
92
+ File: config.py:12
93
+ Rule: aws-access-key
94
+ Score: 100
95
+
96
+ Reason:
97
+ AWS Access Key detected; sensitive context detected
98
+
99
+ Remediation:
100
+ - Remove the key from the code
101
+ - Rotate the AWS credentials immediately
102
+ - Use environment variables or AWS IAM roles instead
103
+
104
+ To ignore:
105
+ Add comment: # keygate: ignore reason="..."
106
+ ```
107
+
108
+ **読み方:**
109
+ - `File: config.py:12` — 問題のあるファイルと行番号
110
+ - `Rule: aws-access-key` — 何を検知したか
111
+ - `Score: 100` — 危険度(70以上で自動ブロック、40〜69は警告のみ)
112
+ - `Reason` — 検知の理由
113
+ - `Remediation` — 直し方の提案
114
+
115
+ ---
116
+
117
+ ## 手動でスキャンする
118
+
119
+ フックを使わず、その場でチェックすることもできます。
120
+
121
+ ```bash
122
+ git add .
123
+ keygate scan
124
+ ```
125
+
126
+ `git diff --cached`(ステージ済みの変更)に対してスキャンを実行します。
127
+
128
+ ---
129
+
130
+ ## 誤検知が出たときの対処
131
+
132
+ `keygate` は安全に倒すため、まれに本物ではないものも検知します。そのときの対処法を3つ用意しています。
133
+
134
+ ### 方法1: コメントで「これは無視していい」と伝える
135
+
136
+ その行限定で無視できます。理由を書くのが必須です。
137
+
138
+ ```python
139
+ api_key = "dummy-key-for-testing" # keygate: ignore reason="テストデータ"
140
+ ```
141
+
142
+ ### 方法2: ファイルやキーワードを丸ごと除外する
143
+
144
+ プロジェクトのルートに `keygate.toml` というファイルを作って、除外したいファイルパスやキーワードを書きます。
145
+
146
+ ```toml
147
+ [allowlist]
148
+ paths = ["vendor/*", "third_party/*"] # 自分のコードではない箇所は無視
149
+ patterns = ["dummy", "example"] # この単語を含む行は無視
150
+ ```
151
+
152
+ > 注意: `tests/*` のようにテスト全体を allowlist に入れると、テストコードに混入した本物のシークレットを見逃します。テスト側の誤検知は方法1(inline ignore)か方法3(baseline)で対処してください。
153
+
154
+ ### 方法3: 既存の検知をすべて見逃しリストに登録する(baseline)
155
+
156
+ これから新しく加わるものだけチェックしたい場合に便利です。
157
+
158
+ ```bash
159
+ keygate baseline create
160
+ ```
161
+
162
+ 現時点の検知結果が `.keygate.baseline.json` というファイルに保存され、それ以降は同じ場所を検知しても無視されます。中身はこのような JSON です:
163
+
164
+ ```json
165
+ {
166
+ "version": 1,
167
+ "entries": [
168
+ {
169
+ "fingerprint": "e5282a7860678bc768d280eb3e77d2ca8a44286357c743dd024d74fe0605fe09",
170
+ "file_path": "src/app/config.py",
171
+ "line_number": 42,
172
+ "rule_id": "url-credentials",
173
+ "created_at": "2026-04-22T09:30:00+00:00"
174
+ }
175
+ ]
176
+ }
177
+ ```
178
+
179
+ `fingerprint` は `file_path` + `line_number` + 検知文字列 の SHA256 ハッシュです。値そのものは保存されないため、baseline を Git にコミットしても機密情報は漏れません。
180
+
181
+ 新しく見逃しリストに追加したいものが出てきたら、こうします:
182
+
183
+ ```bash
184
+ keygate baseline update
185
+ ```
186
+
187
+ #### チームで共有する
188
+
189
+ `.keygate.baseline.json` は Git にコミットして共有することをおすすめします。共有しておけば、チーム全員が同じ「見逃してよい検知」リストを使えます。
190
+
191
+ ```bash
192
+ git add .keygate.baseline.json
193
+ git commit -m "Add keygate baseline"
194
+ ```
195
+
196
+ 新しくプロジェクトに参加した人は、`pipx install keygate` と `keygate install-hook` を実行するだけで、共有された baseline がそのまま使われます。
197
+
198
+ ---
199
+
200
+ ## 設定ファイル(必要な人だけ)
201
+
202
+ デフォルト設定で十分動きますが、好みに合わせて変更できます。`keygate.toml` をプロジェクトのルートに作ります。
203
+
204
+ ```toml
205
+ [scan]
206
+ entropy_threshold = 4.2 # ランダムに見える文字列を検知する基準(厳しくしたいなら下げる)
207
+ block_score = 70 # この点数以上でコミットを止める
208
+
209
+ [allowlist]
210
+ paths = ["vendor/*"]
211
+ patterns = ["dummy", "example"]
212
+
213
+ [baseline]
214
+ path = ".keygate.baseline.json"
215
+ ```
216
+
217
+ 設定ファイルがなければデフォルトで動作します。
218
+
219
+ ---
220
+
221
+ ## よくある質問
222
+
223
+ **Q. うっかり機密情報をコミットしてしまったらどうすれば?**
224
+
225
+ A. すぐにそのキーを無効化(rotate)してください。Git の履歴から消すだけでは不十分です。漏れた可能性のあるキーは攻撃者の手に渡っていると考えるべきです。
226
+
227
+ **Q. フックを一時的に無効化したい**
228
+
229
+ A. `git commit --no-verify` で `keygate` を含むすべてのフックをスキップできます(ただし非推奨です)。
230
+
231
+ **Q. チームで共有するには?**
232
+
233
+ A. `keygate.toml` と `.keygate.baseline.json` を Git にコミットして共有してください。各メンバーは `keygate install-hook` をそれぞれ実行する必要があります。
234
+
235
+ ---
236
+
237
+ ## 免責事項
238
+
239
+ `keygate` はベストエフォートで動作する検知ツールです。利用にあたっては以下を理解してください。
240
+
241
+ - **完全な検知は保証しません**:未知のシークレット形式、難読化された値、独自フォーマットなどは検知できない場合があります(false negative)。
242
+ - **誤検知が発生する可能性があります**:本物ではない文字列が検知されることがあります(false positive)。allowlist / baseline / inline ignore で対処してください。
243
+ - **シークレット管理の代替ではありません**:本ツールはコミット時の追加防壁です。秘密情報は本来、環境変数・シークレットマネージャー・KMS 等で管理し、リポジトリに含めない設計を優先してください。
244
+ - **フックの無効化を防ぐものではありません**:`git commit --no-verify` でバイパスされる可能性があります。組織的な統制が必要な場合はサーバ側のチェック(pre-receive hook、CI スキャン等)と併用してください。
245
+ - **検知漏れによって機密情報が漏洩した場合の責任は利用者にあります**:本ツールの使用によって生じたいかなる損害についても、作者および貢献者は責任を負いません(詳細は [LICENSE](LICENSE) 記載のとおり)。
246
+ - **検知された場合は速やかに鍵をローテーションしてください**:コミット前に止められた場合でも、ローカルファイル・エディタ履歴・クリップボード・他端末等に値が残っている可能性があります。
247
+
248
+ 本ツールは「シークレット管理を正しく行う」ことの代わりではなく、「人間のうっかりミスを最後に拾う網」として設計されています。
249
+
250
+ ---
251
+
252
+ ## ライセンス
253
+
254
+ [MIT License](LICENSE) で配布しています。商用利用を含めて自由に利用・改変・再配布できます。詳細は [LICENSE](LICENSE) を参照してください。
@@ -0,0 +1,225 @@
1
+ # keygate
2
+
3
+ **APIキーやパスワードを誤って Git にコミットしてしまう事故を防ぐツール**です。
4
+
5
+ ---
6
+
7
+ ## なぜ必要なのか
8
+
9
+ 開発中、コードに API キーやパスワードを直接書いてしまうことがあります。それをそのまま `git commit` すると、リポジトリの履歴に永久に残ってしまいます。
10
+
11
+ たとえ後で削除しても、過去のコミットからは取り出せるため、GitHub などに公開されるとすぐに悪用されます。AWS のキーが漏れて高額請求された事例も多くあります。
12
+
13
+ `keygate` は **コミット直前に自動でチェック** し、危険なものが含まれていれば止めてくれます。
14
+
15
+ ---
16
+
17
+ ## 検知できるもの
18
+
19
+ - AWS アクセスキー
20
+ - OpenAI API キー
21
+ - GitHub トークン
22
+ - Slack トークン
23
+ - 秘密鍵(PEM 形式)
24
+ - JWT トークン
25
+ - ランダムに見える長い文字列(高エントロピー検知)
26
+ - `api_key`, `password`, `secret` などの変数名 + 値
27
+
28
+ ---
29
+
30
+ ## はじめかた
31
+
32
+ ### ステップ1: インストール
33
+
34
+ `keygate` は Python 製のコマンドラインツールです。`pipx` というツールでインストールするのが一番簡単です。
35
+
36
+ ```bash
37
+ pipx install keygate
38
+ ```
39
+
40
+ > `pipx` がない場合は `pip install pipx` でインストールできます。
41
+ > `pipx` を使うと、どのプロジェクトのフォルダからでも `keygate` コマンドが使えるようになります。
42
+
43
+ ### ステップ2: フックを有効化する
44
+
45
+ 「フック」とは、Git が特定のタイミングで自動的に実行してくれる仕組みのことです。`keygate install-hook` を実行すると、`git commit` のたびに `keygate` が自動で動くようになります。
46
+
47
+ ```bash
48
+ cd path/to/your-project # 自分のプロジェクトに移動
49
+ keygate install-hook
50
+ ```
51
+
52
+ これで準備完了です。
53
+
54
+ ### ステップ3: 実際に使ってみる
55
+
56
+ 普段通り `git add` と `git commit` をするだけです。危険なものが含まれていなければ、何も起きません。
57
+
58
+ 危険なものが含まれていると、こんなふうにコミットが止まります:
59
+
60
+ ```
61
+ [BLOCK] High confidence secret detected
62
+
63
+ File: config.py:12
64
+ Rule: aws-access-key
65
+ Score: 100
66
+
67
+ Reason:
68
+ AWS Access Key detected; sensitive context detected
69
+
70
+ Remediation:
71
+ - Remove the key from the code
72
+ - Rotate the AWS credentials immediately
73
+ - Use environment variables or AWS IAM roles instead
74
+
75
+ To ignore:
76
+ Add comment: # keygate: ignore reason="..."
77
+ ```
78
+
79
+ **読み方:**
80
+ - `File: config.py:12` — 問題のあるファイルと行番号
81
+ - `Rule: aws-access-key` — 何を検知したか
82
+ - `Score: 100` — 危険度(70以上で自動ブロック、40〜69は警告のみ)
83
+ - `Reason` — 検知の理由
84
+ - `Remediation` — 直し方の提案
85
+
86
+ ---
87
+
88
+ ## 手動でスキャンする
89
+
90
+ フックを使わず、その場でチェックすることもできます。
91
+
92
+ ```bash
93
+ git add .
94
+ keygate scan
95
+ ```
96
+
97
+ `git diff --cached`(ステージ済みの変更)に対してスキャンを実行します。
98
+
99
+ ---
100
+
101
+ ## 誤検知が出たときの対処
102
+
103
+ `keygate` は安全に倒すため、まれに本物ではないものも検知します。そのときの対処法を3つ用意しています。
104
+
105
+ ### 方法1: コメントで「これは無視していい」と伝える
106
+
107
+ その行限定で無視できます。理由を書くのが必須です。
108
+
109
+ ```python
110
+ api_key = "dummy-key-for-testing" # keygate: ignore reason="テストデータ"
111
+ ```
112
+
113
+ ### 方法2: ファイルやキーワードを丸ごと除外する
114
+
115
+ プロジェクトのルートに `keygate.toml` というファイルを作って、除外したいファイルパスやキーワードを書きます。
116
+
117
+ ```toml
118
+ [allowlist]
119
+ paths = ["vendor/*", "third_party/*"] # 自分のコードではない箇所は無視
120
+ patterns = ["dummy", "example"] # この単語を含む行は無視
121
+ ```
122
+
123
+ > 注意: `tests/*` のようにテスト全体を allowlist に入れると、テストコードに混入した本物のシークレットを見逃します。テスト側の誤検知は方法1(inline ignore)か方法3(baseline)で対処してください。
124
+
125
+ ### 方法3: 既存の検知をすべて見逃しリストに登録する(baseline)
126
+
127
+ これから新しく加わるものだけチェックしたい場合に便利です。
128
+
129
+ ```bash
130
+ keygate baseline create
131
+ ```
132
+
133
+ 現時点の検知結果が `.keygate.baseline.json` というファイルに保存され、それ以降は同じ場所を検知しても無視されます。中身はこのような JSON です:
134
+
135
+ ```json
136
+ {
137
+ "version": 1,
138
+ "entries": [
139
+ {
140
+ "fingerprint": "e5282a7860678bc768d280eb3e77d2ca8a44286357c743dd024d74fe0605fe09",
141
+ "file_path": "src/app/config.py",
142
+ "line_number": 42,
143
+ "rule_id": "url-credentials",
144
+ "created_at": "2026-04-22T09:30:00+00:00"
145
+ }
146
+ ]
147
+ }
148
+ ```
149
+
150
+ `fingerprint` は `file_path` + `line_number` + 検知文字列 の SHA256 ハッシュです。値そのものは保存されないため、baseline を Git にコミットしても機密情報は漏れません。
151
+
152
+ 新しく見逃しリストに追加したいものが出てきたら、こうします:
153
+
154
+ ```bash
155
+ keygate baseline update
156
+ ```
157
+
158
+ #### チームで共有する
159
+
160
+ `.keygate.baseline.json` は Git にコミットして共有することをおすすめします。共有しておけば、チーム全員が同じ「見逃してよい検知」リストを使えます。
161
+
162
+ ```bash
163
+ git add .keygate.baseline.json
164
+ git commit -m "Add keygate baseline"
165
+ ```
166
+
167
+ 新しくプロジェクトに参加した人は、`pipx install keygate` と `keygate install-hook` を実行するだけで、共有された baseline がそのまま使われます。
168
+
169
+ ---
170
+
171
+ ## 設定ファイル(必要な人だけ)
172
+
173
+ デフォルト設定で十分動きますが、好みに合わせて変更できます。`keygate.toml` をプロジェクトのルートに作ります。
174
+
175
+ ```toml
176
+ [scan]
177
+ entropy_threshold = 4.2 # ランダムに見える文字列を検知する基準(厳しくしたいなら下げる)
178
+ block_score = 70 # この点数以上でコミットを止める
179
+
180
+ [allowlist]
181
+ paths = ["vendor/*"]
182
+ patterns = ["dummy", "example"]
183
+
184
+ [baseline]
185
+ path = ".keygate.baseline.json"
186
+ ```
187
+
188
+ 設定ファイルがなければデフォルトで動作します。
189
+
190
+ ---
191
+
192
+ ## よくある質問
193
+
194
+ **Q. うっかり機密情報をコミットしてしまったらどうすれば?**
195
+
196
+ A. すぐにそのキーを無効化(rotate)してください。Git の履歴から消すだけでは不十分です。漏れた可能性のあるキーは攻撃者の手に渡っていると考えるべきです。
197
+
198
+ **Q. フックを一時的に無効化したい**
199
+
200
+ A. `git commit --no-verify` で `keygate` を含むすべてのフックをスキップできます(ただし非推奨です)。
201
+
202
+ **Q. チームで共有するには?**
203
+
204
+ A. `keygate.toml` と `.keygate.baseline.json` を Git にコミットして共有してください。各メンバーは `keygate install-hook` をそれぞれ実行する必要があります。
205
+
206
+ ---
207
+
208
+ ## 免責事項
209
+
210
+ `keygate` はベストエフォートで動作する検知ツールです。利用にあたっては以下を理解してください。
211
+
212
+ - **完全な検知は保証しません**:未知のシークレット形式、難読化された値、独自フォーマットなどは検知できない場合があります(false negative)。
213
+ - **誤検知が発生する可能性があります**:本物ではない文字列が検知されることがあります(false positive)。allowlist / baseline / inline ignore で対処してください。
214
+ - **シークレット管理の代替ではありません**:本ツールはコミット時の追加防壁です。秘密情報は本来、環境変数・シークレットマネージャー・KMS 等で管理し、リポジトリに含めない設計を優先してください。
215
+ - **フックの無効化を防ぐものではありません**:`git commit --no-verify` でバイパスされる可能性があります。組織的な統制が必要な場合はサーバ側のチェック(pre-receive hook、CI スキャン等)と併用してください。
216
+ - **検知漏れによって機密情報が漏洩した場合の責任は利用者にあります**:本ツールの使用によって生じたいかなる損害についても、作者および貢献者は責任を負いません(詳細は [LICENSE](LICENSE) 記載のとおり)。
217
+ - **検知された場合は速やかに鍵をローテーションしてください**:コミット前に止められた場合でも、ローカルファイル・エディタ履歴・クリップボード・他端末等に値が残っている可能性があります。
218
+
219
+ 本ツールは「シークレット管理を正しく行う」ことの代わりではなく、「人間のうっかりミスを最後に拾う網」として設計されています。
220
+
221
+ ---
222
+
223
+ ## ライセンス
224
+
225
+ [MIT License](LICENSE) で配布しています。商用利用を含めて自由に利用・改変・再配布できます。詳細は [LICENSE](LICENSE) を参照してください。
@@ -0,0 +1,48 @@
1
+ [build-system]
2
+ requires = ["setuptools>=42"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "keygate"
7
+ version = "0.1.0"
8
+ description = "Git pre-commit hook for preventing accidental secret commits"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = { text = "MIT" }
12
+ authors = [
13
+ { name = "Yuichi Kaneko" },
14
+ ]
15
+ keywords = ["git", "pre-commit", "secrets", "security", "scanner", "hook", "devtools"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Environment :: Console",
19
+ "Intended Audience :: Developers",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Operating System :: POSIX :: Linux",
22
+ "Operating System :: MacOS",
23
+ "Operating System :: Microsoft :: Windows",
24
+ "Programming Language :: Python :: 3",
25
+ "Programming Language :: Python :: 3.11",
26
+ "Programming Language :: Python :: 3.12",
27
+ "Programming Language :: Python :: 3.13",
28
+ "Topic :: Security",
29
+ "Topic :: Software Development :: Version Control :: Git",
30
+ ]
31
+ dependencies = [
32
+ "click>=8.1",
33
+ ]
34
+
35
+ [project.scripts]
36
+ keygate = "keygate.cli:main"
37
+
38
+ [project.optional-dependencies]
39
+ dev = [
40
+ "pytest>=7.4",
41
+ "pytest-cov>=4.1",
42
+ ]
43
+
44
+ [tool.setuptools.packages.find]
45
+ where = ["src"]
46
+
47
+ [tool.pytest.ini_options]
48
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
File without changes