MinIO对象存储加密实践

1、关于MinIO对象存储加密

MinIO对象存储支持服务端加密和客户端加密。

1.1 服务端加密

服务端在对象落盘之前加密对象,下载对象时由服务端自动解密。
MinIO支持的服务端加密又有两种具体的方式:

  • SSE-S3(使用S3托管密钥的服务器端加密)
  • SSE-C(使用客户托管密钥的服务器端加密)

1.2 客户端加密

客户端加密对象,然后上传服务端。下载对象时也由客户端解密。

2、MinIO加密实践

2.1 SSE-S3加密实践

MinIO使用密钥管理系统(KMS)支持SSE-S3(使用S3托管密钥的服务器端加密)。如果客户端请求SSE-S3,或启用了自动加密,则MinIO服务器会使用唯一的对象密钥对每个对象进行加密,该对象密钥受KMS管理的主密钥保护。由于开销极低,因此可以为每个应用程序和实例打开自动加密。
根据中文官网http://docs.minio.org.cn/docs/master/minio-kms-quickstart-guide的说法,MinIO仍提供本机Hashicorp Vault支持,但是此功能已弃用,将来可能会删除。强烈建议使用下面的体系结构:
在这里插入图片描述
MinIO通过KES访问KMS,而不是直接访问KMS,每个MinIO群集均具有“自己的” KES实例。KES是一个用于高性能应用程序的无状态分布式密钥管理系统,它处理”其” MinIO群集发出的加密/解密请求,从而使KMS不必处理大量流量,KMS仅作为KES安全密钥的后台存储。
KES支持多种KMS实现https://docs.min.io/docs/minio-kms-quickstart-guide.html,推荐使用Hashicorp Vault。

2.1.1 部署Vault

  1. 生成Vault服务TLS证书
# mkdir /vault && cd /vault
# kes tool identity new --server --key vault-tls.key --cert vault-tls.crt --ip "127.0.0.1" --dns localhost
  1. 生成Vault服务配置文件
# cat > /vault/vault-config.json <

请注意,我们使用文件后端运行Vault。为了获得高可用性,您可能需要使用其他 后端,例如etcd或consul。

  1. 启动vault服务
# vault server -config /vault/vault-config.json
  1. 初始化vault服务。初始化过程中输出五个unseal key和Initial Root Token,须记录下来
# cat /vault/vault-tls.crt >> /etc/pki/tls/certs/ca-bundle.crt
# export VAULT_ADDR='https://127.0.0.1:8200'
# vault operator init
Unseal Key 1: 2UdRWTs2OW180j3VmdFT8etIduOeKx9qfG6Mru4gIASJ
Unseal Key 2: 51N6gWQpQ9xj6IbIJkGVdGjCURzpDcXYifomWUX278ZF
Unseal Key 3: w+pUdOSsR+awHF3ca9x0OtvQcdVhEkXiFBX26U0mpAsh
Unseal Key 4: bWXZPvccAVuqXDa5ufG5dx/5JDByRb+9W+TgwXtdMEP2
Unseal Key 5: hETyueJ4ovsDpwlwrhf8AqMgHvd56BMW26yomsrbDpNT
Initial Root Token: s.Oy3abPynrVZBvB9ixZGbVdf1
  1. 解封。在使用vault之前,需要对vault进行解封,用任意3 个Unseal Key可解封
# vault operator unseal 2UdRWTs2OW180j3VmdFT8etIduOeKx9qfG6Mru4gIASJ
# vault operator unseal 51N6gWQpQ9xj6IbIJkGVdGjCURzpDcXYifomWUX278ZF
# vault operator unseal w+pUdOSsR+awHF3ca9x0OtvQcdVhEkXiFBX26U0mpAsh
# vault status
  1. 启用KV密钥管理引擎
# export VAULT_TOKEN=s.Oy3abPynrVZBvB9ixZGbVdf1
# vault secrets enable kv
# vault secrets list
  1. 启用AppRole身份验证
# vault auth enable approle
# vault auth list
  1. 创建Policy
# cd /vault
# cat > minio-kes-policy.hcl <
  1. 创建一个新的AppRole并将其绑定到策略
# vault write auth/approle/role/kes-role token_num_uses=0  secret_id_num_uses=0  period=5m
# vault write auth/approle/role/kes-role policies=minio-key-policy
  1. 获取AppRole Role ID和 Secret ID
# vault read auth/approle/role/kes-role/role-id
Key        Value
---        -----
role_id    d461eddf-db49-b261-b08a-6f7201992e33# vault write -f auth/approle/role/kes-role/secret-id
Key                   Value
---                   -----
secret_id             2646ee0c-8a7a-7e79-bf5a-52f1e3f203bd
secret_id_accessor   ……

2.1.2 部署Kes

  1. 生成KES 服务TLS证书
# mkdir /kes && cd /kes
# kes tool identity new --server --key kes-tls.key --cert kes-tls.crt --ip "127.0.0.1" --dns localhost
  1. 创建MinIO标识

连接KES服务器时,用户或应用程序必须出示有效的X.509证书。因此,每个MinIO群集都需要一个X.509 TLS证书来进行客户端身份验证。

**创建(自签名)证书**
# kes tool identity new --key=minio.key --cert=minio.crt --time=8760h MinIO
此处MinIO是[subject name]。 您可以为您的部署方案选择一个更合适的名称。**获取证书ID**
# kes tool identity of minio.crt
Identity:  672e00c31f9276ac0e98e5e9ddfe99e36d0e05d4e8a405185e5c30d9b948134b
  1. 创建KES配置文件
# cat > kes-config.yaml << EOF
# Refer: https://github.com/minio/kes/blob/master/server-config.yaml
# The TCP address (ip:port) for the KES server to listen on.
address: 0.0.0.0:7373tls:key:  kes-tls.keycert: kes-tls.crtpolicy:minio:paths:- /v1/key/create/minio-*- /v1/key/generate/minio-*- /v1/key/decrypt/minio-*identities:- 672e00c31f9276ac0e98e5e9ddfe99e36d0e05d4e8a405185e5c30d9b948134b # identity of minio.crtcache:expiry:any:    5m0s unused: 20s keystore:vault:endpoint: https://127.0.0.1:8200  # The Vault endpointprefix:   minio                   # The domain resp. prefix at Vault's K/V backend approle:id:     "d461eddf-db49-b261-b08a-6f7201992e33"    # Your AppRole Role ID secret: "2646ee0c-8a7a-7e79-bf5a-52f1e3f203bd"    # Your AppRole Secret IDretry:  15s   # Duration until the server tries to re-authenticate after connection loss.tls:ca: /vault/vault-tls.crt  # Since we use self-signed certificatesstatus:ping: 10s
EOF
  1. 启动Kes
# kes server --config=kes-config.yaml --mlock --root=disabled --auth=off
因为minio.crt是自签名证书,--auth=off不校验证书。
  1. 创建密钥
# cat /kes/kes-tls.crt >> /etc/pki/tls/certs/ca-bundle.crt
# export KES_CLIENT_KEY=/kes/minio.key
# export KES_CLIENT_CERT=/kes/minio.crt
# kes key create minio-key-1
  1. 检查密钥
# export VAULT_TOKEN=s.Oy3abPynrVZBvB9ixZGbVdf1
# vault kv list kv/minio
# vault kv get kv/minio/minio-key-1

2.1.3 部署MinIO

  1. 生成MinIO服务TLS证书
# cd /root/.minio/certs
# openssl req -new -x509 -days 3650 -key private.key -out public.crt -subj "/C=CN/ST=GD/L=SZ/O=example/CN=minio.example.com"
  1. 启动MinIO
# export MINIO_KMS_KES_ENDPOINT=https://127.0.0.1:7373
# export MINIO_KMS_KES_KEY_FILE=/kes/minio.key
# export MINIO_KMS_KES_CERT_FILE=/kes/minio.crt
# export MINIO_KMS_KES_KEY_NAME=minio-key-1
# export MINIO_ACCESS_KEY=QS8W8H15JS0F6ZRN0F9S
# export MINIO_SECRET_KEY=IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4
# minio server /data --address :443 --certs-dir /root/.minio/certs

2.1.4 加密验证

  1. 设置存储桶自动加密属性,上传到该存储桶的所有对象都将自动加密。
# mc mb myminio/bucket1
# mc encrypt set sse-s3 myminio/bucket1
Auto encryption configuration has been set successfully for myminio/bucket1
# mc encrypt info myminio/bucket1
Auto encryption 'sse-s3' is enabled
  1. 上传测试文件到存储桶。
# cat > test.txt << EOF
This is a test!
EOF
# mc cp test.txt myminio/bucket1
  1. 检查存储桶中对象状态,已加密
# mc stat myminio/bucket1/test.txt
Name      : test.txt
……
Encrypted :
X-Amz-Server-Side-Encryption: AES256
  1. 下载测试文件,文件已自动解密
# mc cp myminio/bucket1/test.txt /tmp
# cat /tmp/test.txt
This is a test!

2.2 SSE-C加密实践

Minio支持采用客户端提供的密钥(SSE-C)进行服务端加密。

  1. 创建存储桶
# mc mb myminio/bucket2
# mc encrypt info myminio/bucket2
mc:  Unable to get encryption info. The server side encryption configuration was not found.
  1. 上传测试文件,提供SSE-C密钥
# mc cp --encrypt-key "myminio/bucket2=MzJieXRlc2xvbmdzZWNyZWFiY2RlZmcJZ2l2ZW5uMjE=" /root/test.txt  myminio/bucket2
/root/test.txt:    16 B / 16 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 2.32 KiB/s 0s
  1. 下载测试文件,提供正确的SSE-C密钥
# mc cp --encrypt-key "myminio/bucket2=MzJieXRlc2xvbmdzZWNyZWFiY2RlZmcJZ2l2ZW5uMjF=" myminio/bucket2/test.txt /tmp
...16.2.106/bucket2/test.txt:  16 B / 16 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 2.27 KiB/s 0s
  1. 下载测试文件,提供错误的SSE-C密钥
# mc cp --encrypt-key "myminio/bucket2=wrongpassword" myminio/bucket2/test.txt /tmp
mc:  Unable to validate source \`myminio/bucket2/test.txt\`.

2.3 客户端加密实践

s3cmd支持客户端加密,mc貌似不具备这个功能。

# s3cmd put –h
……
-e, --encrypt         Encrypt files before uploading to S3.
  1. 设置s3cmd加密密码
# vi /root/.s3cfg
……
gpg_command = /usr/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
**gpg_passphrase = `123456`**
……

从配置文件中可以看到,s3cmd其实是调用了/usr/bin/gpg加密与解密对象

  1. 上传测试文件
# s3cmd -e put test.txt s3://bucket3
upload: '/tmp/tmpfile-NInvNVIC2zPu8wfqFaPv' -> 's3://bucket3/test.txt'  [1 of 1]
59 of 59   100% in    0s  1338.84 B/s  done
  1. 下载测试文件
# s3cmd -e get s3://bucket3/test.txt /tmp -f
download: 's3://bucket3/test.txt' -> '/tmp/test.txt'  [1 of 1]
59 of 59   100% in    0s    14.07 kB/s  done
# cat /tmp/test.txt
This is a test!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章