因此,我们有一个用例,我们希望使用 opentelemetry 转换处理器中的 replace_pattern 来替换日志中的密码,方法是保留第一个和最后一个字符,但将其间的所有其他字符替换为“*”。
这允许开发人员确保秘密是他们期望的长度(并且是有效的秘密),但无需完全记录整个秘密。
我们如何使用下面的函数来获取日志行以仅替换除第一个和最后一个字符之外的字符串?
日志行示例:
mysecret=123-456-789&nextvariable
期望的结果:
mysecret=1*********9&nextvariable
功能:
replace_pattern(target, regex, replacement, Optional[function], Optional[replacementFormat])
最安全的方法可能是使用基于
string
的秘密类型(例如密码),但它会混淆任何使用 Stringer
接口的尝试,同时提供用于检索底层秘密的替代机制值,例如:
package secret
type String string
func (s String) String() string {
switch {
case len(s) < 3:
return "***"
default:
return string(s[0:1]) + strings.Repeat("*", len(string(s))-2) + string(s[len(s)-1:len(s)])
}
}
func (s String) Exposed() string {
return string(s)
}
你如何处理长度的秘密<= 3 is up to you; the above is just an example, not necessarily production-ready。
在使用中,变量被声明为
secret.String
类型(因为 String
类型位于名为 secret
的包中);如果有意或无意地传递到使用 Stringer
获取字符串值的记录器或其他区域(例如,在您的用例中,opentelemetry 元数据),它们将得到混淆的结果。
如果您需要 real 值,则可以使用
Exposed
方法显式公开秘密:
func Connect(uid string, pwd secret.String) error {
dbc := &Client{
User: uid,
Password: pwd.Exposed(),
}
log.Infof("connecting to db as %s:%s", uid, pwd)
return dbc.Connect()
}
上面显然不是“真正的代码”,只是一个说明。