安全
Camel 提供多种形式和级别的安全功能,可用于 Camel 路由。这些不同形式的安全功能可以相互结合使用,也可以单独使用。
提供的大类包括
-
路由安全 - 在路由或路由段上进行的验证和授权服务 -
有效载荷安全 - 在有效载荷层面提供加密/解密服务的数据格式 -
端点安全 - 与组件关联的 endpointUri 可利用组件提供的安全功能 -
配置安全性 - 通过对来自配置文件或外部 Secured Vault 系统的敏感信息进行加密而提供的安全性。
Camel 提供 JSSE 工具,用于配置 Camel 多个组件的 SSL/TLS 相关方面。
路线安全
认证和授权服务
Camel 提供路由策略驱动的安全功能,可将其连接到路由或路由段中。Camel 中的路由策略利用策略模式在 Camel 处理器上应用拦截器。它提供了应用 Camel 路由的交叉关注(如安全、事务等)的能力。
利用路由策略提供身份验证和授权服务的组件有
配置安全
Camel 提供的属性组件可将配置值外部化到属性文件中。这些值可能包含用户名和密码等敏感信息。
Camel 可以使用这些值进行加密和自动解密:
Camel 还支持从外部保险库系统访问安全配置。
使用保险库确保配置安全
Camel 支持以下保险库:
使用 aws vault
要使用 AWS Secrets Manager,需要提供 accessKey、secretKey 和区域。这可以在启动应用程序前使用环境变量来完成:
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 默认凭据提供程序,则需要提供以下环境变量:
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 Secrets 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 Secrets Manager 服务中的秘密名称。
您可以指定一个默认值,以防 AWS Secret Manager 中没有该秘密:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{aws:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,该属性将退回到 "默认 "值。
此外,如果您有一个名为数据库的秘密,您还可以获取该秘密的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个秘密值,例如
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{aws:database/username}}"/>
</route>
</camelContext>
或者将属性作为端点的一部分重新使用。
如果 AWS Secret Manager 中没有特定的秘密字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{aws:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,或者秘密存在,但用户名字段不是秘密的一部分,则属性将回退到 "admin "作为值。
目前我们还没有考虑旋转功能,但这是我们要做的工作。 |
唯一的要求是将 camel-aws-secrets-manager
JAR 添加到 Camel 应用程序中。
使用 GCP 保险库
要使用 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 默认客户端实例,则需要提供以下环境变量:
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 秘密管理器服务中的秘密名称。
您可以指定一个默认值,以防 GCP 秘密管理器中没有该秘密:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,该属性将退回到 "默认 "值。
此外,如果您有一个名为数据库的秘密,您还可以获取该秘密的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个秘密值,例如
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username}}"/>
</route>
</camelContext>
或者将属性作为端点的一部分重新使用。
如果 GCP Secret Manager 中没有特定的秘密字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,或者秘密存在,但用户名字段不是秘密的一部分,则属性将回退到 "admin "作为值。
目前我们还没有考虑旋转功能,但这是我们要做的工作。 |
只有两个要求:- 添加 camel-google-secret-manager
JAR 添加到 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
您也可以在 application.properties
文件中配置证书,例如
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
此时,你可以通过以下方式引用属性:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{azure:route}}"/>
</route>
</camelContext>
其中 route 将是存储在 Azure 密钥保管库服务中的密文名称。
如果 Azure 密钥保管库服务中不存在秘密,可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{azure:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,该属性将退回到 "默认 "值。
此外,如果您有一个名为数据库的秘密表单,您还可以获取该秘密的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个秘密值,例如
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{azure:database/username}}"/>
</route>
</camelContext>
或者将属性作为端点的一部分重新使用。
如果 Azure 密钥库中没有特定的秘密字段,可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{azure:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,或者秘密存在,但用户名字段不是秘密的一部分,则属性将回退到 "admin "作为值。
目前我们还没有考虑旋转功能,但这是我们要做的工作。
唯一的要求是在 Camel 应用程序中添加 camel-azure-key-vault jar。
使用Hashicorp保险库
要使用此功能,您需要将 Hashicorp vault 的凭据作为环境变量提供:
export $CAMEL_VAULT_HASHICORP_TOKEN=token
export $CAMEL_VAULT_HASHICORP_ENGINE=secretKey
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.engine = engine
camel.vault.hashicorp.host = host
camel.vault.hashicorp.port = port
camel.vault.hashicorp.scheme = scheme
此时,你可以通过以下方式引用属性:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:route}}"/>
</route>
</camelContext>
其中 route 将是存储在 Hashicorp Vault 实例中的秘密名称。
如果 Hashicorp Vault 实例中没有秘密,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:route:default}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,该属性将退回到 "默认 "值。
此外,如果您有一个名为数据库的秘密表单,您还可以获取该秘密的特定字段:
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
您可以在路由中获取单个秘密值,例如
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{hashicorp:database/username}}"/>
</route>
</camelContext>
或者将属性作为端点的一部分重新使用。
如果 Hashicorp Vault 实例中没有特定的秘密字段,您可以指定一个默认值:
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{hashicorp:database/username:admin}}"/>
</route>
</camelContext>
在这种情况下,如果秘密不存在,或者秘密存在,但用户名字段不是秘密的一部分,则属性将回退到 "admin "作为值。
此外,还有一种语法可以获取两种方法的特定版本的密文,即指定字段/默认值或仅指定密文:
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:route@2}}"/>
</route>
</camelContext>
这种方法将返回版本为 "2 "的 RAW 路由秘密。
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{hashicorp:route:default@2}}"/>
</route>
</camelContext>
如果路由密文不存在或版本不存在,此方法将返回版本为 "2 "的路由密文值或默认值。
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{hashicorp:database/username:admin@2}}"/>
</route>
</camelContext>
如果数据库秘密不存在或版本不存在,该方法将返回版本为 "2 "的数据库秘密的用户名字段或 admin。
唯一的要求是将 camel-hashicorp-vault jar 添加到您的 Camel 应用程序中。
使用 aws 秘密管理器时,在刷新秘密时自动重新加载骆驼上下文
通过指定常规凭证(与 AWS Secret Manager 属性功能相同),可以在刷新 Secret 时重新加载 Camel 上下文。
环境变量
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(访问密钥)和区域,而不是使用默认的凭据提供链。
要启用自动刷新,还需要设置其他属性:
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
是表示我们要跟踪更新的机密的 regex。
请注意, camel.vault.aws.secrets
并非必填项:如果未指定,负责检查更新事件的任务将考虑带 aws:
前缀的属性。
唯一的要求是在 Camel 应用程序中添加 camel-aws-secrets-manager jar。
使用谷歌秘密管理器时,在刷新秘密时自动重新加载骆驼上下文
可以通过指定常用凭据(与谷歌秘密管理器属性功能相同),在刷新秘密时重新加载 Camel 上下文。
环境变量
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
是表示我们要跟踪更新的机密的 regex。
请注意, camel.vault.gcp.secrets
并非必填项:如果未指定,负责检查更新事件的任务将考虑带 gcp:
前缀的属性。
camel.vault.gcp.subscriptionName
是针对与被跟踪秘密相关的 Google PubSub 主题创建的订阅名称。
这一机制将利用与谷歌秘密管理器相关的通知系统:通过这一功能,每个秘密都可以与一个至十个谷歌 Pubsub 主题相关联。这些主题将接收与秘密生命周期相关的事件。
只有两个要求:- 添加 camel-google-secret-manager
JAR。- 赋予所使用的服务账户在密文管理级别上进行操作的权限(例如,访问密文有效载荷,或作为密文管理器服务的管理员,同时拥有对 Pubsub 服务的权限)
使用蔚蓝密钥库时,在刷新密文时自动重新加载骆驼上下文
在秘密刷新时重新加载 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
是表示我们要跟踪更新的机密的 regex。
其中 camel.vault.azure.eventhubConnectionString
是要从中获取通知的 eventhub 连接字符串, camel.vault.azure.blobAccountName
和 camel.vault.azure.blobAccessKey
是 Azure Eventhub 所需的检查点存储的 Azure Storage Blob 参数。、 camel.vault.azure.blobContainerName
和 camel.vault.azure.blobAccessKey
是 Azure Eventhub 所需的检查点存储的 Azure Storage Blob 参数。
请注意, camel.vault.azure.secrets
并非必填项:如果未指定,负责检查更新事件的任务将考虑带 azure:
前缀的属性。
唯一的要求是在 Camel 应用程序中添加 camel-azure-key-vault jar。