🎯 쿠버네티스 클러스터 권한 관리 가이드 - IAM, RBAC, Context 전환의 핵심
📑 목차
1. 로컬 vs 클라우드 환경의 극명한 차이점
핵심 개념
로컬 개발 환경과 클라우드 환경은 권한 관리 방식이 완전히 다릅니다. 이 차이점을 이해하지 못하면 프로덕션 환경에서 심각한 보안 사고가 발생할 수 있습니다.
🏠 로컬 환경 (minikube, kind, Docker Desktop)
🤔 질문: “내 노트북에서는 모든 게 잘 되는데, 클라우드에서는 왜 안 될까?”
📋 로컬 환경의 특징과 함정
로컬 개발 시 일반적인 상황
- 전능한 권한: 로컬에서는 보통 cluster-admin 권한으로 작업
- 단순한 인증: kubeconfig 파일 하나로 모든 것 해결
- 보안 고려 부족: “내 컴퓨터니까 괜찮겠지”라는 생각
- 현실과의 괴리: 클라우드 배포 시 권한 오류 폭발
💻 로컬 환경 권한 확인
# 📊 로컬 환경에서의 권한 확인
# 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
# 결과: 거의 모든 리소스에 대한 모든 동작 가능📊 로컬 환경별 권한 비교
| 도구 | 기본 권한 | 인증 방식 | 보안 수준 |
|---|---|---|---|
| minikube | cluster-admin | 클라이언트 인증서 | 매우 낮음 |
| Docker Desktop | cluster-admin | 내장 인증 | 매우 낮음 |
| kind | cluster-admin | kubeconfig | 매우 낮음 |
| k3s | cluster-admin | 토큰 기반 | 낮음 |
☁️ 클라우드 환경 (AWS EKS, GCP GKE, Azure AKS)
🤔 질문: “클라우드에서는 왜 이렇게 복잡하고 엄격할까?”
📋 클라우드 환경의 현실적 제약
클라우드 첫 배포 시 겪는 일
- IAM 인증 필요: AWS/GCP/Azure 계정 인증 먼저 필요
- 다층 권한 구조: 클라우드 IAM + 쿠버네티스 RBAC
- 네트워크 제한: VPC, 서브넷, 보안 그룹 설정 필요
- 비용 고려: 잘못된 설정으로 인한 예상치 못한 과금
💻 클라우드별 인증 과정
# 📊 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) | 최소 권한 원칙 |
| 네트워크 | localhost | VPC, 방화벽, 로드밸런서 |
| 비용 | 무료 | 시간당 과금 |
| 보안 | 개인 컴퓨터 수준 | 엔터프라이즈 수준 |
| 복잡도 | 매우 단순 | 높음 |
2. 클라우드 IAM: 첫 번째 보안 관문
핵심 개념
클라우드 IAM은 쿠버네티스 클러스터에 접근하기 전 첫 번째 보안 계층으로, “누가 클러스터에 접근할 수 있는가?”를 결정합니다.
🔐 IAM의 역할과 중요성
🤔 질문: “회사 건물에 들어가려면 출입카드가 필요한데, 쿠버네티스는?”
📋 IAM 인증 과정 시나리오
EKS 클러스터 접근 과정
- AWS IAM 인증: 개발자가 AWS 계정으로 로그인
- 역할 확인: eks:DescribeCluster 권한이 있는지 확인
- 클러스터 접근: IAM 인증 성공 후 kubectl 명령 가능
- 추가 인증: 클러스터 내부에서 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 서비스 | 쿠버네티스 통합 | 주요 권한 |
|---|---|---|---|
| AWS | AWS IAM | EKS | eks:DescribeCluster |
| GCP | Google Cloud IAM | GKE | container.clusters.get |
| Azure | Azure AD | AKS | Microsoft.ContainerService/read |
⚠️ IAM 보안 주의사항
일반적인 IAM 실수
- 과도한 권한: 개발자에게 cluster-admin 권한 부여
- 영구 자격증명: Access Key를 로컬에 저장
- 권한 검토 부족: 정기적인 권한 감사 미실시
2. 쿠버네티스 RBAC: 세밀한 권한 제어
핵심 개념
RBAC(Role-Based Access Control)는 쿠버네티스 내부에서 “누가 무엇을 할 수 있는가?”를 세밀하게 제어하는 보안 메커니즘입니다.
🏗️ RBAC 구성 요소
🤔 질문: “사무실에서 각 부서마다 접근할 수 있는 공간이 다른 것처럼, 쿠버네티스도 그럴까?”
📋 RBAC 4가지 핵심 요소
RBAC 구성 요소
- Subject (주체): 누가? → User, Group, ServiceAccount
- Role/ClusterRole (역할): 무엇을? → 권한 집합 정의
- RoleBinding/ClusterRoleBinding (바인딩): 연결 → 주체와 역할 연결
- 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 비교
| 구분 | Role | ClusterRole |
|---|---|---|
| 범위 | 특정 네임스페이스 | 전체 클러스터 |
| 리소스 | 네임스페이스 리소스 | 모든 리소스 + 클러스터 리소스 |
| 사용 사례 | 팀별 개발 환경 | 클러스터 관리자 |
| 바인딩 | RoleBinding | ClusterRoleBinding |
🔍 권한 확인 및 디버깅
# 📊 현재 사용자 권한 확인
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 wide3. 컨텍스트 전환: 왜 필수적인가?
핵심 개념
컨텍스트 전환은 다중 클러스터, 다중 환경에서 안전하고 효율적으로 작업하기 위한 필수적인 메커니즘입니다. 잘못된 환경에서의 작업은 치명적인 결과를 초래할 수 있습니다.
⚡ 컨텍스트 전환이 필수적인 이유
🤔 질문: “프로덕션 DB를 실수로 삭제한 적이 있나요?”
📋 실제 장애 시나리오
실수로 인한 프로덕션 장애
- 상황: 개발자가 개발 환경에서 테스트 중
- 실수: 컨텍스트 확인 없이
kubectl delete deployment critical-service실행- 결과: 현재 컨텍스트가 프로덕션이어서 실제 서비스 중단
- 교훈: 컨텍스트 전환과 확인의 중요성 재인식
💻 안전한 컨텍스트 관리
# 📊 현재 컨텍스트 확인 (매우 중요!)
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🛡️ 컨텍스트 전환 보안 모범 사례
컨텍스트 안전 관리 방법
- 항상 확인: 명령 실행 전 현재 컨텍스트 확인
- 환경별 분리: 프로덕션과 개발 환경 컨텍스트 명확히 구분
- 제한된 권한: 필요한 최소 권한만 부여
- 자동화: 스크립트로 컨텍스트 전환 자동화
📊 컨텍스트 구성 요소
| 요소 | 설명 | 예시 |
|---|---|---|
| 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=default5. 실제 클라우드 환경에서 놓치기 쉬운 차이점들
핵심 개념
로컬 환경에서 잘 동작하던 것들이 클라우드에서는 예상과 다르게 동작하는 경우가 많습니다. 이런 차이점을 미리 이해하고 준비해야 합니다.
⚡ 클라우드 환경의 숨겨진 복잡성
🤔 질문: “로컬에서는 잘 되는데, AWS EKS에 배포하면 왜 권한 오류가 날까?”
📋 실제 클라우드 배포 시 마주치는 문제들
클라우드 배포 첫날 겪는 일들
- IAM 역할 매핑: aws-auth ConfigMap 설정 필요
- 네트워크 정책: VPC, 서브넷, 보안 그룹의 복잡함
- 서비스 계정 권한: 파드가 AWS 서비스 접근 시 필요한 IRSA
- 로드밸런서 제한: 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 EKS | GCP GKE | Azure AKS |
|---|---|---|---|---|
| 기본 접근 | cluster-admin | IAM 사용자 매핑 필요 | Google 계정 자동 연동 | Azure AD 통합 |
| 파드 권한 | 제한 없음 | IRSA 설정 필요 | Workload Identity | Pod Managed Identity |
| 네트워크 | localhost | VPC 설정 | VPC 네이티브 | VNET 통합 |
| 스토리지 | hostPath | EBS/EFS | Persistent Disk | Azure Disk |
🔍 클라우드 환경 권한 디버깅 가이드
🤔 질문: “클라우드에서 권한 오류가 났을 때 어디서부터 확인해야 할까?”
📋 단계별 트러블슈팅 체크리스트
권한 오류 해결 순서
- 클라우드 IAM 확인: 클러스터 접근 권한이 있는가?
- Kubernetes RBAC 확인: 클러스터 내부 권한이 있는가?
- 네트워크 확인: VPC/서브넷 설정이 올바른가?
- 서비스 계정 확인: 파드가 클라우드 서비스에 접근 가능한가?
💻 실제 디버깅 명령어들
# 📊 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는 수백 개의 마이크로서비스를 어떻게 안전하게 관리할까?”
📋 엔터프라이즈 멀티 클러스터 시나리오
대기업 쿠버네티스 환경
- 개발 클러스터: 자유로운 실험 환경, 관대한 권한
- 스테이징 클러스터: 프로덕션 유사 환경, 제한된 권한
- 프로덕션 클러스터: 최소 권한 원칙, 엄격한 보안
- 관리 클러스터: 모니터링, 로깅 전용 클러스터
💻 멀티 클러스터 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 권한 | 보안팀 권한 |
|---|---|---|---|
| Development | Full Access | Admin | Audit |
| Staging | Limited Write | Admin | Audit + Policy |
| Production | Read Only | Limited Admin | Full 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회 불필요한 권한 제거
- 로그 모니터링: 권한 관련 이벤트 실시간 감시
- 교육: 팀원 대상 보안 교육 정기 실시
🚀 자동화된 보안 도구
# 📊 권한 검사 자동화 스크립트
#!/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"중요한 보안 원칙
- Zero Trust: 모든 접근을 검증하고 최소 권한 부여
- Defense in Depth: 다층 보안 방어 구조 구축
- Continuous Monitoring: 지속적인 보안 모니터링 및 감사
- Incident Response: 보안 사고 발생 시 신속한 대응 체계