简单会议应用程序(DynamoDB?)的 AWS 后端架构的安全性和效率
Security and efficiency in AWS backend architecture for a simple meeting app (DynamoDB?)
我正在构建一个简单的应用程序 (IOS),每个用户都可以在其中向他的一个或多个 Facebook 好友发送会议邀请。会议由日期、地点和相关人员组成(以某种方式复制 Facebook 已经为活动所做的事情)。我决定将 AWS 用于我的后端,但尽管这似乎是一个简单而经典的用例,但我想不出一个既高效又安全的解决方案。下面我会把我一直以来的后台搭建方式揭露,然后指出我能想到的一些弱点。
出于解释的原因 . I use a unique DynamoDB table for all my users (inspired by this Amazon document),我将 Web Identity Federation 与 Facebook 而不是 Cognito 结合使用,其中主键是用户 Facebook ID。每个用户只能查询和获取与他的 Facebook ID 对应的行,但她可以使用她想要的任何主键写入行。
这是附加到我创建的角色的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings",
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings/index/*"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${graph.facebook.com:id}"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"dynamodb:PutItem"
],
"Resource": [
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings",
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings/index/*"
]
}
]
}
实际工作原理: 假设 Facebook ID 为 1001 的用户想要向其 ID 为 1002 和 1003 的两个 Facebook 好友发送会议邀请。为此,她使用三个不同的主键:1001、1002 和 1003 将相同的会议信息写入同一行 3 次。之后,每个用户都有一份会议副本,她可以从 table同时与 DynamoDB 同步(查询请求)。
我能想到的问题:
- 行在帐户之间重复:次优存储管理。
- 无法更新现有会议。
- 用户可以访问任何人的帐户,而不仅仅是他们的朋友。更危险的是:任何账号都可以安排人与人之间的假会议。
即是说,我想我遗漏了一些关于应如何在此处使用 AWS 的信息。我觉得 IAM 中的 DynamoDB 权限管理不够灵活。我应该继续使用 DynamoDB 但尝试以其他方式使用它吗?我应该彻底改变我的架构吗?
看起来您的用例需要一些更高级的 DynamoDB 技术,并且让移动设备直接访问 DynamoDB table 根据 Cognito 强加的限制,可能过于严格。
我建议考虑将 API 网关与 AWS Lambda 结合使用来创建您自己的 API,它仍然可以使用 Cognito 进行身份验证,但您可以让更高级的业务逻辑由您的应用程序以确保一切仍然安全。
我正在构建一个简单的应用程序 (IOS),每个用户都可以在其中向他的一个或多个 Facebook 好友发送会议邀请。会议由日期、地点和相关人员组成(以某种方式复制 Facebook 已经为活动所做的事情)。我决定将 AWS 用于我的后端,但尽管这似乎是一个简单而经典的用例,但我想不出一个既高效又安全的解决方案。下面我会把我一直以来的后台搭建方式揭露,然后指出我能想到的一些弱点。
出于解释的原因
这是附加到我创建的角色的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings",
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings/index/*"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${graph.facebook.com:id}"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"dynamodb:PutItem"
],
"Resource": [
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings",
"arn:aws:dynamodb:eu-west-1:528570751657:table/Meetings/index/*"
]
}
]
}
实际工作原理: 假设 Facebook ID 为 1001 的用户想要向其 ID 为 1002 和 1003 的两个 Facebook 好友发送会议邀请。为此,她使用三个不同的主键:1001、1002 和 1003 将相同的会议信息写入同一行 3 次。之后,每个用户都有一份会议副本,她可以从 table同时与 DynamoDB 同步(查询请求)。
我能想到的问题:
- 行在帐户之间重复:次优存储管理。
- 无法更新现有会议。
- 用户可以访问任何人的帐户,而不仅仅是他们的朋友。更危险的是:任何账号都可以安排人与人之间的假会议。
即是说,我想我遗漏了一些关于应如何在此处使用 AWS 的信息。我觉得 IAM 中的 DynamoDB 权限管理不够灵活。我应该继续使用 DynamoDB 但尝试以其他方式使用它吗?我应该彻底改变我的架构吗?
看起来您的用例需要一些更高级的 DynamoDB 技术,并且让移动设备直接访问 DynamoDB table 根据 Cognito 强加的限制,可能过于严格。
我建议考虑将 API 网关与 AWS Lambda 结合使用来创建您自己的 API,它仍然可以使用 Cognito 进行身份验证,但您可以让更高级的业务逻辑由您的应用程序以确保一切仍然安全。