

# 在 Lambda 中配置 Amazon MSK 集群身份验证方法
<a name="msk-cluster-auth"></a>

Lambda 需要访问 Amazon MSK 集群、检索记录和执行其他任务的权限。Amazon MSK 支持多种方法来使用 MSK 集群进行身份验证。

**Topics**
+ [未经身份验证的访问](#msk-unauthenticated)
+ [SASL/SCRAM 身份验证](#msk-sasl-scram)
+ [双向 TLS 身份验证](#msk-mtls)
+ [IAM 身份验证](#msk-iam-auth)
+ [Lambda 如何选择引导代理](#msk-bootstrap-brokers)

## 未经身份验证的访问
<a name="msk-unauthenticated"></a>

如果没有客户端会通过互联网访问集群，则可以使用未经身份验证访问。

## SASL/SCRAM 身份验证
<a name="msk-sasl-scram"></a>

Lambda 支持使用 SHA-512 哈希函数和传输层安全性协议（TLS）加密进行[简单身份验证和安全层/加盐质疑应答身份验证机制（SASL/SCRAM）](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password-tutorial.html)身份验证。为使 Lambda 连接到集群，请将身份验证凭证（用户名和密码）存储在 Secrets Manager 密钥中，并在配置事件源映射时引用此密钥。

有关使用 Secrets Manager 的更多信息，请参阅《Amazon Managed Streaming for Apache Kafka Developer Guide》**中的 [Sign-in credentials authentication with Secrets Manager](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html)。

**注意**  
Amazon MSK 不支持 SASL/PLAIN 身份验证。

## 双向 TLS 身份验证
<a name="msk-mtls"></a>

双向 TLS（mTLS）在客户端和服务器之间提供双向身份验证。客户端将证书发送给服务器，以便服务器验证客户端。服务器还将服务器证书发送给客户端，以便客户端验证服务器。

对于 Amazon MSK 与 Lambda 的集成，MSK 集群充当服务器，而 Lambda 充当客户端。
+ 要让 Lambda 验证 MSK 集群，您可以在 Secrets Manager 中将客户端证书配置为密钥，并在事件源映射配置中引用该证书。客户端证书必须由服务器信任存储中的证书颁发机构 (CA) 签名。
+ MSK 集群还会向 Lambda 发送服务器证书。服务器证书必须由 AWS 信任存储中的证书颁发机构（CA）签名。

Amazon MSK 不支持自签名服务器证书。Amazon MSK 中的所有代理都使用由 [Amazon Trust Services CA](https://www.amazontrust.com/repository/) 签名的[公有证书](https://docs.aws.amazon.com/msk/latest/developerguide/msk-encryption.html)，默认情况下 Lambda 信任这些证书。

### 配置 mTLS 密钥
<a name="mtls-auth-secret"></a>

CLIENT\$1CERTIFICATE\$1TLS\$1AUTH 密钥需要证书字段和私有密钥字段。对于加密的私有密钥，密钥需要私有密钥密码。证书和私有密钥必须采用 PEM 格式。

**注意**  
Lambda 支持 [PBES1](https://datatracker.ietf.org/doc/html/rfc2898/#section-6.1)（而不是 PBES2）私有密钥加密算法。

证书字段必须包含证书列表，首先是客户端证书，然后是任何中间证书，最后是根证书。每个证书都必须按照以下结构在新行中启动：

```
-----BEGIN CERTIFICATE-----  
        <certificate contents>
-----END CERTIFICATE-----
```

Secrets Manager 支持最多包含 65536 字节的密钥，这为长证书链提供了充足的空间。

私有密钥必须采用 [PKCS \$18](https://datatracker.ietf.org/doc/html/rfc5208) 格式，并具有以下结构：

```
-----BEGIN PRIVATE KEY-----  
         <private key contents>
-----END PRIVATE KEY-----
```

对于加密的私有密钥，请使用以下结构：

```
-----BEGIN ENCRYPTED PRIVATE KEY-----  
          <private key contents>
-----END ENCRYPTED PRIVATE KEY-----
```

以下示例显示使用加密私有密钥进行 mTLS 身份验证的密钥内容。对于加密的私有密钥，您可以在密钥中包含私有密钥密码。

```
{
 "privateKeyPassword": "testpassword",
 "certificate": "-----BEGIN CERTIFICATE-----
MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw
...
j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk
cmUuiAii9R0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb
...
rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no
c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg==
-----END CERTIFICATE-----",
 "privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp
...
QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ
zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA==
-----END ENCRYPTED PRIVATE KEY-----"
}
```

有关适用于 Amazon MSK 的 mTLS 的更多信息，请参阅《Amazon Managed Streaming for Apache Kafka Developer Guide》**中的 [Mutual TLS client authentication for Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)。

## IAM 身份验证
<a name="msk-iam-auth"></a>

您可以使用 AWS Identity and Access Management（IAM）来验证连接到 MSK 集群的客户端的身份。使用 IAM 身份验证时，Lambda 依靠函数[执行角色](lambda-intro-execution-role.md)中的权限连接到集群、检索记录以及执行其他所需操作。有关包含必要权限的策略示例，请参阅《Amazon Managed Streaming for Apache Kafka Developer Guide》**中的 [Create authorization policies for the IAM role](https://docs.aws.amazon.com/msk/latest/developerguide/create-iam-access-control-policies.html)。

如果 IAM 身份验证在您的 MSK 集群上处于活动状态，并且您没有提供密钥，则 Lambda 自动默认使用 IAM 身份验证。

有关 Amazon MSK 中的 IAM 身份验证的更多信息，请参阅 [IAM access control](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html)。

## Lambda 如何选择引导代理
<a name="msk-bootstrap-brokers"></a>

Lambda 根据集群上可用的身份验证方法以及您是否提供用于身份验证的密钥来选择[引导代理](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html)。如果您为 mTLS 或 SASL/SCRAM 提供了密钥，Lambda 将自动选择该身份验证方法。如果不提供密钥，Lambda 会选择在集群上处于活动状态的最强身份验证方法。下面是 Lambda 选择代理的优先级顺序，从最强到最弱的身份验证：
+ mTLS（为 mTLS 提供的密钥）
+ SASL/SCRAM（为 SASL/SCRAM 提供的密钥）
+ SASL IAM（未提供密钥，IAM 身份验证处于活动状态）
+ 未经身份验证的 TLS（未提供密钥，IAM 身份验证未处于活动状态）
+ 纯文本（未提供密钥，IAM 身份验证和未经身份验证的 TLS 均未处于活动状态）

**注意**  
如果 Lambda 无法连接到最安全的代理类型，则 Lambda 不会尝试连接到其他（较弱）代理类型。如果希望 Lambda 选择较弱的代理类型，请停用集群上所有更强的身份验证方法。