본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

At-Rest 암호화 — auth 로 부족할 때

~15 min · encryption-at-rest, fernet, filevault

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Auth 는 누가 물어볼 수 있는지를 정해. 암호화는 auth 를 이미 지나쳐버린 쪽 (도둑맞은 디스크, 뚫린 host, 나쁜 마음 먹은 클라우드 admin, 권한이 잘못 열린 backup) 이 뭘 읽을 수 있는지를 정하고.

세 tier

Tier방어하는 것노력
Disk-level (FileVault, LUKS)전원 꺼진 디바이스의 물리적 도난한 번만 하면 되고 공짜야. 요즘 OS 는 대부분 기본이 켜짐
Database-level (SQLCipher, Postgres TDE)파일엔 닿지만 앱엔 못 들어온 상대라이브러리를 바꾸면 됨. 하루쯤
Field-level (민감 컬럼 암호화)Rogue DBA, leak 된 backup, 앱 레벨 XSS-extracted dump손이 제일 많이 감. 게다가 key 관리라는 새 문제가 생김

Key 관리 현실

암호화는 보안 문제를 "데이터" 에서 "키" 로 옮겨놔. 그래서 새 질문이 생겨.

  • Key 가 어디 살아? (OS keychain, KMS, HSM, env var)
  • deploy 하거나 재시작할 땐 어떻게 되지? (서비스가 시작할 때 키를 가져와야 해)
  • 키를 잃어버리면? (데이터가 영영 사라져. 키는 따로 백업해둬)
  • 회전은 어떻게 하지? (새 키로 전부 다시 암호화해야 해. 규모가 커지면 간단하지 않아)

field 레벨 암호화가 값어치를 하는 것들

전부는 아니야. index 나 foreign key 를 암호화하면 쿼리 패턴이 깨져. 현실적인 목록은 이래. 사용자 대신 보관하는 API 키와 토큰, 개인 노트와 일기, 건강·재무 데이터, session 토큰 (보통은 one-way hash 로 충분해), 그리고 컴플라이언스 규정 (HIPAA, GDPR 특수 범주) 이 걸리는 것들.

Code

cryptography.Fernet 으로 field 레벨 암호화·python
from cryptography.fernet import Fernet

# 키는 Keychain 에서. repo 엔 절대 두지 마
fernet = Fernet(get_keychain("APP_DATA_KEY"))

def encrypt_field(value: str) -> bytes:
    return fernet.encrypt(value.encode())

def decrypt_field(blob: bytes) -> str:
    return fernet.decrypt(blob).decode()

# DB 엔 blob 만 저장. 앱이 write 할 때 암호화하고 read 할 때 복호화.
# Leak 된 backup 은 APP_DATA_KEY 없이 unreadable.

External links

Exercise

개발에 쓰는 모든 맥에서 FileVault ON 확인 (System Settings → Privacy & Security → FileVault). 꺼져 있으면 오늘 저녁에 켜. 그 설정 하나가 '전원 꺼진 채 도둑맞은 노트북' 이라는 위협을 모델에서 통째로 지워. 공짜로 얻는 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.