密钥管理
管理密钥很困难,理想情况下密钥应该安全存储,需要有严格的访问控制,并且应定期轮换。市场上有许多专门解决处理密钥问题的密钥管理器。通过利用这些解决方案,GoCD 提供了插件端点以查找在外部密钥管理器中定义的密钥。这为 GoCD 用户提供了使用其选择的密钥管理器来存储和管理密钥的灵活性。
在任何时候,外部密钥都不会存储在 GoCD 中,这些密钥仅在需要时进行查找,例如,如果作业配置为使用外部密钥,则在作业分配给代理之前会查找这些密钥并安全地传输到代理。
如何在 GoCD 中使用外部密钥
第一步 - 安装 Secrets 插件
要从外部密钥管理器中查找密钥,您需要安装支持您选择的密钥管理器的密钥插件。可以找到可用的密钥插件列表在这里.
GoCD 捆绑了一个加密并将在文件上存储密钥的密钥插件。有关基于文件的密钥插件的更多信息,请参考文档.
第二步 - 配置 Secret Manager
应该配置一个密钥管理器以查找密钥。可以使用密钥配置来配置密钥管理器,此配置特定于插件,并会根据所用插件的不同而有所不同。
配置密钥管理器的步骤,以下示例使用捆绑的基于文件的密钥插件,
-
登录到您的 GoCD 服务器。
-
前往管理菜单 →密钥管理.
-
点击
Add
按钮。 -
输入密钥配置的唯一 ID。在 GoCD 配置中使用密钥时将引用此 ID。
-
在插件下拉菜单中选择支持您选择的密钥管理器的插件。一旦选择了插件,下面将显示适当的配置。
-
提供 GoCD 服务器上密钥文件的路径。
The 密钥文件插件的文档包含有关如何生成密钥文件和管理密钥的信息。
第三步 - 限制 Secrets Manager 的使用
可能会出现管理员希望限制对密钥管理器或密钥管理器中定义的密钥的使用的情况。例如,限制生产密钥只能用于特定管道或环境。GoCD 允许管理员通过Allow
或Deny
规则来控制密钥管理器的使用。规则为密钥管理器定义了严格的访问控制。
- 用户可以定义两种类型的规则
-
Allow
- 明确允许密钥管理器被某个 GoCD 实体使用。<allow type="pipeline_group" action="refer">my_first_pipeline</allow>
-
Deny
- 明确拒绝密钥管理器被某个 GoCD 实体使用。<deny type="environment" action="refer">resource_identifier</deny>
-
规则具有以下属性,
属性 | 描述 |
---|---|
类型 | 此属性表示 GoCD 配置实体的类型。可以是其中之一environment , pipeline_group , pluggable_scm , package_repository 或cluster_profile 。要表示任何实体类型,使用通配符(*). |
操作 | 此属性表示对密钥配置允许的动作,目前唯一的允许动作是refer . |
资源 | 资源名称。例如,当type = environment . |
-
默认情况下,如果没有定义规则,那么没有任何 GoCD 实体会有权访问密钥管理器。因此,密钥管理器将不可用。
第四步 - 定义 Secret Params
配置密钥管理器后,您需要定义一个密钥参数以从外部密钥管理器中查找密钥。
密钥参数的语法是:{{SECRET:[secret_config_id][secret_key]}}
其中,
secret_config_id
: 是创建密钥配置时提供的唯一 ID。secret_key
: 是指向您外部密钥管理器中存储的密钥值的键。
添加一个密钥参数
当前,GoCD 允许在以下位置添加密钥参数,
-
SCM 材料的密码字段
-
环境变量的值字段。
-
可插拔 SCM 的任何配置字段
-
包存储库的任何配置字段
-
包的任何配置字段
-
集群配置文件的任何配置字段
-
弹性代理配置文件的任何配置字段
在上述位置以外定义的密钥参数将被忽略并视为字符串。
密钥参数解析
外部密钥管理器中的密钥永远不会存储在 GoCD 中,因此密钥参数在需要时才会解析。
- 在 SCM 材料中定义为密码的密钥参数在材料被更新时立即解析。
- 定义为环境变量的密钥参数在将工作分配给代理之前解析。
- 在可插拔 SCM、包存储库和包中定义的密钥参数将在
- 检查连接时解析
- 配置保存/验证时解析
- 对于插件和包材料,密钥参数在被更新之前解析
- 在弹性配置中定义的密钥参数将在
- 配置保存/验证时解析
- 在 GoCD 向弹性代理插件发出请求之前解析密钥参数。只有当消息中有集群配置文件和弹性代理配置文件的请求时,才会解析密钥参数。
如果 Secret Param 解析失败,相应的任务也会失败。这可能导致作业失败或材料更新失败。
更多关于规则的内容
-
访问 Secrets Manager 时遵循限制性模型。在没有规则的情况下,默认情况下 Secret Manager 不可访问。
示例中定义的秘密配置无法被 GoCD 中的任何实体引用。
<secretConfig id='teamA_secrets' pluginId='vault_based_plugin'> <description>All secrets for env1</description> <configuration> ... </configuration> <rules/> </secretConfig>
-
通配符(*)在类型:
使用通配符(*)对于类型意味着给定规则适用于所有实体类型。在这种情况下,支持的实体是
pipeline_group
,environment
,pluggable_scm
,package_repository
和cluster_profile
.在给定示例中,具有指定名称的支持实体可以引用 Secret 配置。
production
.<rules> <allow type="*" action="refer">production</allow> </rules>
注意:
type
可以使用通配符(*
),但它不支持模式匹配,例如pipe*
. -
通配符(*)在操作:
使用通配符(*)对于操作意味着给定规则适用于 Secret Config 的任何操作。目前
refer
是唯一支持的操作。注意:
action
可以使用通配符(*
),但它不支持模式匹配,例如ref*
. -
通配符(*)在资源:
资源名称支持通配符字符‘?’和‘*’,分别表示单个或多个(零个或更多)通配符字符。
通配符匹配器 资源名称 *_group
匹配 my_group
和someother_group
,但不匹配testgroup
或group1
.Production_*
匹配 Production_Team_A
和Production_Team_B
但不匹配Team_ABC_Production_D
.*group*
匹配 group
,my_group
和group_A
,但不匹配groABCup
.Team_?_group
匹配 Team_A_group
,Team_B_group
但不匹配Team_ABC_group
或Team__group
. -
当定义了多条规则时,规则将从上到下依次应用。
在下面的示例中,pipeline_group
my_group
无法引用 secret_config,因为第一条规则使用模式拒绝了访问。my_*
<rules> <deny action="refer" type="pipeline_group">my_*</deny> <allow action="refer" type="pipeline_group">my_group</allow> </rules>
在下面的示例中,pipeline_group
my_group
可以引用 secret_config,因为第一条规则允许访问。<rules> <allow action="refer" type="pipeline_group">my_group</allow> <deny action="refer" type="pipeline_group">*</deny> </rules>
-
规则在秘密查找期间应用。如果实体没有访问 Secret Manager 所需的权限,查找将失败。查找失败会导致作业失败或材料更新失败,具体取决于 secret param 的定义位置。