Why encryption?
Encryption flight(SSL)
: 전송 중 암호화에서 데이터는 전송 전에 암호화되고 서버에서는 수신 후에 암호화를 해독한다. 하지만 이 방법은 본인과 서버만 알고 있다. 그래서 SSL 인증서로 암호화를 하고 이를 확인할 수 있는 또다른 방법은 HTTPS가 있다.
Server side encryption at rest
: 서버에서 데이터를 수신한 후에 암호화한다.
- 서버는 데이터를 디스크에 저장하는데 암호화된 형식으로 저장한다.
Client side encryption
: 데이터는 서버에 저장되지만 서버는 데이터의 의미를 알지 못한다.
AWS KMS(Key Management Service)
- CloudTrail을 통해 키를 사용하기 위해 수행된 모든 API 호출을 검사할 수 있다.
- 기본적으로 KMS는 직접 사용할 수도 있는데 기밀 정보가 있는 경우 일반 텍스트 즉, 있는 그대로 코드에 저장해서는 안 된다.
- KMS에서 AWS Managed Service 키를 사용할 수 있으므로 자체 KMS 키를 생성할 필요가 없다.
KMS Keys Types
Symmetric(AES-256 keys)
: 데이터를 암호화하고 복호화하는 데 오직 하나의 키가 사용된다.
Asymmetric(RSA & ECC key pairs)
: 데이터 암호화에 사용되는 공개 키와 복호화에 사용되는 개인 키가 있다.
Copying Snapshots acress regions
KMS Key Policies
Default KMS Key Policy
: 특정한 사용자 지정 KMS 키 정책이 제공되지 않는 경우에 생성된다.
Custom KMS Key Policy
: KMS 키에 액세스할 수 있는 사용자, 역할을 정의하고 키를 관리할 수 있는 사람을 정의할 수 있다.
- 암호화된 스냅샷을 여러 계정에 복사하려는 경우
1. KMS 키로 암호화된 스냅샷을 생성한다(고객 관리형 키를 생성).
- KMS 키 정책을 추가하여 교차 계정 접근 권한을 부여한다.
- 암호화된 스냅샷을 대상 계정과 공유한다.
- 대상 계정에서 스냅샷 복사본을 생성하여 해당 계정의 다른 고객 관리 키로 암호화한다.
- 대상 계정의 스냅샷에서 볼륨을 생성한다.
API - Encrypt and Decrypt
Encrypt
: 4KB 이상의 데이터를 암호화할 때 사용한다.
Decrypt
: 4KB 이하의 데이터를 해독할 때 사용한다.
GenerateRandom
Envelope Encryption
: 4KB 이상을 암호화하려면 봉투를 사용해서 암호화하는 방법이 있다.
- 크기가 큰 파일을 암호화할 때 GenerateDataKey API를 사용한다.
- GenerateDataKeyWithoutPlaintext
Encryption SDK
- Data Key Caching: 데이터 키를 매번 오브젝트를 암호화할 때마다 다시 생성하는 게 아니라 재사용한다.
KMS Request Quotas
: 암호화나 해독에 있어 KMS의 요청 할당량을 초과하게 되면 ThrottlingException이 난다.
- 이런 경고에 대처하는 법은 지수 백오프 전략을 사용한다.
- GenerateDataKey를 사용하고 있다면, DEK 캐싱을 사용한다.
- 다른 방법은 제한을 여러 번 초과할 경우를 대비해 요청 할당량을 늘린다(API 호출이나 AWS 고객센터 문의를 통해 가능).
S3 Bucket Key for SSE-KMS encryption
: SSE-KMS 유형 암호화를 상용해 S3로부터 KMS로 보내지는 API 호출의 양을 99% 감소시킬 수 있다.
- CloudTrail 내에 KMS 관련 CloudTrail 이벤트의 수가 줄어들고 KMS 비용 또한 대폭 낮아진다.
CloudHSM
: 'HSM'이라는 암호화 하드웨어를 통해 보안 모듈을 프로비저닝한다.
- S3에서 SSE-C 유형의 암호화를 구현하고자 할 때 아주 적절한 선택지이다.
- 외부에서 비대친 키를 가져오는 건 CloudHSM에서만 할 수 있다.
High Availability
: CloudHSM 클러스터는 가용성이 매우 높다. 여러 가용 영역에 분산되어 있어 고가용성을 갖는다.
Integration with AWS Services
: KMS에서 KMS 사용자 지정 키 스토어를 CloudHSM으로 지정하면 KMS를 통해 CloudHSM 기능을 사용할 수 있다.
SSM Parameter Store
: 구성 및 보안 암호를 안전하게 보관하기 위한 저장소
- SSM 파라미터 스토어는 비밀을 저장하는 데 사용할 수 있으며 버전 추적 기능이 내장되어 있다. 파라미터 값을 편집할 때마다 SSM Parameter Store는 파라미터의 새 버전을 생성하고 이전 버전을 유지한다. 매개변수 기록에 있는 모든 버전의 값을 비롯한 세부정보를 볼 수 있다.
SSM Parameter Store Hierarchy
Parameters Policies
AWS Secrets Manager
: 암호 위주의 서비스이며 매 X일마다 암호가 순환하도록 강제할 수 있다.
- Secrets Manager를 RDS와 통합하여 데이터베이스와 Secrets Manager 사이에서 암호를 동기화할 수도 있다.
- ManageMasterUserPassword: true - RDS에 의해 자동으로 보안 암호가 생성된다.
: CloudFormation에서 시크릿 매니저로 자격 증명(보안 암호)을 생성한 다음 동적으로 참조한다.
SSM Parameter Store vs Secrets Manager
- Secrets Manager($$$): 람다 함수를 이용해서 암호의 순환을 자동화할 수 있다.
- SSM Parameter Store($): 조금 더 다용도로 사용이 가능하며 비용이 더 저렴하다.
CloudWatch Logs - Encryption
- associate-kms-key: KMS 키를 기존의 로그 그룹과 연결하는 명령어
- create-log-group: 아직 존재하지 않는 로그 그룹을 생성해 KMS 키와 바로 연결
CodeBuild Security
: CodeBuild는 VPC 외부에 있지만 VPC 리소스로의 액세스를 위해 CodeBuild를 VPC 내부에서 실행할 수 있다.
- 암호를 CodeBuild 환경 변수 내에서 평문으로 저장해서는 안 된다.
AWS Nitro Enclaves
: 민감 데이터를 처리하는 앱에서 공격에 노출되는 면을 줄일 수 있다.
- 암호화 증명을 사용하여 인증받은 코드만 엔클레이브에서 실행되도록 할 수 있다.