쿠버네티스 보안 및 CI/CD 실습
- 실습 구성 요소 및 역할
분야 구성 요소 역할 코드 저장소 GitHub 소스 코드 관리 GPG 서명 GitHub 동작에 대한 무결성 검증 Continuous Integration (CI) GitHub Actions 소스코드 빌드 및 테스트 자동화 SonarQube 코드 품질 분석 Continuous Delivery (CD) ArgoCD Kubernetes cluster에 애플리케이션 배포 Helm Kubernetes 애플리케이션 배포 관리 보안 스캔 Trivy 컨테이너 이미지 취약점 스캔 Slack 문제 발생 시 alarm
3. CD: Helm + ArgoCD를 활용한 GitOps 배포
3-1. Helm을 통한 배포 관리
CD 디렉터리 구조
charts/cloudsecurity/
├─ Chart.yaml # 차트 메타정보 (name, version 등)
├─ values.yaml # 이미지, 서비스 설정 등 변수화된 값 저장
└─ templates/
├ deployment.yaml # Kubernetes Deployment 템플릿
└ service.yaml # Kubernetes Service 템플릿
Chart.yaml
apiVersion: v2
name: cloudsecurity
description: A Helm chart for the cloudsecurity app
type: application
version: 0.1.0
appVersion: "1.0.0"
values.yaml
image:
repository: prolmpa/cloudsecurity-7th-8th-week
tag: latest
service:
type: ClusterIP
port: 80
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloudsecurity
spec:
replicas: 1
selector:
matchLabels:
app: cloudsecurity
template:
metadata:
labels:
app: cloudsecurity
spec:
containers:
- name: app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
name: cloudsecurity
spec:
type: {{ .Values.service.type }}
selector:
app: cloudsecurity
ports:
- port: {{ .Values.service.port }}
targetPort: 80
protocol: TCP
name: http
3-2. ArgoCD를 사용하여 Kubernetes cluster에 애플리케이션 배포
ArgoCD (Argo Continuous Delivery)는 Kubernetes Native 환경에서 사용하는 GitOps 기반 CD 도구 입니다.
ArgoCD에서 Git repository는 단일 source of truth로 동작하여 애플리케이션을 원하는 배포 상태로 유지한다. 이는 Helm charts, YAML 파일 등 Git에 적혀있는 것이 오직 "진실이고, 올바른" 환경으로 간주하고, ArgoCD는 Kubernetes 클러스터를 항상 해당 상태를 동기화(Deploy)되도록 보장한다.
요약하면 아래와 같다.
"Git에 적힌 것이 진짜다. 클러스터가 다르면 Git대로 고친다."
핵심 구성 요소
구성 요소 | 역할 |
argocd-server | Web UI 및 CLI API 제공 |
argocd-repo-server | Git 저장소의 Helm/Kustomize 템플릿 렌더링 |
argocd-application-controller | 실제 클러스터와 Git 상태 비교 > 자동 동기화 |
argocd-dex-server | SSO/OAuth 인증 연동 지원 (선택) |
1단계: Argo CD 설치
# 1. 최신 Argo CD 설치
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 2. Argo CD 서버 상태 확인
kubectl get pods -n argocd
# 정상 출력 예:
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 20s
argocd-server-xyz 1/1 Running 0 20s
...
2. Web UI 접속 (포트 포워딩)
kubectl port-forward svc/argocd-server -n argocd 8080:443
→ 브라우저에서 https://localhost:8080 접속
(주의: self-signed cert라서 브라우저 경고 뜰 수 있음)
3. 초기 로그인
✅ 기본 로그인 정보
- Username: admin
- Password: 다음 명령어로 확인:
# Linux
kubectl get secret argocd-initial-admin-secret -n argocd \ -o jsonpath="{.data.password}" | base64 -d && echo
# Windows cmd
powershell -Command "$secret = kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath='{.data.password}'; [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($secret))"
4. Argo CD에 앱 생성 및 연동
Argo CD 내 GitHub repo 인증 설정
- https://localhost:8080 접속 > `admin` 계정 로그인
- Settings > Repositories > 'Connect Repo'
- 설정 정보
항목 값 Connection method VIA HTTP/HTTPS Type git Git deploy repo URL https://github.com/<organization>/<github-repository.git> Project default Name 적절한 이름 Username GitHub organization 이름 Password Github 개발자 설정에서 생성한 Access token 값
Argo CD Web UI로 생성
- https://localhost:8080 접속 > `admin` 계정 로그인
- "+ NEW APP" 클릭
- 설정 정보
항목 값 Git deploy repo URL https://github.com/<organization>/<github-repository.git> Path charts/cloudsecurity 목적지 cluster https://kubernetes.default.svc (기본) 네임스페이스 default (또는 지정한 네임스페이스) Sync Policy 자동(auto sync) 또는 수동 선택 가능
애플리케이션 생성 확인
결과 확인
1. 배포 상태 확인
kubectl get pods,svc -n default
kubectl describe pods <pod-name> -n default
kubectl port-forward svc/cloudsecurity 8080:80
2. localhost:8080 결과 확인
4. 보안 스캔: Trivy를 활용한 취약점 탐지
Trivy를 사용한 컨테이너 이미지 취약점 스캔
Trivy는 보안 스캐너로, 보안 문제를 수색하고 해당 문제가 어디서 발생하는지 추적한다.
Trivy 스캔 대상 | Trivy로 확인 가능한 결과 | |
1 | Container image | 사용 중인 OS 패키지 및 소프트웨어 의존성 |
2 | Filesystem | Known vulnerabilities (CVEs) |
3 | Git repository (remote) | IaC 문제 및 잘못된 configuration |
4 | Vitual Machine image | Sensitive information and secrets |
5 | Kubernetes | Software licenses |
4-1. Trivy 스캔 전용 파이프라인 구성
- GitHub Actions에서 Trivy 스캔만 수행하는 workflow 예시 (trivy-scan.yaml):
name: CI - Trivy Vulnerability Scan (Remote)
on:
push:
paths:
- 'Dockerfile'
- 'app/**'
jobs:
trivy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install Trivy
run: |
sudo apt-get update
sudo apt-get install -y wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install -y trivy
- name: Log in to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
run: |
docker build -t prolmpa/cloudsecurity:trivy-temp .
docker push prolmpa/cloudsecurity:trivy-temp
- name: Run Trivy scan (remote) and save result
continue-on-error: true
run: |
trivy image prolmpa/cloudsecurity:trivy-temp --severity HIGH,CRITICAL --exit-code 0 > result.txt
echo "🛑 Trivy Scan completed — vulnerabilities detected in prolmpa/cloudsecurity:trivy-temp" > alert.txt
echo "\`\`\`" >> alert.txt
head -n 100 result.txt >> alert.txt
echo "\`\`\`" >> alert.txt
- severity.Critical 수준의 문제만 실패 처리하여 과도한 pipeline 중단 방지
- CI와 분리하여 보안만 집중적으로 점검 가능하다.
4-2. Slack 알림 수신
- name: Send Slack alert
if: always()
run: |
echo "Sending Slack message:"
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$(cat alert.txt)\"}" \
${{ secrets.SLACK_WEBHOOK_URL }}
이를 통해 취약점 발견 시 개발팀에게 즉시 Slack 알림이 전송된다.
결과 확인
참고 자료
'Cloud Security 7기' 카테고리의 다른 글
[Cloud Security] 쿠버네티스 보안 및 CI/CD 환경 분석 - CI 구현 (0) | 2025.06.10 |
---|---|
[Cloud Security] 9주차. 쿠버네티스 보안 및 CI/CD 환경 분석 (0) | 2025.06.08 |
[Cloud Security] 8주차. 컨테이너를 이용한 쿠버네티스 아키텍처 파악 (0) | 2025.06.03 |
[Cloud Security] 7주차. Okta를 활용한 GitHub Organization 연동 가이드 (0) | 2025.05.31 |
[Cloud Security] 7주차. Zero Trust & CNAPP (0) | 2025.05.26 |