

# Synthetics 金丝雀的安全注意事项
<a name="servicelens_canaries_security"></a>

以下部分说明了在 Synthetics 中创建和运行金丝雀时应考虑的安全问题。

## 使用安全连接
<a name="servicelens_canaries_connections"></a>

由于金丝雀代码和金丝雀测试运行的结果可能包含敏感信息，因此，请不要让金丝雀通过未加密的连接来连接到终端节点。始终使用加密连接，例如以 `https://` 开头的连接。

## 金丝雀命名注意事项
<a name="servicelens_canaries_security_canary_arn_name"></a>

金丝雀的 Amazon Resource Name (ARN) 包含在用户代理标头中，作为从 CloudWatch Synthetics 包装器库中包含的 Puppeteer 驱动的 Chromium 浏览器发出的出站调用的一部分。这有助于标识 CloudWatch Synthetics 金丝雀流量，并再次将其与正在发出调用的金丝雀关联。

金丝雀 ARN 包含金丝雀名称。选择未显示专有信息的金丝雀名称。

此外，请确保仅将您的金丝雀指向由您控制的网站和终端节点。

## 金丝雀代码中的密钥和敏感信息
<a name="servicelens_canaries_secrets"></a>

如果您使用 zip 文件将金丝雀代码直接传递到金丝雀中，则该脚本的内容会显示在 AWS CloudTrail 日志中。

如果您在金丝雀脚本中有敏感信息或密钥（例如访问密钥或数据库凭证），我们强烈建议您将该脚本作为版本控制对象存储在 Amazon S3 中，并将 Amazon S3 位置传递到金丝雀中，而不是通过 zip 文件传递金丝雀代码。

如果您确实要使用 zip 文件传递金丝雀脚本，我们强烈建议您不要将密钥或敏感信息包含在金丝雀源代码中。有关如何使用 AWS Secrets Manager 来帮助保护密钥安全的更多信息，请参阅[什么是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。

## 权限注意事项
<a name="servicelens_canaries_security_results"></a>

我们建议您限制对由 CloudWatch Synthetics 创建或使用的资源的访问。对金丝雀存储测试运行结果和其他构件（例如，日志和屏幕截图）的 Amazon S3 存储桶使用严格权限。

同样，对金丝雀源代码的存储位置保留严格权限，以免用户意外或恶意删除用于金丝雀的 Lambda 层或 Lambda 函数。

要帮助确保您运行所需的金丝雀代码，您可以对用于存储金丝雀代码的 Amazon S3 存储桶使用对象版本控制。之后，在您指定此代码作为金丝雀运行时，您可以将对象 `versionId` 作为路径的一部分，如以下示例所示。

```
https://bucket.s3.amazonaws.com/path/object.zip?versionId=version-id
https://s3.amazonaws.com/bucket/path/object.zip?versionId=version-id
https://bucket.s3-region.amazonaws.com/path/object.zip?versionId=version-id
```

## 堆栈跟踪和异常消息
<a name="servicelens_canaries_security_stack_traces"></a>

预设情况下，CloudWatch Synthetics 金丝雀会捕获金丝雀脚本引发的所有异常，无论该脚本是自定义脚本还是蓝图中的脚本。CloudWatch Synthetics 将异常消息和堆栈跟踪记录到三个位置：
+ 记录到 CloudWatch Synthetics 服务中，以便在描述测试运行时加快调试速度
+ 记录到 CloudWatch Logs 中，具体取决于创建 Lambda 函数时使用的配置
+ 记录到 Synthetics 日志文件中，该文件是一个纯文本文件，已上载到由您为金丝雀的 `resultsLocation` 设置的值所指定的 Amazon S3 位置

如果您要发送和存储的信息较少，则可以在异常返回到 CloudWatch Synthetics 包装器库之前捕获异常。

您也可以将请求 URL 包含在错误中。CloudWatch Synthetics 会扫描脚本引发的错误中的任何 URL，并根据 **restrictedUrlParameters** 配置编辑其中的受限 URL 参数。如果您在脚本中记录错误消息，则可以使用 [getSanitizedErrorMessage](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_getSanitizedErrorMessage) 在记录日志之前编辑 URL。

## 缩小 IAM 角色的范围
<a name="servicelens_canaries_security_canary_iam_scope"></a>

建议您不要将金丝雀配置为访问潜在的恶意 URL 或终端节点。将金丝雀指向不受信任或未知的网站或端点可能会将您的 Lambda 函数代码暴露给恶意用户的脚本。假设一个恶意网站可以破解 Chromium，它可能会以与您使用 Internet 浏览器连接时类似的方式访问您的 Lambda 代码。

使用缩小了权限范围的 IAM 执行角色来运行您的 Lambda 函数。这样，如果 Lambda 函数受到恶意脚本的影响，它在作为金丝雀的 AWS 账户运行时可采取的操作会受到限制。

在使用 CloudWatch 控制台创建金丝雀时，会使用缩小了权限范围的 IAM 执行角色来进行创建。

## 敏感数据编辑
<a name="servicelens_canaries_security_logging"></a>

CloudWatch Synthetics 捕获 URL、状态代码、故障原因（如有）以及请求和响应的标头及请求体和响应体。这使得金丝雀用户能够理解、监控和调试金丝雀。

 以下各节中所述配置可以在金丝雀执行的任何时间点进行设置。您还可以选择对不同的 Synthetics 步骤应用不同的配置。

### 请求 URL
<a name="servicelens_canaries_security_logging_url"></a>

预设情况下，CloudWatch Synthetics 会将每个 URL 的请求 URL、状态代码和状态原因记录在金丝雀日志中。请求 URL 也可以出现在金丝雀执行报告、HAR 文件等中。请求 URL 可能会包含敏感查询参数，例如访问令牌或密码。您可以编辑敏感信息，以免被 CloudWatch Synthetics 记录下来。

若要修改敏感信息，请设置配置属性 **restrictedUrlParameters**。有关更多信息，请参阅 [SyntheticsConfiguration 类](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration)。配置此属性后，CloudWatch Synthetics 会在记录日志前根据 **restrictedUrlParameters** 属性修改 URL 参数，包括路径和查询参数值。如果您在脚本中记录 URL，则可以使用 [getSanitizedUrl(url, stepConfig = null)](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_getSanitizedUrl) 在记录日志之前编辑 URL。有关更多信息，请参阅 [SyntheticsLogHelper 类](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogHelper)。

### 标头
<a name="servicelens_canaries_security_logging_headers"></a>

预设情况下，CloudWatch Synthetics 不记录请求/响应标头。对于 UI 金丝雀，此为使用 `syn-nodejs-puppeteer-3.2` 和更高版本运行时金丝雀的默认行为。

 如果标头不包含敏感信息，则可以通过将 **includeRequestHeaders** 和 **includeResponseHeaders** 属性设置为 `true` 来在 HAR 文件和 HTTP 报告中启用标头。您可以启用所有标头，但选择限制敏感标头键的值。例如，您可以选择只编辑金丝雀生成的构件中的 `Authorization` 标头。

### 请求体和响应体
<a name="servicelens_canaries_security_logging_body"></a>

预设情况下，CloudWatch Synthetics 不会将请求/响应体记录在金丝雀日志或报告中。此信息对 API 金丝雀特别有用。Synthetics 捕获所有 HTTP 请求，并可显示标头、请求体和响应体。有关更多信息，请参阅 [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_executeHttpStep)。您可以选择将 **includeRequestBody** 和 **includeResponseBody** 属性设置为 `true` 来启用请求/响应体。