我希望通过Vault-agent-injector 变异 Webhook 注入敏感配置值,从而确保集群中 otel-collector 部署的安全和自动化。我正在使用一个定制的 otel-collector 二进制文件,它与 google Chronicle 转发器一起提供。
https://github.com/observIQ/bindplane-agent/tree/release/v1.49.0/exporter/chronicleexporter
这是我的配置:
exporters:
chronicle:
creds: |
${env.CHRONICLE_JSON}
customer_id: someCustomerId
endpoint: someChronicleEndpoint
log_type: CUSTOM_APPLICATION_ACCESS
debug:
verbosity: detailed
elasticsearch:
api_key: ${env.ES_API_KEY}
endpoints:
- someESEndpoint
password: ${env.ES_PASSWORD}
user: someESuser
elasticsearch/log:
endpoints:
- someESEndpoint
当收集器替换
CHRONICLE_JSON
的值时,我从收集器处收到 unexpected end of input
错误。这是该环境变量的值,敏感值替换为占位符。
{
"type": "service_account",
"project_id": "someProjectID",
"private_key_id": "11111111111111111",
"private_key": "-----BEGIN PRIVATE KEY-----\nsomeCert\n-----END PRIVATE KEY-----\n",
"client_email": "someClientEmail",
"client_id": "111111111111111111111",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "someCertUrl",
"universe_domain": "googleapis.com"
}
我知道此配置有效,因为当我手动运行收集器时,导出器会正确转发。我知道我的 Vault 注释正在工作,如
/vault/secrets/otel-collector
所示,我可以看到我的秘密已正确填充,并且我知道我的容器正在正确获取它们,因为环境变量也已填充。
我认为我在这里格式化的内容不正确,或者不完全理解这种替换是如何工作的。似乎正是这个 JSON 值导致了问题,因为只有硬编码的 JSON 值收集器也可以很好地替换 ES 值。
这是注入器模板的秘密文件的内容,同样带有占位符值:
export ES_API_KEY="someAPIKey"
export ES_PASSWORD="somePassword"
export CHRONICLE_JSON='{
"type": "service_account",
"project_id": "someProjectID",
"private_key_id": "11111111111111111",
"private_key": "-----BEGIN PRIVATE KEY-----\nsomeCert\n-----END PRIVATE KEY-----\n",
"client_email": "someClientEmail",
"client_id": "111111111111111111111",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "someCertUrl",
"universe_domain": "googleapis.com"
}'
我尝试过在一行中格式化 JSON 并转义它等等。但我一生都无法正确替换它。我确实读过 https://github.com/open-telemetry/opentelemetry-collector/issues/5223 但这仍然是一个悬而未决的问题,所以我无法确切地看出我的配置出了什么问题。
如何格式化此环境变量,使其对我的收集器有效?
我最终将 json 作为文件注入,并调整导出器配置以从文件中读取。
vault.hashicorp.com/agent-inject-secret-config.json: "secret/data/development/otel-collector"
vault.hashicorp.com/agent-inject-template-config.json: |
{{`{{- with secret "secret/data/development/otel-collector" -}}`}}
{{`{{ .Data.data.CHRONICLE_JSON }}`}}
{{`{{- end }}`}}
vault.hashicorp.com/agent-inject-secret-envvars: "secret/data/development/otel-collector"
vault.hashicorp.com/agent-inject-template-envvars: |
{{`{{- with secret "secret/data/development/otel-collector" -}}`}}
export ES_PASSWORD="{{`{{ .Data.data.ES_PASSWORD }}`}}"
export ES_API_KEY="{{`{{ .Data.data.ES_API_KEY }}`}}"
{{`{{- end }}`}}
exporters:
chronicle:
creds_file_path: '/vault/secrets/config.json'