Skip to content

機密データフィルタリング

DD は機密データの自動フィルタリングを組み込みで提供し、ログ書き込み前にパスワード、API Key、クレジットカード番号などの機密情報を [REDACTED] に置換し、機密データがログに漏洩するのを防ぎます。

クイック有効化

go
logger, err := dd.New(dd.Config{
    Security: dd.DefaultSecurityConfig(),
})
if err != nil {
    log.Fatal(err)
}
defer logger.Close()

// password フィールドは自動マスキング
logger.InfoWith("ユーザーログイン",
    dd.String("username", "alice"),
    dd.String("password", "s3cr3t123"),    // 出力:password=[REDACTED]
)

組み込みフィルタリングパターン

DefaultSecurityConfig() は基本フィルタリングを有効にし、以下の機密情報をカバーします:

カテゴリマッチ対象
パスワードpasswordpasswdpwd などのフィールド
API Keyapi_keyapikeyaccess_token など
クレジットカードVisa、MasterCard などのカード番号フォーマット
SSN米国社会保障番号フォーマット
電話番号グローバル電話番号フォーマット(国際フォーマット含む)

DefaultSecureConfig()完全パターンセットを使用します(基本全パターンを含み、さらに以下の一般的なカテゴリを追加):

カテゴリマッチ対象
メールアドレスemail アドレスフォーマット
IP アドレスIPv4/IPv6 アドレス
JWT TokeneyJ で始まる JWT フォーマット
接続文字列データベース接続文字列内のパスワード

パターンカバー範囲

上表は一般的なカテゴリの例のみです。DefaultSecurityConfig() は実際に約 36 パターンを内蔵し、業界プリセット(HealthcareConfig() など)は 71 パターンに達し、AWS キー、Stripe/GitHub/Slack トークン、IBAN、複数国の税務番号、Log4Shell などもカバーします。完全なパターンセットはソースコード internal/patterns.go を参照してください。

カスタムフィルタリングパターン

カスタムパターンの追加

go
filter := dd.NewEmptySensitiveDataFilter()

// カスタム正規表現パターンを追加(組み込み ReDoS 防護付き)
_ = filter.AddPattern(`(?i)credit_card\s*[:=]\s*\d+`)
_ = filter.AddPattern(`(?i)phone\s*[:=]\s*\d{11}`)

logger, err := dd.New(dd.Config{
    Security: &dd.SecurityConfig{
        SensitiveFilter: filter,
    },
})
if err != nil {
    log.Fatal(err)
}
defer logger.Close()

ゼロからカスタムフィルターを作成

go
filter, err := dd.NewCustomSensitiveDataFilter(
    `(?i)secret_key\s*[:=]\s*\S+`,
    `(?i)private_token\s*[:=]\s*\S+`,
)
if err != nil {
    log.Fatal(err) // 正規表現の安全性検証に失敗
}

ReDoS 防護

NewCustomSensitiveDataFilter は組み込みの ReDoS 検証を含みます。正規表現に破滅的バックトラックのリスクがある場合、エラーが返されます。非貪欲マッチとアンカーパターンを使用してこの問題を回避してください。

セキュリティレベル

DD は 5 つのセキュリティレベルを提供し、各レベルに対応するプリセット設定があります:

go
// レベルで設定を取得
cfg := dd.SecurityConfigForLevel(dd.SecurityLevelStandard)
レベル説明適用シナリオ
SecurityLevelDevelopment最も緩やかローカル開発
SecurityLevelBasic基本フィルタリングテスト環境
SecurityLevelStandard標準フィルタリング一般的な本番環境
SecurityLevelStrict厳格フィルタリング高セキュリティ要件
SecurityLevelParanoid最も厳格金融/医療などの機密業界

業界コンプライアンスプリセット

DD は 3 種類の業界コンプライアンス設定を提供します:

HIPAA(医療業界)

go
cfg := dd.HealthcareConfig()

追加フィルタリング:ICD-10 コード、病历番号 (MRN)、健康保険請求番号 (HICN)、患者識別番号。

PCI-DSS(金融決済)

go
cfg := dd.FinancialConfig()

追加フィルタリング:SWIFT コード、IBAN 口座番号、CVV/CVC、銀行ルーティング番号。

政府基準

go
cfg := dd.GovernmentConfig()

追加フィルタリング:パスポート番号、運転免許番号、税務 ID、SSN バリアント。

完全な例

go
// 医療システム:HIPAA 準拠設定を使用
logger, err := dd.New(dd.Config{
    Format:   dd.FormatJSON,
    Security: dd.HealthcareConfig(),
    Targets: []dd.OutputTarget{
        dd.FileOutput("logs/hipaa-audit.json"),
    },
})
if err != nil {
    log.Fatal(err)
}
defer logger.Close()

// 機密情報を含むログメッセージは自動マスキング
logger.Info("患者記録 mrn=MRN123456 diagnosis=J18.9 が更新されました")
// メッセージ内の MRN と ICD-10 コードがパターンにマッチするとマスキングされる

// 構造化フィールドはキー名の機密度に基づいてフィルタリング
logger.InfoWith("ユーザーログイン",
    dd.String("password", "s3cr3t123"),    // → [REDACTED](キー名が機密)
    dd.String("department", "内科"),         // 正常に出力
)

フィルタリング統計

フィルターの動作状況をモニタリング:

go
filter := dd.NewSensitiveDataFilter()
stats := filter.GetFilterStats()
fmt.Printf("アクティブ goroutines: %d\n", stats.ActiveGoroutines)
fmt.Printf("フィルタリングパターン数:%d\n", stats.PatternCount)
fmt.Printf("総マスキング回数:%d\n", stats.TotalRedactions)
fmt.Printf("タイムアウト回数:%d\n", stats.TotalTimeouts)

フィルタリングの無効化

go
// Development セキュリティレベルを使用(機密データフィルタリングなし)
logger, err := dd.New(dd.Config{
    Security: dd.SecurityConfigForLevel(dd.SecurityLevelDevelopment),
})
if err != nil {
    log.Fatal(err)
}

// または SensitiveFilter を手動で nil に設定
logger, err = dd.New(dd.Config{
    Security: &dd.SecurityConfig{
        SensitiveFilter: nil,
    },
})
if err != nil {
    log.Fatal(err)
}
defer logger.Close()

デフォルトでフィルタリングが有効

DefaultConfig() はデフォルトで基本機密データフィルタリング(DefaultSecurityConfig())が有効です。Security フィールドを設定しない場合も、デフォルトのセキュリティ設定が使用されます。フィルタリングを無効にするには、明示的に SensitiveFilternil に設定する必要があります。

次のステップ