🐾
개발자국
  • 🐶ABOUT
  • 🚲프로그래밍
    • 객체 지향 프로그래밍
    • 오브젝트
      • 1장: 객체, 설계
      • 2장: 객체지향 프로그래밍
      • 3장: 역할, 책임, 협력
      • 4장: 설계 품질과 트레이드오프
      • 5장: 책임 할당하기
      • 6장: 메시지와 인터페이스
      • 7장: 객체 분해
      • 8장: 의존성 관리하기
      • 9장: 유연한 설계
      • 10장: 상속과 코드 재사용
      • 11장: 합성과 유연한 설계
      • 12장: 다형성
      • 13장: 서브클래싱과 서브타이핑
      • 14장: 일관성 있는 협력
      • 15장: 디자인 패턴과 프레임워크
    • 도메인 주도 개발 시작하기
      • 1장: 도메인 모델 시작하기
      • 2장: 아키텍처 개요
      • 3장: 애그리거트
      • 4장: 리포지토리와 모델 구현
      • 5장: 스프링 데이터 JPA를 이용한 조회 기능
      • 6장: 응용 서비스와 표현 영역
      • 7장: 도메인 서비스
      • 8장: 애그리거트 트랜잭션 관리
      • 9장: 도메인 모델과 바운디드 컨텍스트
      • 10장: 이벤트
      • 11장: CQRS
    • 클린 아키텍처
      • 만들면서 배우는 클린 아키텍처
        • 계층형 아키텍처의 문제와 의존성 역전
        • 유스케이스
        • 웹 어댑터
        • 영속성 어댑터
        • 아키텍처 요소 테스트
        • 경계 간 매핑 전략
        • 애플리케이션 조립
        • 아키텍처 경계 강제하기
        • 지름길 사용하기
        • 아키텍처 스타일 결정하기
    • 디자인 패턴
      • 생성(Creational) 패턴
        • 팩토리 패턴
        • 싱글톤 패턴
        • 빌더 패턴
        • 프로토타입 패턴
      • 행동(Behavioral) 패턴
        • 전략 패턴
        • 옵저버 패턴
        • 커맨드 패턴
        • 템플릿 메서드 패턴
        • 반복자 패턴
        • 상태 패턴
        • 책임 연쇄 패턴
        • 인터프리터 패턴
        • 중재자 패턴
        • 메멘토 패턴
        • 비지터 패턴
      • 구조(Structural) 패턴
        • 데코레이터 패턴
        • 어댑터 패턴
        • 퍼사드 패턴
        • 컴포지트 패턴
        • 프록시 패턴
        • 브리지 패턴
        • 플라이웨이트 패턴
      • 복합 패턴
  • 시스템 설계
    • 1. 사용자 수에 따른 규모 확장성
    • 2. 개략적 규모 추정
    • 3. 시스템 설계 접근법
    • 4. 처리율 제한 장치
    • 5. 안정 해시
    • 6. 키-값 저장소
    • 7. 유일한 ID 생성기
    • 8. URL 단축기
    • 9. 웹 크롤러
    • 10. 알림 시스템
    • 11. 뉴스 피드
    • 12. 채팅 시스템
    • 13. 검색어 자동완성
    • 14. 유튜브 스트리밍
    • 15. 구글 드라이브
    • ⭐️. 캐싱 전략
    • ⭐️. 재고 시스템으로 알아보는 동시성이슈 해결방법
    • ⭐️. 실습으로 배우는 선착순 이벤트 시스템
  • 🏝️자바
    • 자바의 내부 속으로
      • Java 언어의 특징
      • JDK
      • JVM
        • 메모리 관리
        • Garbage Collector
          • 기본 동작
          • Heap 영역을 제외한 GC 처리 영역
          • (WIP) GC 알고리즘
        • 클래스 로더
      • 자바 실행 방식
      • 메모리 모델과 관리
      • 바이트 코드 조작
      • 리플렉션
      • 다이나믹 프록시
      • 어노테이션 프로세서
    • 자바의 기본
      • 데이터 타입, 변수, 배열
    • 이펙티브 자바
      • 2장: 객체의 생성과 파괴
        • item 1) 생성자 대신 정적 팩토리 메서드를 고려하라
        • item2) 생성자에 매개변수가 많다면 빌더를 고려하라
        • item3) private 생성자나 열거 타입으로 싱글톤임을 보증하라
        • item4) 인스턴스화를 막으려면 private 생성자를 사용
        • item5) 자원을 직접 명시하는 대신 의존 객체 주입 사용
        • item6) 불필요한 객체 생성 지양
        • item7) 다 쓴 객체는 참조 해제하라
        • item8) finalizer와 cleaner 사용 자제
        • item9) try-with-resources를 사용하자
      • 3장: 모든 객체의 공통 메서드
        • item 10) equals는 일반 규약을 지켜 재정의 하자
        • item 11) equals 재정의 시 hashCode도 재정의하라
        • item 12) 항상 toString을 재정의할 것
        • item 13) clone 재정의는 주의해서 진행하라
        • item 14) Comparable 구현을 고려하라
      • 4장: 클래스와 인터페이스
        • item 15) 클래스와 멤버의 접근 권한을 최소화하라
        • item 16) public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
        • item 17) 변경 가능성을 최소화하라
        • item 18) 상속보다는 컴포지션을 사용하라
        • item 19) 상속을 고려해 설계하고 문서화하고, 그러지 않았다면 상속을 금지하라
        • item 20) 추상 클래스보다는 인터페이스를 우선하라
        • item 21) 인터페이스는 구현하는 쪽을 생각해 설계하라
        • item 22) 인터페이스는 타입을 정의하는 용도로만 사용하라
        • item 23) 태그 달린 클래스보다는 클래스 계층구조를 활용하라
        • item 24) 멤버 클래스는 되도록 static으로 만들라
        • item 25) 톱레벨 클래스는 한 파일에 하나만 담으라
      • 5장: 제네릭
        • item 26) 로 타입은 사용하지 말 것
        • item 27) unchecked 경고를 제거하라
        • item 28) 배열보다 리스트를 사용하라
        • item 29) 이왕이면 제네릭 타입으로 만들라
        • item 30) 이왕이면 제네릭 메서드로 만들라
        • item 31) 한정적 와일드카드를 사용해 API 유연성을 높이라
        • item 32) 제네릭과 가변 인수를 함께 사용
        • item 33) 타입 안전 이종 컨테이너를 고려하라
      • 6장: 열거 타입과 어노테이션
        • item 34) int 상수 대신 열거 타입을 사용하라
        • item 35) ordinal 메서드 대신 인스턴스 필드를 사용하라
        • item 36) 비트 필드 대신 EnumSet을 사용하라
        • item 37) ordinal 인덱싱 대신 EnumMap을 사용하라
        • item 38) 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라
        • item 39) 명명 패턴보다 어노테이션을 사용하라
        • item 40) @Override 어노테이션을 일관되게 사용하라
        • item 41) 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라
      • 7장: 람다와 스트림
        • item 42) 익명 클래스보다는 람다를 사용하라
        • item 43) 람다보다는 메서드 참조를 사용하라
        • item 44) 표준 함수형 인터페이스를 사용하라
        • item 45) 스트림은 주의해서 사용하라
        • item 46) 스트림에서는 부작용 없는 함수를 사용하라
        • item 47) 반환 타입으로는 스트림보다 컬렉션이 낫다
        • item 48) 스트림 병렬화는 주의해서 적용하라
      • 8장: 메서드
        • item 49) 매개변수가 유효한지 검사하라
        • item 50) 적시에 방어적 복사본을 만들라
        • item 51) 메서드 시그니처를 신중히 설계하라
        • item 52) 다중정의는 신중히 사용하라
        • item 53) 가변인수는 신중히 사용하라
        • item 54) null이 아닌, 빈 컬렉션이나 배열을 반환하라
        • item 55) 옵셔널 반환은 신중히 하라
        • item 56) 공개된 API 요소에는 항상 문서화 주석을 작성하라
      • 9장: 일반적인 프로그래밍 원칙
        • item 57) 지역 변수의 범위를 최소화하라
        • item 58) 전통적인 for문보다 for-each문을 사용하기
        • item 59) 라이브러리를 익히고 사용하라
        • item 60) 정확한 답이 필요하다면 float, double은 피하라
        • item 61) 박싱된 기본타입보단 기본 타입을 사용하라
        • item 62) 다른 타입이 적절하다면 문자열 사용을 피하라
        • item 63) 문자열 연결은 느리니 주의하라
        • item 64) 객체는 인터페이스를 사용해 참조하라
        • item 65) 리플렉션보단 인터페이스를 사용
        • item 66) 네이티브 메서드는 신중히 사용하라
        • item 67) 최적화는 신중히 하라
        • item 68) 일반적으로 통용되는 명명 규칙을 따르라
      • 10장: 예외
        • item 69) 예외는 진짜 예외 상황에만 사용하라
        • item 70) 복구할 수 있는 상황에서는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라
        • item 71) 필요 없는 검사 예외 사용은 피하라
        • item 72) 표준 예외를 사용하라
        • item 73) 추상화 수준에 맞는 예외를 던지라
        • item 74) 메서드가 던지는 모든 예외를 문서화하라
        • item 75) 예외의 상세 메시지에 실패 관련 정보를 담으라
        • item 76) 가능한 한 실패 원자적으로 만들라
        • item 77) 예외를 무시하지 말라
      • 11장: 동시성
        • item 78) 공유 중인 가변 데이터는 동기화해 사용하라
        • item 79) 과도한 동기화는 피하라
        • item 80) 스레드보다는 실행자, 태스크, 스트림을 애용하라
        • item 81) wait와 notify보다는 동시성 유틸리티를 애용하라
        • item 82) 스레드 안전성 수준을 문서화하라
        • item 83) 지연 초기화는 신중히 사용하라
        • item 84) 프로그램의 동작을 스레드 스케줄러에 기대지 말라
      • 12장: 직렬화
        • item 85) 자바 직렬화의 대안을 찾으라
        • item 86) Serializable을 구현할지는 신중히 결정하라
        • item 87) 커스텀 직렬화 형태를 고려해보라
        • item 88) readObject 메서드는 방어적으로 작성하라
        • item 89) 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라
        • item 90) 직렬화된 인스턴스 대신 직렬화 프록시 사용을 검토하라
    • 모던 자바 인 액션
      • 1장: 자바의 역사
      • 2장: 동작 파라미터화
      • 3장: 람다
      • 4장: 스트림
      • 5장: 스트림 활용
      • 6장: 스트림으로 데이터 수집
      • 7장: 병렬 데이터 처리와 성능
      • 8장: 컬렉션 API 개선
      • 9장: 람다를 이용한 리팩토링, 테스팅, 디버깅
      • 10장: 람다를 이용한 DSL
      • 11장: null 대신 Optional
      • 12장: 날짜와 시간 API
      • 13장: 디폴트 메서드
      • 14장: 자바 모듈 시스템
      • 15장: CompletableFuture와 Reactive 개요
      • 16장: CompletableFuture
      • 17장: 리액티브 프로그래밍
      • 18장: 함수형 프로그래밍
      • 19장: 함수형 프로그래밍 기법
      • 20장: 스칼라 언어 살펴보기
    • 자바의 이모저모
      • Javax
      • Objects
      • NIO
      • Thread
      • Concurrent
        • Atomic
        • Executor, ExecutorService
        • Interrupt
      • Assertions
    • Netty
      • 네티 맛보기
      • 네티의 주요 특징
      • 채널 파이프라인
      • 이벤트 루프
      • 바이트 버퍼
      • 부트스트랩
      • 네티 테스트
      • 코덱
      • 다양한 ChannelHandler와 코덱
      • 웹소켓
      • UDP 브로드캐스팅
    • 자바 병렬 프로그래밍
      • 2장: 스레드 안전성
      • 15장: 단일 연산 변수와 논블로킹 동기화
  • 🏖️코틀린
    • 코틀린 인 액션
      • 코틀린 언어의 특징
      • 코틀린 기초
      • 함수 정의와 호출
      • 클래스, 객체, 인터페이스
      • 람다
      • 타입 시스템
      • 연산자 오버로딩과 기타 관례
      • 고차 함수
      • 제네릭스
      • 어노테이션과 리플렉션
      • DSL 만들기
  • 🌸스프링
    • Spring Core
      • Cron Expression
      • Bean
        • Lifecycle
        • Aware
    • Spring MVC
    • Spring Security
      • 로그인 처리
      • 로그아웃 처리
      • JWT 인증 방식
      • 메소드별 인가 처리
    • Spring Data
      • Pageable
      • Spring Data Couchbase
      • Spring Data Redis
        • Serializer
    • Spring REST Docs
    • Spring Annotations
    • Spring Cloud
      • Service Discovery
      • API Gateway
      • Spring Cloud Config
      • MicroService Communication
      • Data Synchronization
    • Test
      • 테스트 용어 정리
      • JUnit
      • Spring Boot Test
      • Mockito
    • QueryDSL
      • 프로젝트 환경설정
      • 기본 문법
      • 중급 문법
      • 순수 JPA와 QueryDSL
      • 스프링 데이터 JPA와 QueryDSL
    • Lombok
      • @Data
      • @Builder
      • Log Annotations
  • 🕋DB
    • MySQL
      • CentOS7에서 MySQL 8 버전 설치하기
    • MongoDB
      • 
    • Redis
      • Sentinel
      • Cluster
      • Transaction
      • 자료구조
        • String
        • List
        • Set
        • Hash
        • Bitmaps
        • SortedSet
      • Lettuce 단일 서버, 클러스터 서버, 풀링 사용 방법
  • 📽️인프라
    • 리눅스
      • 주요 명령어 모음
    • Docker
      • Docker
      • Docker Compose
      • Docker Swarm
      • Docker Network
      • Linux에서 root 아닌 유저로 docker 실행하기
    • Kubernetes
      • 기초 개념
      • Pod
      • Configuration
      • ReplicationSet
      • Network
      • ConfigMap & Secret
      • Volume, Mount, Claim
      • Controller
      • Multi Container Pod
      • StatefulSet & Job
      • Rollout & Rollback
      • Helm
      • 개발 워크플로우와 CI/CD
      • Container Probes
      • Resource Limit
      • Logging & Monitoring
      • Ingress
      • Security
      • Multi Node/Architecture Cluster
      • Workload & Pod management
      • CRD & Operator
      • Serverless Function
      • K8S Cheat Sheet
    • Kafka
      • 카프카 개요
      • 카프카 설치 및 실습
      • Kafka Broker
      • Topic, Partition, Record
      • Producer
      • Consumer
      • Kafka Streams
      • Kafka Connect
      • MirrorMaker
  • AWS
    • AWS Console / CLI / SDK
    • IAM
    • EC2
      • EC2 Advanced
    • ELB / ASG
    • RDS / Aurora / ElastiCache
    • DynamoDB
    • DocumentDB / Neptune / Keyspaces / QLDB / Timestream
    • Route 53
    • Beanstalk
    • Solution Architect
    • S3
      • 보안
    • CloudFront
    • Global Accelerator
    • AWS Storage
    • Messaging
    • Container
    • Serverless
    • Data Analysis
    • Machine Learning
    • Monitoring
    • Security
    • VPC
    • Data Migration
    • 기타 서비스
  • 🏔️CS
    • 운영 체제
      • Introduction
      • System Structures
      • Process
      • Synchronization
      • Muitithreaded Programming
      • Process Scheduling
      • Memory Management
      • Virtual Memory
    • 네트워크
      • 네트워크 기초
      • 네트워크 통신 방식
      • OSI 7계층
        • 1계층: 물리계층
        • 2계층: 데이터 링크 계층
        • 3계층: 네트워크 계층
        • 4계층: 전송 계층
        • 5계층: 세션 계층
        • 6계층: 표현 계층
        • 7계층: 응용 계층
      • TCP/IP 스택
      • ARP
      • 데이터 크기 조절
      • WDM
      • NAT
      • DNS
      • DHCP
      • VPN
      • 네이글 알고리즘
      • 서버 네트워크
      • 네트워크 보안
        • 보안의 기본
        • 보안 장비
      • 이중화
    • 데이터베이스
      • 트랜잭션
    • 컴퓨터 구조
      • 개요
      • Instruction Set Architecture
      • Procedure Call & Return
      • Linking
      • Pipeline
      • Memory Hierarchy
      • Virtual Memory
      • Interrupt / Exception, IO
    • 자료 구조
      • Array
      • List
      • Map
      • Set
      • Queue
      • PriorityQueue
      • Stack
    • 웹 기술
      • HTTP
        • 쿠키와 세션
  • 🪂Big Data
    • Apache Hadoop
  • 🕹️ETC
    • Git
      • 내부 구조
      • 내가 자주 사용하는 명령어 모음
      • Commit Convention
    • 이력서 작성하기
    • Embedded
      • 라즈베리파이에서 네오픽셀 적용기
    • 기술블로그 모음집
Powered by GitBook
On this page
  • 암호화 기본
  • KMS
  • Multi-Region Keys
  • S3 암호화된 복제
  • 암호화된 AMI 공유 프로세스
  • SSM 매개변수
  • AWS Secrets Manager
  • ACM
  • WAF
  • Shield
  • Firewall Manager
  • WAF vs FirewallManager vs Shield
  • DDoS Protection
  • GuardDuty
  • Inspector
  • Macie
  1. AWS

Security

PreviousMonitoringNextVPC

Last updated 27 days ago

암호화 기본

  • 전송 중 암호화

    • TLS/SSL 을 이용해 데이터를 보내는 시점에 암호화하고 받는 시점에 복호화하는 방식이다.

    • Man in the middle attack을 방지할 수 있다.

  • Server-Side 암호화

    • 서버가 데이터를 받은 후 암호화하여 저장해두고, 서버가 데이터를 보내기 전 복호화하는 방식이다.

    • 암/복호화 키가 누군가에 의해 관리되어야 하며, 서버가 항상 접근할 수 있어야 한다.

  • Client-Side 암호화

    • 클라이언트가 갖고 있는 암/복호화키를 이용해 데이터를 전송하기 전 암호화하고 데이터를 받은 후 복호화하는 방식이다.

    • 서버는 데이터를 항상 암호화된 상태로 관리하게 된다.

KMS

  • 암호화 키를 관리해주는 서비스

  • IAM과 통합 가능하며 데이터에 대한 접근을 쉽게 제어할 수 있다.

  • CloudTrail을 통해 키를 사용하기 위해 이루어진 모든 API 호출을 감사할 수 있다.

  • 대부분의 AWS 서비스와 통합 가능하다. 예를 들어 EBS 볼륨에 저장되어 있는 데이터를 암호화할 때 KMS 통합을 활성화하면 된다.

  • 기밀 데이터는 절대로 평문 텍스트에 저장하면 안된다. 암호화된 형태로 코드나 환경 변수에서 사용해야 한다.

  • AWS CLI, SDK를 통한 API 호출으로 KMS를 사용할 수 있다.

  • KMS 키

    • 대칭 KMS 키

      • 데이터를 암호화하고 복호화하는 데 하나의 암호화 키만 사용한다.

      • KMS가 통합된 모든 AWS 서비스는 대칭 키를 사용한다. 이 때에는 KMS 키 자체에 절대로 액세스할 수 없다. AWS API 호출을 이용해서 그 키를 사용할 수만 있다.

    • 비대칭 키

      • 데이터를 암호화하는 데 사용되는 퍼블릭 키와 데이터를 복호화하는 데 사용되는 프라이빗 키가 사용된다.

      • 암호화/복호화 또는 서명/확인 형태의 작업을 할 때 사용할 수 있다.

      • KMS에서 퍼블릭 키는 다운로드할 수 있지만 프라이빗 키에는 액세스할 수 없다.

      • 프라이빗 키에 액세스하려면 API 호출만 사용할 수 있다.

      • AWS Cloud 외부에서 KMS API 키에 액세스할 수 없는 사용자가 암호화하려는 경우, 퍼블릭 키를 사용해 데이터를 암호화하여 전송한 후, AWS의 프라이빗 키를 써서 해당 데이터를 복호화할 수 있다.

  • KMS 키의 종류

    • AWS가 소유한 키

      • 무료이며 SSE-S3, SSE DynamoDB, SSE-DDE 타입의 암호화를 사용할 때 쓴다.

    • AWS 관리형 키

      • 무료이며 앞에 aws/가 있고 서비스 이름이 나오기 때문에 식별 가능하다. 에를 들어 aws/rds, aws/ebs, aws/dynamodb 같은 이름을 가진다. 키가 지정된 서비스 안에서만 사용할 수 있다.

    • 고객 관리형 키

      • KMS에서 생성하거나 외부에서 임포트할 수 있으며 한달에 1달러의 비용이 발생한다.

    • 기본적으로 KMS API 호출에 대한 비용이 부과되는데, 대략 10,000회의 API 호출당 3센트 정도 발생한다.

  • 자동 키 순환(Automatic Key Rotation)

    • AMS 관리형 KMS 키라면 자동으로 1년마다 순환된다.

    • KMS 안에서 생성한 고객 관리형 키라면 1년마다 순환되도록 자동 순환 옵션을 활성화할 수 있다. 기본적으로는 비활성화되어 있다.

    • 직접 임포트한 KMS 키라면 수작업으로만 순환시킬 수 있다. alias를 사용해 순환시켜야 한다.

  • KMS 키는 리전 단위로 존재한다.

  • KMS 키 정책

    • KMS 키에 대한 액세스를 관리하기 위한 정책

    • S3 버킷 정책과 비슷하지만, 키에 KMS 키 정책이 없다면 아무도 키에 접근할 수 없다.

    • 기본 정책

      • 특정한 커스텀 KMS 키 정책을 제공하지 않았을 때 생성된다.

      • 계정에 있는 모든 사람이 이 키에 액세스하도록 허용한다.

      • 사용자 또는 역할이 키 정책에 액세스하도록 허용하는 IAM 정책이 있다면 문제가 없다.

    • 커스텀 KMS 키 정책

      • KMS 키에 액세스할 수 있는 사용자와 역할을 직접 정의하고 키를 누가 관리할 수 있는지 정의한다.

      • KMS 키에 대한 교차 계정 액세스를 하려는 경우 유용하다. 다른 계정이 현재 계정의 KMS 키를 사용하도록 승인할 수 있다.

  • 암호화된 EBS 스냅샷을 리전 간 이동시키기

    • 암호화된 스냅샷을 만들고, 암호화된 스냅샷의 스냅샷을 만들어 동일한 KMS 키로 각각 암호화한다.

    • 스냅샷을 다른 리전에 복사하기 위해 다른 리전의 KMS 키를 사용해서 그 스냅샷을 다시 암호화한다. 이는 AWS에서 대신 수행해준다.

    • 다른 리전에서는 EBS 스냅샷을 받은 후 KMS를 이용해서 원래 암호화되어 있던 EBS 볼륨으로 복구한다.

  • 암호화된 EBS 스냅샷을 계정 간 이동시키기

    • 고객 관리형 KMS 키로 암호화된 스냅샷을 생성하고, 교차 계정 액세스를 승인하기 위해 커스텀 키 정책을 첨부한다.

    • 암호화된 스냅샷을 다른 계정에 공유한다. 다른 계정은 자체적으로 스냅샷의 사본을 생성하고 다른 고객 관리형 키를 사용해서 암호화한다.

    • 다른 계정에서는 이 스냅샷으로부터 볼륨을 생성할 수 있다.

Multi-Region Keys

  • AWS KMS에는 다중 리전 키를 둘 수 있다. 즉, 한 리전에 키를 두면, 다른 리전들에 복제시킬 수 있다. (Not Global)

    • 이를 통해 한 리전에서 데이터를 암호화하고 다른 리전에서 데이터를 복호화 할 수 있다.

    • 동일한 키 ID와 동일한 키 구성 요소를 갖는다.

    • 기본 키의 자동 교체를 활성화했다면 실제로 자동으로 교체된 키는 다른 리전에도 복제된다.

    • 한 리전에서 암호화하고 다른 리전에서 복호화해 다음 리전으로 복제할 때나 교차 리전 API 호출을 실행할 때 데이터를 재암호화하지 않아도 된다.

    • 기본 키가 있고 복제본이 있는 거예요

    • 각 다중 리전 키는 자체 키 정책 등으로 각각 독립적으로 관리된다.

    • 일부 상황을 제외하고는 다중 리전 키 사용을 권장하지 않는다.

    • 사용 사례

      • 전역 클라이언트 측 암호화: 한 리전에서 클라이언트 측 암호화를 하고 다른 리전에서 클라이언트 측 복호화를 하는 방식

    • DynamoDB 전역 테이블과 KMS 다중 리전 키로 Client-Side 암호화하기

      • 전체 테이블을 암호화하는 대신 테이블의 속성을 클라이언트에서 암호화하므로 특정 클라이언트만 사용할 수 있다. 데이터베이스 관리자도 사용할 수 없다.

      • 이 때 클라이언트는 Amazon DynamoDB 암호화 클라이언트를 사용한다.

      • KMS 다중 리전 키는 다른 리전에 복제된다.

      • us-east-1 리전의 클라이언트 애플리케이션에서 DynamoDB에 데이터를 삽입할 때 다중 리전 키를 통해 속성을 암호화해 DynamoDB에 저장한다.

      • DynamoDB 테이블이 전역 테이블인 경우 해당 테이블의 데이터는 다른 리전으로 복제된다.

      • 다중 리전 키로 데이터 속성을 암호화하였으므로, ap-southeast-2 리전의 클라이언트 애플리케이션은 해당 속성을 복호화할 수 있다.

      • 이를 통해 데이터의 특정 필드나 속성을 보호할 수 있고, API 키 액세스 권한이 있는 클라이언트만 복호화하도록 할 수 있다.

    • Global Aurora

      • 두 리전에 걸쳐 복제된 KMS 다중 리전 키를 사용한다.

      • 특정 리전의 클라이언트 애플리케이션에서는 AWS Encryption SDK를 사용하여 특정 컬럼 값을 암호화하여 데이터를 Amazon Aurora DB에 보낸다.

      • 전역 데이터베이스이므로 테이블이 전역으로 복제된다.

      • 다른 리전의 클라이언트 애플리케이션에서는 다중 리전 키를 사용해 KMS에 로컬 API 호출을 보내 해당 속성을 복호화할 수 있다.

      • 이를 통해 지연 시간이 단축된다.

S3 암호화된 복제

  • 한 버킷에서 다른 버킷으로 S3 복제를 활성화하면, 암호화되지 않은 객체와 SSE-S3로 암호화된 객체가 기본으로 복제된다.

  • 고객 제공 키인 SSE-C로 암호화한 객체도 복제될 수 있다.

  • SSE-KMS로 암호화한 객체를 복제하려면 별도 옵션을 활성화해주어야 한다.

    • 어떤 KMS 키로 대상 버킷 내 객체를 암호화하는지 지정해야 한다.

    • KMS 키 정책을 대상 키에 적용해야 한다.

    • S3 복제 서비스를 허용하는 IAM 역할을 생성해서 소스 버킷의 데이터를 먼저 복호화한 뒤 대상 KMS 키로 대상 버킷의 데이터를 다시 암호화한다.

    • 수많은 암호화와 복호화가 발생하여 KMS 스로틀링 오류가 발생한 경우는 서비스 할당량 증가를 요청해야 한다.

  • S3 복제에 다중 리전 KMS 키를 사용할 수는 있지만 Amazon S3 서비스에서 독립 키로 취급하고 있다. 객체의 복호화와 암호화 모두 가능하다.

암호화된 AMI 공유 프로세스

  • 소스 계정에서 KMS로 암호화된 AMI를 그대로 타겟 계정에서 사용해 EC2 인스턴스를 실행할 수 있도록 해야 한다.

  • 다음 과정을 수행해야 한다.

    • 소스 계정에서 KMS 키로 암호화된 AMI를 준비한다.

    • 시작 권한(Launch Permission)을 추가해 타겟 계정에서 AMI를 시작할 수 있도록 AMI 속성을 수정한다.

    • KMS 키 정책을 통해 타겟 계정에서 KMS 키를 사용할 수 있도록 공유한다.

    • 타겟 계정에서는 KMS 키와 AMI를 모두 사용할 수 있는 충분한 권한을 가진 IAM 역할이나 IAM 사용자를 생성한다.

      • DescribeKey API 호출과 ReEncrypted API 호출, CreateGrant, Decrypt API 호출에 관한 KMS 측 액세스 권한이 있어야 한다.

    • 앞선 과정이 모두 완료된 후에는 타겟 계정에서 AMI를 이용해 EC2 인스턴스를 시작하면 된다.

      • 이 때 타겟 계정에서 자체 KMS 키를 이용해 볼륨을 재암호화할 수도 있다.

SSM 매개변수

  • 설정 및 암호를 위한 보안 스토리지

  • 설정에 대해 KMS 키로 암호화할지 선택할 수 있다. 기본적으로는 String, StringList 타입을 사용하고, 암호화를 하는 경우 SecureString 타입을 사용하게 된다.

  • SSM Parameter Store는 서버리스이며 확장성과 내구성이 있고 SDK 사용이 용이하다.

  • 설정과 암호의 버전을 추적할 수 있다.

  • IAM을 통해 보안이 제공되며 Amazon EventBridge로 알림을 받을 수 있다.

  • CloudFormation과 통합 가능하다. 즉, CloudFormation이 Parameter Store의 매개변수를 스택의 입력 매개변수로 활용할 수 있다.

  • SSM Parameter Store에 평문을 저장하고자 한다면, 애플리케이션의 IAM 권한을 확인 후 저장한다.

  • 암호화된 데이터를 저장하고자 한다면 SSM Parameter Store가 KMS로 암호화한다. 이 때 애플리케이션은 기본 KMS 키에 액세스할 수 있어야 한다.

  • Parameter Store에 매개변수를 계층 구조로 저장할 수 있다.

    /my-department
      |--my-app
        |--dev
          |__db-url
          |__db-password
        |__prod
          |__db-url
          |__db-password
      |__other-app
  • IAM 정책은 특정 경로에만 접근 가능하도록 설정할 수 있다.

  • /aws/reference/secretsmanager/secret_ID_in_Secrets_Manager 위치의 값을 통해 Secrets Manager의 암호에 액세스할 수 있다.

  • /aws/reference/secretsmanager/secret_ID_in_Secrets_Manager 위치의 값을 통해 특정 리전에서Amazon Linux 2의 최신 AMI를 찾을 수 있다.

  • 매개변수 티어

    • 표준

      • 파라미터의 최대 크기는 4KB이다.

      • 무료로 사용 가능하다.

    • 고급

      • 파라미터의 최대 크기는 8KB이다.

      • 매개변수 정책을 적용하여 만료 기한을 설정하거나 만료에 따른 알람, 일정 기간동안 변화가 없을 때의 알람을 설정할 수 있다.

      • 월 0.05달러를 지불해야 한다.

AWS Secrets Manager

  • 암호를 저장하는 최신 서비스

  • 특정 기간마다 강제로 암호를 교체하는 기능이 있다. 이를 위해 새 암호를 생성할 Lambda 함수를 정의해야 한다.

  • AWS가 제공하는 다양한 서비스(Amazon RDS, MySQL PostgreSQL, Aurora 등)와 통합이 잘된다.

  • RDS, Aurora 등 데이터베이스에 접근하기 위한 사용자 이름과 비밀번호를 AWS Secrets Manager에 바로 저장하고 교체할 수 있다.

  • KMS 서비스를 통해 암호화된다.

  • 다중 리전 암호

    • 여러 AWS 리전에 암호를 복제할 수 있고 AWS Secrets Manager 서비스가 기본 암호와 동기화된 읽기 전용 복제본을 유지해준다.

    • 특정 리전에 문제가 발생하면 암호 복제본을 독립 실행형 암호로 승격할 수 있다.

    • 다중 리전 앱을 구축하고 재해 복구 전략도 짤 수 있다.

    • 동일한 암호로 여러 리전에 분포된 동일한 RDS 데이터베이스에 접근할 수 있다.

ACM

  • AWS Certificate Manager

  • TLS 인증서를 AWS에서 프로비저닝, 관리 및 배포해주는 서비스

  • 오토 스케일링 그룹에 연결된 ALB를 HTTPS 엔드 포인트로 노출하려 한다면 ALB를 AWS Certificate Manager와 통합해 ALB에서 직접 TLS 인증서를 프로비저닝 및 유지관리하도록 하면 된다.

  • ACM은 퍼블릭과 프라이빗 TLS 인증서를 모두 지원한다. 퍼블릭 TLS 인증서 사용 시에는 무료로 이용할 수 있다.

  • 인증서를 자동으로 갱신할 수 있다.

  • CLB, ALB, NLB, CloudFront 배포나 API Gateway와 모두 통합 가능하다.

  • 퍼블릭 인증서일 경우 추출이 불가능하므로 EC2 인스턴스에서는 사용 불가능하다.

  • 다음 과정으로 퍼블릭 인증서를 요청할 수 있다.

    • 인증서에 포함할 도메인 이름을 나열한다.

      • 전체 주소 도메인 이름(FQDN)도 될 수 있고 *.example.com과 같은 와일드카드 도메인도 가능하다.

      • 도메인 개수는 제한이 없다.

    • 유효성 검증 방법을 거친다.

      • 자동화를 목적으로 SSL 인증서를 자동 갱신하려면 DNS 검증을 쓸 수 있다. 이 때 DNS 구성에서 CNAME 레코드를 생성해 도메인 소유권을 증명해야 한다. Route 53을 사용할 경우 자동으로 수행된다.

      • ACM이 도메인에 등록된 연락처로 이메일을 보내 해당 인증서를 요청했는지 여부를 확인하는 이메일 검증을 쓸 수 있다.

    • 몇 시간 후 유효성 검증이 완료되면 인증서가 발행된다.

    • 인증서는 자동 갱신 목록에 추가되어 만료 60일 전에 자동으로 갱신되도록 한다.

  • 다음 과정으로 이미 외부에서 생성된 퍼블릭 인증서를 ACM으로 가져올 수 있다.

    • 자동 갱신은 불가능하다. 따라서 인증서가 만료되기 전에 직접 새 인증서를 다시 가져와야 한다.

    • ACM 서비스는 기본적으로 만료 45일 전부터 매일매일 만료 이벤트를 EventBridge 서비스에 전송해준다. 며칠 전부터 알려줄지는 설정 가능하다.

    • AWS Config을 사용하여 acm-certificate-expiration-check라는 관리형 규칙을 관리할 수 있다. 이는 만료된 인증서를 확인하는 규칙이며 만료 일수를 조정할 수 있다. 규칙에 위배되는 인증서가 있을 경우 규정 비준수 이벤트가 EventBridge로 전송된다.

  • ACM 서비스와 ALB 통합

    • 오토 스케일링 그룹과 매핑된 ALB와 ACM으로 프로비저닝 및 유지관리되는 TLS 인증서가 있을 때 HTTPS 요청을 받을 수 있다.

    • 만약 사용자가 HTTP 프로토콜로 액세스했다면, HTTPS로 리디렉션할 수 있다.

    • 사용자의 요청이 HTTPS 프로토콜을 통과하면 오토 스케일링 그룹으로 전달된다.

  • API Gateway와 통합

    • ACM을 API Gateway와 통합하려면 API Gateway에 사용자 지정 도메인 이름이라는 리소스를 생성하고 설정해야 한다.

    • 다음 엔드포인트 유형 중 하나를 사용할 수 있다. ACM은 엣지 최적화 및 리전 엔드포인트에 적합하다.

      • 엣지 최적화(edge-optimized) 유형

        • 글로벌 클라이언트를 위한 유형으로 CloudFront 엣지 로케이션으로 요청을 라우팅하여 지연을 줄이는 방법이다.

        • 요청이 CloudFront에서 라우팅되고 TLS 인증서가 CloudFront 배포에 연결되기 때문에 TLS 인증서가 반드시 CloudFront와 같은 리전인 us-east-1에 생성되어야 한다.

        • Route 53에 CNAME이나 별칭(A-Alias) 레코드를 설정해야 한다.

      • 리전(regional) 엔드 포인트 유형

        • 클라이언트가 API Gateway와 같은 리전에 있을 때 자체 CloudFront 배포를 생성하여 캐싱 및 배포 전략을 제어할 수 있다.

        • TLS 인증서가 같은 리전에 속해 있어야 한다.

        • Route 53에 CNAME이나 별칭(A-Alias) 레코드를 설정해야 한다.

      • 프라이빗(private) API Gateway 엔드포인트

        • 인터페이스 VPC 엔드 포인트(ENI)를 통해 VPC 내부에만 액세스할 수 있다.

        • API Gateway에 대한 액세스를 정의하는 리소스 정책이 필요하다.

WAF

  • Web Application Firewall

  • 7계층에서 일어나는 일반적인 웹 취약점 공격으로부터 웹 애플리케이션을 보호한다.

  • 웹 애플리케이션 방화벽(WAF)의 배포는 ALB, API Gateway, CloudFront, AppSync GraphQL API, Cognito 사용자 풀에 할 수 있다.

  • 방화벽을 배포한 후 웹 액세스 제어 목록(ACL)과 규칙을 정의해야 한다.

    • IP 주소를 기반으로 필터링하기 위해 IP 세트를 정의할 수 있으며 최대 10,000개의 IP 주소를 가질 수 있다.

    • HTTP 헤더와 본문에 기반해 필터링할 수도 있고 URI 문자열을 조건으로 두어 SQL 주입, 크로스 사이트 스크립팅(XSS) 등의 일반적인 공격을 차단할 수 있다.

    • 용량에 제약을 걸어 요청이 최대 2MB를 넘지 않게 하거나 지역 일치(Geo-match) 조건을 두어 특정 국가를 허용 또는 차단할 수 있다.

    • 속도 기반 규칙을 설정하면 IP당 요청 수를 측정하여 디도스 공격을 막을 수 있다.

    • 웹 ACL은 리전에만 적용되며, CloudFront는 글로벌로 정의된다.

    • 규칙 그룹을 통해 여러 웹 ACL에 추가할 수 있는 재사용 가능한 규칙을 모아둘 수 있다.

  • 애플리케이션에 고정 IP를 사용하면서 로드 밸런서와 함께 WAF를 사용하려 한다면, ALB가 필요하다. 하지만 ALB는 고정 IP 기능을 제공하지 않는다. 이 경우 AWS Global Accelerator와 통합해 고정 IP를 할당받은 다음 ALB에서 WAF를 활성화하면 된다.

Shield

  • 디도스 공격으로부터 스스로를 보호하기 위한 서비스

  • 스탠다드 서비스

    • 모든 AWS 고객에게 무료로 활성화되어 있는 서비스

    • SYN/UDP Floods나 반사 공격 및 L3/L4 공격으로부터 보호해준다.

  • 어드밴스드 서비스

    • 선택적으로 제공되는 디도스 완화 서비스

    • 조직당 월 3,000달러를 지불해야 한다.

    • 더욱 정교한 디도스 공격을 막아주며 Amazon EC2, ELB Amazon CloudFront, AWS Global Accelerator, Route 53를 보호한다.

    • AWS 디도스 대응 팀이 항시 대기하고 있어 공격을 받았을 때 지원을 받을 수 있다.

    • 자동 애플리케이션 계층 디도스 완화 기능을 제공하여 자동으로 WAF 규칙을 생성, 평가, 배포함으로써 L7 공격을 완화할 수 있다.

Firewall Manager

  • AWS Organizations에 있는 모든 계정의 방화벽 규칙을 관리하는 서비스

  • 여러 계정의 규칙을 동시에 관리할 수 있다.

  • 보안 정책을 설정할 수 있다. 정책은 리전 수준에서 생성되며, 조직에 있는 모든 계정에 적용된다.

    • 보안 정책이란 보안 규칙의 집합이다. 아래 규칙들이 추가될 수 있다.

    • ALB, API Gateway CloudFront 등에 적용되는 웹 애플리케이션 방화벽(WAF) 규칙

    • ALB, CLB, NLB, 엘라스틱 IP CloudFront를 위한 AWS Shield 어드밴스드 규칙

    • EC2, ALB, VPC의 ENI 리소스를 위한 보안 그룹

    • VPC 수준의 AWS Network Firewall

    • Amazon Route 53 Resolver DNS Firewall

  • 모든 계정의 모든 지정된 리소스에 대해 규칙이 적용된다. 만약 조직에서 ALB에 대한 WAF 규칙을 생성한 다음 새 ALB를 생성하는 경우, AWS Firewall Manager에서 자동으로 새 ALB에도 같은 규칙을 적용해준다.

WAF vs FirewallManager vs Shield

  • 리소스별 보호를 구성하는 데에는 WAF가 적절하다.

  • 여러 계정에서 WAF를 사용하고 있으며 설정을 가속하고 새 리소스 보호를 자동화하려면 Firewall Manager로 WAF 규칙을 관리하면 된다.

  • Shield Advanced는 디도스 공격으로부터 고객을 보호하고 WAF의 기능 외에도 더 많은 기능을 제공한다.

  • Firewall Manager는 모든 계정에 Shield 어드밴스드를 배포할 때 도움이 된다.

  • VPC 내부의 트래픽 흐름 검사 및 트래픽 필터링 같은 작업을 수행하려면 AWS 네트워크 방화벽을 사용해야 한다.

DDoS Protection

  • CloudFront는 엣지 로케이션에서 사용한다. 웹 애플리케이션 전송도 엣지에서 일어나므로 SYN Flood나 UDP 반사 공격과 같은 DDoS 일반 공격은 Shield 설정으로 막을 수 있다.

  • Global Accelerator를 사용하면 전 세계의 엣지를 통해 애플리케이션에 액세스할 수 있다. Shield와 완전히 통합되므로, CloudFront가 백엔드와 호환되지 않는 경우에도 DDoS 공격 방어를 할 수 있다.

  • Route 53를 사용하는 경우 엣지에 도메인 이름 변환을 글로벌로 설정하여 DNS에도 DDoS 보호 메커니즘을 적용할 수 있다.

  • 인프라 계층 방어

    • Global Accelerator, Route 53, ELB 를 통해 높은 트래픽으로부터 Amazon EC2 인스턴스를 보호할 수 있다.

    • 트래픽을 EC2 인스턴스에 도달하기 전에 관리할 수 있다. EC2 인스턴스에서 오토 스케일링 기능을 활성화하면 오토 스케일링 그룹에 트래픽이 도달한다고 해도 자동으로 확장하여 애플리케이션에서 더 큰 부하를 수용할 수 있다.

  • 애플리케이션 계층 방어

    • CloudFront는 정적 콘텐츠 전송 시 엣지 로케이션에서 전송하여 백엔드에 영향이 가지 않도록 한다.

    • ALB나 CloudFront에 WAF를 사용하여 요청 서명에 따라 악성 요청을 필터링 및 차단할 수 있다.

    • WAF rate-based 규칙을 사용하면 악성 사용자의 IP를 자동으로 차단할 수 있다.

    • CloudFront로는 특정 지역을 차단할 수 있다.

    • Shield Advanced 서비스를 활성화하여 자동으로 WAF 규칙을 생성하여 7계층 공격을 완화할 수 있다.

  • 공격 지점 줄이기

    • CloudFront, API Gateway, ELB를 사용해 백엔드 리소스를 숨긴다.

    • 보안 그룹과 네트워크 ACL 등을 설정하여 특정 IP의 트래픽을 필터링할 수 있다.

    • Elastic IP도 AWS Shield Advanced로 보호할 수 있다.

    • API 엔드 포인트를 보호하려면 API Gateway를 사용하면서 엣지 최적화 모드, CloudFront와 통합하여 리전 모드를 사용한다면 DDoS 보호에 관한 제어 기능이 강화된다.

    • API Gateway에 WAF를 사용하는 경우 모든 HTTP 요청에 대해 버스트 제한과 헤더 필터링, 특정 API 키 사용 등 조건을 통해 필터링할 수 있다.

GuardDuty

  • 머신러닝 기반의 지능형 위협 탐지를 이용해 AWS 계정을 보호할 수 있다.

  • 서드파티 데이터를 사용해서 위협을 탐지한다.

  • GuardDuty는 다음 데이터들을 감시한다.

    • CloudTrail Event Logs 데이터에서 비정상적인 API 호출이나 무단 배포 이력을 탐색한다.

      • CloudTrail Manatement Events: VPC 서브넷 생성 이벤트 등을 포함한다.

      • CloudTrail S3 Data Events: GetObject, ListObject, DeleteObject 이벤트 등을 포함한다.

    • VPC Flow Logs에서 비정상적인 인터넷 트래픽, IP 주소를 탐색한다.

    • DNS 로그에서 DNS 쿼리 안에서 인코딩된 데이터를 전송하는 EC2 인스턴스를 탐색한다.

    • EKS 감사 로그나 RDS 및 Aurora 로그인 이벤트, EBS, 람다, S3 데이터 이벤트 등 다른 입력 데이터 소스도 탐색할 수 있다.

  • EventBridge 규칙을 설정해서, 발견된 결과에 대해 자동으로 알림을 받을 수 있다.

  • 전문적인 탐지 기능이 제공되어 암호화폐 공격을 방어하기 좋다.

Inspector

  • 몇 군데에서 자동화된 보안 평가를 실행할 수 있는 서비스

  • EC2 인스턴스를 평가하기 위해 시스템 관리자 에이전트(AWS SSM Agent)를 활용한다. Amazon Inspector는 의도되지 않은 네트워크 접근 가능성에 대해 분석하고, 실행 중인 운영 체제에서 알려진 취약점을 분석한다.

  • 컨테이너 이미지가 Amazon ECR로 푸시되면 Amazon Inspector가 알려진 취약점에 대해 검사할 수 있다.

  • Lambda 함수가 배포될 때 함수 코드 및 패키지 종속성에서 소프트웨어 취약성을 다시 분석한다.

  • 작업이 완료되면 결과를 AWS 보안 허브에 보고하고, 결과 및 결과 이벤트를 Amazon Event Bridge로 보낸다. 이를 통해 인프라에 있는 취약점을 모아서 볼 수 있다.

  • 패키지 취약성을 분석하기 위해 취약성 데이터베이스인 CVE를 참고한다.

  • 만약 CVE 데이터베이스가 업데이트된다면 Amazon Inspector는 자동으로 다시 실행되어 모든 인프라를 한 번 더 테스트한다.

  • 실행 시 우선 순위를 정하기 위해 risk score가 모든 취약성과 연관된다.

Macie

  • 완전 관리형 데이터 보안 및 데이터 프라이버시 서비스

  • 머신러닝과 패턴 매칭을 이용해 AWS 리소스에 개인식별정보, 즉 PII 같은 민감정보가 존재한다면 EventBridge로 알람을 보내는 기능을 제공한다.

  • EventBridge에 들어온 이벤트는 SNS 토픽이나 람다 함수와 통합할 수 있다.

  • 간단하게 원하는 S3 버킷만 지정하여 활성화할 수 있다.