設定
shk.toml ポリシーの完全なリファレンス: スキャン設定、しきい値、マスキング、アクションガード、env シークレットストア、カスタムルール、抑制。
このページの内容
shk は、カレントワーキングディレクトリの shk.toml からプロジェクトのポリシーを読み込みます。ファイルが存在しない場合、読み取り専用コマンドは組み込みのデフォルトを使用します。プロジェクト設定やツール設定を書き込むコマンドには shk.toml が必要です。別のディレクトリからポリシーを解決するには、グローバルフラグ --project-root <DIR> を渡します。
対話型の初回セットアップの一部としてスターターポリシーを作成するか、ポリシーファイルのみを書き込みます:
shk init
shk policy initmedium 重要度の検出結果で失敗する、より厳格なスターターポリシーを作成します:
shk init --strict
shk policy init --strictポリシーリファレンス
デフォルトのポリシー構成と、任意の secrets push プロファイルの例です:
[scan]
include = ["**/*"]
exclude = [
".git/**",
"node_modules/**",
"dist/**",
"build/**",
"coverage/**",
"**/*.svg",
"**/*.png",
"**/*.jpg",
"**/*.jpeg",
"**/*.gif",
"**/*.webp",
"**/*.ico",
"**/*.icns",
"**/*.avif",
"**/*.bmp",
"**/*.tif",
"**/*.tiff",
"**/*.mp4",
"**/*.m4v",
"**/*.mov",
"**/*.webm",
"**/*.mkv",
"**/*.avi",
"**/*.ogv",
"**/*.mp3",
"**/*.m4a",
"**/*.wav",
"**/*.flac",
"**/*.aac",
"**/*.ogg",
"**/*.opus",
"**/*.woff",
"**/*.woff2",
"**/*.ttf",
"**/*.otf",
"**/*.eot"
]
max_file_size_bytes = 1048576
binary_detection_bytes = 8192
follow_symlinks = false
include_binary = false
[rules]
secrets = true
pii = true
pii_languages = ["en", "ja"]
env = true
internal_terms = false
ai_context = true
[thresholds]
default_fail_on = "high"
scan_fail_on = "high"
pre_commit_fail_on = "high"
[mask]
mode = "strict"
min_severity = "medium"
redaction = "match"
# preserve_prefix = 4
# preserve_suffix = 4
[action_guard]
enabled = true
profile = "recommended"
allow = []
deny = []
[doctor.ignore]
required_patterns = [
".env",
".env.*",
"!.env.example",
"secrets/**",
"credentials/**",
"*.pem",
"*.key",
"*.p12",
"*.mobileprovision",
"*.log",
"*.shk-map"
]
# `shk secrets push` 用の任意のプロファイル。
[secrets.profiles.prod]
provider = "aws"
mode = "blob"
target = "app/prod/dotenv"
source = ".env.production"
audit = true
confirm = true
# 任意の env シークレットストア(デフォルト: OS キーリング)。
# [env]
# secret_store = "keyring" # keyring | 1password
# project_id = "acme/backend-api" # secret_store = "1password" の場合に必須
# [env.onepassword]
# vault = "shk-project-keys" # secret_store = "1password" の場合に必須shk init --strict は同じ構造を使用しますが、default_fail_on、scan_fail_on、pre_commit_fail_on を medium に設定します。
スキャン設定
| キー | デフォルト | 動作 |
|---|---|---|
include |
["**/*"] |
スキャンに含める glob パターン。 |
exclude |
組み込みの生成ファイルおよびメディアファイルの除外設定 | スキャンから除外する glob パターン。 |
max_file_size_bytes |
1048576 |
この上限より大きいファイルはスキップされます。 |
binary_detection_bytes |
8192 |
バイナリ判定のために検査する先頭バイト数。 |
follow_symlinks |
false |
スキャナーの走査でシンボリックリンクをたどるかどうか。 |
include_binary |
false |
バイナリと思われるファイルをスキップせずにスキャンするかどうか。 |
デフォルトにフォールバックするのは、キーが存在しない場合のみです。include = [] は何もスキャンせず、exclude = [] は組み込みの除外設定を無効にします。
サポートされているドキュメント形式(.docx、.xlsx、.pptx、テキストレイヤー付き .pdf)は、バイナリスキップの前にテキスト抽出されます。Office ドキュメントの検出結果には report.docx:word/document.xml のような内部エントリパスのラベルが付きます。PDF の検出結果は PDF のパスそのものを使用します。画像のみの PDF は OCR されず、テキストを抽出できない場合は scan.document_text_empty を生成します。
ルール設定
| キー | デフォルト | 動作 |
|---|---|---|
secrets |
true |
組み込みのシークレットルールを有効にします。 |
pii |
true |
組み込みの PII(個人情報)ルールを有効にします。 |
pii_languages |
["en", "ja"] |
言語ごとに制限された PII ルールを有効にします。言語に依存しない PII ルールは pii = true のときに実行されます。 |
env |
true |
env.sensitive_assignment(機密性の高い変数名にプレースホルダー以外の値を代入する dotenv 形式の記述)などの env 関連ルールを有効にします。env ルールは dotenv 形式のファイル(.env、.env.local、dev.env など)にのみ適用されます。.env.example と .env.sample ファイルは常にスキップされます。 |
internal_terms |
false |
kind = "internal" のカスタムルールを有効にします。 |
ai_context |
true |
Unicode 制御文字と安全でない URI スキームに対する、精度の高い AI コンテキスト安全性ルールを有効にします。 |
しきい値
有効な重要度の値は info、low、medium、high、critical です。
| キー | デフォルト | 動作 |
|---|---|---|
default_fail_on |
high |
フォールバックのしきい値。 |
scan_fail_on |
high |
通常のスキャンのしきい値。 |
pre_commit_fail_on |
high |
shk scan --staged と Cursor のプリフックスキャンのしきい値。 |
CLI オプション --fail-on は、そのコマンド実行に限り、設定されたしきい値を上書きします。
マスク設定
| キー | デフォルト | 動作 |
|---|---|---|
mode |
strict |
strict のみサポートされます。その他の値は拒否されます。 |
min_severity |
medium |
秘匿化する検出結果の最小重要度。info、low、medium、high、critical のいずれかを使用します。 |
redaction |
match |
match は一致した値のみを秘匿化し、full は行全体を秘匿化し、partial は一致した値の両端を設定に従って保持します。 |
preserve_prefix |
4 |
redaction = "partial" のときに、一致した値の先頭で保持する文字数。 |
preserve_suffix |
4 |
redaction = "partial" のときに、一致した値の末尾で保持する文字数。 |
アクションガード設定
action_guard は shk scan --hook-mode claude-code などのブロッキングなプリフックスキャンにのみ適用されます。コンテンツのスキャンより前に操作の意図をチェックし、--audit モードと --post フックではスキップされます。
| キー | デフォルト | 動作 |
|---|---|---|
enabled |
true |
プリフックモードでのアクションガードによるブロックを有効にします。 |
profile |
recommended |
組み込みのカバレッジレベル: minimal、recommended、strict のいずれか。その他の値は recommended にフォールバックします。 |
allow |
[] |
プロジェクトで承認済みの操作向けに、アクションガードをバイパスするアクションパターン。 |
deny |
[] |
ブロック対象に追加する、プロジェクト固有のアクションパターン。 |
アクションパターンには、Bash(psql:*)、Bash(kubectl delete:*)、Read(.env)、Write(tokens/*.json) のような、* ワイルドカードを含むツール形式の文字列を使用します。allow は、組み込みおよびカスタムの拒否ルールより先にチェックされます。
シェルコマンドはセグメントごとに評価されます。Bash(echo:*) のような単一コマンドの許可は、echo ok && curl ... の後続セグメントを許可しません。すべてのセグメントが信頼できる場合にのみ、複合コマンド全体を明示的に許可してください。これにより、広く許可された最初のコマンドが、後続の危険なコマンドを隠すことを防ぎます。
strict プロファイルでは、埋め込まれたスクリプトを完全に解釈しようとする代わりに、bash -c、sh -c、zsh -c、python -c、python3 -c、node -e、node --eval、ruby -e、perl -e のような不透明な実行形式もブロックします。
仮名化の設定
[pseudonymize] は shk mask --pseudonymize を設定します。不明なキーは拒否され、無効な設定はファイルが書き込まれる前に 2 で終了します。
| キー | デフォルト | 動作 |
|---|---|---|
norm |
"v1" |
ハッシュ化の前に適用される正規化バージョン。v1 のみ受け付けます。 |
token_bits |
64 |
トークン幅(ビット単位)。64 から 128 までの 8 の倍数である必要があります。 |
email_strip_subaddress |
false |
メールアドレスをトークン化する前に +tag のサブアドレスを取り除き、a+news@example.com と a@example.com が同じトークンを共有するようにします。 |
columns |
{} |
テーブルモードのデフォルト。ヘッダー名を種類(email、phone、name、または custom:<label>)にマッピングします。どのヘッダーにも一致しないエントリは無視され、--columns はこれらを上書きします。 |
rules |
{} |
テキストモードの上書き設定。[REDACTED] ではなくトークンにすべき検出について、ルール ID を種類にマッピングします。 |
[pseudonymize]
token_bits = 64
email_strip_subaddress = false
[pseudonymize.columns]
Email = "email"
Phone = "phone"
Name = "name"プロジェクトのキーは env 鍵と同じバックエンド([env].secret_store)に保存されます。shk pseudonymize を参照してください。
Env シークレットストア
shk env は dotenv の秘密鍵をリポジトリの外部に保存します。デフォルトでは OS キーリング(macOS のキーチェーン、Windows の資格情報マネージャー、または Linux の Secret Service / keyutils)を使用します。チームは、共有 vault による配布、集中管理された失効、Business プランの監査ログのために、1Password をオプトインで利用できます。
1Password バックエンドには、バージョン 2.24.0 以降の 1Password CLI(op) が必要です。バックエンドを有効にする前に、op をインストールしてサインインしてください。次のコマンドでセットアップを確認します:
op --version
op whoami
shk doctor envデフォルトのキーリングバックエンドには 1Password CLI は不要です。
# デフォルト: ローカルの OS キーリング(追加の依存関係なし)。
[env]
secret_store = "keyring"# チームでの vault 共有のために 1Password をオプトインする。
# `shk env key migrate --to 1password` が成功するまでは secret_store = "keyring" のままにしておくこと。
[env]
secret_store = "1password"
project_id = "acme/backend-api" # 必須。マシンに依存しない識別子
[env.onepassword]
vault = "shk-project-keys" # 1Password を使用または移行する前に必須| キー | デフォルト | 動作 |
|---|---|---|
env.secret_store |
"keyring" |
ネイティブの env 鍵、インポートされた dotenvx 鍵、仮名化キーを保存するバックエンド。サポートされる値: keyring、1password。 |
env.project_id |
未設定 | secret_store = "1password" の場合に必須。1Password のアイテムタイトルに使用される、安定したマシン非依存のプロジェクトラベル。: や先頭・末尾の空白を含めることはできません。shk doctor env は git remote get-url origin またはリポジトリのディレクトリ名から値を提案できます。 |
env.onepassword.vault |
未設定 | secret_store = "1password" の場合に必須。1Password CLI(op)に渡す vault 名。 |
1Password のアイテムタイトルは shk:{project_id}:{segment}:{key} の形式に従います。{segment} は、ネイティブ鍵(shk env encrypt、shk env key import)では env、インポートされた dotenvx 鍵では dotenvx、shk mask --pseudonymize のキーでは pseudonymize です。アイテムには shk タグが付きます。生の鍵の値が shk.toml、JSON レポート、.shk/audit.log に現れることはありません。
op バイナリが PATH 上にない場合は、SHK_OP_PATH に絶対パスを設定します。解決順序は SHK_OP_PATH、既知のインストールパス、そして PATH です(最後の選択肢はハイジャックされやすいため、shk doctor env で警告されます)。1Password CLI はサインイン済み(op whoami)で、バージョン 2.24.0 以降である必要があります。
キーリングストレージは、OS の資格情報ストアで 3 つのサービス名を使用します:
| サービス | 用途 |
|---|---|
security-harness-kit/env |
shk env encrypt、shk env key import によるネイティブ鍵、および取り込まれた dotenvx 鍵 |
security-harness-kit/dotenvx |
shk env dotenvx import-keys でインポートされた鍵 |
security-harness-kit/pseudonymize |
shk mask --pseudonymize と shk pseudonymize のプロジェクトキー |
shk doctor env を実行すると、平文の env ファイルをチェックし、1Password が設定されている場合は op の解決、バージョン、サインイン状態も確認します。
シークレットマネージャープロファイル
[secrets.profiles.<name>] には、shk secrets push で再利用するデフォルト値を保存します。CLI フラグはプロファイルの値を上書きします。
blob モードは、dotenv ファイル全体を 1 つのプロバイダーシークレットとして保存します:
[secrets.profiles.prod]
provider = "aws"
mode = "blob"
target = "app/prod/dotenv"
source = ".env.production"
region = "ap-northeast-1"
audit = true
confirm = true
create_if_missing = false
expected_env = "production"per-key モードは、dotenv の各キーをターゲットプレフィックスの下に保存します:
[secrets.profiles.prod-keys]
provider = "gcp"
mode = "per-key"
target_prefix = "app/prod/"
source = ".env.keys"
project = "my-gcp-project"
location = "global"
audit = trueサポートされるプロファイルキー:
| キー | 動作 |
|---|---|
provider |
aws または gcp。 |
mode |
blob または per-key(エイリアスとして per_key も受け付けます)。省略時は blob になります。 |
target |
blob モードのターゲットシークレット名。 |
target_prefix |
per-key モードのターゲットプレフィックス。 |
source |
ソースの dotenv ファイル。相対パスの場合は Git リポジトリのルート(リポジトリ外ではカレントディレクトリ)を基準に解決されます。 |
region |
AWS リージョン。未指定の場合は AWS CLI の環境変数/設定が使用されます。 |
project |
GCP プロジェクト。未指定の場合は gcloud の環境変数/設定が使用されます。 |
location |
GCP ロケーション。デフォルトは global です。 |
audit |
true の場合、メタデータのみの .shk/audit.log エントリを追記します。 |
confirm |
true の場合、書き込み前に確認プロンプトを表示します。プロンプトにはターミナルが必要で、非対話的な実行では --yes または --dry-run を渡さない限り 2 で終了します。 |
create_if_missing |
プロバイダーシークレットが存在しない場合に作成します。 |
expected_env |
NODE_ENV のような環境名らしい値に対する lint のヒント。 |
不明なプロファイルフィールドは拒否されます。生のシークレット値を shk.toml に置いてはいけません。値はソースの dotenv ファイルまたはプロバイダーのシークレットマネージャーに保持してください。
カスタムルール
プロジェクト固有の機密用語、コードネーム、正規表現パターンのために [[custom_rules]] エントリを追加します:
[[custom_rules]]
id = "internal.codename"
pattern = "ProjectNebula|CONFIDENTIAL_CLIENT_X"
severity = "high"
kind = "internal"
message = "Internal confidential term detected"
case_insensitive = false
enabled = trueフィールド:
| フィールド | デフォルト | 動作 |
|---|---|---|
id |
必須 | 安定したルール識別子。 |
pattern |
必須 | Rust の正規表現パターン。 |
severity |
medium |
検出結果の重要度。 |
kind |
internal |
検出結果の種類。 |
message |
Custom sensitive term detected |
検出結果のメッセージ。 |
confidence |
1.0 |
検出結果の信頼度。 |
case_insensitive |
false |
パターンを大文字小文字を区別しないマッチングでラップします。 |
enabled |
true |
ルールを有効または無効にします。 |
カスタムルールは、スキャン、マスク、フックモード、インライン抑制、[[allowlist]] に参加します。
抑制
コメントをサポートするファイルではインライン抑制が利用できます:
API_KEY=synthetic-example-value # shk-ignore secret.generic_api_key
# shk-ignore-next-line secret.generic_api_key
SECRET=synthetic-example-value
<!-- shk-ignore-next-line secret.generic_api_key -->
SECRET=synthetic-example-valueルール ID のないマーカー(# shk-ignore、# shk-ignore-next-line)はその行のすべてのルールを抑制し、// コメントも # と同じように機能します。
ポリシーの許可リスト(allowlist)では、パスとルールによる抑制ができます:
[[allowlist]]
rule_id = "secret.generic_api_key"
path = "fixtures/**"
reason = "Intentional test fixture"
expires = "2026-12-31"path は省略可能で、デフォルトは **/* です。expires は YYYY-MM-DD 形式である必要があります。日付を解析できないエントリは期限切れになりません。
Office ドキュメントの検出結果については、レポートに表示される内部エントリラベルに一致させます:
[[allowlist]]
rule_id = "secret.openai_api_key"
path = "report.docx:word/document.xml"
reason = "Intentional document fixture"ポリシーの許可リストでは、値ハッシュ(value hash)による抑制もできます:
[[allowlist]]
rule_id = "pii.email"
value_hash = "sha256-hmac:a3f1..."
reason = "Public support address"生のシークレット値を shk.toml に置かないでください。値ごとの抑制には value_hash を使用します。value_hash は等価性チェックのための決定論的なフィンガープリントであり、暗号学的なシークレットの保管ではありません。候補となる値とルール ID を知っている人は誰でも同じハッシュを計算できます。
期限切れの許可リストエントリは、重要度 low の警告検出結果を生成します。
Doctor Ignore 設定
doctor.ignore.required_patterns は、shk doctor ignore でチェックされるパターンを制御します。
デフォルトの必須パターンは次のとおりです:
[
".env",
".env.*",
"!.env.example",
"secrets/**",
"credentials/**",
"*.pem",
"*.key",
"*.p12",
"*.mobileprovision",
"*.log",
"*.shk-map"
]shk doctor ignore --fix を使用すると、不足している必須パターンが .gitignore に追記されます。