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
log_file = /var/log/barbican/api.log
transport_url = rabbit://openstack:password@10.30.10.11
[oslo_policy]
policy_default_rule = default
[secretstore]
enabled_secretstore_plugins = store_crypto
[crypto]
enabled_crypto_plugins = simple_crypto
[simple_crypto_plugin]
kek = 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY='
[keystone_authtoken]
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 |
+--------------------------------------+---------------------+---------------------+------------+---------+--------+----------+------------+-----------+------------+------+-------------+----------------------------------+--------------------------------------+
|
4. Barbican cinder encryption
Controller node setting
controller node cinder 설정 중 [keymgr] 에 barbican api 를 이용 할 수 있도록 수정 한다.
cinder api 서비스 재시작
nova에서도 동일하게 barbican 을 사용 할 수 있도록 수정 한다.
nova api서비스 재시작
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 서비스를 재시작
Create Encryption/Decryption Volume
암호화 볼륨을 생성 하기 위하여 , 암호화 타입의 "LUKS" 라는 이름의 volume type을 생성 한다.
아래와 같이 볼륨 타입을 확인 해본다.
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
|
참조문서