SOPS는 Terraform에서 쓰이는 어떤 값을 암호화할 때 사용한다. IaC는 코드로써 인프라를 관리하는 것이고, 그러면 Github와 같은 Source Repository에 업로드하고, 서로 리뷰를 해야한다. 그리고 그 정보는 외부에 저장되는 것과 같다. (Repo가 누구나 접근할 수 있는 public이면 정말 큰일)
테라폼 파일에다가 민감한 정보를 입력하고 KMS의 암호화된 값을 집어넣게 되면 파일이 암호화된다. 내가 그 KMS의 권한이 있으면 terraform plan이 가능해지는 것이다. 즉, terraform에서 민감정보를 관리하는 방법 중 하나라고 할 수 있다.
참고 : https://github.com/getsops/sops
키를 쉽게 만드는 서비스이다. 보통 어떤 데이터를 암호화하기 위해서는 어떤 키가 필요하다. 그래서 데이터를 특정 키로 암호화한다. kms가 그 역할을 하는 것이다.
KMS의 활용 용도는 보통 봉투 암호화 알고리즘이라고 부르는데 우리가 특정 데이터 암호화한느 어떤 데이터를 암호화하는 키를 암호화하는 키라고 생각하면 된다.
대표적으로 parameter store와 secret manager가 있다.
parameter store는 단순하게 키-밸류 스토어이다. aws에서는 system manager라는 서비스로 일컫는다. 해당 서비스 안에 parameter store라는 도구는 aws의 접근 제어를 관리하는 서비스이다. 2가지의 aws의 권한이 필요하다.
첫 번째, 파라미터스토어를 get할 수 있다. 해당 파라미터의 키를 가져올 수 있다.
두 번째, 내가 가지고 있는 KMS키로 암호화를 하여 그것을 통해 decrypt할 수 있다. 이렇게 2가지 권한을 가지고 있어야 value를 얻어낼 수 있다.
secret manager는 key-value로 구성된 map 형태의 집합이다. 그래서 더욱 더 복잡하다.
이것을 이해하면 암호화와 관리 방식의 원리를 이해할 수 있다.

민감정보가 저장되어 있는 데이터가 평문이 아닌 KMS를 통해 암호화되어 있어야 한다. 그렇다면 서버는 2가지의 권한을 가지고 있어야 한다.
복호화 데이터를 요청할 수 있는 권한과 그 데이터에 대한 것을 복호화할 수 있는 권한이다.
서버 어플리케이션 컨피그레이션 설정에다 평문으로 저장되는 것은 완전히 잘못되었기 때문에 위와 같은 방식을 적용해야만 한다.
IRSA는 IAM Role for Service Account의 약자 입니다. 풀네임에서 볼 수 있듯이 kubernetes의 serviceaccount를 사용하여 pod의 권한을 IAM Role로 제어할 수 있도록 하는 할당할 수 있다.
최대한 최소한의 권한을 할당할 수 있어야 한다.
코드예제 자세히 보기
ssm.tf
resource "aws_ssm_parameter" "secret" {
name = var.ssm_parameter_name #"test-key"
description = var.ssm_parameter_description #"for Testing"
type = var.ssm_parameter_type #"SecureString"
key_id = var.ssm_parameter_key_id
value = var.ssm_parameter_value
lifecycle {
ignore_changes = all
}
}
여기서 라이프사이클은 모든 변경 값에 대해서 무시하라는 것이다. 다른 옵션에 대해서 자세히 알고 싶으면 아래 링크를 달아놨으니 확인해보는 것이 좋다.
hint
aws 서비스에는 IAM와 같은 글로벌 종속 서비스가 있다. 또한, 리전에 따라 다르게 리소스가 생성될 수 있는 리전 종속 서비스가 있다. 대표적으로 S3와 같은 서비스이다. 마지막으로 VPC에 종속되는 서비스가 있다. EC2, RDS와 같은 서비스가 그 예이다. VPC 내에서만 생성할 수 있다.