컨테이너 보안: 이것이 필수적인 이유
I 컨테이너 그들은 우리가 소프트웨어를 제공하는 방식에 혁명을 일으켰습니다. 새로운 공격 표면도 도입되었습니다. Docker 이미지에는 코드 이상의 내용이 포함되어 있습니다. 애플리케이션뿐만 아니라 기본 운영 체제, 시스템 라이브러리 및 종속성도 포함됩니다. 런타임. 각 구성 요소에는 애플리케이션에서 상속된 취약점이 포함될 수 있습니다.
컨테이너 보안은 이미지 구성(빌드 시간)부터, 레지스트리 배포(배포)부터 프로덕션 실행(런타임)까지. 이 문서에서는 각 단계를 보호하기 위한 도구와 사례를 살펴보겠습니다.
무엇을 배울 것인가
- Trivy 및 Grype에서 컨테이너 이미지 스캐닝이 작동하는 방식
- 다단계 빌드 및 distroless를 통해 안전한 이미지 구축
- Cosign을 사용하여 이미지 서명 및 확인
- Falco 및 네트워크 정책을 통한 런타임 보호
- Kubernetes의 보안 컨텍스트 및 포드 보안 표준
- 보안 Dockerfile 모범 사례
Trivy: 종합적인 취약점 스캐너
퀴즈 Aqua Security와 분석이 가능한 가장 인기있는 컨테이너 스캐너 Docker 이미지, 파일 시스템, Git 리포지토리 및 IaC 구성. 빠르고 정확하며 쉽습니다. CI/CD 파이프라인에 통합합니다.
도커 이미지 스캔
# Installare Trivy
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
# Scan di un'immagine Docker
trivy image node:18-alpine
# Scan con filtro severita
trivy image --severity CRITICAL,HIGH node:18-alpine
# Output in formato SARIF per GitHub
trivy image --format sarif --output trivy-results.sarif myapp:latest
# Scan del filesystem locale
trivy fs --security-checks vuln,config .
# Scan con exit code per CI (fallisce se trova CRITICAL)
trivy image --exit-code 1 --severity CRITICAL myapp:latest
GitHub Actions의 Trivy 통합
# .github/workflows/container-security.yml
name: Container Security Scan
on:
push:
branches: [main]
pull_request:
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Trivy vulnerability scan
uses: aquasecurity/trivy-action@master
with:
image-ref: "myapp:${{ github.sha }}"
format: "sarif"
output: "trivy-results.sarif"
severity: "CRITICAL,HIGH"
exit-code: "1"
- name: Upload SARIF to GitHub Security
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "trivy-results.sarif"
Grype: 이미지 스캐닝을 위한 경량 대안
그리페 Anchore의 Trivy에 대한 가볍고 독점적인 대안 컨테이너 이미지의 취약점 스캔에 대해 알아보세요. 특히 빠르고 통합됩니다. 글쎄요 Syft (같은 팀에서) SBOM 생성을 위한 것입니다.
# Installare Grype
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh
# Scan di un'immagine
grype myapp:latest
# Scan con filtro e output JSON
grype myapp:latest --only-fixed --output json > grype-results.json
# Scan con fail-on severity
grype myapp:latest --fail-on critical
# Generare SBOM con Syft e analizzare con Grype
syft myapp:latest -o cyclonedx-json > sbom.json
grype sbom:sbom.json
보안 Docker 이미지 구축
컨테이너의 보안은 다음에서 시작됩니다. 도커파일. 잘 구성된 이미지 공격 표면과 취약점 수를 대폭 줄입니다.
다단계 구축
다단계 빌드 패턴은 빌드 환경을 최종 이미지와 분리합니다. 프로덕션 이미지에서 빌드 도구, 소스 및 개발 종속성을 삭제합니다.
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# Stage 2: Production (immagine minimale)
FROM gcr.io/distroless/nodejs20-debian12
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
USER nonroot
CMD ["dist/server.js"]
무분별한 이미지
Le dystroless 이미지 Google에서는 애플리케이션과 해당 애플리케이션만 포함합니다. 쉘, 패키지 관리자 또는 기타 시스템 도구 없이 런타임 종속성. 이렇게 하면 공격 표면을 최소한으로 줄입니다.
규모 및 취약점 비교
| 기본 이미지 | 크기 | 일반적인 CVE |
|---|---|---|
| 노드:20 | ~1.1GB | 200-400 |
| 노드:20-슬림 | ~250MB | 50-100 |
| 노드:20-알파인 | ~180MB | 10-30 |
| 배포판/nodejs20 | ~130MB | 0-5 |
Dockerfile 보안 모범 사례
보안 Dockerfile은 공격 표면을 줄이는 특정 규칙을 따릅니다.
# 1. Usare versioni specifiche, mai :latest
FROM node:20.11.0-alpine3.19
# 2. Creare un utente non-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 3. Impostare WORKDIR
WORKDIR /app
# 4. Copiare prima i file di dipendenze (cache layer)
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
# 5. Copiare il codice applicativo
COPY --chown=appuser:appgroup . .
# 6. Non esporre porte privilegiate
EXPOSE 8080
# 7. Usare l'utente non-root
USER appuser
# 8. Usare HEALTHCHECK
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
# 9. Usare exec form per CMD
CMD ["node", "dist/server.js"]
Cosign을 사용한 이미지 서명
공동사인 (Sigstore 프로젝트의 일부)를 사용하면 이미지에 디지털 서명을 할 수 있습니다 컨테이너를 사용하여 빌드 이후 이미지가 수정되지 않았는지 확인합니다. 이것은 공급망 보안의 기본입니다.
# Installare Cosign
brew install cosign # macOS
# oppure
go install github.com/sigstore/cosign/v2/cmd/cosign@latest
# Generare una coppia di chiavi
cosign generate-key-pair
# Firmare un'immagine
cosign sign --key cosign.key myregistry.com/myapp:v1.0.0
# Verificare la firma
cosign verify --key cosign.pub myregistry.com/myapp:v1.0.0
# Firmare con keyless (Sigstore/Fulcio)
cosign sign myregistry.com/myapp:v1.0.0
Falco를 통한 런타임 보호
Falco 런타임 보안을 위한 Sysdig 및 참조 오픈 소스 도구 컨테이너의. 커널 시스템 호출을 실시간으로 모니터링하고 감지되면 경고를 생성합니다. 비정상적이거나 의심스러운 행동.
Falco가 감지하는 것
- 쉘이 컨테이너 내부에서 생성됩니다.
- 민감한 파일에 접근(/etc/shadow, /etc/passwd)
- 예기치 않은 네트워크 연결
- 시스템 파일 편집
- 권한 승격
- 암호화폐 채굴 활동
Kubernetes 포드 보안
Kubernetes 환경에서 컨테이너 보안은 포드 구성으로 확장됩니다. 그만큼 포드 보안 표준 세 가지 보안 수준을 정의합니다.
# Pod con security context restrittivo
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: myapp:v1.0.0
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "250m"
네트워크 정책
Le 네트워크 정책 Kubernetes에서는 Pod 간의 네트워크 트래픽을 제한합니다. 네트워크 수준에서 최소 권한 원칙 구현:
# Deny all ingress by default
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
---
# Allow only specific traffic
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-api
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
컨테이너 보안 모범 사례
- 모든 빌드에서 스캔: Trivy/Grype를 각 이미지의 CI 파이프라인에 통합합니다.
- 최소한의 이미지: Alpine 또는 distroless를 기본으로 사용하고 전체 이미지는 피하십시오.
- 비루트: 항상 루트가 아닌 사용자로 컨테이너를 실행합니다.
- 읽기 전용 파일 시스템: 루트 파일 시스템을 읽기 전용으로 마운트합니다.
- 최신 태그 없음: 항상 SHA256 다이제스트와 함께 특정 태그를 사용하십시오.
- 개인 레지스트리: 통합 검사가 포함된 개인 레지스트리 사용
- 이미지 서명: 배포하기 전에 Cosign으로 각 이미지에 서명하세요.
- 런타임 모니터링: 생산 모니터링을 위한 Falco 구현
결론
컨테이너 보안은 항상 주의가 필요한 DevSecOps의 중요한 측면입니다. 수명주기의 단계. 최소한의 안전한 이미지 구축부터 스캔까지 자동화되어 런타임 모니터링에 이르기까지 각 계층은 다음으로부터 보호 기능을 추가합니다. 위협.
다음 기사에서는 살펴보겠습니다. 공급망 보안, SBOM 분석 (소프트웨어 BOM), 아티팩트 서명을 위한 Sigstore 및 SLSA 프레임워크 소프트웨어 공급망의 무결성을 보장합니다.







