본문 바로가기
Openstack

Openstack barbican install/Barbican-cinder encryption

 

1. Barbican Project?

Barbican 프로젝트는 기본적으로 Openstack내부의 하나의 비밀저장소 플러그인으로 사용/관리 할 수 있도록 제공된다.

즉,  Openstack내부에서 KeyMananager 서비스를 담당한다. 대칭키,비대칭키, 인증서, raw binary data 등을 저장 관리 하고 있다.

Openstack Newton 부터 release되어 다양한 형태의 플러그인 백앤드로 제공 되고 있다.

https://docs.openstack.org/barbican/queens/index.html

 

 

 

2. Barbican Manual install

 

Barbican 에서 사용 될 db 유저 및 테이블을 생성

db 유저 생성/테이블 생성
 
mysql -u root -p'password'
CREATE DATABASE barbican;
GRANT ALL PRIVILEGES ON barbican.* TO 'barbican'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON barbican.* TO 'barbican'@'%' IDENTIFIED BY 'password';
 
Openstack에서 사용할 유저와 Role을 생성
유저/role 생성
 
openstack user create --domain default --password-prompt barbican
openstack role add --project service --user barbican admin
openstack role create creator
openstack role add --project service --user barbican creator
openstack service create --name barbican --description "Key Manager" key-manager
 
Key Manager service API endpoint 생성
Key Manager service API endpoints
 
openstack endpoint create --region RegionOne \
 key-manager public http://controller:9311/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne \
 key-manager internal http://controller:9311/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne \
 key-manager admin http://controller:9311/v1/%\(tenant_id\)s
 
barbican 패키지 설치 
install barbican
 
yum install openstack-barbican-api - y
 
barbican.conf 설정 수정 
Secret Store Back-ends 옵션은 Simple Crypto  ,PKCS#11 ,Crypto ,Dogtag ,KMIP있으며, Simple Crypto 로 구성 
/etc/barbican/barbican.conf
 
[DEFAULT]
bind_host = 0.0.0.0
bind_port = 9311
host_href = http://10.30.10.11:9311
log_file = /var/log/barbican/api.log
sql_connection = mysql+pymysql://barbican:password@10.30.10.11/barbican
transport_url = rabbit://openstack:password@10.30.10.11
 
[oslo_policy]
policy_file = /etc/barbican/policy.json
policy_default_rule = default
 
[secretstore]
enabled_secretstore_plugins = store_crypto
 
[crypto]
enabled_crypto_plugins = simple_crypto
 
[simple_crypto_plugin]
kek = 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY='
 
[keystone_authtoken]
www_authenticate_uri = http://10.30.10.11:5000
auth_url = http://10.30.10.11:5000
memcached_servers = 10.30.10.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = barbican
password = password
 
db에 해당 설정을 upgrade 
db upgrade
 
su -s /bin/bash barbican -c "barbican-manage db upgrade"
 
table 확인하여 정상적으로 삽입 된것을 확인 
barbican table
 
# mysql -uroot -p'password' barbican -e 'show tables';
+-----------------------------------+
| Tables_in_barbican                |
+-----------------------------------+
| alembic_version                   |
| certificate_authorities           |
| certificate_authority_metadata    |
| container_acl_users               |
| container_acls                    |
| container_consumer_metadata       |
| container_secret                  |
| containers                        |
| encrypted_data                    |
| kek_data                          |
| order_barbican_metadata           |
| order_plugin_metadata             |
| order_retry_tasks                 |
| orders                            |
| preferred_certificate_authorities |
| project_certificate_authorities   |
| project_quotas                    |
| project_secret_store              |
| projects                          |
| secret_acl_users                  |
| secret_acls                       |
| secret_store_metadata             |
| secret_stores                     |
| secret_user_metadata              |
| secrets                           |
| transport_keys                    |
+-----------------------------------+
 
openstack-barbican-api 서비스 재시작 
start barbican
 
systemctl enable openstack-barbican-api
 
systemctl start openstack-barbican-api
 

 

3. Barbican Verify operation

 
python-barbicanclient 패키지 설치
install barbican client package
 
yum install python-barbicanclient -y
 
 
mysecret 라는 이름의 j4=]d21 payload 로 생성
Secret href 링크를 저장해둔다 (Enc Key)
openstack secret store
 
openstack secret store --name mysecret --payload j4=]d21
+---------------+-------------------------------------------------------------------------+
| Field         | Value                                                                   |
+---------------+-------------------------------------------------------------------------+
| Name          | mysecret                                                                |
| Created       | None                                                                    |
| Status        | None                                                                    |
| Content types | None                                                                    |
| Algorithm     | aes                                                                     |
| Bit length    | 256                                                                     |
| Secret type   | opaque                                                                  |
| Mode          | cbc                                                                     |
| Expiration    | None                                                                    |
+---------------+-------------------------------------------------------------------------+
 
openstack secret get 으로 복호화 하여 평문을 확인 한다.(기본 aes 256 으로 암호화)
openstack secret get
 
+---------------+-------------------------------------------------------------------------+
| Field         | Value                                                                   |
+---------------+-------------------------------------------------------------------------+
| Name          | mysecret                                                                |
| Created       | 2018-07-12T07:34:51+00:00                                               |
| Status        | ACTIVE                                                                  |
| Content types | {u'default': u'text/plain'}                                             |
| Algorithm     | aes                                                                     |
| Bit length    | 256                                                                     |
| Secret type   | opaque                                                                  |
| Mode          | cbc                                                                     |
| Expiration    | None                                                                    |
+---------------+-------------------------------------------------------------------------+
 
 
암복호화에 관련된 entries 를 모두 database에 저장 하며 기본 90일 보관 하고 있음(자동 삭제)
# mysql -uroot -p'password' barbican -e 'select * from secrets'
+--------------------------------------+---------------------+---------------------+------------+---------+--------+----------+------------+-----------+------------+------+-------------+----------------------------------+--------------------------------------+
| id                                   | created_at          | updated_at          | deleted_at | deleted | status | name     | expiration | algorithm | bit_length | mode | secret_type | creator_id                       | project_id                           |
+--------------------------------------+---------------------+---------------------+------------+---------+--------+----------+------------+-----------+------------+------+-------------+----------------------------------+--------------------------------------+
| f0064215-45c4-4df4-9cca-274d3a75ac56 | 2018-07-12 07:34:51 2018-07-12 07:34:51 | NULL       |       0 | ACTIVE | mysecret | NULL       | aes       |        256 | cbc  | opaque      | 8f4c711b42f84be6b7e4fc8a14a128a5 | 9ecd9463-70e7-4c20-bb37-461a5c91268d |
+--------------------------------------+---------------------+---------------------+------------+---------+--------+----------+------------+-----------+------------+------+-------------+----------------------------------+--------------------------------------+
 
데이터베이스clean을 하기 위해서 별도 명령어난 cronjob으로 사용 하도록 권고 하고 있음https://docs.openstack.org/barbican/queens/admin/database_cleaning.html
 
 

4. Barbican cinder encryption

Controller node setting

controller node cinder 설정 중 [keymgr] 에  barbican api 를 이용 할 수 있도록 수정 한다.
/etc/cinder/cinder.conf
 
...
 
[keymgr]
 
...
 
cinder api  서비스 재시작 
Restart cinder-api
 
systemctl restart openstack-cinder-api.service
 
nova에서도 동일하게 barbican 을 사용 할 수 있도록 수정 한다.
/etc/nova/nova.conf
 
...
 
[keymgr]
 
 
...
 
nova api서비스 재시작
Restart nova-api
 
systemctl restart openstack-nova-api.service
 
 

compute node setting

compute node 에서 barbican을 사용 하기 위해서  cryptsetup, barbicanclient 을 설치 한다.
 
install barbican client package
 
# yum install -y python-pip
# pip install python-barbicanclient
# yum install -y cryptsetup
 
nova에서 암호화되어 있는 볼륨을 사용 하기 위하여 barbican backend설정과 endpoint 설정을 추가 한다.
/etc/nova/nova.conf
 
...
 
[key_manager]
backend=barbican
 
[barbican]
auth_endpoint=http://controller:35357/v3
 
...
 
nova  compute 서비스를 재시작
restart nova/libvirt
 

Create Encryption/Decryption Volume

암호화 볼륨을 생성 하기 위하여 , 암호화 타입의 "LUKS" 라는 이름의 volume type을 생성 한다.
Volume type생성
 
openstack volume type create --encryption-provider nova.volume.encryptors.luks.LuksEncryptor   --encryption-cipher aes-xts-plain64 --encryption-key-size 256 --encryption-control-location front-end LUKS
 
아래와 같이 볼륨 타입을 확인 해본다.
Volume type 확인
 
#  openstack volume type list
+--------------------------------------+----------------------------+-----------+
| ID                                   | Name                       | Is Public |
+--------------------------------------+----------------------------+-----------+
| ed0a2d42-1e8e-4e88-ada6-a814c703c8f4 | LUKS                       | True      |
+--------------------------------------+----------------------------+-----------+
#  openstack volume type show LUKS
+--------------------+--------------------------------------+
| Field              | Value                                |
+--------------------+--------------------------------------+
| access_project_ids | None                                 |
| description        | None                                 |
| id                 | ed0a2d42-1e8e-4e88-ada6-a814c703c8f4 |
| is_public          | True                                 |
| name               | LUKS                                 |
| properties         |                                      |
| qos_specs_id       | None                                 |
+--------------------+--------------------------------------+
 
해당 볼륨 타입으로 암호화되어 있는 "encrypted volume" 이라는 이름의 볼륨과 일반적으로 암호화가 안된 unencrypted volume을 생성 한다.
볼륨 생성
 
cinder create --display-name 'encrypted volume' --volume-type LUKS 1
cinder create --size 1 'unencrypted volume'
 
 
horizon상에서 볼륨을 확인하면 아래와 같이 암호화 기능이 활성화 되어 있는 볼륨을 볼 수 있다.
암호화부분을 확인 하면 위에서 설정한 volume type의 암호화를 확인 할 수 있다.

 

Volume Encryption/Decryption Test

unencrypted volume을 vdb에 encrypted volume 을 vdc에 연결 한 뒤 os상에서 인식 되는지 확인 해본다.
별도로 마운트 하지 않고, 각각 동일한 평문을 입력 해본다.
평문 저장
 
NAME   MAJ:MIN RM    SIZE RO TYPE MOUNTPOINT
vda    253:0    0      1G  0 disk
`-vda1 253:1    0 1011.9M  0 part /
vdb    253:16   0      1G  0 disk
vdc    253:32   0      1G  0 disk
 
# echo "test data" > /dev/vdb
# echo "test data" > /dev/vdc
 
 
각각 기존에 입력한 평문을 확인 할 수 있다
암호화 확인
 
# head -n1 /dev/vdb
test data
# head -n1 /dev/vdc
test data
 
 
기존에 추가한 볼륨을 해제 하고, 동일한 볼륨을 다른 인스터스에 연결한다.
연결한뒤 위에서 동일하게 확인 한 방법과 같인  head 로 볼륨을 읽을 경우 unencrypted volume에서는 기존에 입력한 평문을 확인 할 수 있지만,
encrypted volume  에서는 암호화되어 있는 형태로 확인 할 수 있다.
 
암호화 확인
 
#head /dev/vdb  | strings
test data
 
#head /dev/vdc  | strings
8V7_
{l`S]
$i_L
DGJW
SJ1Q
fZ)l
e6gE
pqS
;O3$a
4.]2
 
참조문서 

 

반응형