개인적으로 공부하는 관점에서 작성한 내용이라, 잘못된 부분이 있을 수 있습니다. 잘못된 부분은 말씀주시면 감사하겠습니다
본 내용은 아래 자료를 기반으로 학습하면서 작성했습니다.
- OpenStack Key Manager를 사용하여 시크릿 관리 | Red Hat Product Documentation
- OpenStack Key Manager (barbican) — Barbican 19.1.0.dev22 documentation
- OpenStack Docs: Welcome to Barbican’s developer documentation!
- Openstack barbican install/Barbican-cinder encryption
Barbican 이란?
![](https://blog.kakaocdn.net/dn/bmoEdN/btsMcsWyGp3/qIFvPwGw23d7vWFW16eO4k/img.png)
개요
Barbican - "Openstack Key Manager"로 시크릿 관리자 역할로 Opensatck 서비스에서 사용하는 인증서, Key 등을 중앙에서 관리할 수 있음
여기서 Secret 이란? 인증서, API 키, 암호화 등 모두 지칭 하는 용어
저장하는 Secret 예시
- 대칭 암호화키 (Symmetric)
- 비대칭 키 (Asymmetric)
- 인증서 ... 등
활용 예시
- 대칭 암호화키를 통한 Block Storage / Ephemeral Disk / Object Storage 암호화
- 비대칭키와 인증서를 사용한 Glance 이미지 서명 및 확인
Barbican 구성
barbican-api
- Openstack Native 한 Restful API 서비스 제공의 역할
- 즉, User or 다른 Service 에게 API를 통해 Secret 생성, 조회, 삭제 등등.. 의 기능을 제공
- 예를 들어, Cinder 볼륨 암호화에 사용하는 경우 Cinder 서비스와 연동해서 관련 Secret 정보 등 제공
- 내부적으로 메세지 큐와 연계해서 요청 처리
barbican-worker
barbican-api
와 함께 동작하며 주로 비동기적인 작업을 담당함- Openstack RPC 인터페이스 제공을 통해
barbican-api
으로부터 수신한 요청을 처리
barbican-api
~ barbican-worker
연계 흐름
barbican-api
가 암호화 키를 요청하면→ RabbitMQ에 작업 메시지를 추가barbican-worker
가 메시지 큐에서 요청을 읽음- 암호화 키를 생성 & 백엔드(HSM, Vault 등)에서 저장
- 결과를
barbican-api
에 전달하여 사용자가 조회 가능하도록 처리
barbican-keystone-listener
- Keystone 에서 발생하는 프로젝트 관련 이벤트 감지를 해서 Barbican DB 를 자동으로 업데이트
- 즉, Keystone과 Barbaican 과의 데이터 동기화 역할 수행
- ex. Keystone 에서 프로젝트 삭제 시 Barbican 에서 관련 데이터 정리 수행
- 아마.. 프로젝트 삭제 시 관련된 암호화 데이터도 삭제를 보장하기 위해서 있는 듯 (보안 문제 방지를 위해서)
Barbiacn 백엔드
Barbican의 백엔드 구성으로 (1) 데이터베이스에 BLOB
타입으로 저장하는 방식과, (2) 실제 보안 스토리지 시스템에 직접 저장하는 방식 등이 있음
BLOB(Binary Large Object) - 데이터베이스에서 대용량 바이너리 데이터를 저장하는 데이터 타입으로 주로 이미지, 오디오, 비디오, PDF, ZIP 파일 등의 비정형 데이터를 저장할 때 사용됩니다
Brabican 암호화 플러그인
데이터베이스에 암호화된 BLOB
으로 저장할 때 어떤 플러그인을 사용하냐이고 아래와 같은 플러그인 이 있음
simple_crypto
p11_crypto
kmip_plugin
등..
자세한 플러그인은 아래 링크에서 확인할 수 있음
Barbical CLI Hands-On
openstack secret list
![](https://blog.kakaocdn.net/dn/cQw3Oo/btsMcpMhoXM/Pp4ClB8nd9fTaqZRpKM2Kk/img.png)
openstack secret store --name test-secret --payload 'test-playload'
![](https://blog.kakaocdn.net/dn/Jx27Z/btsMa6ULyFT/i52DijKtLzWj7y1Mks8er0/img.png)
openstack secret get http://barbican-api.openstack.svc.cluster.local:9311/v1/secrets/f7410d6d-0483-44f6-b8f8-99cfeadce3d1
- 조회 시 이름이 아닌
Secret href
기반으로 CLI 수행
![](https://blog.kakaocdn.net/dn/cfvV87/btsMcIky2WE/pWN9E3Ad5GdIlMq1Zr8tvK/img.png)
openstack secret get http://barbican-api.openstack.svc.cluster.local:9311/v1/secrets/f7410d6d-0483-44f6-b8f8-99cfeadce3d1 --payload
- Payload 내용 조회
![](https://blog.kakaocdn.net/dn/AQHW1/btsMbX3MZMj/zSIWjDbX2cKmtNQg3Mhxg1/img.png)
openstack secret delete http://barbican-api.openstack.svc.cluster.local:9311/v1/secrets/b051a1fc-0879-4d17-a8d0-8e303c5f63f0
- 조회 시 이름이 아닌
Secret href
기반으로 삭제
![](https://blog.kakaocdn.net/dn/bpuNH6/btsMaN2gN4P/RkNPWuvcrhFsWg1h8tsWvk/img.png)
openstack secret order create --name swift\_key --algorithm aes --mode ctr --bit-length 256 --payload-content-type=application/octet-stream key\
- 대칭키 생성
openstack secret order create --name swift_key --algorithm aes --mode ctr --bit-length 256 --payload-content-type=application/octet-stream key
- 대칭키 조회
![](https://blog.kakaocdn.net/dn/co0IuH/btsMaOtgjBB/WQqbev66kxKe1y21amh0K0/img.png)
Barbican 활용한 Cinder 암호화
Barbican 을 통한 Cinder 암호화 목적
from ChatGPT
Cloud 환경에서는 여러 사용자가 동일한 디스크 인프라 사용함에 따라 데이터 유출 위험이 있을 수 있음
암호화 수행을 통해서 물리적 혹은 논리적으로 직접 접근하더라도 저장된 데이터 직접 읽을 수 없으므로 기밀성이 유지
따라서 이는 다중 테넌트 환경에서 특히 중요
Nova ~ Cinder 간 주요 흐름
from ChatGPT
① Nova → Cinder에 루트 볼륨 요청
② Cinder → 암호화된 볼륨 생성 (LUKS)
③ Cinder → Barbican에서 암호화 키 요청
④ Barbican → 키 반환
⑤ Cinder → Compute 노드로 볼륨 전달
⑥ Nova → OS-Brick을 통해 암호화된 볼륨 마운트 및 해독
⑦ Nova → 인스턴스 부팅
실습
암호화를 지원하는 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
![](https://blog.kakaocdn.net/dn/ciec5R/btsMcpZN7g9/b3nY4jXabBOm4rbml2DK20/img.png)
Skyline 에서 Volume Type 조회
![](https://blog.kakaocdn.net/dn/HOurJ/btsMbtWuUxx/pDhgbFVaQHeHkARddXK310/img.png)
Encyiption Info
확인 가능
암호화 Volume 생성
# Volume 생성
# 위에서 지정한 Volume Type 지정
openstack volume create --type LUKS --size=10 encrypt-vol-test-1
# 조회
openstack volume show encrypt-vol-test-1
+--------------------------------+--------------------------------------+
| Field | Value |
+--------------------------------+--------------------------------------+
| attachments | [] |
| availability_zone | az1 |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2025-02-07T13:34:14.000000 |
| description | None |
| encrypted | True |
| id | fa7e4f73-eeec-4be1-b1d5-14c93927573d |
| migration_status | None |
| multiattach | False |
| name | encrypt-vol-test-1 |
| os-vol-host-attr:host | cinder-volume-worker@rbd1#rbd1 |
| os-vol-mig-status-attr:migstat | None |
| os-vol-mig-status-attr:name_id | None |
| os-vol-tenant-attr:tenant_id | 98cbfc7aace14b9bad37d523d655cf5c |
| properties | |
| replication_status | None |
| size | 10 |
| snapshot_id | None |
| source_volid | None |
| status | available |
| type | LUKS |
| updated_at | 2025-02-07T13:34:28.000000 |
| user_id | 8343471505f6457786f301635c5bd26f |
+--------------------------------+--------------------------------------+
Skyline 에서 Volume 조회
![](https://blog.kakaocdn.net/dn/LwRQe/btsMbwMiP1g/WkAge4KzLto74Poipevxzk/img.png)
참고 - 암호화한 Volume 은 Transfer 를 지원하지 않음
openstack volume transfer request create encrypt-vol-test-1
Invalid volume: transferring encrypted volume is not supported (HTTP 400) (Request-ID: req-ff472f33-9683-403e-be15-ead7a52ac6b2)
Secret 조회
Volume 생성 이후 Barbican 조회 시,신규 Symmetric
타입의 Secret 생성되어 있음을 확인
![](https://blog.kakaocdn.net/dn/cnFZls/btsMcgWha2n/3VcfMMSWdkAdcwbyhpk3BK/img.png)