应用程序 JSON 内的 Azure Key Vault 值集成
Azure key Vault value integration inside a JSON of an application
我在 Azure 集群上安装了 Mesosphere DC/OS,运行 tomcat 应用程序作为服务,这些服务是使用 JSON 包含端口和密码的文件配置的应用。我的经理想使用 Azure Key Vault 来存储应用程序的密码和机密,我创建了保险库并将我需要的机密存储在其中。
这是我需要替换的 JSON 值的一部分:
(我只剪切了具有我想从 Vault 中替换的值的字段)
"APP_ACCESS_SERVICE_PASSWORD": "AppPW",
"CASSANDRA_DB_PASSWORD": "App_uat_PW",
"UAMS_ORACLE_PASSWORD": "App_uat_PW",
"PUBLISH_DB_PASSWORD": "ogw",
"App-PUBLISH_DB_PASSWORD": "App_uat1",
"EMP_DB_PASSWORD": "App_uat1",
如何用密钥库中的值替换 JSON 中的密码?我的意思是将 URL 放入密码而不是密码不是一个选项,任何想法我如何将密钥保管库中的值输入 JSON 而不是静态值?
从 Azure 文档中我看到我可以使用 URL 访问这些值,例如:
https://Contoso-Vault2.vault.azure.net/secrets/ExamplePassword
但是使用 URL 而不是值不是一个选项。 (不行)
我假设你有一个管道,但这是你可以做到的。
首先在您想要的密钥保管库中创建您的机密。我已经使用 Python 和 Azure sdk 创建了一个应用程序,它可以让您非常轻松地在密钥库中创建 多个 秘密 - https://github.com/TechyTish/AzurePy/blob/main/create-azure-secrets-README.md
假设您的秘密存储为 (secretName: secretValue):
- 应用访问服务:1234
- 卡桑德拉数据库:hello567
...
等等
#filename: example.json
"APP_ACCESS_SERVICE_PASSWORD": "{#appAccessServicePW#}",
"CASSANDRA_DB_PASSWORD": "{#cassandraDB#}",
"UAMS_ORACLE_PASSWORD": "{#uamsOraclePW#}",
"PUBLISH_DB_PASSWORD": "{#publishDBPW#}",
"App-PUBLISH_DB_PASSWORD": "{#appPublishPW#}",
"EMP_DB_PASSWORD": "{#empDBPW#}",
创建一个包含 2 个任务的 YAML 管道:
- 提取密钥库机密
- 用秘密替换 .json 密钥值
#filename: azure-pipeline.yml
# Azure Key Vault
# Download Azure Key Vault secrets
- task: AzureKeyVault@2
inputs:
connectedServiceName: # Azure subscription - you will need to create an service connection in the repo which has access policies to the keyvault
keyVaultName: # Name of existing key vault
secretsFilter: '*' # Downloads all secrets for the key vault
runAsPreJob: true # Runs before the job starts
在上一个任务下面添加另一个任务。
这将在 .[=57 中查找具有 {# pre-fix 和 #} 后缀的任何键值=] 文件 和此任务后的变量(下方)将用您分配给它的秘密值替换 .json 文件中的值。
#filename: azure-pipeline.yml
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
inputs:
targetFiles: "$(Pipeline.Workspace)/codepath/jsonFileName.json"
encoding: "auto"
writeBOM: true
verbosity: "detailed"
actionOnMissing: "warn"
keepToken: false
tokenPrefix: "{#"
tokenSuffix: "#}"
displayName: Perform variable substitution in json file
- script: echo "$(<folderName/example.json)" #open json file in the terminal to show the changes
#.json value: point to secret name
variables:
appAccessServicePW: $(appAccessService)
cassandraDB: $(cassandraDB)
#....
#etc
运行 管道(勾选调试框)和 .json 文件的输出应该是:
#filename: appsettings.json
"APP_ACCESS_SERVICE_PASSWORD": "1234",
"CASSANDRA_DB_PASSWORD": "hello567"
#....
#etc
通过这种方式,只有当管道 运行 在您使用的任何主机代理(虚拟机)上时,您的秘密才会被泄露。
我在 Azure 集群上安装了 Mesosphere DC/OS,运行 tomcat 应用程序作为服务,这些服务是使用 JSON 包含端口和密码的文件配置的应用。我的经理想使用 Azure Key Vault 来存储应用程序的密码和机密,我创建了保险库并将我需要的机密存储在其中。
这是我需要替换的 JSON 值的一部分: (我只剪切了具有我想从 Vault 中替换的值的字段)
"APP_ACCESS_SERVICE_PASSWORD": "AppPW",
"CASSANDRA_DB_PASSWORD": "App_uat_PW",
"UAMS_ORACLE_PASSWORD": "App_uat_PW",
"PUBLISH_DB_PASSWORD": "ogw",
"App-PUBLISH_DB_PASSWORD": "App_uat1",
"EMP_DB_PASSWORD": "App_uat1",
如何用密钥库中的值替换 JSON 中的密码?我的意思是将 URL 放入密码而不是密码不是一个选项,任何想法我如何将密钥保管库中的值输入 JSON 而不是静态值? 从 Azure 文档中我看到我可以使用 URL 访问这些值,例如: https://Contoso-Vault2.vault.azure.net/secrets/ExamplePassword 但是使用 URL 而不是值不是一个选项。 (不行)
我假设你有一个管道,但这是你可以做到的。
首先在您想要的密钥保管库中创建您的机密。我已经使用 Python 和 Azure sdk 创建了一个应用程序,它可以让您非常轻松地在密钥库中创建 多个 秘密 - https://github.com/TechyTish/AzurePy/blob/main/create-azure-secrets-README.md
假设您的秘密存储为 (secretName: secretValue):
- 应用访问服务:1234
- 卡桑德拉数据库:hello567
... 等等
#filename: example.json
"APP_ACCESS_SERVICE_PASSWORD": "{#appAccessServicePW#}",
"CASSANDRA_DB_PASSWORD": "{#cassandraDB#}",
"UAMS_ORACLE_PASSWORD": "{#uamsOraclePW#}",
"PUBLISH_DB_PASSWORD": "{#publishDBPW#}",
"App-PUBLISH_DB_PASSWORD": "{#appPublishPW#}",
"EMP_DB_PASSWORD": "{#empDBPW#}",
创建一个包含 2 个任务的 YAML 管道:
- 提取密钥库机密
- 用秘密替换 .json 密钥值
#filename: azure-pipeline.yml
# Azure Key Vault
# Download Azure Key Vault secrets
- task: AzureKeyVault@2
inputs:
connectedServiceName: # Azure subscription - you will need to create an service connection in the repo which has access policies to the keyvault
keyVaultName: # Name of existing key vault
secretsFilter: '*' # Downloads all secrets for the key vault
runAsPreJob: true # Runs before the job starts
在上一个任务下面添加另一个任务。 这将在 .[=57 中查找具有 {# pre-fix 和 #} 后缀的任何键值=] 文件 和此任务后的变量(下方)将用您分配给它的秘密值替换 .json 文件中的值。
#filename: azure-pipeline.yml
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
inputs:
targetFiles: "$(Pipeline.Workspace)/codepath/jsonFileName.json"
encoding: "auto"
writeBOM: true
verbosity: "detailed"
actionOnMissing: "warn"
keepToken: false
tokenPrefix: "{#"
tokenSuffix: "#}"
displayName: Perform variable substitution in json file
- script: echo "$(<folderName/example.json)" #open json file in the terminal to show the changes
#.json value: point to secret name
variables:
appAccessServicePW: $(appAccessService)
cassandraDB: $(cassandraDB)
#....
#etc
运行 管道(勾选调试框)和 .json 文件的输出应该是:
#filename: appsettings.json
"APP_ACCESS_SERVICE_PASSWORD": "1234",
"CASSANDRA_DB_PASSWORD": "hello567"
#....
#etc
通过这种方式,只有当管道 运行 在您使用的任何主机代理(虚拟机)上时,您的秘密才会被泄露。