Storlets/DataSecuritySpec
需求
允许账户管理员使用 storlets 设置读取访问权限。也就是说,只有当 GET 请求包含适当的 X-Run-Storlet 头时,才允许访问容器,从而强制执行使用该 storlet 进行的敏感数据过滤。
目前,我们要求此功能仅与 Keystone 配合使用,并且访问权限仅授予单个用户。
新增 API
POST account/container
- X-Storlet-Container-Read: user_name
- X-Storlet-Name: storlet_name
- X-Auth-Token: token
其中
- 用户名是用户 Keystone token 中显示的名称。
- storlet_name 是在调用 storlet 时在 X-Run-Storlet 头中显示的名称。
- token 是授权更改容器 ACL 的用户的 token。
用法
GET account/container
- X-Run-Storlet: storlet_name
- X-Auth-Token: token
其中
- storlet_name 是要调用的 storlet 的名称
- token 是一个用户的 token,该用户
- 被授权从 storlet 容器读取 - 与今天相比没有变化
- 被授权从访问的容器读取,或者使用上述 API 使用指定的 storlet 名称被明确授予读取权限。
实现
由于我们希望允许账户管理员在无需更新 Keystone 的情况下设置此权限,因此我们利用 Swift referrers 机制:上述 POST 请求的内部操作会将以下形式的 referrer 条目添加到目标容器的读取 acl:.r:org.openstack.storlet_internal.<user_name>_<storlet_name>
为了防止将连接的 referrer 包含在其原始请求中的用户造成数据泄露,storlet_middleware 会阻止任何携带包含内部前缀的 referrer 的请求:org.openstack.storlet_internal。
流程
storlet middleware 代码将按如下方式工作:1. 确保传入的请求(GET 或 HEAD)不携带包含内部前缀“org.openstack.storlet_internal”的 referrer。2. 对于带有 X-Run-Storlet 的 GET 调用,尝试使用现有路径,无需更改。3. 如果调用失败,状态为 HTTPForbidden,我们将向请求添加内部 referrer,该 referrer 是经过身份验证的用户名和用户尝试执行的 storlet 的连接。添加 referrer 后,我们将重试该请求。
这种方法确保原始用户是具有有效 token 的经过身份验证的用户,并且该用户确实通过指定的 storlet 获得了访问权限。