使用AWS参数存储的机密管理器
psyml的Python项目详细描述
心理符号
yml文件的生命周期
用户将准备一个如下所示的yml文件:
path:/apps/superman/region:us-east-1kmskey:alias/supermantags:cost_center:team17project:supermanparameters:-name:api_versiondescription:The version of the API endpoint, not a secret.type:Stringvalue:2-name:api_tokendescription:The token used to communicate with the API endpoint, typically a secrettype:SecureStringvalue:5a5468-786448467a59-326436
注意这里所有的秘密都是纯文本的。为了将其保存到我们的代码库中,我们将文件另存为superman.nonprod.yml
,从命令行登录到我们的AWS帐户,然后运行:
psyml encrypt superman.nonprod.yml
这将生成一个如下所示的文件:
^{pr2}$请注意,我们添加了一个名为encrypted_with
的额外字段,它是用于加密机密的KMS密钥(alias/psyml
)的当前id。此外,参数的类型被更改为小写字符。在
这个yml文件的维护应该不会太困难。如果需要添加配置,只需将其添加到yml文件中即可。如果需要添加机密,请将映射添加到参数中,确保值为明文,类型为SecureString
。之后,再次运行psyml encrypt filename.yml
,这次,psyml将忽略所有加密的参数,只使用encrypted_with
中的keyid对新参数进行加密。要删除条目,请先删除参数存储中的相关条目,然后再删除yml文件中的映射,这不是因为我们有任何依赖关系,而是因为很容易忘记清理过程。在
过程中使用的密钥
我们在这个工具中专门用了一个单独的部分来介绍KMS的使用,因为它确实可能有点混乱。在
为了清楚起见,我们使用了两组密钥,一组(alias/psyml
)只用于本地加密,这样我们的秘密就可以安全地保存到我们的代码库中。另一个KMS密钥由用户在yml文件的kmskey
字段中指定,用于实际的参数存储加密。因此,当我们运行psyml encrypt
时,我们将使用alias/psyml
对值进行加密。当我们运行psyml decrypt
时,我们仍将使用alias/psyml
来解密这些值。但是在psyml save
中,我们将首先使用alias/psyml
来解密内存中的值,然后使用kmskey
来进行参数存储上载。在
密钥alias/psyml
是在每个帐户中创建的,我们使用这个密钥加密yaml文件中的所有机密。此密钥不会用于ssm中的参数加密。我们不会为每个区域创建一个CMK,因为这是不必要的。这个键的默认区域是Sydney(ap-southeast-2
),因为我们在澳大利亚,您可以通过将环境变量PSYML_KEY_REGION
设置为us-east-2
来改变这种行为。如果您不喜欢我们的别名,也可以使用环境变量PSYML_KEY_ALIAS
将其设置为其他值。在
在这个工具中,当我们第一次运行encrypt
并且没有alias/psyml
键时,该工具将尝试为您创建它。请注意,由于权限问题,这可能会失败,如果是这种情况,请使用更强大的角色设置密钥和别名。在
所有可用行动的简短简介
命令行语法如下:
psyml [action] filename.yml
,其中action可以是:
- 在
在encrypt
:用默认kms密钥(alias/psyml
)加密yml文件。在 - 在
在save
:使用指定的KMS键将参数保存到参数存储中。在 - 在
在nuke
:删除yml文件中指定的所有参数存储项。在 - 在
在decrypt
:解密yml文件并将输出写入stdout。在 - 在
在refresh
:使用当前的alias/psyml
加密yml文件。在 - 在
在export
:导出所有变量,以便可以对其进行源代码。在 - 在
在diff
:将参数存储中的参数与本地版本进行比较。在 - 在
在sync
:更新参数存储中的参数,使其与yml同步。在
已知限制
- 有些命令(
diff
/sync
)尚未实现。在 - 尚不支持参数存储类型
StringList
。在 - 我们正在使用KMS服务,请在继续之前检查the KMS pricing page。在
- 项目
标签: