使用 AWS S3 的 ArcticDB 动态库权限¶
目标¶
ArcticDB 的优势之一在于其作为个人数据库易于设置和使用。但我们如何将此模式扩展到组织层面?如何在保持个人使用简便的同时,允许与组织内的团队成员和小组安全地共享数据?我们还希望这易于维护,这是权限管理的一个主要挑战。
在此,我们在 AWS 中构建了一个名为“Acme”的小型双团队组织模型,并创建了一些灵活的权限,允许用户和团队创建和使用私有和共享数据,而无需进行逐个库的设置。
- 数据团队
- Jane
- Samir
- 量化团队
- Alan
- Diana
每位用户应能够:
- 列出所有 ArcticDB 库(但不能查看其内容)
- 创建只有他们自己才能读写的个人库
- 创建只有其团队成员才能读写的团队库
用户将遵循 ArcticDB 库命名约定。库名称应为 <USERNAME>/<LIBRARY>
或 <TEAM>/<MYLIBRARY>
之一,因此如果 Jane 想创建一个用于天气数据的个人库,她可以使用 lib.create_library('jane@acme/weather')
(假设已完成下面的 AWS S3 设置)。
我们可以通过 AWS S3 中的路径前缀权限来实现这一点。其他后端,如 Minio,也支持基于路径的权限管理。
AWS S3¶
您应该已经在 AWS IAM 中设置了一些用户以及包含所有用户的用户组。请参阅 IAM 文档获取相关帮助。
对于 Acme,我们设置了四位用户,并用他们所属的团队对用户进行了标签标记
aws:username | aws:PrincipalTag/team |
---|---|
jane@acme | data |
samir@acme | data |
alan@acme | quant |
diana@acme | quant |
我们还创建了一个用户组 acme
,包含这四位用户。
让我们使用 cloudshell 为 Acme 创建一个 S3 存储桶 acme-arcticdb
。
aws s3 mb s3://acme-arcticdb
设置权限策略¶
通常,对于读取访问,我们的用户需要 s3:ListBucket
和 s3:GetObject
权限;对于写入访问,用户还需要 s3:PutObject
和 s3:DeleteObject
权限。
然后设置以下访问策略。我们将此代码片段保存到 policy.json
中。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjects",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::acme-arcticdb",
"Condition": {
"StringLike": {
"s3:prefix": [
"_arctic_cfg/*",
"${aws:username}/*",
"${aws:PrincipalTag/team}/*"
]
}
}
},
{
"Sid": "PutGetDeleteObjects",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::acme-arcticdb/${aws:username}/*",
"arn:aws:s3:::acme-arcticdb/${aws:PrincipalTag/team}/*",
"arn:aws:s3:::acme-arcticdb/_arctic_cfg/cref/?sUt?${aws:username}/*",
"arn:aws:s3:::acme-arcticdb/_arctic_cfg/cref/?sUt?${aws:PrincipalTag/team}/*"
]
}
]
}
在 AWS 中创建策略。
aws iam create-policy --policy-name acme-arcticdb-access --policy-document file://policy.json
记下最后一个命令输出中的 Arn
,因为您需要它将策略附加到包含所有用户的组,本例中的组是 acme
。
aws iam attach-group-policy --policy-arn <ARN> --group-name acme
如果您打算根据自己的情况调整该示例策略,请注意:
acme-arcticdb
是存储桶的名称,需要在所有出现的地方替换为您自己的存储桶名称s3:ListBucket
用于授予ListObjectsV2
权限,并且需要单独的部分,因为它适用于整个存储桶。我们通过检查作为ListObjectsV2
请求一部分的s3:prefix
参数来控制对路径的访问。Put
、Get
和Delete
可以在第二部分中指定对象路径。_arctic_cfg/cref/*
是 ArcticDB 库配置的存储位置,每个库的数据存储在存储桶的根目录中,路径以库名称开头。- 通过使用
${aws:username}
和${aws:PrincipalTag/team}
,我们将库访问权限限制为具有匹配的 AWS IAM 用户名或匹配的用户“team”标签的用户。
安全注意事项¶
由于 ${aws:username}
、${aws:PrincipalTag/team}
和 _arctic_cfg
... 位于路径的开头,因此重要的是它们不包含可能重叠的值。例如,如果您有一个名为“data”的团队和一个名为“data”的应用程序用户名,他们将拥有相同的权限;或者,如果可以创建以 _arctic_cfg
... 开头的用户名,则该用户将能够修改所有库配置。
用法¶
现在 Jane 可以列出、读取和写入她自己的库和团队库,但不能访问 Acme 中其他人的库。
import numpy as np
import arcticdb as adb
# jane@acme team=data
access = '<REDACTED>'
secret = '<REDACTED>'
bucket='acme-arcticdb'
region='eu-west-2'
arctic = adb.Arctic(f's3://s3.{region}.amazonaws.com:{bucket}?access={access}&secret={secret}')
# Create library as me
arctic.create_library('jane@acme/weather')
lib = arctic.get_library('jane@acme/weather')
lib.write('test', np.arange(100))
# Create library as data team
arctic.create_library('data/forecast')
lib = arctic.get_library('data/forecast')
lib.write('test', np.arange(100))
# See all libraries
arctic.list_libraries()
# ['alan@acme/bonds', 'data/forecast', 'jane@acme/weather', 'quant/stocks']
# Can't use or delete Alan or Quant team data
arctic.get_library('alan@acme/bonds')
arctic.get_library('quant/stocks')
arctic.delete_libraru('alan@acme/bonds')
# All raise:
# PermissionException: E_PERMISSION Permission error: S3Error#15 : No response body.