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.
- keygate-0.1.0/CHANGELOG.md +18 -0
- keygate-0.1.0/LICENSE +21 -0
- keygate-0.1.0/MANIFEST.in +8 -0
- keygate-0.1.0/PKG-INFO +254 -0
- keygate-0.1.0/README.md +225 -0
- keygate-0.1.0/pyproject.toml +48 -0
- keygate-0.1.0/setup.cfg +4 -0
- keygate-0.1.0/src/keygate/__init__.py +0 -0
- keygate-0.1.0/src/keygate/cli.py +135 -0
- keygate-0.1.0/src/keygate/config.py +40 -0
- keygate-0.1.0/src/keygate/diff/__init__.py +0 -0
- keygate-0.1.0/src/keygate/diff/parser.py +64 -0
- keygate-0.1.0/src/keygate/hook/__init__.py +0 -0
- keygate-0.1.0/src/keygate/hook/installer.py +44 -0
- keygate-0.1.0/src/keygate/models.py +42 -0
- keygate-0.1.0/src/keygate/policy/__init__.py +0 -0
- keygate-0.1.0/src/keygate/policy/allowlist.py +15 -0
- keygate-0.1.0/src/keygate/policy/baseline.py +55 -0
- keygate-0.1.0/src/keygate/policy/inline.py +22 -0
- keygate-0.1.0/src/keygate/scanner/__init__.py +0 -0
- keygate-0.1.0/src/keygate/scanner/context.py +82 -0
- keygate-0.1.0/src/keygate/scanner/entropy.py +24 -0
- keygate-0.1.0/src/keygate/scanner/rules.py +195 -0
- keygate-0.1.0/src/keygate/scanner/scoring.py +98 -0
- keygate-0.1.0/src/keygate.egg-info/PKG-INFO +254 -0
- keygate-0.1.0/src/keygate.egg-info/SOURCES.txt +43 -0
- keygate-0.1.0/src/keygate.egg-info/dependency_links.txt +1 -0
- keygate-0.1.0/src/keygate.egg-info/entry_points.txt +2 -0
- keygate-0.1.0/src/keygate.egg-info/requires.txt +5 -0
- keygate-0.1.0/src/keygate.egg-info/top_level.txt +1 -0
- keygate-0.1.0/tests/__init__.py +0 -0
- keygate-0.1.0/tests/conftest.py +9 -0
- keygate-0.1.0/tests/test_diff/__init__.py +0 -0
- keygate-0.1.0/tests/test_diff/test_parser.py +75 -0
- keygate-0.1.0/tests/test_hook/__init__.py +0 -0
- keygate-0.1.0/tests/test_hook/test_installer.py +32 -0
- keygate-0.1.0/tests/test_policy/__init__.py +0 -0
- keygate-0.1.0/tests/test_policy/test_allowlist.py +32 -0
- keygate-0.1.0/tests/test_policy/test_baseline.py +81 -0
- keygate-0.1.0/tests/test_policy/test_inline.py +34 -0
- keygate-0.1.0/tests/test_scanner/__init__.py +0 -0
- keygate-0.1.0/tests/test_scanner/test_context.py +173 -0
- keygate-0.1.0/tests/test_scanner/test_entropy.py +28 -0
- keygate-0.1.0/tests/test_scanner/test_rules.py +145 -0
- 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.
|
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) を参照してください。
|
keygate-0.1.0/README.md
ADDED
|
@@ -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"]
|
keygate-0.1.0/setup.cfg
ADDED
|
File without changes
|