0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Danh sách kiểm tra tối ưu cho Pipeline CI/CD Docker an toàn

Đăng vào 7 tháng trước

• 6 phút đọc

Danh sách Kiểm tra Tối ưu cho Pipeline CI/CD Docker An toàn

Giới thiệu

Nếu bạn là một trưởng nhóm DevOps được giao nhiệm vụ triển khai một pipeline CI/CD tập trung vào Docker, một danh sách kiểm tra chắc chắn sẽ giúp bạn không bỏ sót các bước quan trọng. Hướng dẫn này sẽ đưa bạn qua những phần thiết yếu - từ việc gia cố hình ảnh đến giám sát - để bạn có thể triển khai mã nhanh chóng giữ cho môi trường của bạn an toàn.


1. Vệ sinh Repository

  • Bảo vệ nhánh: Yêu cầu xem xét pull-request và kiểm tra tình trạng trước khi hợp nhất vào nhánh main.
  • Quét bí mật: Kích hoạt các công cụ như GitGuardian hoặc TruffleHog để phát hiện sớm các khóa API.
  • Kiểm tra commit: Thiết lập các commit theo quy ước để giữ cho changelog rõ ràng.

2. Các Thực hành Tốt cho Dockerfile

Một Dockerfile được thiết kế tốt sẽ giảm thiểu bề mặt tấn công và cải thiện tốc độ xây dựng.

dockerfile Copy
# Sử dụng một hình ảnh gốc chính thức và tối thiểu
FROM python:3.12-slim-alpine AS builder

# Thiết lập người dùng không phải root ngay từ đầu
ARG USERNAME=appuser
ARG USER_UID=1001
ARG USER_GID=$USER_UID
RUN addgroup -g $USER_GID $USERNAME \
    && adduser -u $USER_UID -G $USERNAME -s /bin/sh -D $USERNAME

# Chỉ cài đặt các phụ thuộc cần thiết cho quá trình xây dựng
RUN apk add --no-cache gcc musl-dev libffi-dev

# Sao chép mã nguồn và cài đặt phụ thuộc cho runtime
COPY requirements.txt /app/
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt

# Chuyển sang người dùng không phải root cho runtime
USER $USERNAME

# Giai đoạn cuối – hình ảnh runtime tối thiểu
FROM python:3.12-slim-alpine
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /app /app
WORKDIR /app
CMD ["python", "-m", "myapp"]

Điểm nổi bật chính:

  • Xây dựng đa giai đoạn giúp hình ảnh cuối cùng nhẹ nhàng hơn.
  • Chạy như một người dùng không phải root.
  • Ghi chú phiên bản chính xác của hình ảnh gốc.
  • Loại bỏ các gói cần thiết cho quá trình xây dựng trước giai đoạn cuối.

3. Quét và Ký Hình ảnh

  • Quét: Tích hợp các công cụ như Trivy hoặc Clair vào pipeline CI của bạn. Ví dụ bước GitHub Actions:
yaml Copy
- name: Quét hình ảnh Docker
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
    severity: HIGH,CRITICAL
  • : Sử dụng Docker Content Trust (DCT) hoặc Cosign để ký các hình ảnh trước khi đẩy lên registry của bạn.

4. Cấu trúc Workflow CI

Giai đoạn Mục đích Công cụ thông dụng
Lint Phân tích tĩnh Dockerfile và mã Hadolint, ESLint
Test Kiểm tra đơn vị & tích hợp pytest, Jest
Build Tạo hình ảnh, chạy quét Docker, BuildKit
Push Đẩy hình ảnh đã ký lên registry Docker, Cosign
Deploy Triển khai lên staging/production Argo CD, Helm

Mẫu GitHub Actions CI

yaml Copy
name: CI
on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Lint Dockerfile
        uses: hadolint/hadolint-action@v2
        with:
          dockerfile: Dockerfile
      - name: Chạy kiểm tra
        run: |
          python -m venv .venv
          . .venv/bin/activate
          pip install -r requirements.txt
          pytest
      - name: Xây dựng hình ảnh
        run: |
          docker build -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} .
      - name: Quét hình ảnh
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
      - name: Ký hình ảnh
        run: |
          cosign sign --key ${{ secrets.COSIGN_KEY }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}

5. Gia cố Runtime

  • Giới hạn tài nguyên: Định nghĩa giới hạn CPU và bộ nhớ trong docker-compose.yml hoặc các manifest Kubernetes.
  • Hệ thống tệp chỉ đọc: Khi có thể, gắn các volumes dưới dạng chỉ đọc.
  • Seccomp & AppArmor: Áp dụng các cấu hình mặc định, sau đó thắt chặt khi cần thiết.
  • Phân đoạn mạng: Sử dụng các mạng cầu nối do người dùng định nghĩa để cách ly các container.
yaml Copy
services:
  web:
    image: myorg/webapp:latest
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M
    read_only: true
    networks:
      - frontend

networks:
  frontend:
    driver: bridge

6. Giám sát & Khả năng quan sát

  • Chỉ số: Xuất chỉ số daemon Docker sang Prometheus thông qua cadvisor.
  • Nhật ký: Gửi stdout/stderr của container đến Loki hoặc Elastic Stack bằng driver json-file.
  • Cảnh báo: Thiết lập cảnh báo cho CPU cao, đột biến bộ nhớ hoặc lỗ hổng hình ảnh.
yaml Copy
# phần docker-compose cho cAdvisor
services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    ports:
      - "8080:8080"
    volumes:
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

7. Sao lưu & Khôi phục Thảm họa

  • Sao lưu Registry: Định kỳ docker save các hình ảnh quan trọng và lưu trữ chúng trong một bucket S3 không thể thay đổi.
  • Dữ liệu có trạng thái: Sử dụng các snapshot volume (ví dụ: docker volume create --driver local ...) và lưu trữ các snapshot ở nơi khác.
  • Tài liệu quy trình: Ghi lại quy trình quay lại từng bước, bao gồm quay lại phiên bản hình ảnh và khôi phục cơ sở dữ liệu.

8. Danh sách Kiểm tra Định kỳ

  • [ ] Tất cả các hình ảnh gốc có được cập nhật với các bản vá bảo mật không?
  • [ ] Bạn đã loại bỏ bất kỳ gói không cần thiết nào khỏi hình ảnh cuối cùng chưa?
  • [ ] Tất cả các hình ảnh có vượt qua quét Trivy/Clair mà không có phát hiện nào về HIGH hoặc CRITICAL không?
  • [ ] Các container runtime có chạy với ID người dùng ít quyền không?
  • [ ] Đã cấu hình giới hạn tài nguyên cho mỗi dịch vụ chưa?
  • [ ] Nhật ký và chỉ số có được gửi đến một kho lưu trữ trung tâm không?
  • [ ] Bạn đã thử nghiệm khôi phục đầy đủ từ kho sao lưu của bạn trong tháng qua chưa?

Kết luận

Xây dựng một pipeline CI/CD tập trung vào Docker không chỉ là về tự động hóa; nó còn là việc nhúng bảo mật và khả năng quan sát vào từng bước. Bằng cách kiểm tra các mục ở trên, bạn sẽ giảm thiểu rủi ro tấn công chuỗi cung ứng, giữ hiệu suất ổn định và tạo niềm tin cho nhóm rằng các bản phát hành vừa nhanh chóng vừa an toàn.

Nếu bạn đang tìm kiếm một đối tác có thể giúp đánh giá pipeline của bạn hoặc cung cấp dịch vụ lưu trữ Docker được quản lý, hãy xem xét việc kiểm tra lacidaweb.com để có một cuộc trò chuyện không áp lực và dễ tiếp cận.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào