随着云计算技术的发展,Serverless 架构成为了云端应用程序的新宠,因其无需管理服务器和自动伸缩等优点而受到了广泛的欢迎。但是由于其基础设施是由云服务提供商来托管的,因此在访问控制方面可能需要进行特殊的管理,以确保您的应用程序数据和资源的安全性和隐私性。
本文将介绍如何在 Serverless 应用程序中控制访问,从而保护您的数据安全。我们将提供完整的代码示例,并深入讨论涉及的重要概念和技术。
访问控制的基础概念
在 Serverless 应用程序中,我们需要关注的访问控制方面主要包括以下几个概念:
- 角色(Role):角色定义了一组权限,授予某些资源的访问权限并规定了这些角色在系统中的作用。在 Serverless 中通常使用 IAM 角色(Identity and Access Management)来控制资源的访问权限。
- 策略(Policy):策略是为特定资源或资源集开放或关闭访问权限的规则。在 Serverless 中,策略可以是附加到角色或直接附加到资源上。
- 访问令牌(Access Token):访问令牌是指授权用户或应用程序访问某个资源的数字证书(token),它可以限制访问仅限于特定级别的某个资源或某些资源。
- 访问控制列表(ACL):ACL 是一种定义授权级别和资源访问权限的访问列表。在 Serverless 应用程序中,ACL 通常使用列表来授权访问端点。
使用 AWS API Gateway 和 Lambda
AWS API Gateway 是 Amazon Web Services 的一项服务,可用于创建、部署和维护 RESTful Web Services 和 WebSocket API。Lambda 是 AWS 提供的一种无服务器计算服务,可以运行任何类型的应用程序代码,无需管理服务器,同时拥有按需伸缩、高可用性和容错性的能力。这使得使用 AWS API Gateway 和 Lambda 作为 Serverless 应用程序的核心变得非常容易。让我们看看如何在使用这种技术的 Serverless 系统中进行访问控制。
在本例中,我们将创建一个简单的 API,用于获取特定资源的详细信息,您需要确保未经授权的用户无法访问该 API。首先,在 AWS API Gateway 中创建一个新的 REST API,您可以使用以下代码操作:
aws apigateway create-rest-api --name "serverless-example"
接下来,向我们的 API 添加一个资源和方法,我们可以通过以下命令来实现:
aws apigateway create-resource --rest-api-id <rest_api_id> --parent-id <resource_id> --path-part users aws apigateway put-method --rest-api-id <rest_api_id> --resource-id <resource_id> --http-method GET --authorization-type "AWS_IAM" aws apigateway put-method-response --rest-api-id <rest_api_id> --resource-id <resource_id> --http-method GET --status-code 200 aws apigateway put-integration --rest-api-id <rest_api_id> --resource-id <resource_id> --http-method GET --integration-http-method GET --type AWS --uri arn:aws:apigateway:<region>:lambda:path/2015-03-31/functions/arn:aws:lambda:<region>:<account_id>:function:<function_name>/invocations --passthrough-behavior WHEN_NO_TEMPLATES --timeout-in-millis 29000 aws apigateway put-method-response --rest-api-id <rest_api_id> --resource-id <resource_id> --http-method GET --status-code 200 aws apigateway create-deployment --rest-api-id <rest_api_id> --stage-name dev --description "Development Stage" --variables var1=value1
现在,我们已经创建了使用 AWS Lambda 作为后端的 REST API,但这并不意味着我们的 API 在访问控制方面是安全的,现在我们需要添加一个 IAM 角色来限制对该资源的访问。我们可以使用以下代码来创建一个新的 IAM 角色和策略:
aws iam create-role --role-name "serverless-example-role" --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}' aws iam create-policy --policy-name "serverless-example-policy" --policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["lambda:InvokeFunction"],"Resource":"arn:aws:lambda:<region>:<account_id>:function:<function_name>"}]}' aws iam attach-role-policy --role-name "serverless-example-role" --policy-arn "arn:aws:iam::<account_id>:policy/serverless-example-policy"
接下来,将该角色附加到 Lambda 函数中。然后,将 IAM 验证作为 API 级别的授权类型,以确保只有拥有适当的权限的 IAM 用户或角色可以访问我们的 API。所有这些都可以通过下面的代码来实现:
aws iam create-policy --policy-name "serverless-example-execution-policy" --policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource":"arn:aws:logs:<region>:<account_id>:*:*"},{"Effect":"Allow","Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:<region>:<account_id>:function:<function_name>"}]}' aws lambda create-function --function-name "serverless-example" --runtime nodejs14.x --role "<serverless-example-role-arn>" --handler index.handler --zip-file fileb://function.zip aws lambda add-permission --function-name "serverless-example" --statement-id "APIGatewayTest" --action "lambda:InvokeFunction" --principal apigateway.amazonaws.com --source-arn "arn:aws:execute-api:<region>:<account_id>:<rest_api_id>/*/*/*"
使用 Auth0 和 AWS Lambda
使用 Auth0 和 AWS Lambda,可以获得从社交网络、企业身份验证、数据库和密码等多个来源进行身份验证和授权的能力,这大大简化了访问控制的任务。在下面的示例中,我们采用了将 Auth0 和 AWS Lambda 结合起来的方案。
我们假设您已经创建了具有正确配置的 Auth0 应用程序,现在需要创建一个 Lambda 函数来处理身份验证。我们将使用 Node.js 编写我们的 Lambda 函数,示例代码如下:
exports.handler = async (event, context) => { // 通过与 Auth0 API 交互验证 JWT // 将 Auth0 的响应返回给 API Gateway };
接下来,我们需要使用 AWS Lambda 通过 API Gateway 暴露我们的 Lambda 函数。这些过程应该非常熟悉,因此在此处介绍。
-- -------------------- ---- ------- --- ------ --------------- --------------- -------------------- --------- ---------- ------ ------------------------------- --------- ------------- ---------- -------------------- --- ---------- --------------- ------ -------------------- --- ---------- ------------- ------------- ------------- --- ---------- --------------- ------------- ------------- ----------- ------------- ----------- ----- --- ---------- ---------- ------------- ------------- ------------- ------------- ------------- --- -------------------- -------- --------------- ----------------- --- ---------- ------------------- ------------- ------------- ------------- ------------- ------------- --- ------------- --- --- ---------- ------------------- ------------- ------------- ------------- ------------- ------------- --- ------------- --- --- ---------- ---------------------- ------------- ------------- ------------- ------------- ------------- --- ------ --- ----- -------------------------------------------------------------------------------------------------------------------------------------- ---------------------- ----------------- ------------------- ----- ---------------------- ----------------------------- --- ---------- ------------------------ ------------- ------------- ------------- ------------- ------------- --- ------------- --- -------------------- -------------------------------------- ---- ---------------- --------------------------- --------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- ---------- ------------------------ ------------- ------------- ------------- ------------- ------------- --- ------------- --- -------------------- -------------------------------------- ---- ---------- -------------------- --------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- ---------- ----------------- ------------- ------------- ------------ --- ------------- ------------ ------ ----------- -----------
结论
通过合理的角色、策略、访问令牌和 ACL 管理,我们可以实现对 Serverless 应用程序的访问控制,并保护我们的数据安全。在本文中,我们深入讨论了基础概念和技术,并提供了相关代码示例,希望对您开发安全的 Serverless 应用程序有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671d8c9a9babaf620fb6de0b