코드와 로그에 시크릿을 남기지 마세요

개발자를 위한 AWS 보안 활용

Rahul Singh

Technical Product Manager

민감 정보가 모두 시크릿은 아닙니다

세 가지 문자열 유형

  • 시크릿: 낯선 사람이 당신 행세를 할 수 있음
  • 민감 정보: 개인이 노출됨
  • 설정값: 얻을 것이 없음

시크릿, 민감 정보, 설정값을 비교하는 세 개의 행. 각 행은 예시 값 두 개와 낯선 사람이 그 값으로 할 수 있는 일(사용자 행세부터 아무것도 얻지 못하는 경우까지)을 보여줍니다.

개발자를 위한 AWS 보안 활용

민감 정보가 모두 시크릿은 아닙니다

세 가지 문자열 유형

  • 시크릿: 낯선 사람이 당신 행세를 할 수 있음
  • 민감 정보: 개인이 노출됨
  • 설정값: 얻을 것이 없음

개인정보를 가리키는 두 가지 용어

  • PII: 개인 식별 정보
  • PHI: 보호 대상 건강 정보

시크릿, 민감 정보, 설정값을 비교하는 세 개의 행. 각 행은 예시 값 두 개와 낯선 사람이 그 값으로 할 수 있는 일(사용자 행세부터 아무것도 얻지 못하는 경우까지)을 보여줍니다.

개발자를 위한 AWS 보안 활용

시크릿이 유출되는 네 가지 경로

실행 중인 시스템의 시크릿이 번호가 매겨진 네 개의 출구로 퍼져나갑니다. 마커 1은 소스 코드와 그 기록, 마커 2는 환경 변수, 마커 3은 애플리케이션 로그, 마커 4는 오류 출력과 트레이스를 가리킵니다. 네 경로 모두 '누군가 읽을 수 있음'이라는 상자로 모입니다.

  1. 소스 코드와 그 기록
  2. 환경 변수
개발자를 위한 AWS 보안 활용

시크릿이 유출되는 네 가지 경로

실행 중인 시스템의 시크릿이 번호가 매겨진 네 개의 출구로 퍼져나갑니다. 마커 1은 소스 코드와 그 기록, 마커 2는 환경 변수, 마커 3은 애플리케이션 로그, 마커 4는 오류 출력과 트레이스를 가리킵니다. 네 경로 모두 '누군가 읽을 수 있음'이라는 상자로 모입니다.

  1. 소스 코드와 그 기록
  2. 환경 변수
  3. 애플리케이션 로그
  4. 오류 출력과 트레이스
개발자를 위한 AWS 보안 활용

저장 시 암호화는 숨김이 아닙니다

안전해 보이는 선택

  • 항상 저장 시 암호화됨
  • AWS KMS 키, 기본값은 AWS 관리형

환경 변수를 가진 Lambda 함수가 두 갈래로 나뉩니다. 디스크에서는 AWS KMS 키로 저장 시 암호화되며 초록색으로 표시됩니다. API를 통해 GetFunctionConfiguration을 호출하면 값이 평문으로 반환되며 빨간색으로 표시됩니다. 두 경로는 '한쪽 경로만 보호됨'이라는 메모에서 만납니다.

개발자를 위한 AWS 보안 활용

저장 시 암호화는 숨김이 아닙니다

안전해 보이는 선택

  • 항상 저장 시 암호화됨
  • AWS KMS 키, 기본값은 AWS 관리형

GetFunctionConfiguration이 반환하는 값

  • 평문 그대로의 값

접근 문제에 저장 방식으로 답하기

환경 변수를 가진 Lambda 함수가 두 갈래로 나뉩니다. 디스크에서는 AWS KMS 키로 저장 시 암호화되며 초록색으로 표시됩니다. API를 통해 GetFunctionConfiguration을 호출하면 값이 평문으로 반환되며 빨간색으로 표시됩니다. 두 경로는 '한쪽 경로만 보호됨'이라는 메모에서 만납니다.

개발자를 위한 AWS 보안 활용

어떤 저장소를, 왜 선택할까

각자의 역할이 있는 두 서비스

  • Secrets Manager: 시크릿 전용
  • Parameter Store: 설정값 전용, SecureString 파라미터는 KMS 키로 암호화됨

스펙트럼 다이어그램입니다. 왼쪽에는 Secrets Manager, 오른쪽에는 Systems Manager Parameter Store가 표시되고 그 사이를 네 개의 가로 레일이 연결합니다. 각 레일에는 번호가 매겨진 마커가 있습니다. 마커 1은 맨 왼쪽, 마커 2는 중앙보다 왼쪽, 마커 3은 중앙선, 마커 4는 맨 오른쪽에 위치하며, 네 번째 레일 양 끝에는 비용 수치가, 그리고 '회전 주기가 결정 요인'이라는 메모가 있습니다.

개발자를 위한 AWS 보안 활용

어떤 저장소를, 왜 선택할까

각자의 역할이 있는 두 서비스

  • Secrets Manager: 시크릿 전용
  • Parameter Store: 설정값 전용, SecureString 파라미터는 KMS 키로 암호화됨

선택을 좌우하는 네 가지 요소

  1. 관리형 교체
  2. 계정 간 공유
  3. 버전 관리
  4. 비용

스펙트럼 다이어그램입니다. 왼쪽에는 Secrets Manager, 오른쪽에는 Systems Manager Parameter Store가 표시되고 그 사이를 네 개의 가로 레일이 연결합니다. 각 레일에는 번호가 매겨진 마커가 있습니다. 마커 1은 맨 왼쪽, 마커 2는 중앙보다 왼쪽, 마커 3은 중앙선, 마커 4는 맨 오른쪽에 위치하며, 네 번째 레일 양 끝에는 비용 수치가, 그리고 '회전 주기가 결정 요인'이라는 메모가 있습니다.

개발자를 위한 AWS 보안 활용

새로 읽고, 짧게 캐시하세요

실행 중인 프로세스가 마커 1에서 시크릿 저장소에 GetSecretValue를 호출하고, 마커 2에서는 단일 시크릿 ARN과 kms:Decrypt로 범위가 제한된 역할을 사용하며, 마커 3에서는 데이터베이스나 파트너 API를 호출하기 전에 반환된 값을 인메모리 캐시에 보관합니다.

  1. 시작 시 GetSecretValue 호출
  2. 단일 시크릿 ARN과 kms:Decrypt로 범위가 제한된 역할
개발자를 위한 AWS 보안 활용

새로 읽고, 짧게 캐시하세요

실행 중인 프로세스가 마커 1에서 시크릿 저장소에 GetSecretValue를 호출하고, 마커 2에서는 단일 시크릿 ARN과 kms:Decrypt로 범위가 제한된 역할을 사용하며, 마커 3에서는 데이터베이스나 파트너 API를 호출하기 전에 반환된 값을 인메모리 캐시에 보관합니다.

  1. 시작 시 GetSecretValue 호출
  2. 단일 시크릿 ARN과 kms:Decrypt로 범위가 제한된 역할
  3. 값을 메모리에 캐시

영구 캐시는 교체 시 문제를 일으킵니다

개발자를 위한 AWS 보안 활용

교체는 당신 몰래 값을 바꿉니다

왜 한 번에 교체하지 않고 네 단계로 나눌까

  • 새 값은 사용되기 전에 검증됨
  • 한 번에 바꾸면 모든 클라이언트가 동시에 오류 발생

페이지를 따라 내려가는 세 개의 열: 교체 단계, 레이블, 캐시입니다. Secrets Manager는 createSecret, setSecret, testSecret을 차례로 실행하고, 점선은 finishSecret이 레이블을 옮기는 순간을 표시합니다. 그 선 위에서는 레이블이 'AWSCURRENT = 이전 값'이고 캐시가 올바르며, 그 아래에서는 레이블이 'AWSCURRENT = 새 값'이지만 같은 캐시가 빨간 해칭으로 표시됩니다. 다이어그램은 짧은 캐시 수명과 인증 실패 시 새로고침이라는 두 가지 해결책으로 마무리됩니다.

개발자를 위한 AWS 보안 활용

교체는 당신 몰래 값을 바꿉니다

왜 한 번에 교체하지 않고 네 단계로 나눌까

  • 새 값은 사용되기 전에 검증됨
  • 한 번에 바꾸면 모든 클라이언트가 동시에 오류 발생

네 단계, 하나의 전환

  • AWSPENDING, AWSCURRENT, AWSPREVIOUS

페이지를 따라 내려가는 세 개의 열: 교체 단계, 레이블, 캐시입니다. Secrets Manager는 createSecret, setSecret, testSecret을 차례로 실행하고, 점선은 finishSecret이 레이블을 옮기는 순간을 표시합니다. 그 선 위에서는 레이블이 'AWSCURRENT = 이전 값'이고 캐시가 올바르며, 그 아래에서는 레이블이 'AWSCURRENT = 새 값'이지만 같은 캐시가 빨간 해칭으로 표시됩니다. 다이어그램은 짧은 캐시 수명과 인증 실패 시 새로고침이라는 두 가지 해결책으로 마무리됩니다.

개발자를 위한 AWS 보안 활용

교체는 당신 몰래 값을 바꿉니다

왜 한 번에 교체하지 않고 네 단계로 나눌까

  • 새 값은 사용되기 전에 검증됨
  • 한 번에 바꾸면 모든 클라이언트가 동시에 오류 발생

네 단계, 하나의 전환

  • AWSPENDING, AWSCURRENT, AWSPREVIOUS

캐시에는 아무도 알려주지 않습니다

  • 수명을 몇 분으로 설정 후 재조회
  • 인증 실패 시 새로고침

페이지를 따라 내려가는 세 개의 열: 교체 단계, 레이블, 캐시입니다. Secrets Manager는 createSecret, setSecret, testSecret을 차례로 실행하고, 점선은 finishSecret이 레이블을 옮기는 순간을 표시합니다. 그 선 위에서는 레이블이 'AWSCURRENT = 이전 값'이고 캐시가 올바르며, 그 아래에서는 레이블이 'AWSCURRENT = 새 값'이지만 같은 캐시가 빨간 해칭으로 표시됩니다. 다이어그램은 짧은 캐시 수명과 인증 실패 시 새로고침이라는 두 가지 해결책으로 마무리됩니다.

개발자를 위한 AWS 보안 활용

마스킹, 편집, 그래도 디버깅 가능

요청 ID, 전체 카드 번호, 토큰이 포함된 원본 로그 한 줄이 빨간색으로 표시되어 있습니다. 그 아래에는 처리 후 같은 세 필드가 있습니다. 요청 ID는 그대로, 카드 번호는 마지막 네 자리만 남기고 마스킹, 토큰은 편집됨 표시로 대체되었으며, 그 아래에는 '디버깅하기에 충분히 남음'이라는 메모가 있습니다.

기록하기 전에 정제하세요

  • 마스킹: 형태는 유지, 값은 숨김
개발자를 위한 AWS 보안 활용

마스킹, 편집, 그래도 디버깅 가능

요청 ID, 전체 카드 번호, 토큰이 포함된 원본 로그 한 줄이 빨간색으로 표시되어 있습니다. 그 아래에는 처리 후 같은 세 필드가 있습니다. 요청 ID는 그대로, 카드 번호는 마지막 네 자리만 남기고 마스킹, 토큰은 편집됨 표시로 대체되었으며, 그 아래에는 '디버깅하기에 충분히 남음'이라는 메모가 있습니다.

기록하기 전에 정제하세요

  • 마스킹: 형태는 유지, 값은 숨김
  • 편집(Redact): 값은 삭제, 표시만 남음
개발자를 위한 AWS 보안 활용

마스킹, 편집, 그래도 디버깅 가능

요청 ID, 전체 카드 번호, 토큰이 포함된 원본 로그 한 줄이 빨간색으로 표시되어 있습니다. 그 아래에는 처리 후 같은 세 필드가 있습니다. 요청 ID는 그대로, 카드 번호는 마지막 네 자리만 남기고 마스킹, 토큰은 편집됨 표시로 대체되었으며, 그 아래에는 '디버깅하기에 충분히 남음'이라는 메모가 있습니다.

기록하기 전에 정제하세요

  • 마스킹: 형태는 유지, 값은 숨김
  • 편집: 값은 삭제, 표시만 남음

온콜엔 설정값, 낯선 사람에겐 나머지

개발자를 위한 AWS 보안 활용

연습해 봅시다!

개발자를 위한 AWS 보안 활용

Preparing Video For Download...