这是用户在 2024-3-28 22:01 为 https://camel.apache.org/manual/security.html 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

 安全


Camel 提供多种形式和级别的安全功能,可用于 Camel 路由。这些不同形式的安全功能可以相互结合使用,也可以单独使用。


提供的大类包括


  • 路由安全 - 在路由或路由段上进行的验证和授权服务


  • 有效载荷安全 - 在有效载荷层面提供加密/解密服务的数据格式


  • 端点安全 - 与组件关联的 endpointUri 可利用组件提供的安全功能


  • 配置安全性 - 通过对来自配置文件或外部 Secured Vault 系统的敏感信息进行加密而提供的安全性。


Camel 提供 JSSE 工具,用于配置 Camel 多个组件的 SSL/TLS 相关方面。

 路线安全


认证和授权服务


Camel 提供路由策略驱动的安全功能,可将其连接到路由或路由段中。Camel 中的路由策略利用策略模式在 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.blobAccountNamecamel.vault.azure.blobAccessKey 是 Azure Eventhub 所需的检查点存储的 Azure Storage Blob 参数。、 camel.vault.azure.blobContainerNamecamel.vault.azure.blobAccessKey 是 Azure Eventhub 所需的检查点存储的 Azure Storage Blob 参数。


请注意, camel.vault.azure.secrets 并非必填项:如果未指定,负责检查更新事件的任务将考虑带 azure: 前缀的属性。


唯一的要求是在 Camel 应用程序中添加 camel-azure-key-vault jar。