

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

Lambda 支持多种方法来使用自行管理的 Apache Kafka 集群进行身份验证。请确保将 Kafka 集群配置为使用支持的下列身份验证方法之一：有关 Kafka 安全的更多信息，请参阅 Kafka 文档的[安全](http://kafka.apache.org/documentation.html#security)部分。

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

Lambda 支持使用传输层安全性协议（TLS）加密 (`SASL_SSL`) 进行简单身份验证和安全层/加盐质疑应答身份验证机制（SASL/SCRAM）身份验证。Lambda 发送已加密凭据以使用集群进行身份验证。Lambda 不支持使用明文 (`SASL_PLAINTEXT`) 的 SASL/SCRAM。有关 SASL/SCRAM 身份验证的更多信息，请参阅 [RFC 5802](https://tools.ietf.org/html/rfc5802)。

Lambda 还支持 SASL/PLAIN 身份验证。由于此机制使用明文凭证，因此与服务器的连接必须使用 TLS 加密以确保凭证受到保护。

为了 SASL 身份验证，需要将登录凭证作为密钥存储在 Amazon Secrets Manager 中。有关使用 Secrets Manager 的更多信息，请参阅《*Amazon Secrets Manager 用户指南*》中的 [Create an Amazon Secrets Manager secret](https://docs.amazonaws.cn/secretsmanager/latest/userguide/create_secret.html)。

**重要**  
要使用 Secrets Manager 进行身份验证，密钥必须存储在 Lambda 函数所在的同一 Amazon 区域中。

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

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

在自行托管的 Apache Kafka 中，Lambda 充当客户端。您可以配置客户端证书（作为 Secrets Manager 中的密钥），以使用 Kafka 代理对 Lambda 进行身份验证。客户端证书必须由服务器信任存储中的 CA 签名。

Kafka 集群向 Lambda 发送服务器证书，以便使用 Lambda 对 Kafka 代理进行身份验证。服务器证书可以是公有 CA 证书。也可以是私有 CA/自签名证书。公有 CA 证书必须由 Lambda 信任存储中的证书颁发机构（CA）签名。对于私有 CA /自签名证书，您可以配置服务器根 CA 证书（作为 Secrets Manager 中的密钥）。Lambda 使用根证书来验证 Kafka 代理。

有关 mTLS 的更多信息，请参阅[为作为事件源的 Amazon MSK 引入双向 TLS 身份验证](https://www.amazonaws.cn/blogs/compute/introducing-mutual-tls-authentication-for-amazon-msk-as-an-event-source)。

## 配置客户端证书密钥
<a name="smaa-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-----"
}
```

## 配置服务器根 CA 证书密钥
<a name="smaa-auth-ca-cert"></a>

如果您的 Kafka 代理使用 TLS 加密（具有由私有 CA 签名的证书），则创建此密钥。您可以将 TLS 加密用于 VPC、SASL/SCRAM、SASL/PLAIN 或 mTLS 身份验证。

服务器根 CA 证书密钥需要一个字段，其中包含 PEM 格式的 Kafka 代理的根 CA 证书。以下示例显示密钥的结构。

```
{"certificate":"-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dG...
-----END CERTIFICATE-----"
}
```