ドキュメントリファレンス

設定

shk.toml ポリシーの完全なリファレンス: スキャン設定、しきい値、マスキング、アクションガード、env シークレットストア、カスタムルール、抑制。

このページの内容

shk は、カレントワーキングディレクトリの shk.toml からプロジェクトのポリシーを読み込みます。ファイルが存在しない場合、読み取り専用コマンドは組み込みのデフォルトを使用します。プロジェクト設定やツール設定を書き込むコマンドには shk.toml が必要です。別のディレクトリからポリシーを解決するには、グローバルフラグ --project-root <DIR> を渡します。

対話型の初回セットアップの一部としてスターターポリシーを作成するか、ポリシーファイルのみを書き込みます:

shk init
shk policy init
bash

medium 重要度の検出結果で失敗する、より厳格なスターターポリシーを作成します:

shk init --strict
shk policy init --strict
bash

ポリシーリファレンス

デフォルトのポリシー構成と、任意の 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" の場合に必須
toml

shk init --strict は同じ構造を使用しますが、default_fail_onscan_fail_onpre_commit_fail_onmedium に設定します。

スキャン設定

キー デフォルト 動作
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.localdev.env など)にのみ適用されます。.env.example.env.sample ファイルは常にスキップされます。
internal_terms false kind = "internal" のカスタムルールを有効にします。
ai_context true Unicode 制御文字と安全でない URI スキームに対する、精度の高い AI コンテキスト安全性ルールを有効にします。

しきい値

有効な重要度の値は infolowmediumhighcritical です。

キー デフォルト 動作
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 秘匿化する検出結果の最小重要度。infolowmediumhighcritical のいずれかを使用します。
redaction match match は一致した値のみを秘匿化し、full は行全体を秘匿化し、partial は一致した値の両端を設定に従って保持します。
preserve_prefix 4 redaction = "partial" のときに、一致した値の先頭で保持する文字数。
preserve_suffix 4 redaction = "partial" のときに、一致した値の末尾で保持する文字数。

アクションガード設定

action_guardshk scan --hook-mode claude-code などのブロッキングなプリフックスキャンにのみ適用されます。コンテンツのスキャンより前に操作の意図をチェックし、--audit モードと --post フックではスキップされます。

キー デフォルト 動作
enabled true プリフックモードでのアクションガードによるブロックを有効にします。
profile recommended 組み込みのカバレッジレベル: minimalrecommendedstrict のいずれか。その他の値は recommended にフォールバックします。
allow [] プロジェクトで承認済みの操作向けに、アクションガードをバイパスするアクションパターン。
deny [] ブロック対象に追加する、プロジェクト固有のアクションパターン。

アクションパターンには、Bash(psql:*)Bash(kubectl delete:*)Read(.env)Write(tokens/*.json) のような、* ワイルドカードを含むツール形式の文字列を使用します。allow は、組み込みおよびカスタムの拒否ルールより先にチェックされます。

シェルコマンドはセグメントごとに評価されます。Bash(echo:*) のような単一コマンドの許可は、echo ok && curl ... の後続セグメントを許可しません。すべてのセグメントが信頼できる場合にのみ、複合コマンド全体を明示的に許可してください。これにより、広く許可された最初のコマンドが、後続の危険なコマンドを隠すことを防ぎます。

strict プロファイルでは、埋め込まれたスクリプトを完全に解釈しようとする代わりに、bash -csh -czsh -cpython -cpython3 -cnode -enode --evalruby -eperl -e のような不透明な実行形式もブロックします。

仮名化の設定

[pseudonymize]shk mask --pseudonymize を設定します。不明なキーは拒否され、無効な設定はファイルが書き込まれる前に 2 で終了します。

キー デフォルト 動作
norm "v1" ハッシュ化の前に適用される正規化バージョン。v1 のみ受け付けます。
token_bits 64 トークン幅(ビット単位)。64 から 128 までの 8 の倍数である必要があります。
email_strip_subaddress false メールアドレスをトークン化する前に +tag のサブアドレスを取り除き、a+news@example.coma@example.com が同じトークンを共有するようにします。
columns {} テーブルモードのデフォルト。ヘッダー名を種類(emailphonename、または custom:<label>)にマッピングします。どのヘッダーにも一致しないエントリは無視され、--columns はこれらを上書きします。
rules {} テキストモードの上書き設定。[REDACTED] ではなくトークンにすべき検出について、ルール ID を種類にマッピングします。
[pseudonymize]
token_bits = 64
email_strip_subaddress = false

[pseudonymize.columns]
Email = "email"
Phone = "phone"
Name = "name"
toml

プロジェクトのキーは 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
bash

デフォルトのキーリングバックエンドには 1Password CLI は不要です。

# デフォルト: ローカルの OS キーリング(追加の依存関係なし)。
[env]
secret_store = "keyring"
toml
# チームでの 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 を使用または移行する前に必須
toml
キー デフォルト 動作
env.secret_store "keyring" ネイティブの env 鍵、インポートされた dotenvx 鍵、仮名化キーを保存するバックエンド。サポートされる値: keyring1password
env.project_id 未設定 secret_store = "1password" の場合に必須。1Password のアイテムタイトルに使用される、安定したマシン非依存のプロジェクトラベル。: や先頭・末尾の空白を含めることはできません。shk doctor envgit remote get-url origin またはリポジトリのディレクトリ名から値を提案できます。
env.onepassword.vault 未設定 secret_store = "1password" の場合に必須。1Password CLI(op)に渡す vault 名。

1Password のアイテムタイトルは shk:{project_id}:{segment}:{key} の形式に従います。{segment} は、ネイティブ鍵(shk env encryptshk env key import)では env、インポートされた dotenvx 鍵では dotenvxshk 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 encryptshk env key import によるネイティブ鍵、および取り込まれた dotenvx 鍵
security-harness-kit/dotenvx shk env dotenvx import-keys でインポートされた鍵
security-harness-kit/pseudonymize shk mask --pseudonymizeshk 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"
toml

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
toml

サポートされるプロファイルキー:

キー 動作
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
toml

フィールド:

フィールド デフォルト 動作
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
text

ルール 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"
toml

path は省略可能で、デフォルトは **/* です。expiresYYYY-MM-DD 形式である必要があります。日付を解析できないエントリは期限切れになりません。

Office ドキュメントの検出結果については、レポートに表示される内部エントリラベルに一致させます:

[[allowlist]]
rule_id = "secret.openai_api_key"
path = "report.docx:word/document.xml"
reason = "Intentional document fixture"
toml

ポリシーの許可リストでは、値ハッシュ(value hash)による抑制もできます:

[[allowlist]]
rule_id = "pii.email"
value_hash = "sha256-hmac:a3f1..."
reason = "Public support address"
toml

生のシークレット値を 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"
]
toml

shk doctor ignore --fix を使用すると、不足している必須パターンが .gitignore に追記されます。