2017-11-27 1 views
2

私はZapロガーを使用しています。ログに記録される情報を制限したいのですが、例えば、私は、コードスニペットログに印刷の秘密を表示しない

func (m *mountCommand) Execute(args []string) error { 

    filelogger.Info("First log", zap.Strings("input args", args)) 

の下にあり、どのように私はちょうどによるログに追加取得からキーアクセスおよび秘密鍵の値を防ぐん

{"level":"info","ts":"2017-11-16T10:04:40.225Z","msg":"First log","input args":["/var/lib/kubelet/pods/74785895-cab5-11e7-88ed-ce1c8b57856c/volumes/xyz-xandndnd", 
    "{\"kubernetes.io/secret/access-key\":\"Qdfnnfbbdnsjnxni8ehh=\",\"kubernetes.io/secret/secret-key\":\"GGHNHwsffUIJMNBNBVV==\", 
\"parallel-count\":\"5\",\"region\":\"iam-standard\"}"]} 

以下のようにログ出力がありますデータの感度

私は、zapオブジェクトを使用する前にこれらの内容を削除できるように、Goで多くの文字列操作関数を試しました。これを単純な関数で単純な方法で行うのは簡単ではないようです。

答えて

2

あなたの現在のargsは、以下のstring秒のスライスです:

/var/lib/kubelet/pods/74785895-cab5-11e7-88ed-ce1c8b57856c/volumes/xyz-xandndnd 
{"kubernetes.io/secret/access-key":"Qdfnnfbbdnsjnxni8ehh=","kubernetes.io/secret/secret-key":"GGHNHwsffUIJMNBNBVV==","parallel-count":"5","region":"iam-standard"} 

セキュリティに敏感なデータが含まれている入力引数がインデックス1であり、そしてそれがJSONテキストです。

JSONテキストを「文字列操作する」べきではありません。まず、Go値に非整列化して操作し、整列化して戻します。

// Make a copy of args: 
args2 := append([]string{}, args...) 

// Unmarshal: 
var m map[string]interface{} 
if err := json.Unmarshal([]byte(args2[1]), &m); err != nil { 
    panic(err) 
} 

// Modify: 
m["kubernetes.io/secret/access-key"] = "XXX" 
m["kubernetes.io/secret/secret-key"] = "YYY" 

// Marshal: 
s2, err := json.Marshal(m) 
if err != nil { 
    panic(err) 
} 
args2[1] = string(s2) 

// Verify: 
fmt.Println(args2[1]) 

// Now use args2 to log 
filelogger.Info("First log", zap.Strings("(masked) input args", args2)) 

「を確認します:」

これは、これを行う方法で、明らかに必要とされていない私たちは結果を見ることのために、それだけです。 Go Playgroundの出力:あなたのソリューションで

{"kubernetes.io/secret/access-key":"XXX","kubernetes.io/secret/secret-key":"YYY","parallel-count":"5","region":"iam-standard"} 

あなたはまた、実行時のパニックを避けるために、スライスインデックスのチェックを追加する必要があります。

関連する問題