用户名模板

一些为外部系统生成动态用户的机密引擎允许 Vault 操作员定制如何生成关联的外部系统中的用户名。此自定义功能使用了 Go 模板语言。本节描述了使用这些模板生成用户名的基础知识,但没有深入使用模板语言进行更高级的用法。请参阅对应机密引擎的 API 文档,以确定它是否支持用户名模板,以及在该引擎上使用用户名模板的更多详细信息。

在定制用户名的生成方式时,请注意确保有足够的随机性以确保唯一性,否则创建凭据的多次调用可能会相互干扰。

除了内置在 Go 模板语言中的功能外,还有许多附加功能可用:

可用函数

操作字符串与字符的函数

lowercase——将输入值转小写 样例:{{.FieldName | lowercase}}

replace——在输入值中寻找并替换指定字符串 样例:{{.FieldName | replace - _}}

truncate——将输入值截断至指定长度 样例:{{.FieldName | truncate 10}}

truncate_sha256——将输入值截断为指定的字符数,得到的新值的最后 8 个字符将被截断字符的 SHA256 哈希码的前 8 个字符替换。 样例:{{.FieldName | truncate_sha256 20}}。如果FieldName的值是abcdefghijklmnopqrstuvwxyz,在第 12 个字符 l 之后的字符都会被删除,剩下的部分会被计算 SHA256 哈希码,得到872808ffbf...1886ca6f20。哈希码的头 8 个字符,也就是872808ff会被拼接到原来的 12 子字母之后,得到的结果就是abcdefghijkl872808ff

uppercase——将输入值转为大写 样例:{{.FieldName | uppercase}}

生成值的函数

random——从小写字母、大写字母和数字生成随机字符串。必须包含一个数字来指定要生成的长度。 样例:{{random 20}} 生成20位长的随机字符串

timestamp——当前的时间戳,后面的参数必须以 Go 语言的时间库规定的格式提供时间格式模板 样例:{{timestamp "2006-01-02T15:04:05Z"}}

unix_time——当前的 unix 时间戳(从 1970 年 01 月 01 日起到当前时间的秒数) 样例:{{unix_time}}

unix_time_millis——毫秒计数的当前 unix 时间戳 样例:{{unix_time_millis}}

uuid——生成一个随机的 UUID 样例:{{uuid}}

哈希函数

base64——将输入值进行 Base64 编码 样例:{{.FieldName | base64}}

sha256——计算输入值的 SHA256 哈希码 样例:{{.FieldName | sha256}}

例子

不同的机密引擎为模板提供了不同的数据集。有关提供给模板的值的详细信息,请参阅相关的机密引擎的文档。下面的示例以 Database 机密引擎的数据为模型,但是从给定引擎提供的特定字段可能与这些示例不同。此外,假设当前的时间是 2009-02-13 11:31:30PM GMT(unix 时间戳:1234567890),随机字符集是有序的英文字母表:abcdefghijklmnopqrstuvwxyz

请注意,{{}}之间的空格是可选的,例如,{{.DisplayName}}{{ .DisplayName }}是等价的。

下表是我们例子中将会读到的字段的值:

字段名
DisplayName token-with-display-name
RoleName my_custom_database_role

要引用这些字段中的任何一个,请在字段名称前面加上.{{.DisplayName}}。本文所述的函数前面不加.{{random 20}}

基本例子

模板:

{{.DisplayName}}_{{.RoleName}}

生成的用户名是:

token-with-display-name_my_custom_database_role

这是引用提供给模板的两个字段的基本示例。简单来说,这是一个简单的字符串替换。

此示例没有任何随机性,不应在生成动态用户名时使用。目的是演示在 Go 模板语言中引用数据。

定制函数例子

模板:

FOO_{{.DisplayName | replace "-" "_" | uppercase}}_{{.RoleName | replace "-" "_" | uppercase}}_{{timestamp "2006_01_02T15_04_05Z" | replace "-" "_"}}

生成的用户名:

FOO_TOKEN_WITH_DISPLAY_NAME_MY_CUSTOM_DATABASE_ROLE_2009_02_13T11_31_30Z_0700

{{.DisplayName | replace "-" "_" | uppercase}}——将显示名中所有的折线替换成下划线,然后转为大写字母。 {{.RoleName | replace "-" "_" | uppercase}}——将角色名中所有的折线替换成下划线,然后转为大写字母。 {{timestamp "2006_01_02T15_04_05Z" | replace "-" "_"}}——使用2006_01_02T15_04_05Z这样的格式生成当前时间的时间戳,并将所有的折线替换成下划线。

截断至最大长度的例子

模板:

{{printf "v_%s_%s_%s_%s" (.DisplayName | truncate 8) (.RoleName | truncate 8) (random 20) (unix_time) | truncate 45}}

生成的用户名:

v_token-wi_my_custo_abcdefghijklmnopqrst_1234

.DisplayName | truncate 8:将展示名截断到8位长度(token-wi)。 .RoleName | truncate 8:将角色名截断到8位长度(my_custo)。 random 20:生成的 20 位长的随机字符串(假设是abcdefghijklmnopqrst)。 unix_time:生成当前是时间距离 1970 年 01 月 01 日零时的秒数(1234567890)

上面的每个值都被传递给了 printf "v_%s_%s_%s_%s" ,在它们前面加上 v_ 并在每个字段之间放置一个下划线,到这里为止生成了 v_token-wi_my_custo_abcdefghijklmnopqrst_1234567890。然后将此值传递给 truncate 45,其中最后 6 个字符被删除,得到 v_token-wi_my_custo_abcdefghijklmnopqrst_1234

results matching ""

    No results matching ""