비밀이란 무엇인가?

발행: (2025년 12월 2일 오전 09:52 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

1. What is a secret?

비밀(secret) 은 무단 접근으로부터 보호해야 하는 모든 민감한 정보를 의미합니다.

예시

  • API 키
  • 액세스 토큰
  • 데이터베이스 비밀번호
  • 개인 키(.pem)
  • Confluent Cloud 자격 증명
  • Terraform 백엔드 자격 증명
  • OAuth 토큰
  • SSH 키

목표: 비밀을 저장 시 암호화하고, 전송 시 암호화하며, 평문(예: 저장소, 로그, 아티팩트)으로 절대 저장하지 않음.


2. Why secrets management is critical

시니어 DevOps 엔지니어는 다음을 방지해야 합니다:

  • 자격 증명 누출
  • 무단 접근
  • Git에 실수로 커밋
  • Terraform, Kubernetes, Docker, CI/CD 파이프라인에 하드코딩

비밀 누출 시 결과

  • 환경 침해
  • 데이터 유출
  • 수천 달러가 청구되는 무단 AWS 사용
  • 저장소 탈취

이 때문에 일반 파일 대신 보안 비밀 저장소를 사용합니다.


3. Secret storage options DevOps must know

도구사용 위치장점단점
GitHub SecretsGitHub CI/CD사용하기 쉬우며 암호화됨런타임 애플리케이션에 사용 불가
AWS Secrets ManagerAWS에서 실행되는 애플리케이션자동 회전 및 IAM 통합대규모 사용 시 비용이 많이 듦
AWS SSM Parameter StoreAWS Systems ManagerSecrets Manager보다 저렴함회전 기능이 기본 제공되지 않음
HashiCorp Vault엔터프라이즈 멀티클라우드가장 안전하고 동적 비밀 제공관리 복잡함

4. GitHub Secrets — Used for CI/CD only

Where used

  • GitHub Actions CI/CD 파이프라인

What it stores

  • AWS 액세스 키 + 비밀 키
  • Docker 레지스트리 토큰
  • Terraform Cloud 토큰
  • Confluent Cloud 자격 증명
  • 모든 배포 API 키

How it works

  • GitHub은 libsodium으로 비밀을 암호화합니다.
  • 당신의 저장소에서 실행되는 GitHub Actions만 접근할 수 있습니다.
  • 포크된 PR에서는 사용할 수 없습니다.

Security rules for senior DevOps

  • 애플리케이션용 데이터베이스 비밀번호는 절대 저장하지 마세요.
  • 장기 AWS 키는 저장하지 말고 OIDC 사용을 권장합니다.
  • 키는 90일마다 회전하세요.
  • 저장소에 최소 권한만 부여합니다.
  • 복잡한 JSON은 저장하지 말고 AWS Parameter Store를 사용하세요.

What GitHub Secrets do not replace

  • AWS Secrets Manager
  • HashiCorp Vault
  • Kubernetes Secrets
  • 애플리케이션 런타임 비밀

GitHub Secrets는 CI/CD 전용입니다.


5. AWS Secrets Manager — Production‑grade secret storage

Where used

  • AWS 상의 프로덕션 마이크로서비스

Features

  • 자동 회전(Lambda 활용)
  • 버전 히스토리
  • IAM을 통한 다중 계정 접근
  • 리전 간 복제
  • KMS 내장 암호화

Typical use cases

  • RDS 마스터 비밀번호
  • Confluent API 비밀
  • Stripe 키
  • OAuth 토큰
  • ECS 작업용 DB 자격 증명

Access via IAM

ecsTaskExecutionRole:
  can access secret: arn:aws:secretsmanager:...

Code example (ECS task environment)

{
  "name": "DB_PASSWORD",
  "valueFrom": "arn:aws:secretsmanager:us-east-2:xxx:secret:db_pass"
}

When to choose Secrets Manager

  • 회전이 필요할 때.
  • 엄격한 감사가 필요할 때.
  • 크로스‑계정 애플리케이션을 관리할 때.

6. AWS SSM Parameter Store

Overview

  • SecureString 파라미터를 저장합니다.

Cost

  • 표준 티어는 $0 (Secrets Manager는 비밀당 월 약 $0.40).

Ideal for

  • 개발 / QA / 비핵심 비밀.

Use cases

  • 마이크로서비스 설정값
  • 회전되지 않는 토큰
  • S3 버킷 이름
  • 기능 플래그
  • 프로덕션 데이터베이스 비밀번호(회전 지원 안 함).

7. HashiCorp Vault — The most advanced system

Why Vault is used

  • AWS, GCP, Azure, Kubernetes, 온‑프레미스 모두 지원.
  • 동적 비밀(임시 DB 자격 증명).
  • 암호화‑as‑a‑service(Transit).
  • PKI 인증서 발급.
  • 세밀한 접근 정책.
  • 감사 로그.
  • 온‑프레미스 혹은 HCP Vault Cloud에서 운영 가능.

Dynamic secrets example

Vault는 PostgreSQL 사용자명/비밀번호를 생성할 수 있습니다:

  • 유효 기간 1 시간
  • 이후 자동 삭제

CI/CD 작업이나 고보안 환경(은행, 의료, 핀테크)에 최적입니다.

Notable users

  • Uber
  • Stripe
  • Goldman Sachs
  • Netflix

8. Kubernetes Secrets (optional but DevOps must know)

Storage

  • etcd 내부에 저장(프로덕션에서는 KMS로 암호화).

Used for

  • API 키
  • DB 비밀번호
  • TLS 인증서

Mounted as

  • 환경 변수
  • 파일

9. Terraform & Secrets — Senior level knowledge

Where not to store secrets

  • Git 저장소
  • .tf 파일 또는 모듈
  • Terraform 상태 파일

How secrets must be passed

  • terraform.tfvars(로컬에서만)
  • CI/CD 환경 변수
  • AWS SSM Parameter Store
  • AWS Secrets Manager

Example bad code (do not do)

password = "MySecret123"

Better practice

password = var.db_password
password = data.aws_secretsmanager_secret_version.db_password.secret_string

10. How secrets flow in a real CI/CD pipeline

  1. 비밀을 AWS Secrets Manager에 저장합니다.
  2. EC2/ECS/Lambda는 IAM 역할을 통해 해당 비밀에 접근합니다.
  3. GitHub Actions는 다음만 저장합니다:
    • AWS Access Key
    • AWS Secret Key
    • Confluent API key
  4. Terraform은 인프라를 배포하면서 ARN으로 비밀을 참조합니다.
  5. 애플리케이션은 IAM 역할 권한을 이용해 AWS SDK로 비밀을 가져옵니다.

11. What NOT TO DO (Senior DevOps knowledge)

  • ❌ 절대 비밀을 GitHub 저장소에 저장하지 마세요.
  • ❌ 절대 비밀을 Slack이나 Teams에 저장하지 마세요.
  • ❌ 절대 비밀을 Docker 이미지에 저장하지 마세요.
  • ❌ 절대 비밀을 YAML 파일에 저장하지 마세요.
  • ❌ 절대 비밀을 Terraform 상태에 저장하지 마세요.
  • ❌ 절대 비밀을 코드 주석에 남기지 마세요.
  • ❌ 절대 CI 로그에 비밀을 echo 하지 마세요.
  • ❌ 절대 이메일로 비밀을 보내지 마세요.

비밀이 유출되면 즉시 회전하세요.


12. Interview‑level explanation (you can say this)

“우리 파이프라인에서는 GitHub Secrets를 CI/CD 자격 증명에만 사용합니다.
애플리케이션 런타임 비밀은 회전 요구에 따라 AWS Secrets Manager 또는 SSM Parameter Store를 사용합니다.
Terraform에서는 비밀을 런타임에 비밀 저장소에서 가져와 하드코딩을 피합니다.
엔터프라이즈 멀티‑클라우드 환경에서는 HashiCorp Vault를 AWS IAM 및 Kubernetes 서비스 계정과 연동해 안전한 인증과 동적 비밀을 제공합니다.
모든 비밀은 KMS로 암호화되며 로그에 절대 노출되지 않습니다.”


Secrets flow — High‑level diagram

                        ┌──────────────────────────┐
                        │   Developer Machine      │
                        │   (Push Git Changes)     │
                        └─────────────┬────────────┘


                         ┌────────────────────────┐
                         │   GitHub Repository    │
                         └─────────────┬──────────┘


                         ┌──────────────────────────────┐
                         │   GitHub Actions Runner        │
                         │   (CI/CD Workflow Execution)  │
                         └──────────────┬────────────────┘
        SECRETS ENTER HERE FROM GITHUB →│

   ┌───────────────────────────────────────────────────────────────────────────────┐
   │                     GitHub Secrets Storage                                   │
   │   - AWS_ACCESS_KEY_ID                                                         │
   │   - AWS_SECRET_ACCESS_KEY                                                     │
   └───────────────────────────────────────────────────────────────────────────────┘
Back to Blog

관련 글

더 보기 »

계정 전환

@blink_c5eb0afe3975https://dev.to/blink_c5eb0afe3975 여러분도 알다시피 저는 다시 제 진행 상황을 기록하기 시작했으니, 이것을 다른…