第 8 章 安全性
作为存储管理员,保护存储集群环境非常重要。Red Hat Ceph Storage 提供加密和密钥管理,以保护 Ceph 对象网关访问点的安全。
先决条件
- 一个正常运行的 Red Hat Ceph Storage 集群。
- 安装 Ceph 对象网关软件.
8.1. 服务器侧加密(SSE)
Ceph 对象网关支持为 S3 应用编程接口(API)上传对象的服务器端加密。服务器端加密意味着 S3 客户端以未加密的形式通过 HTTP 发送数据,而 Ceph 对象网关以加密的形式将数据存储在 Red Hat Ceph Storage 集群中。
- 红帽不支持静态大型对象(SLO)或动态大对象(DLO)的 S3 对象加密。
-
目前,没有 Server-Side 加密(SSE)模式支持
CopyObject
。它目前正在开发 [BZ#2149450]。
由于一个已知问题,服务器端加密与多站点复制不兼容。此问题将在以后的发行版本中解决。如需了解更多详细信息,请参阅 已知问题- Mult-site Object Gateway。
若要使用加密,客户端请求需要通过 SSL 连接发送请求。除非 Ceph 对象网关使用 SSL,否则红帽不支持从客户端进行 S3 加密。但是,出于测试目的,管理员可以使用 ceph config set client.rgw
命令,在测试期间禁用 SSL,在运行时将 rgw_crypt_require_ssl
配置设置设置为 false
,然后重新启动 Ceph 对象网关实例。
在生产环境中,可能无法通过 SSL 发送加密的请求。在这种情况下,使用 HTTP 和服务器端加密发送请求。
有关如何使用服务器端加密配置 HTTP 的详情,请参考下面的附加资源部分。
管理加密密钥有三个选项:
客户提供的键
在使用客户提供的密钥时,S3 客户端会传递加密密钥以及每个请求来读取或写入加密数据。客户负责管理这些密钥。客户必须记住用于加密每个对象的 Ceph 对象网关的关键是什么。
Ceph 对象网关根据 Amazon SSE-C 规范在 S3 API 中实施客户提供的关键行为。
由于客户处理密钥管理,并且 S3 客户端将密钥传递到 Ceph 对象网关,因此 Ceph 对象网关不需要特殊配置来支持这种加密模式。
密钥管理服务
在使用密钥管理服务时,安全密钥管理服务存储密钥,Ceph 对象网关则按需检索密钥,为数据加密或解密请求提供服务。
Ceph 对象网关根据 Amazon SSE-KMS 规范在 S3 API 中实施关键管理服务行为。
目前,唯一测试的关键管理实施是 HashiCorp Vault 和 OpenStack Barbican。但是,OpenStack Barbican 是一个技术预览,不支持在生产环境中使用。
SSE-S3
使用 SSE-S3 时,密钥存储在密码库中,但它们由 Ceph 自动创建和删除,并在需要时检索以加密或解密数据。
Ceph 对象网关根据 Amazon SSE-S3 规范在 S3 API 中实施 SSE-S3 行为。
8.1.1. 为现有 S3 存储桶设置默认加密
作为存储管理员,您可以为现有 Amazon S3 存储桶设置默认加密,以便在存储在存储桶时加密所有对象。您可以使用 Bucket 加密 API 支持 Amazon S3-managed 密钥(SSE-S3)或 Amazon KMS 客户主密钥(SSE-KMS)的服务器端加密。
SSE-KMS 仅支持 Red Hat Ceph Storage 5.x,不支持 Red Hat Ceph Storage 4.x。
您可以使用 PutBucketEncryption
API 管理现有 Amazon S3 存储桶的默认加密。在存储桶级别上定义默认加密,上传到此存储桶的所有文件都将具有此加密。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 Ceph 对象网关.
- 已创建 S3 存储桶。
- 创建的用户具有访问权限的 S3 用户。
- 使用安装的 AWS CLI 软件包访问 Ceph 对象网关客户端。
流程
为加密配置创建 JSON 文件:
示例
[user@client ~]$ vi bucket-encryption.json
在文件中添加加密配置规则:
示例
{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }
为存储桶设置默认加密:
语法
aws --endpoint-url=pass:q[_RADOSGW_ENDPOINT_URL_]:pass:q[_PORT_] s3api put-bucket-encryption --bucket pass:q[_BUCKET_NAME_] --server-side-encryption-configuration pass:q[_file://PATH_TO_BUCKET_ENCRYPTION_CONFIGURATION_FILE/BUCKET_ENCRYPTION_CONFIGURATION_FILE.json_]
示例
[user@client ~]$ aws --endpoint-url=http://host01:80 s3api put-bucket-encryption --bucket testbucket --server-side-encryption-configuration file://bucket-encryption.json
验证
检索存储桶的存储桶加密配置:
语法
aws --endpoint-url=pass:q[_RADOSGW_ENDPOINT_URL_]:pass:q[_PORT_] s3api get-bucket-encryption --bucket BUCKET_NAME
示例
[user@client ~]$ aws --profile ceph --endpoint=http://host01:80 s3api get-bucket-encryption --bucket testbucket { "ServerSideEncryptionConfiguration": { "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] } }
如果存储桶没有默认的加密配置,get-bucket-encryption
命令会返回 ServerSideEncryptionConfigurationNotFoundError
。
8.1.2. 删除默认存储桶加密
您可以使用 s3api delete-bucket-encryption
命令删除指定存储桶的默认存储桶加密。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 Ceph 对象网关.
- 已创建 S3 存储桶。
- 创建的用户具有访问权限的 S3 用户。
- 使用安装的 AWS CLI 软件包访问 Ceph 对象网关客户端。
流程
删除存储桶加密配置:
语法
aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api delete-bucket-encryption --bucket BUCKET_NAME
示例
[user@client ~]$ aws --endpoint-url=http://host01:80 s3api delete-bucket-encryption --bucket testbucket
验证
检索存储桶的存储桶加密配置:
语法
aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-encryption --bucket BUCKET_NAME
示例
[user@client ~]$ aws --endpoint=http://host01:80 s3api get-bucket-encryption --bucket testbucket An error occurred (ServerSideEncryptionConfigurationNotFoundError) when calling the GetBucketEncryption operation: The server side encryption configuration was not found