프로젝트 정보
Cephfs 파일 클라이언트측 암호화
•
클라이언트(FE, BE)에서 파일을 암호화하고 스토리지에 저장하는 방식.
FE 또는 BE 클라이언트에서 서버에 양방향 Key를 요청하여 파일을 암호화 처리하고 스토리지(Cephfs)에 업로드.
•
장점 : 스토리지 종류(S3, Ceph, Cephfs)에 관계없이 파일 암호화 처리 후 저장이 가능.
•
단점 : 클라이언트측(FE, BE) 구현이 필요.
•
Key 관리 방식은 보안 요건에 따라 아래와 같이 구체화.
•
DEK : Data Encryption Key (데이터를 암호화하기 위한 키) - Data에 따라 일회성으로 생성
IV : Initialization Vector (초기화 벡터) - Data에 따라 일회성으로 생성
KEK : Key Encryption Key (키를 암호화하기 위한 키) - Data에 따라 일회성으로 생성
CMK : Customer Master Key (KEK 를 암호화하기 위한 키) - Vault 에서 관리되는 고정키
•
1) 클라이언트는 AES256 암호화 스펙에 따라 일회성 DEK와 IV를 발급하고 파일을 암호화 처리한다.
2) 클라이언트는 암호화된 파일을 저장소에 (S3, Ceph, Cephfs) 업로드 한다.
3) 클라이언트는 DEK 를 암호화 하기 위한 KEK를 서버에 요청한다.
4) 서버는 일회성 비대칭키(RSA Key) 형식으로 키를 생성하여, public key는 클라이언트에 응답하고
5) 서버에서 생성된 private key는 vault 서버에 저장된 CMK를 요청하여 KEK를 암호화한 후 DB 에 저장한다.
6) 클라이언트는 암호화된 DEK를 서버에 전송하여 DB 에 저장한다.
sequenceDiagram
participant Client as 🧑💻 클라이언트
participant Server as 🖥️ 서버
participant Vault Server as 🔑 Vault
participant Storage as 📄 S3/Ceph
participant DB as 🛢️ DB
%% --- 1. 파일 암호화 및 업로드 (Flow 1, 2) --- %%
activate Client
Note left of Client: 1. 일회성 DEK와 IV를 (AES256) 발급
Client->>Client: 1. DEK와 IV로 로컬 파일 암호화
Client->>Storage: 2. 암호화된 파일 업로드 (IV+ENC_File)
deactivate Client
%% --- 2. KEK(공개키) 요청 및 수신 (Flow 3, 5) --- %%
activate Client
Client->>Server: 3. DEK를 암호화할 KEK(공개키) 요청
deactivate Client
activate Server
Server->>Server: 4. 일회성 비대칭키(RSA) 생성 (Pub/Priv)
Server-->>Client: 4. Public Key (KEK) 응답 (w/ UUID)
%% --- 3. 서버의 Private Key 저장 (Flow 6) --- %%
Note right of Server: 5. (서버) 생성한 Private Key를 보호해야 함
Server->>Vault Server: 5. Private Key 암호화용 CMK 요청
activate Vault Server
Vault Server-->>Server: 5. CMK 제공 (프로퍼티 주입)
deactivate Vault Server
Server->>Server: 5. Private Key를 CMK로 암호화
Server->>DB: 5. 암호화된 Private Key를 DB에 저장 (INSERT)
deactivate Server
%% --- 4. 암호화된 DEK 전송 및 저장 (Flow 4) --- %%
activate Client
Note left of Client: 4에서 받은 Public Key로 DEK 암호화
Client->>Server: 6. 암호화된 DEK를 전송 (w/ UUID)
deactivate Client
activate Server
Server->>DB: 6. 암호화된 DEK를 DB에 저장 (UPDATE)
deactivate ServerMermaid
복사
•
보안팀 가이드 스펙
◦
AES-256-GCM 암호화 알고리즘 사용하여 암호화
◦
파일마다 개별 일회용 랜덤 IV 를 사용하여 암호화
◦
KEY 정보를 DB에 저장 시에 HashiCorp Vault 에 저장된 CMK 로 암호화해서 저장
◦
기존 저장된 평문 이미지 데이터를 암호화 처리하는 마이그레이션 작업 필요
◦
암호화된 개인정보 파일도 주기적인 삭제 필요
•
일회성 DEK (AES256) 발급하고 파일 암호화 처리하는 예시 코드
const dek = await window.crypto.subtle.generateKey(
{ name: 'AES-GCM', length: 256 },
true, // export 가능하도록
['encrypt', 'decrypt']
);
const fileData = await file.arrayBuffer();
const iv = window.crypto.getRandomValues(new Uint8Array(12)); // GCM용 초기화 벡터
// 암호화
const encryptedFile = await window.crypto.subtle.encrypt(
{ name: 'AES-GCM', iv: iv },
dek,
fileData
);
const rawDek = await window.crypto.subtle.exportKey('raw', dek); // ArrayBuffer
// TODO Base64 string
// 복호화
const decryptedFile = await window.crypto.subtle.decrypt(
{ name: 'AES-GCM', iv: iv },
dek,
encryptedFile // S3에서 다운로드한 파일 본문
);
JavaScript
복사