

# 使用公共端点保护工作负载
<a name="security-public-endpoints"></a>

对于可公开访问的工作负载，AWS 提供了许多有助于降低某些风险的功能和服务。本节介绍应用程序用户的身份验证和授权以及保护 API 端点。

## 身份验证和授权
<a name="authentication"></a>

身份验证与身份相关，授权涉及操作。使用身份验证来控制谁可以调用 Lambda 函数，然后使用授权来控制调用者可以执行的操作。对于许多应用程序来说，IAM 足以管理这两种控制机制。

对于具有外部用户的应用程序，例如 Web 或移动应用程序，通常使用 [JSON Web 令牌](https://jwt.io/introduction/)（JWT）来管理身份验证和授权。与传统的基于服务器的密码管理不同，JWT 在每次请求时都会从客户端传递。它们是一种加密的安全方式，可使用从客户端传递的数据来验证身份和声明。对于基于 Lambda 的应用程序，这使您可以保护对每个 API 端点的每次调用，而无需依赖中央服务器进行身份验证。

您可以[使用 Amazon Cognito 实施 JWT](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)，这是一种可以处理注册、身份验证、账户恢复和其他常见账户管理操作的用户目录服务。[Amplify Framework](https://docs.amplify.aws/start/getting-started/auth/q/integration/react) 提供了一些库，可简化将此服务集成到前端应用程序中的过程。您还可以考虑第三方合作伙伴服务，例如 [Auth0](https://auth0.com/)。

鉴于身份提供者服务的关键安全角色，使用专业工具来保护您的应用程序非常重要。不建议您自己编写服务来处理身份验证或授权。自定义库中的任何漏洞都可能对您的工作负载及其数据的安全性产生重大影响。

## 保护 API 端点
<a name="api-endpoints"></a>

对于无服务器应用程序，公开为后端应用程序提供服务的首选方式是使用 Amazon API Gateway。这可以帮助您保护 API 免受恶意用户或流量激增的侵害。

API Gateway 为无服务器开发人员提供了两种端点类型：[REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html) 和 [HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)。两者都支持[使用 AWS Lambda 授权](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)、IAM 授权或 Amazon Cognito 授权。使用 IAM 或 Amazon Cognito 时，会评估传入的请求，如果这些请求缺少所需的令牌或包含无效的身份验证，则会拒绝该请求。您无需为这些请求付费，并且这些请求不计入任何限制配额。

公共互联网上的任何人皆可访问未经身份验证的 API 路由，因此建议您限制使用未经身份验证的 API。如果您必须使用未经身份验证的 API，务必保护它们免受常见风险，例如[拒绝服务（DoS）](https://en.wikipedia.org/wiki/Denial-of-service_attack)攻击。[将 AWS WAF 应用](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)到这些 API 可以帮助保护您的应用程序免受 SQL 注入和跨站脚本攻击（XSS）。使用 API 密钥时，API Gateway 还会在 AWS 账户级别和每个客户端级别实施[节流](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html)。

在许多情况下，未经身份验证的 API 所提供的功能可以通过其他方法来实现。例如，Web 应用程序可以向未登录的用户提供来自 DynamoDB 表的客户零售商店列表。此请求可能来自前端 Web 应用程序或任何其他调用 URL 端点的源。此图比较了三种解决方案：

![\[安全运营图 5\]](http://docs.aws.amazon.com/zh_cn/lambda/latest/dg/images/security-ops-figure-5.png)


1. 互联网上的任何人都可以调用此未经身份验证的 API。在拒绝服务攻击中，可能会耗尽底层表上的 API 节流限制、Lambda 并发或 DynamoDB 预调配的读取容量。

1. 在 API 端点前面使用适当的[生存时间](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html)（TTL）配置的 CloudFront 分配将承受 DoS 攻击中的大部分流量，而无需更改用于获取数据的底层解决方案。

1. 另外，对于很少更改的静态数据，CloudFront 分配可以提供来自 Amazon S3 存储桶的数据。