🎯 쿠버네티스 클러스터 권한 관리 가이드 - IAM, RBAC, Context 전환의 핵심

📑 목차


1. 로컬 vs 클라우드 환경의 극명한 차이점

핵심 개념

로컬 개발 환경과 클라우드 환경은 권한 관리 방식이 완전히 다릅니다. 이 차이점을 이해하지 못하면 프로덕션 환경에서 심각한 보안 사고가 발생할 수 있습니다.

🏠 로컬 환경 (minikube, kind, Docker Desktop)

🤔 질문: “내 노트북에서는 모든 게 잘 되는데, 클라우드에서는 왜 안 될까?”

📋 로컬 환경의 특징과 함정

로컬 개발 시 일반적인 상황

  1. 전능한 권한: 로컬에서는 보통 cluster-admin 권한으로 작업
  2. 단순한 인증: kubeconfig 파일 하나로 모든 것 해결
  3. 보안 고려 부족: “내 컴퓨터니까 괜찮겠지”라는 생각
  4. 현실과의 괴리: 클라우드 배포 시 권한 오류 폭발

💻 로컬 환경 권한 확인

# 📊 로컬 환경에서의 권한 확인
# minikube
kubectl auth can-i "*" "*"
# 결과: yes (보통 cluster-admin 권한)
 
# 현재 사용자 확인
kubectl config view --minify -o jsonpath='{.users[0].name}'
# 결과: minikube (또는 docker-desktop)
 
# 모든 권한 확인
kubectl auth can-i --list
# 결과: 거의 모든 리소스에 대한 모든 동작 가능

📊 로컬 환경별 권한 비교

도구기본 권한인증 방식보안 수준
minikubecluster-admin클라이언트 인증서매우 낮음
Docker Desktopcluster-admin내장 인증매우 낮음
kindcluster-adminkubeconfig매우 낮음
k3scluster-admin토큰 기반낮음

☁️ 클라우드 환경 (AWS EKS, GCP GKE, Azure AKS)

🤔 질문: “클라우드에서는 왜 이렇게 복잡하고 엄격할까?”

📋 클라우드 환경의 현실적 제약

클라우드 첫 배포 시 겪는 일

  1. IAM 인증 필요: AWS/GCP/Azure 계정 인증 먼저 필요
  2. 다층 권한 구조: 클라우드 IAM + 쿠버네티스 RBAC
  3. 네트워크 제한: VPC, 서브넷, 보안 그룹 설정 필요
  4. 비용 고려: 잘못된 설정으로 인한 예상치 못한 과금

💻 클라우드별 인증 과정

# 📊 AWS EKS 접근 과정
# 1. AWS CLI 인증
aws configure
aws sts get-caller-identity
 
# 2. EKS 클러스터 인증 정보 업데이트
aws eks update-kubeconfig --region us-west-2 --name my-cluster
 
# 3. 권한 확인 (처음엔 거의 아무것도 못함)
kubectl auth can-i get pods
# 결과: no (기본적으로 권한 없음)
 
# 4. aws-auth ConfigMap에 사용자 추가 필요
kubectl get configmap aws-auth -n kube-system -o yaml
# 📊 GCP GKE 접근 과정
# 1. gcloud 인증
gcloud auth login
gcloud config set project my-project
 
# 2. GKE 클러스터 인증 정보 가져오기
gcloud container clusters get-credentials my-cluster \
  --zone us-central1-a
 
# 3. 권한 확인
kubectl auth can-i get pods
# 결과: depends on IAM roles
 
# 4. RBAC 설정 필요
kubectl create clusterrolebinding my-binding \
  --clusterrole=view \
  --user=$(gcloud config get-value account)

📊 로컬 vs 클라우드 비교표

구분로컬 환경클라우드 환경
인증단순 (kubeconfig만)복합 (클라우드 IAM + k8s RBAC)
권한전체 권한 (cluster-admin)최소 권한 원칙
네트워크localhostVPC, 방화벽, 로드밸런서
비용무료시간당 과금
보안개인 컴퓨터 수준엔터프라이즈 수준
복잡도매우 단순높음

2. 클라우드 IAM: 첫 번째 보안 관문

핵심 개념

클라우드 IAM은 쿠버네티스 클러스터에 접근하기 전 첫 번째 보안 계층으로, “누가 클러스터에 접근할 수 있는가?”를 결정합니다.

🔐 IAM의 역할과 중요성

🤔 질문: “회사 건물에 들어가려면 출입카드가 필요한데, 쿠버네티스는?”

📋 IAM 인증 과정 시나리오

EKS 클러스터 접근 과정

  1. AWS IAM 인증: 개발자가 AWS 계정으로 로그인
  2. 역할 확인: eks:DescribeCluster 권한이 있는지 확인
  3. 클러스터 접근: IAM 인증 성공 후 kubectl 명령 가능
  4. 추가 인증: 클러스터 내부에서 RBAC로 세부 권한 제어

💻 실제 IAM 설정 예시

# 📊 AWS EKS 클러스터 접근 권한 설정
aws iam create-policy \
  --policy-name EKSClusterAccess \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "eks:DescribeCluster",
          "eks:ListClusters"
        ],
        "Resource": "*"
      }
    ]
  }'
 
# 사용자에게 정책 연결
aws iam attach-user-policy \
  --user-name developer \
  --policy-arn arn:aws:iam::123456789:policy/EKSClusterAccess

📊 클라우드별 IAM 비교

클라우드IAM 서비스쿠버네티스 통합주요 권한
AWSAWS IAMEKSeks:DescribeCluster
GCPGoogle Cloud IAMGKEcontainer.clusters.get
AzureAzure ADAKSMicrosoft.ContainerService/read

⚠️ IAM 보안 주의사항

일반적인 IAM 실수

  • 과도한 권한: 개발자에게 cluster-admin 권한 부여
  • 영구 자격증명: Access Key를 로컬에 저장
  • 권한 검토 부족: 정기적인 권한 감사 미실시

2. 쿠버네티스 RBAC: 세밀한 권한 제어

핵심 개념

RBAC(Role-Based Access Control)는 쿠버네티스 내부에서 “누가 무엇을 할 수 있는가?”를 세밀하게 제어하는 보안 메커니즘입니다.

🏗️ RBAC 구성 요소

🤔 질문: “사무실에서 각 부서마다 접근할 수 있는 공간이 다른 것처럼, 쿠버네티스도 그럴까?”

📋 RBAC 4가지 핵심 요소

RBAC 구성 요소

  1. Subject (주체): 누가? → User, Group, ServiceAccount
  2. Role/ClusterRole (역할): 무엇을? → 권한 집합 정의
  3. RoleBinding/ClusterRoleBinding (바인딩): 연결 → 주체와 역할 연결
  4. Resource (리소스): 대상 → Pod, Service, Deployment 등

💻 실제 RBAC 설정 예시

# 📊 개발팀용 Role 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development
  name: developer-role
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "create", "update", "patch"]
---
# 개발자에게 역할 할당
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-binding
  namespace: development
subjects:
- kind: User
  name: jane.developer
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io

📊 Role vs ClusterRole 비교

구분RoleClusterRole
범위특정 네임스페이스전체 클러스터
리소스네임스페이스 리소스모든 리소스 + 클러스터 리소스
사용 사례팀별 개발 환경클러스터 관리자
바인딩RoleBindingClusterRoleBinding

🔍 권한 확인 및 디버깅

# 📊 현재 사용자 권한 확인
kubectl auth can-i create pods
kubectl auth can-i delete deployments --namespace=production
 
# 특정 사용자 권한 확인
kubectl auth can-i create pods --as=jane.developer
kubectl auth can-i "*" "*" --as=system:admin
 
# 권한 상세 조회
kubectl describe clusterrole cluster-admin
kubectl get rolebinding -n development -o wide

3. 컨텍스트 전환: 왜 필수적인가?

핵심 개념

컨텍스트 전환은 다중 클러스터, 다중 환경에서 안전하고 효율적으로 작업하기 위한 필수적인 메커니즘입니다. 잘못된 환경에서의 작업은 치명적인 결과를 초래할 수 있습니다.

⚡ 컨텍스트 전환이 필수적인 이유

🤔 질문: “프로덕션 DB를 실수로 삭제한 적이 있나요?”

📋 실제 장애 시나리오

실수로 인한 프로덕션 장애

  1. 상황: 개발자가 개발 환경에서 테스트 중
  2. 실수: 컨텍스트 확인 없이 kubectl delete deployment critical-service 실행
  3. 결과: 현재 컨텍스트가 프로덕션이어서 실제 서비스 중단
  4. 교훈: 컨텍스트 전환과 확인의 중요성 재인식

💻 안전한 컨텍스트 관리

# 📊 현재 컨텍스트 확인 (매우 중요!)
kubectl config current-context
# 결과: production-cluster-admin
 
# 모든 컨텍스트 조회
kubectl config get-contexts
# * production-cluster-admin
#   development-cluster-user
#   staging-cluster-user
 
# 안전한 컨텍스트 전환
kubectl config use-context development-cluster-user
kubectl config current-context  # 재확인 필수!
 
# 특정 명령에만 다른 컨텍스트 사용
kubectl get pods --context=staging-cluster-user

🛡️ 컨텍스트 전환 보안 모범 사례

컨텍스트 안전 관리 방법

  1. 항상 확인: 명령 실행 전 현재 컨텍스트 확인
  2. 환경별 분리: 프로덕션과 개발 환경 컨텍스트 명확히 구분
  3. 제한된 권한: 필요한 최소 권한만 부여
  4. 자동화: 스크립트로 컨텍스트 전환 자동화

📊 컨텍스트 구성 요소

요소설명예시
Cluster쿠버네티스 클러스터 정보https://prod-k8s.company.com
User인증 정보jane.developer
Namespace기본 네임스페이스development
Context위 3개의 조합dev-jane-context

💻 고급 컨텍스트 관리 도구

# 📊 kubectx - 컨텍스트 빠른 전환
brew install kubectx
kubectx                    # 컨텍스트 목록
kubectx development        # 빠른 전환
kubectx -                  # 이전 컨텍스트로 돌아가기
 
# kubens - 네임스페이스 빠른 전환  
kubens                     # 네임스페이스 목록
kubens production          # 네임스페이스 전환
 
# kubeconfig 파일 직접 편집
kubectl config view        # 현재 설정 확인
kubectl config set-context my-context \
  --cluster=prod-cluster \
  --user=jane.admin \
  --namespace=default

5. 실제 클라우드 환경에서 놓치기 쉬운 차이점들

핵심 개념

로컬 환경에서 잘 동작하던 것들이 클라우드에서는 예상과 다르게 동작하는 경우가 많습니다. 이런 차이점을 미리 이해하고 준비해야 합니다.

⚡ 클라우드 환경의 숨겨진 복잡성

🤔 질문: “로컬에서는 잘 되는데, AWS EKS에 배포하면 왜 권한 오류가 날까?”

📋 실제 클라우드 배포 시 마주치는 문제들

클라우드 배포 첫날 겪는 일들

  1. IAM 역할 매핑: aws-auth ConfigMap 설정 필요
  2. 네트워크 정책: VPC, 서브넷, 보안 그룹의 복잡함
  3. 서비스 계정 권한: 파드가 AWS 서비스 접근 시 필요한 IRSA
  4. 로드밸런서 제한: ALB 인그레스 컨트롤러 설정의 복잡성

💻 AWS EKS의 현실적인 권한 설정

# 📊 실제 EKS 클러스터에서 겪는 권한 문제들
 
# 1. kubectl 명령이 안 되는 이유
kubectl get pods
# error: You must be logged in to the server (Unauthorized)
 
# 해결: aws-auth ConfigMap에 사용자 추가
kubectl get configmap aws-auth -n kube-system -o yaml
# 현재 사용자를 mapUsers에 추가해야 함
 
# 2. 파드가 AWS 서비스에 접근하지 못하는 이유
kubectl logs my-pod
# error: unable to load AWS credentials
 
# 해결: IRSA (IAM Roles for Service Accounts) 설정
eksctl create iamserviceaccount \
  --name my-service-account \
  --namespace default \
  --cluster my-cluster \
  --attach-policy-arn arn:aws:iam::aws:policy/S3ReadOnlyAccess \
  --approve

📊 클라우드별 권한 복잡도 비교

요소로컬 환경AWS EKSGCP GKEAzure AKS
기본 접근cluster-adminIAM 사용자 매핑 필요Google 계정 자동 연동Azure AD 통합
파드 권한제한 없음IRSA 설정 필요Workload IdentityPod Managed Identity
네트워크localhostVPC 설정VPC 네이티브VNET 통합
스토리지hostPathEBS/EFSPersistent DiskAzure Disk

🔍 클라우드 환경 권한 디버깅 가이드

🤔 질문: “클라우드에서 권한 오류가 났을 때 어디서부터 확인해야 할까?”

📋 단계별 트러블슈팅 체크리스트

권한 오류 해결 순서

  1. 클라우드 IAM 확인: 클러스터 접근 권한이 있는가?
  2. Kubernetes RBAC 확인: 클러스터 내부 권한이 있는가?
  3. 네트워크 확인: VPC/서브넷 설정이 올바른가?
  4. 서비스 계정 확인: 파드가 클라우드 서비스에 접근 가능한가?

💻 실제 디버깅 명령어들

# 📊 AWS EKS 권한 디버깅
# 1. 현재 IAM 사용자/역할 확인
aws sts get-caller-identity
 
# 2. EKS 클러스터 접근 권한 확인
aws eks describe-cluster --name my-cluster
 
# 3. aws-auth ConfigMap 확인
kubectl get configmap aws-auth -n kube-system -o yaml
 
# 4. 현재 사용자의 K8s 권한 확인
kubectl auth can-i "*" "*" --all-namespaces
kubectl auth whoami
 
# 5. 특정 파드의 서비스 계정 확인
kubectl get pod my-pod -o jsonpath='{.spec.serviceAccountName}'
kubectl describe serviceaccount my-service-account
# 📊 GCP GKE 권한 디버깅
# 1. 현재 계정 확인
gcloud auth list
gcloud config get-value account
 
# 2. GKE 클러스터 권한 확인
gcloud container clusters describe my-cluster --zone=us-central1-a
 
# 3. Workload Identity 확인 (파드가 GCP 서비스 접근용)
kubectl annotate serviceaccount my-ksa \
  iam.gke.io/gcp-service-account=my-gsa@PROJECT.iam.gserviceaccount.com
 
# 4. IAM 정책 확인
gcloud projects get-iam-policy PROJECT_ID

⚠️ 클라우드별 주의사항

자주 놓치는 클라우드 설정들

AWS EKS:

  • aws-auth ConfigMap 설정 누락
  • IRSA (IAM Roles for Service Accounts) 미설정
  • VPC CNI 플러그인 권한 부족

GCP GKE:

  • Workload Identity 미활성화
  • GCP API 서비스 비활성화
  • 네트워크 정책 충돌

Azure AKS:

  • Azure AD Pod Identity 미설정
  • RBAC와 Azure AD 통합 문제
  • Network Security Group 제한

🛡️ 클라우드 환경 보안 강화 전략

프로덕션급 보안 설정

# 📊 AWS EKS 보안 강화 예시
# 1. 최소 권한 원칙 적용
aws iam create-policy --policy-name MinimalEKSAccess --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "eks:DescribeCluster",
        "eks:ListClusters"
      ],
      "Resource": "arn:aws:eks:*:*:cluster/my-cluster"
    }
  ]
}'
 
# 2. 네트워크 정책 활성화
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-default
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
EOF
 
# 3. Pod Security Standards 적용
kubectl label namespace default pod-security.kubernetes.io/enforce=restricted
kubectl label namespace default pod-security.kubernetes.io/audit=restricted
kubectl label namespace default pod-security.kubernetes.io/warn=restricted

💡 클라우드 환경 학습 전략

로컬에서 클라우드 차이점 미리 체험하기

# 📊 로컬에서 클라우드 환경 시뮬레이션
# 1. 제한된 ServiceAccount 생성 (IAM 사용자 시뮬레이션)
kubectl create serviceaccount cloud-user-sim
kubectl create token cloud-user-sim
 
# 2. 최소 권한만 부여 (실제 클라우드와 유사)
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cloud-user-role
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch"]
EOF
 
# 3. 네트워크 정책으로 클라우드 네트워크 제한 시뮬레이션
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: simulate-cloud-network
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: restricted-app
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: allowed-app
    ports:
    - protocol: TCP
      port: 8080
EOF

핵심 개념

현대 기업 환경에서는 개발, 스테이징, 프로덕션 등 여러 클러스터를 운영하며, 각각 다른 보안 정책과 접근 방식이 필요합니다.

🌍 멀티 클러스터 아키텍처

🤔 질문: “Netflix는 수백 개의 마이크로서비스를 어떻게 안전하게 관리할까?”

📋 엔터프라이즈 멀티 클러스터 시나리오

대기업 쿠버네티스 환경

  1. 개발 클러스터: 자유로운 실험 환경, 관대한 권한
  2. 스테이징 클러스터: 프로덕션 유사 환경, 제한된 권한
  3. 프로덕션 클러스터: 최소 권한 원칙, 엄격한 보안
  4. 관리 클러스터: 모니터링, 로깅 전용 클러스터

💻 멀티 클러스터 kubeconfig 구성

# 📊 여러 클러스터 kubeconfig 설정
# 개발 클러스터
kubectl config set-cluster dev-cluster \
  --server=https://dev-k8s.company.com \
  --certificate-authority=/path/to/dev-ca.crt
 
# 프로덕션 클러스터  
kubectl config set-cluster prod-cluster \
  --server=https://prod-k8s.company.com \
  --certificate-authority=/path/to/prod-ca.crt
 
# 사용자별 권한 설정
kubectl config set-credentials jane.developer \
  --client-certificate=/path/to/jane-dev.crt \
  --client-key=/path/to/jane-dev.key
 
kubectl config set-credentials jane.admin \
  --client-certificate=/path/to/jane-prod.crt \
  --client-key=/path/to/jane-prod.key
 
# 컨텍스트 조합
kubectl config set-context dev-context \
  --cluster=dev-cluster \
  --user=jane.developer \
  --namespace=development
 
kubectl config set-context prod-context \
  --cluster=prod-cluster \
  --user=jane.admin \
  --namespace=default

🔐 환경별 보안 정책 차이

# 📊 개발 환경 - 관대한 권한
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: developers-binding
subjects:
- kind: Group
  name: developers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: edit  # 대부분 리소스 편집 가능
  apiGroup: rbac.authorization.k8s.io
---
# 프로덕션 환경 - 제한적 권한
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: prod-developers-binding
  namespace: application
subjects:
- kind: Group
  name: developers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: prod-read-only  # 읽기 전용
  apiGroup: rbac.authorization.k8s.io

📊 환경별 권한 매트릭스

환경개발자 권한SRE 권한보안팀 권한
DevelopmentFull AccessAdminAudit
StagingLimited WriteAdminAudit + Policy
ProductionRead OnlyLimited AdminFull Control

🎯 실전 보안 시나리오

🚨 일반적인 보안 사고와 예방법

시나리오 1: 권한 에스컬레이션 공격

# 📊 공격 시도 탐지
# 의심스러운 권한 상승 시도
kubectl get clusterrolebindings -o json | \
  jq '.items[] | select(.roleRef.name=="cluster-admin")'
 
# ServiceAccount의 과도한 권한 확인
kubectl get clusterrolebindings -o custom-columns=\
  NAME:.metadata.name,ROLE:.roleRef.name,SERVICE_ACCOUNT:.subjects[?(@.kind=="ServiceAccount")].name

시나리오 2: 잘못된 네임스페이스 접근

# 📊 네임스페이스별 접근 권한 감사
for ns in $(kubectl get ns -o name | cut -d/ -f2); do
  echo "=== Namespace: $ns ==="
  kubectl auth can-i "*" "*" --namespace=$ns --as=jane.developer
done

시나리오 3: 컨텍스트 혼동 방지

# 📊 프롬프트에 현재 컨텍스트 표시
# ~/.bashrc 또는 ~/.zshrc에 추가
kube_ps1() {
  local context=$(kubectl config current-context 2>/dev/null)
  if [[ -n "$context" ]]; then
    echo "[k8s:$context]"
  fi
}
PS1='$(kube_ps1) \u@\h:\w\$ '
 
# 위험한 환경에서 추가 확인 강제
prod_kubectl() {
  local current_context=$(kubectl config current-context)
  if [[ "$current_context" == *"prod"* ]]; then
    echo "⚠️  PRODUCTION ENVIRONMENT!"
    echo "Current context: $current_context"
    echo "Command: kubectl $@"
    read -p "Are you sure? (yes/no): " confirm
    if [[ "$confirm" == "yes" ]]; then
      kubectl "$@"
    else
      echo "Command cancelled."
    fi
  else
    kubectl "$@"
  fi
}
alias kubectl=prod_kubectl

🛡️ 보안 모니터링 및 알림

# 📊 권한 변경 감시 (Falco 규칙)
apiVersion: v1
kind: ConfigMap
metadata:
  name: falco-rbac-rules
data:
  rbac_rules.yaml: |
    - rule: RBAC Permission Changes
      desc: Detect changes to RBAC permissions
      condition: >
        ka and (
          ka.verb in (create, update, patch, delete) and
          ka.target.resource in (clusterroles, roles, clusterrolebindings, rolebindings)
        )
      output: >
        RBAC permission changed (user=%ka.user.name verb=%ka.verb 
        target=%ka.target.resource/%ka.target.name)
      priority: WARNING
      tags: [rbac, security]

📋 보안 체크리스트

일일 보안 점검 사항

  1. 컨텍스트 확인: 매 작업 전 현재 컨텍스트 확인
  2. 최소 권한 원칙: 필요한 최소 권한만 부여
  3. 정기 권한 감사: 월 1회 불필요한 권한 제거
  4. 로그 모니터링: 권한 관련 이벤트 실시간 감시
  5. 교육: 팀원 대상 보안 교육 정기 실시

🚀 자동화된 보안 도구

# 📊 권한 검사 자동화 스크립트
#!/bin/bash
# security-audit.sh
 
echo "🔍 Kubernetes Security Audit"
echo "=============================="
 
echo "📊 Cluster Admin Bindings:"
kubectl get clusterrolebindings -o custom-columns=\
  NAME:.metadata.name,SUBJECTS:.subjects[*].name | \
  grep cluster-admin
 
echo "⚠️  Over-privileged ServiceAccounts:"
kubectl get clusterrolebindings -o json | \
  jq -r '.items[] | select(.roleRef.name=="cluster-admin") | 
    select(.subjects[]?.kind=="ServiceAccount") | 
    "\(.metadata.name): \(.subjects[].name)"'
 
echo "🔐 Current Context:"
kubectl config current-context
 
echo "✅ Audit Complete"

중요한 보안 원칙

  1. Zero Trust: 모든 접근을 검증하고 최소 권한 부여
  2. Defense in Depth: 다층 보안 방어 구조 구축
  3. Continuous Monitoring: 지속적인 보안 모니터링 및 감사
  4. Incident Response: 보안 사고 발생 시 신속한 대응 체계