ログ、テレメトリ、その他サードパーティの領域に到達する前に、自由形式の文字列から認証情報らしき内容を除去する
phpboyscout Go toolkit の一部: go-tool-base から抽出された、フレームワークに依存しない小さな Go モジュール群。ドキュメント: redact.go.phpboyscout.uk
gitlab.com/phpboyscout/go/redact は、信頼された領域と信頼されていない可観測性の領域(テレメトリベンダー、ログアグリゲータ、メトリクスストアなど)の境界において、自由形式の文字列から認証情報らしき内容を除去します。エラーメッセージ、コマンド引数、HTTP ヘッダー値は、しばしば意図せずシークレットを含んでしまいます(userinfo が埋め込まれた URL、os.Args 内の --api-key=sk-… フラグ、エクスポートエラーに引用された Authorization ヘッダーなど)。これらを出力時に redact.String 経由で通せば、平文のままプロセスから外へ出ることはありません。
regexp、strings)のみを使用するため、モジュール以外は依存グラフに入りません。depfootprint_test.go ガードがこれを強制し、テストは testify とエステートの go/errors に限定しています。go get gitlab.com/phpboyscout/go/redact
import "gitlab.com/phpboyscout/go/redact"
safe := redact.String("failed calling https://user:[email protected]?api_key=sk-abc123…")
// → credentials in the URL userinfo, the api_key query param, and the sk- token are masked
msg := redact.Error(err) // redact.String applied to err.Error() (nil-safe)
if redact.IsSensitiveHeaderKey("Authorization") { /* … redact this header's value … */ }
redact.String は、あらゆるスキーム(https://、postgres://、redis:// など)の URL userinfo、認証情報の name=value 代入、"access_token" や "client_secret" などの JSON 認証情報フィールド、Authorization ヘッダートークン、JWT、よく知られたプロバイダープレフィックス(sk-、ghp_、glpat-、AIza、AKIA、Slack)、および長い不透明トークンを除去します。SensitiveHeaderKeys / IsSensitiveHeaderKey は、値がリダクションされるべきヘッダーを識別します。
パターンカタログが 100% の再現率に達することは決してなく、これは意図的に保守的です:
String は任意のヘッダー値をマスクしません。 Authorization: のみを認識し、X-API-Key: … はそのまま通過します。そのためにヘッダーシンボルが存在します。redact が行わないこと に完全な境界が記載されています。
完全なガイド、リファレンス、脅威モデル: redact.go.phpboyscout.uk。 生成された API ドキュメントと実行可能な例: pkg.go.dev。
LICENSE を参照してください。