Search

[인슈어런스] 이미지 암호화 작업 가이드

프로젝트 정보

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 암호화 스펙에 따라 일회성 DEKIV를 발급하고 파일을 암호화 처리한다. 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 Server
Mermaid
복사
보안팀 가이드 스펙
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
복사