用户名模板
一些为外部系统生成动态用户的机密引擎允许 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
。