应用程序 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 管道:

  1. 提取密钥库机密
  2. 用秘密替换 .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

通过这种方式,只有当管道 运行 在您使用的任何主机代理(虚拟机)上时,您的秘密才会被泄露。