7.5. 配置安全性
Camel 提供 Properties 组件将配置值外部化到属性文件。这些值可以包含敏感信息,如用户名和密码。
这些值可由 Camel 加密和自动解密:
Camel 还支持从外部 vault 系统访问安全配置。
7.5.1. 使用 Vault 配置安全性 复制链接链接已复制到粘贴板!
Camel 支持以下 Vault :
7.5.1.1. 使用 AWS Vault 复制链接链接已复制到粘贴板!
要使用 AWS Secret Manager,您需要提供 accessKey、secretKey 和 region。这可以通过在启动应用程序前使用环境变量完成:
export $CAMEL_VAULT_AWS_ACCESS_KEY=accessKey
export $CAMEL_VAULT_AWS_SECRET_KEY=secretKey
export $CAMEL_VAULT_AWS_REGION=region
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.aws.accessKey = accessKey
camel.vault.aws.secretKey = secretKey
camel.vault.aws.region = region
如果要使用 AWS 默认凭证供应商,您需要提供以下 env 变量:
export $CAMEL_VAULT_AWS_USE_DEFAULT_CREDENTIALS_PROVIDER=true
export $CAMEL_VAULT_AWS_REGION=region
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.aws.defaultCredentialsProvider = true
camel.vault.aws.region = region
还可以指定用于访问 AWS Secret Manager 的特定配置集名称
export $CAMEL_VAULT_AWS_USE_PROFILE_CREDENTIALS_PROVIDER=true
export $CAMEL_VAULT_AWS_PROFILE_NAME=test-account
export $CAMEL_VAULT_AWS_REGION=region
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.aws.profileCredentialsProvider = true
camel.vault.aws.profileName = test-account
camel.vault.aws.region = region
此时,您可以使用 aws: 作为 {{ }} 语法中的前缀,以以下方式引用属性:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{aws:route}}"/>
</route>
</camelContext>
其中 route 将是存储在 AWS Secret Manager Service 中的 secret 名称。
如果 AWS Secret Manager 中不存在 secret,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{aws:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在,属性将回退到 "default" 作为值。
另外,如果您有名为 database 的 secret,您可以获取 secret 的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个 secret 值,例如:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{aws:database/username}}"/>
</route>
</camelContext>
或重新使用属性作为端点的一部分。
如果 AWS Secret Manager 上不存在 secret 的特定字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{aws:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在或 secret 存在,但 username 字段不是 secret 的一部分,则属性将回退到 "admin" 作为值。
目前,我们不会考虑轮转功能(如果有的话),而是需要完成的工作。
唯一的要求是将 camel-aws-secrets-manager JAR 添加到 Camel 应用程序。
7.5.1.2. 使用 Google Secret Manager GCP Vault 复制链接链接已复制到粘贴板!
要使用 GCP Secret Manager,您需要提供 serviceAccountKey 文件和 GCP projectId。这可以通过在启动应用程序前使用环境变量完成:
export $CAMEL_VAULT_GCP_SERVICE_ACCOUNT_KEY=file:////path/to/service.accountkey
export $CAMEL_VAULT_GCP_PROJECT_ID=projectId
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.gcp.serviceAccountKey = accessKey
camel.vault.gcp.projectId = secretKey
如果要使用 GCP 默认客户端实例,您需要提供以下 env 变量:
export $CAMEL_VAULT_GCP_USE_DEFAULT_INSTANCE=true
export $CAMEL_VAULT_GCP_PROJECT_ID=projectId
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.gcp.useDefaultInstance = true
camel.vault.aws.projectId = region
此时,您可以使用 gcp: 作为 {{ }} 语法中的前缀,以以下方式引用属性:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route}}"/>
</route>
</camelContext>
其中 route 是存储在 GCP Secret Manager Service 中的 secret 的名称。
如果 GCP Secret Manager 上不存在 secret,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在,属性将回退到 "default" 作为值。
另外,如果您有名为 database 的 secret,您可以获取 secret 的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个 secret 值,例如:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username}}"/>
</route>
</camelContext>
或重新使用属性作为端点的一部分。
如果 GCP Secret Manager 上不存在 secret 的特定字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在或 secret 存在,但 username 字段不是 secret 的一部分,则属性将回退到 "admin" 作为值。
目前,我们不会考虑轮转功能(如果有的话),而是需要完成的工作。
仅有两个要求: - 向您的 Camel 应用程序添加 camel-google-secret-manager JAR。- 提供服务帐户在 secret 管理级别执行的操作(例如,访问 secret 有效负载或作为 secret manager 服务的 admin)
7.5.1.3. 使用 Azure Key Vault 复制链接链接已复制到粘贴板!
要使用此功能,您需要为 Azure Key Vault Service 提供凭证作为环境变量:
export $CAMEL_VAULT_AZURE_TENANT_ID=tenantId
export $CAMEL_VAULT_AZURE_CLIENT_ID=clientId
export $CAMEL_VAULT_AZURE_CLIENT_SECRET=clientSecret
export $CAMEL_VAULT_AZURE_VAULT_NAME=vaultName
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.azure.tenantId = accessKey
camel.vault.azure.clientId = clientId
camel.vault.azure.clientSecret = clientSecret
camel.vault.azure.vaultName = vaultName
或者您可以使用以下方法启用 Azure 身份的使用:
export $CAMEL_VAULT_AZURE_IDENTITY_ENABLED=true
export $CAMEL_VAULT_AZURE_VAULT_NAME=vaultName
您还可以在 application.properties 文件中启用 Azure Identity 的使用,例如:
camel.vault.azure.azureIdentityEnabled = true
camel.vault.azure.vaultName = vaultName
此时,您可以使用以下方法引用属性:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{azure:route}}"/>
</route>
</camelContext>
其中 route 将是存储在 Azure Key Vault Service 中的 secret 名称。
如果 Azure Key Vault Service 上不存在 secret,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{azure:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在,属性将回退到 "default" 作为值。
另外,如果您有这个格式的名为 database 的 secret,您可以获取 secret 的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个 secret 值,例如:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{azure:database/username}}"/>
</route>
</camelContext>
或重新使用属性作为端点的一部分。
如果 Azure Key Vault 上不存在 secret 的特定字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{azure:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在或 secret 存在,但 username 字段不是 secret 的一部分,则属性将回退到 "admin" 作为值。
目前,我们不会考虑轮转功能(如果有的话),而是需要完成的工作。
唯一的要求是将 camel-azure-key-vault jar 添加到 Camel 应用程序。
7.5.1.4. 使用 Hashicorp Vault 复制链接链接已复制到粘贴板!
要使用这个功能,您需要为 Hashicorp vault 提供凭证作为环境变量:
export $CAMEL_VAULT_HASHICORP_TOKEN=token
export $CAMEL_VAULT_HASHICORP_HOST=host
export $CAMEL_VAULT_HASHICORP_PORT=port
export $CAMEL_VAULT_HASHICORP_SCHEME=http/https
您还可以在 application.properties 文件中配置凭证,例如:
camel.vault.hashicorp.token = token
camel.vault.hashicorp.host = host
camel.vault.hashicorp.port = port
camel.vault.hashicorp.scheme = scheme
此时,您可以使用以下方法引用属性:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:secret:route}}"/>
</route>
</camelContext>
其中 route 是存储在 Hashicorp Vault 实例中的机密的名称,存储在 'secret' 引擎中。
如果 secret 不在 Hashicorp Vault 实例中,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:secret:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不在 'secret' 引擎中,则属性将回退到"默认"作为值。
另外,如果您拥有一个名为 database 的 secret,则可以获取 secret 的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个 secret 值,在 'secret' 引擎中,例如:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{hashicorp:secret:database/username}}"/>
</route>
</camelContext>
或重新使用属性作为端点的一部分。
如果 'secret' 引擎中的 Hashicorp Vault 实例中没有 secret 的特定字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{hashicorp:secret:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果 secret 不存在或者 secret 存在(在 'secret' 引擎中),但 username 字段不是 secret 的一部分,则属性将回退到 "admin" 作为值。
另外,还提供了为这两种方法获取 secret 的特定版本的语法,指定了字段/默认值,或仅使用 secret:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:secret:route@2}}"/>
</route>
</camelContext>
此方法将在 'secret' 引擎中返回带有版本 '2' 的 RAW 路由 secret。
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:route:default@2}}"/>
</route>
</camelContext>
如果 secret 不存在或版本不存在,此方法将返回带有版本 '2' 或默认值的路由 secret 值(在 'secret' 引擎中)。
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{hashicorp:secret:database/username:admin@2}}"/>
</route>
</camelContext>
如果 secret 不存在或者版本不存在,此方法将返回数据库 secret 的用户名字段,如果 secret 不存在,或者版本不存在(在 'secret' 引擎中)。
可以在 Secret Refresh 上重新加载 Camel 上下文,可以通过指定常规凭证(与 AWS Secret Manager 属性功能相同)。
使用环境变量:
export $CAMEL_VAULT_AWS_USE_DEFAULT_CREDENTIALS_PROVIDER=accessKey
export $CAMEL_VAULT_AWS_REGION=region
或者作为普通 Camel 主属性:
camel.vault.aws.useDefaultCredentialProvider = true
camel.vault.aws.region = region
或者,通过指定 accessKey/SecretKey 和 region,而不是使用默认的凭证供应商链。
要启用自动刷新,您需要设置其他属性:
camel.vault.aws.refreshEnabled=true
camel.vault.aws.refreshPeriod=60000
camel.vault.aws.secrets=Secret
camel.main.context-reload-enabled = true
其中 camel.vault.aws.refreshEnabled 将启用自动上下文重新加载,camel.vault.aws.refreshPeriod 是更新事件的两个不同检查和 camel.vault.aws.secrets 是一个正则表达式,代表我们要跟踪的 secret。
请注意,camel.vault.aws.secrets 不是强制的:如果没有指定负责检查更新事件的任务,则会考虑帐户或使用 aws: 前缀的属性。
唯一的要求是将 camel-aws-secrets-manager jar 添加到 Camel 应用程序。
另一种选择是将 AWS EventBridge 与 AWS SQS 服务一起使用。
在 AWS 端,需要创建以下资源:
- 一个 AWS Couldtrail trail
- AWS SQS Queue
- 以下类型的 Eventbridge 规则
{
"source": ["aws.secretsmanager"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["secretsmanager.amazonaws.com"]
}
}
此规则将过滤与 AWS Secret Manager 相关的事件
- 您需要为 Eventbridge 规则将 Rule 目标设置为 AWS SQS Queue
- 您需要授予 Eventbrige 规则的权限,以便在上述 SQS Queue 上写入。要做到这一点,您需要定义 json 文件,如下所示:
{
"Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"<queue_arn>/SQSDefaultPolicy\",\"Statement\":[{\"Sid\": \"EventsToMyQueue\", \"Effect\": \"Allow\", \"Principal\": {\"Service\": \"events.amazonaws.com\"}, \"Action\": \"sqs:SendMessage\", \"Resource\": \"<queue_arn>\", \"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"<eventbridge_rule_arn>\"}}}]}"
}
更改 queue_arn 和 eventbridge_rule_arn 的值,使用 policy.json 名称保存文件,并使用 AWS CLI 运行以下命令
aws sqs set-queue-attributes --queue-url <queue_url> --attributes file://policy.json
其中 queue_url 是刚才创建的 Queue 的 AWS SQS Queue URL。
现在,您应能够在 Camel 端设置配置。要启用 SQS 通知添加以下属性:
camel.vault.aws.refreshEnabled=true
camel.vault.aws.refreshPeriod=60000
camel.vault.aws.secrets=Secret
camel.main.context-reload-enabled = true
camel.vault.aws.useSqsNotification=true
camel.vault.aws.sqsQueueUrl=<queue_url>
其中 queue_url 是刚才创建的 Queue 的 AWS SQS Queue URL。
每当发生名为 'Secret' 的 Secret 的 PutSecretValue 事件时,信息将在 AWS SQS Queue 中排队,并在 Camel 端消耗一个上下文重新加载。
可以在 Secret Refresh 上重新加载 Camel 上下文,可以通过指定常规凭证(与 Google Secret Manager 属性功能相同)。
使用环境变量:
export $CAMEL_VAULT_GCP_USE_DEFAULT_INSTANCE=true
export $CAMEL_VAULT_GCP_PROJECT_ID=projectId
或者作为普通 Camel 主属性:
camel.vault.gcp.useDefaultInstance = true
camel.vault.aws.projectId = projectId
或者指定服务帐户密钥文件的路径,而不是使用默认实例。
要启用自动刷新,您需要设置其他属性:
camel.vault.gcp.projectId= projectId
camel.vault.gcp.refreshEnabled=true
camel.vault.gcp.refreshPeriod=60000
camel.vault.gcp.secrets=hello*
camel.vault.gcp.subscriptionName=subscriptionName
camel.main.context-reload-enabled = true
其中 camel.vault.gcp.refreshEnabled 将启用自动上下文重新加载,camel.vault.gcp.refreshPeriod 是更新事件的两个不同检查和 camel.vault.gcp.secrets 是代表我们要跟踪更新的 secret 的时间间隔。
请注意,camel.vault.gcp.secrets 不是强制的:如果没有指定负责检查更新事件的任务,则会考虑帐户或带有 gcp: 前缀的属性。
camel.vault.gcp.subscriptionName 是与跟踪的 secret 关联的 Google PubSub 主题创建的订阅名称。
当使用与 Google Secret Manager 相关的通知系统时,此机制:通过此功能,每个 secret 最多可以与 10 个 Google Pubsub Topic 关联。这些主题将收到与 secret 生命周期相关的事件。
只有两个要求: - 向您的 Camel 应用程序添加 camel-google-secret-manager JAR。- 提供服务帐户在 secret 管理级别执行的操作(例如,访问 secret 有效负载,或作为 secret manager 服务的 admin,对 Pubsub 服务具有权限)
可以在 Secret Refresh 上重新加载 Camel 上下文,可以通过指定常规凭证(与 Azure Key Vault 属性功能相同)进行。
使用环境变量:
export $CAMEL_VAULT_AZURE_TENANT_ID=tenantId
export $CAMEL_VAULT_AZURE_CLIENT_ID=clientId
export $CAMEL_VAULT_AZURE_CLIENT_SECRET=clientSecret
export $CAMEL_VAULT_AZURE_VAULT_NAME=vaultName
或者作为普通 Camel 主属性:
camel.vault.azure.tenantId = accessKey
camel.vault.azure.clientId = clientId
camel.vault.azure.clientSecret = clientSecret
camel.vault.azure.vaultName = vaultName
如果要将 Azure Identity 与环境变量搭配使用,您可以使用以下方法进行:
export $CAMEL_VAULT_AZURE_IDENTITY_ENABLED=true
export $CAMEL_VAULT_AZURE_VAULT_NAME=vaultName
您还可以在 application.properties 文件中启用 Azure Identity 的使用,例如:
camel.vault.azure.azureIdentityEnabled = true
camel.vault.azure.vaultName = vaultName
要启用自动刷新,您需要设置其他属性:
camel.vault.azure.refreshEnabled=true
camel.vault.azure.refreshPeriod=60000
camel.vault.azure.secrets=Secret
camel.vault.azure.eventhubConnectionString=eventhub_conn_string
camel.vault.azure.blobAccountName=blob_account_name
camel.vault.azure.blobContainerName=blob_container_name
camel.vault.azure.blobAccessKey=blob_access_key
camel.main.context-reload-enabled = true
其中 camel.vault.azure.refreshEnabled 将启用自动上下文重新加载,camel.vault.azure.refreshPeriod 是更新事件的两个不同检查和 camel.vault.azure.secrets 是代表我们要跟踪更新的 secret 的时间间隔。
其中 camel.vault.azure.eventhubConnectionString 是 eventhub 连接字符串,从 camel.vault.azure.blobAccountName,camel.vault.azure.blobContainerName 和 camel.vault.azure.blobAccessKey 获取通知,用于 Azure Eventhub 所需的检查点存储。
请注意,camel.vault.azure.secrets 不是强制的:如果没有指定负责检查更新事件的任务,则会考虑帐户或带有 azure: 前缀的属性。
唯一的要求是将 camel-azure-key-vault jar 添加到 Camel 应用程序。