使用 mTLS 对来自 Amazon MSK 的 Redshift 流式摄取进行身份验证 - Amazon Redshift

使用 mTLS 对来自 Amazon MSK 的 Redshift 流式摄取进行身份验证

双向传输层安全(mTLS)提供了一种手段,使服务器可以对其发送信息的客户端进行身份验证,客户端也可以对服务器进行身份验证。使用 mTLS 的好处是可以为多个行业垂直应用中的各种应用场景提供可信身份验证。其中包括金融、零售、政府和医疗保健行业的应用场景。在流式摄取到 Redshift 的情况下,身份验证发生在服务器(在本例中为 Amazon MSK)和 Amazon Redshift 预置集群或 Amazon Redshift Serverless 工作组之间。

本主题提供了过程和 SQL 命令示例,展示了创建外部架构的方法,该架构使用 mTLS 在 Redshift 客户端和 Amazon MSK 服务器之间进行身份验证。本主题中的步骤补充了从 Amazon MSK 设置流式摄取的全套步骤。详情请见 开始使用 Amazon Managed Streaming for Apache Kafka(Amazon MSK)流式摄取

使用 mTLS 进行流式摄取的先决条件

此部分提供了使用 mTLS 通过 AWS Certificate Manager 或 Amazon SageMaker 进行流式摄取的先决步骤。

  1. 作为第一步,您必须拥有或创建私有证书颁发机构(PCA),您可以使用它来颁发证书,除其它功能外,还可以通过安全通信渠道进行安全通信。AWS Private Certificate Authority(私有 CA)是执行此功能的可用服务。有关更多信息,请参阅《AWS Private Certificate Authority 用户指南》中的创建私有 CA。在后面的步骤中,您将签发证书并将其附加到 Amazon MSK 集群,以启用与 Redshift 的加密通信。

  2. 创建支持 mtls 客户端身份验证的 Amazon MSK 集群。有关配置 Amazon MSK 集群的更多信息,请参阅《Amazon Managed Streaming for Apache Kafka 开发人员指南》中的创建支持客户端身份验证的集群

  3. 编辑 Amazon MSK 集群的安全设置,使用 AWS Certificate Manager(ACM)打开 TLS 客户端身份验证,并选择之前创建的 AWS Private CA(PCA)。有关更多信息,请参阅《Amazon Managed Streaming for Apache Kafka 开发人员指南》中的更新集群的安全设置

使用 mTLS 通过 AWS Certificate Manager 进行流式摄取

下面的过程展示了如何利用 AWS Certificate Manager(ACM)进行证书存储和管理,为 Redshift 流式摄取配置 mTLS:

  1. 通过 ACM 请求私有证书。此时,请选择在“先决条件”部分中创建的 PCA 作为证书颁发机构。ACM 会存储已签名的证书和附带的私钥,以确保通信安全。有关使用 ACM 管理证书的更多信息,请参阅《AWS Certificate Manager 用户指南》中的发布和管理证书

  2. 对于用于管理 Redshift 集群或 Amazon Redshift Serverless 工作组的 IAM 角色,附加导出证书的权限,即 acm:ExportCertificate。有关设置必要的 IAM 资源以使用 Amazon MSK 进行流式摄取的更多信息,请参阅 设置 IAM 权限并从 Kafka 执行流式摄取。在下一步中指定相同的 IAM 角色,以创建外部架构。

  3. 获取 Amazon MSK 集群的引导代理 URI。《Amazon Managed Streaming for Apache Kafka 开发人员指南》中的获取 Amazon MSK 集群的引导代理详细介绍了如何获取引导代理 URI。

  4. 运行类似以下示例的 SQL 命令来创建外部架构,使用 mtls 将 Amazon MSK 集群的数据流映射到 Redshift 外部架构。

    CREATE EXTERNAL SCHEMA my_schema FROM MSK IAM_ROLE 'arn:aws:iam::012345678901:role/my_role' AUTHENTICATION mtls URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094' AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';

    重要参数:

    • IAM_ROLE – 与集群相关联的 IAM 角色,用于流式摄取。

    • URI – Amazon MSK 集群的引导代理 URI。请注意,指定 9094 端口是为了与代理进行 TLS 加密通信。

    • AUTHENTICATION_ARN – ACM 证书的 ARN。当您选择已签发证书时,ARN 就会出现在 ACM 控制台中。

执行这些配置步骤后,就可以创建一个引用示例中定义的架构的 Redshift 实体化视图,然后使用 REFRESH MATERIALIZED VIEW 来流式传输数据。这在 Amazon MSK 的流式传输入门步骤中有详细说明,请参阅开始使用 Amazon Managed Streaming for Apache Kafka(MSK)流式摄取

使用 mTLS 通过 AWS Secrets Manager 进行流式摄取

如果您不想在 ACM 中引用证书,则可以利用 AWS Secrets Manager 进行证书管理,为 Redshift 流式摄取配置 mTLS。下面的步骤将介绍如何进行配置。

  1. 使用您选择的工具创建证书签名请求和私钥。然后,您可以使用为 Amazon MSK 集群生成证书时使用的同一 AWS 私有 CA(PCA)来使用签名请求生成签名证书。有关签发证书的更多信息,请参阅《AWS Private Certificate Authority API 参考》中的 IssueCertificate

  2. 使用 AWS Private Certificate Authority 提取证书。有关更多信息,请参阅《AWS Private Certificate Authority 用户指南》中的检索私有证书

  3. 将上一步中生成的证书和私钥存储在 AWS Secrets Manager 中。选择 Other type of secret 并使用纯文本格式。键值对的格式应为 {"certificate":"<cert value>","privateKey":"<pkey value>"},如以下示例所示。有关在 AWS Secrets Manager 中创建和管理密钥的更多信息,请参阅《AWS Secrets Manager 用户指南》中的使用 AWS Secrets Manager 创建和管理密钥

    {"certificate":"-----BEGIN CERTIFICATE----- klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi H4hAX8/eE96qCcjkpfT84EdvHzp6fC+/WwM0oXlwUEWlvfMCXNaG5D8SqRq3qA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -----END CERTIFICATE-----", "privateKey":"-----BEGIN PRIVATE KEY----- klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 7OD4m1dBEs3Fj++hDMH9rYRp99RqtCOf0EWOUe139KOilOsW+cyhAoc9Ci2+Jo/k 17u2N1iGILMQEZuCRtnJOkFYkw== -----END PRIVATE KEY-----"}
  4. 在 Redshift 中,运行 SQL 命令来创建外部架构。您可以使用 AUTHENTICATION 类型 mtls。您还可以在 AWS Secrets Manager 中指定 Amazon MSK 集群的 URI 和密钥 ARN。

    CREATE EXTERNAL SCHEMA my_schema FROM MSK IAM_ROLE 'arn:aws:iam::012345678901:role/my_role' AUTHENTICATION mtls URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094' SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';

重要参数:

  • IAM_ROLE – 与集群相关联的 IAM 角色,用于流式摄取。

  • URI – Amazon MSK 集群的引导代理 URI。请注意,指定 9094 端口是为了与代理进行 TLS 加密通信。

  • SECRET_ARN – 来自 Secrets Manager 的密钥的 ARN,其中包含用于 mTLS 的证书。

为现有外部架构启用 mTLS 身份验证

如果您有一个用于流式摄取的现有外部架构,并且想要实现双向 TLS 进行身份验证,则可以运行如下命令,该命令在 ACM 中指定 mTLS 身份验证和 ACM 证书 ARN。

ALTER EXTERNAL SCHEMA schema_name AUTHENTICATION mtls AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';

或者,您可以参考 AWS Secrets Manager 中的密钥 ARN 指定 mTLS 身份验证。

ALTER EXTERNAL SCHEMA schema_name AUTHENTICATION mtls SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';