更新历史:
- 2018.04.15,初稿完成
- 2018.05.01,添加加密卷的验证部分,添加镜像验签部分
使用Barbican加密卷/虚拟机/镜像
环境
使用devstack部署的OpenStack单节点
1、Nova ephemeral storage encryption
nova的配置文件中配置开启临时存储加密:
[ephemeral_storage_encryption]
enabled=True
key_size=256
需要配置key_size
为支持的值,因为barbican默认使用simple crypto插件生成密钥,而simple crypto支持的密钥长度有限。
重启nova相关的服务即可。
2、卷加密
编辑/etc/cinder/cinder.conf
,配置cinder服务的密钥管理后端为barbican:
[key_manager]
#fixed_key = bae3516cc1c0eb18b05440eba8012a4a880a2ee04d584a9c1579445e675b12defdc716ec
backend = barbican
编辑/etc/nova/nova.conf
,配置nova服务的密钥管理后端为barbican:
[key_manager]
#fixed_key = bae3516cc1c0eb18b05440eba8012a4a880a2ee04d584a9c1579445e675b12defdc716ec
backend = barbican
重启cinder、nova相关的服务。
创建加密卷类型:
openstack volume type create --encryption-provider luks --encryption-cipher aes-xts-plain64 --encryption-key-size 256 --encryption-control-location front-end LUKS
创建加密卷:
openstack volume create --size 1 --type LUKS 'encrypted volume'
创建非加密卷:
openstack volume create --size 1 'unencrypted volume'
创建虚拟机:
openstack server create --image cirros-0.3.5-x86_64-disk --flavor m1.tiny TESTVM
将卷挂载到虚拟机:
openstack server add volume --device /dev/vdb TESTVM 'encrypted volume'
openstack server add volume --device /dev/vdc TESTVM 'unencrypted volume'
在虚拟机中向卷写数据:
echo "encrypted" >> /dev/vdb
echo "unencrypted" >> /dev/vdc
sync && sleep 2
在cinder-volume服务所在主机上搜索卷中数据:
strings /dev/stack-volumes-lvmdriver-1/volume-* | grep "encrypt"
unencrypted
只能读到非加密卷中的数据。
3、镜像签名/验签
修改glance配置文件/etc/glance/glance-api.conf
,添加如下配置:
[barbican]
auth_endpoint = http://localhost/identity/v3
[key_manager]
backend = barbican
重启glance相关服务。
准备密钥、证书,使用openssl生成。
openssl genrsa -out private_key.pem 1024
openssl rsa -pubout -in private_key.pem -out public_key.pem
openssl req -new -key private_key.pem -out cert_request.csr
openssl x509 -req -days 14 -in cert_request.csr -signkey private_key.pem -out new_cert.crt
上传证书到barbican。
openstack secret store --name test --algorithm RSA --expiration 2018-06-29 --secret-type certificate --payload-content-type "application/octet-stream" --payload-content-encoding base64 --payload "$(base64 new_cert.crt)"
+---------------+-------------------------------------------------------------------------------+
| Field | Value |
+---------------+-------------------------------------------------------------------------------+
| Secret href | http://localhost/key-manager/v1/secrets/a9e46728-2ac6-4adf-a2ff-35250607ab14 |
cert_uuid=a9e46728-2ac6-4adf-a2ff-35250607ab14
为镜像生成签名。
openssl dgst -sha256 -sign private_key.pem -sigopt rsa_padding_mode:pss -out cirrosimage.signature cirros-0.3.5-x86_64-disk.img
base64 -w 0 cirrosimage.signature > cirrosimage.signature.b64
image_signature=$(cat cirrosimage.signature.b64)
上传镜像。
glance image-create --name cirrosSignedImage --container-format bare --disk-format qcow2 --property img_signature="$image_signature" --property img_signature_certificate_uuid="$cert_uuid" --property img_signature_hash_method='SHA-256' --property img_signature_key_type='RSA-PSS' < cirros-0.3.5-x86_64-disk.img
如果镜像签名验证失败,镜像则创建失败。