Docker & Application

Quản lý Secret doanh nghiệp với Infisical: Thay thế file .env

Hướng dẫn tự host Infisical trên Docker Compose, phân quyền secret RBAC theo Dev/Staging/Production và inject secret tự động vào container và CI/CD.

Quản lý Secret doanh nghiệp Infisical trên Docker bảo vệ biến môi trường
MỤC LỤC

Trong quá trình phát triển phần mềm, tệp .env là giải pháp quen thuộc nhất để cấu hình các tham số môi trường như cổng dịch vụ, chuỗi kết nối cơ sở dữ liệu và các khóa bảo mật (API keys). Ở giai đoạn dự án mới hình thành với một hoặc hai lập trình viên làm việc trên một máy chủ đơn lẻ, cách làm này tỏ ra tiện lợi và không đòi hỏi chi phí thiết lập phức tạp.

Tuy nhiên, khi quy mô đội ngũ mở rộng, thói quen quản lý bí mật bằng tệp .env tĩnh nhanh chóng trở thành một khoản nợ kỹ thuật và là nguồn gốc của hàng loạt sự cố an toàn thông tin nghiêm trọng. Các lập trình viên thường xuyên chia sẻ mật khẩu qua các kênh trao đổi nội bộ như Zalo, Telegram hoặc Slack. Đôi khi, chỉ một phút sơ suất không thêm tệp vào .gitignore, toàn bộ chứng chỉ truy cập AWS hoặc khóa thanh toán Stripe đã bị đẩy lên kho mã nguồn Git công khai. Thêm vào đó, việc thiếu cơ chế phân quyền khiến bất kỳ lập trình viên nào cũng có thể nhìn thấy chuỗi kết nối của cơ sở dữ liệu môi trường sản xuất (Production).

Để giải quyết triệt để vấn đề phân tán thông tin bí mật (Secret Sprawl), các đội ngũ kỹ thuật hiện đại cần một nền tảng Quản lý Bí mật chuyên dụng (SecretOps). Thay vì phải vận hành một cụm HashiCorp Vault quá phức tạp và tốn kém tài nguyên, bài viết này hướng dẫn bạn cách tự lưu trữ Infisical trên Docker Compose, thiết lập ma trận phân quyền theo vai trò (RBAC), và áp dụng kỹ thuật nạp trực tiếp biến môi trường vào bộ nhớ tiến trình bằng Infisical CLI để hoàn toàn loại bỏ tệp .env dạng văn bản thô khỏi máy trạm của lập trình viên.

Kiến trúc quản lý và nạp Secret tập trung qua Infisical

Rủi ro khi quản lý secret bằng file .env trong môi trường nhóm

Trước khi chuyển đổi sang một nền tảng tập trung, chúng ta cần nhìn thẳng vào các rủi ro vận hành mà tệp .env truyền thống gây ra:

  1. Lưu trữ văn bản thô không mã hóa (Plain Text at Rest): Tệp .env nằm trần trụi trên ổ đĩa máy tính xách tay của lập trình viên, máy chủ build CI/CD và máy chủ ứng dụng. Nếu máy tính của nhân sự bị nhiễm mã độc, bị thất lạc hoặc bị tấn công qua các tiện ích mở rộng (extension) độc hại trên trình soạn thảo mã nguồn, toàn bộ thông tin bí mật sẽ bị đánh cắp dễ dàng.
  2. Nguy cơ rò rỉ mã nguồn (Git Leaks): Dù đã có quy định thêm .env vào tệp .gitignore, tình huống vô tình commit nhầm vẫn diễn ra thường xuyên. Một khi secret đã lọt vào lịch sử commit của Git, việc xóa tệp ở commit tiếp theo không giải quyết được vấn đề; kẻ tấn công chỉ cần quét lại lịch sử nhánh là có thể trích xuất được thông tin.
  3. Kênh phân phối tùy tiện và thiếu an toàn (Insecure Transit): Khi có nhân sự mới gia nhập dự án, các thành viên thường nén tệp .env gửi qua ứng dụng nhắn tin hoặc email. Những dữ liệu nhạy cảm này sẽ tồn tại vĩnh viễn trên máy chủ của bên thứ ba mà không có hạn sử dụng và không thể thu hồi.
  4. Hiện tượng trôi dạt cấu hình (Configuration Drift): Khi một lập trình viên bổ sung một biến môi trường mới vào dịch vụ của mình nhưng quên thông báo cho cả nhóm, các thành viên khác khi kéo mã nguồn mới về sẽ gặp lỗi crash ứng dụng. Môi trường Staging và Production dễ bị lệch cấu hình dẫn đến những lỗi phát sinh bất ngờ trong quá trình phát hành.
  5. Thiếu hoàn toàn quyền kiểm soát và nhật ký kiểm toán (No RBAC & Audit Trail): Với tệp .env, quản trị viên không thể phân tách quyền hạn: lập trình viên phụ trách giao diện (Frontend) hoặc kiểm thử viên (Tester) cũng có thể thấy trọn vẹn mật khẩu của cơ sở dữ liệu thật. Khi xảy ra sự cố rò rỉ dữ liệu, đội ngũ không có bất kỳ căn cứ nhật ký nào để xác định ai đã sao chép thông tin và vào thời điểm nào.

Kiến trúc của Infisical: Giải pháp SecretOps tự lưu trữ thực dụng

Infisical là nền tảng quản trị bí mật mã nguồn mở được thiết kế nhằm tối ưu hóa trải nghiệm của lập trình viên (Developer Experience - DX). Khác với các hệ thống truyền thống đòi hỏi quy trình mở khóa (unseal) phức tạp, Infisical cung cấp một giải pháp cân bằng:

  • Mã hóa đầu cuối (End-to-End Encryption): Mọi giá trị bí mật đều được mã hóa bằng thuật toán đối xứng AES-GCM 256-bit trước khi ghi vào cơ sở dữ liệu. Ngay cả khi kẻ tấn công trích xuất được tệp sao lưu của cơ sở dữ liệu PostgreSQL, các giá trị này vẫn là các chuỗi vô nghĩa nếu không có khóa mã hóa chính.
  • Cấu trúc phân vùng trực quan:
  • Organization: Đại diện cho tổ chức hoặc doanh nghiệp.
  • Project: Mỗi ứng dụng hoặc cụm microservice là một dự án độc lập.
  • Environments: Phân tách sẵn ba môi trường mặc định là Development, Staging và Production.
  • Secret Folders: Cho phép chia nhỏ các nhóm biến theo từng phân hệ (ví dụ: database, payment, auth).
  • Cơ chế nạp biến vào bộ nhớ (Process Memory Injection): Thông qua Infisical CLI, các biến môi trường được giải mã và nạp thẳng vào bộ nhớ RAM của tiến trình con khi chạy ứng dụng. Không có bất kỳ tệp tin vật lý nào chứa dữ liệu nhạy cảm được tạo ra trên ổ cứng của kỹ sư.

Triển khai Infisical Core bằng Docker Compose

Cụm dịch vụ Infisical tự lưu trữ tiêu chuẩn bao gồm ba thành phần:

  • infisical-backend: Ứng dụng Node.js xử lý toàn bộ logic nghiệp vụ, giao diện Web quản trị, API phân quyền, kiểm toán và mã hóa.
  • infisical-db: Cơ sở dữ liệu PostgreSQL lưu trữ người dùng, quyền hạn, lịch sử phiên bản và các secret đã mã hóa.
  • infisical-redis: Bộ nhớ đệm tốc độ cao phục vụ kiểm soát tốc độ truy cập API (rate limiting) và duy trì phiên đăng nhập.

Bước 1: Chuẩn bị thư mục và sinh khóa mật mã

Đăng nhập SSH vào máy chủ quản trị vận hành và tạo cấu trúc thư mục:

bash
sudo mkdir -p /opt/infisical
cd /opt/infisical

Infisical yêu cầu hai khóa bảo mật cốt lõi để vận hành an toàn:

  1. ENCRYPTION_KEY: Chuỗi Hexadecimal 32 bytes (tương đương 64 ký tự) dùng để mã hóa toàn bộ dữ liệu bí mật lưu trữ trong PostgreSQL.
  2. AUTH_SECRET: Chuỗi Base64 dùng để ký các token xác thực của người dùng và dịch vụ.

Thực hiện sinh khóa và tạo tệp .env cấu hình hệ thống:

bash
# Sinh khóa mã hóa 64 ký tự hex
ENC_KEY=$(openssl rand -hex 32)

# Sinh chuỗi bí mật ký token
AUTH_SEC=$(openssl rand -base64 32)

# Sinh mật khẩu quản trị cơ sở dữ liệu PostgreSQL
DB_PASS=$(openssl rand -base64 24)

cat <<EOF > .env
ENCRYPTION_KEY=${ENC_KEY}
AUTH_SECRET=${AUTH_SEC}

DB_USER=infisical
DB_PASSWORD=${DB_PASS}
DB_NAME=infisical
DB_HOST=infisical-db
DB_PORT=5432

SITE_URL=https://secrets.internal.example.com
REDIS_URL=redis://infisical-redis:6379
TELEMETRY_ENABLED=false
EOF

chmod 600 .env

Bạn cần lưu ý đặc biệt: Chuỗi ENCRYPTION_KEY là chìa khóa duy nhất để giải mã dữ liệu của bạn. Nếu làm mất chuỗi này, toàn bộ dữ liệu bí mật trong hệ thống sẽ không thể phục hồi dưới bất kỳ hình thức nào.

Bước 2: Thiết lập tệp docker-compose.yml chuẩn hóa

Tạo tệp docker-compose.yml với cấu hình phân tách mạng nội bộ và giám sát trạng thái dịch vụ:

yaml
version: '3.8'

services:
  infisical-db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      - infisical_backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
      interval: 10s
      timeout: 5s
      retries: 5

  infisical-redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --save 60 1 --loglevel warning
    volumes:
      - redis_data:/data
    networks:
      - infisical_backend
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  infisical-backend:
    image: infisical/infisical:v0.90.0-postgres
    restart: unless-stopped
    depends_on:
      infisical-db:
        condition: service_healthy
      infisical-redis:
        condition: service_healthy
    environment:
      NODE_ENV: production
      ENCRYPTION_KEY: ${ENCRYPTION_KEY}
      AUTH_SECRET: ${AUTH_SECRET}
      DB_CONNECTION_URI: postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
      REDIS_URL: ${REDIS_URL}
      SITE_URL: ${SITE_URL}
      TELEMETRY_ENABLED: ${TELEMETRY_ENABLED}
    ports:
      - "127.0.0.1:8080:8080"
    networks:
      - infisical_backend
      - proxy_net

volumes:
  pg_data:
    driver: local
  redis_data:
    driver: local

networks:
  infisical_backend:
    internal: true
  proxy_net:
    external: true

Khởi chạy cụm dịch vụ:

bash
docker compose up -d

Kiểm tra tiến trình hoạt động:

bash
docker compose ps
docker compose logs -f infisical-backend

Bước 3: Cấu hình Reverse Proxy Nginx với chứng chỉ SSL/TLS

Infisical CLI và giao diện quản trị yêu cầu kết nối an toàn qua giao thức HTTPS. Tạo một Virtual Host Nginx để chuyển tiếp lưu lượng vào cổng nội bộ 8080:

nginx
server {
    listen 80;
    server_name secrets.internal.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name secrets.internal.example.com;

    ssl_certificate /etc/letsencrypt/live/secrets.internal.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/secrets.internal.example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    client_max_body_size 10M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}

Tải lại cấu hình Nginx bằng lệnh:

bash
sudo nginx -t && sudo systemctl reload nginx

Mở trình duyệt truy cập https://secrets.internal.example.com để đăng ký tài khoản quản trị đầu tiên, thiết lập tổ chức và tạo dự án đầu tiên của bạn.

Thiết lập ma trận phân quyền RBAC giữa các môi trường

Điểm cốt lõi tạo nên sự khác biệt giữa Infisical và tệp tin cấu hình truyền thống là khả năng kiểm soát truy cập dựa trên vai trò (Role-Based Access Control - RBAC).

Trong một dự án thực tế, bạn nên thiết lập chính sách phân quyền theo ba cấp độ:

  1. Lập trình viên (Developer Role):
  • Môi trường Development: Toàn quyền Đọc (Read), Ghi (Write) và Xóa (Delete). Lập trình viên có thể thoải mái thêm các biến thử nghiệm, trỏ về cơ sở dữ liệu cục bộ trên máy tính cá nhân.
  • Môi trường Staging: Quyền chỉ Đọc (Read-only) nhằm phục vụ việc kiểm tra tích hợp khi chạy thử nghiệm trên máy chủ kiểm thử.
  • Môi trường Production: Không có quyền truy cập (No Access). Lập trình viên không thể đọc giá trị thật của cơ sở dữ liệu hay khóa API dịch vụ thanh toán ở môi trường sản xuất.
  1. Kỹ sư Trưởng / DevOps Lead (Admin Role):
  • Toàn quyền trên cả ba môi trường Development, Staging và Production.
  • Có thẩm quyền phê duyệt các yêu cầu thay đổi giá trị bí mật (Secret Change Approval) trên môi trường Production.
  1. Định danh Máy (Machine Identity / Service Token):
  • Dành riêng cho các tiến trình tự động như máy chủ CI/CD hoặc container ứng dụng.
  • Chỉ được cấp quyền đọc các secret cụ thể tại môi trường tương ứng khi tiến hành build hoặc deploy.

Ngoài ra, với các biến môi trường Production cực kỳ nhạy cảm, bạn có thể bật tính năng Secret Approval Workflow. Khi một kỹ sư muốn thay đổi giá trị biến trên Production, họ phải tạo một yêu cầu (Change Request); biến số chỉ chính thức được cập nhật sau khi có sự phê duyệt của Tech Lead hoặc Trưởng nhóm Hạ tầng.

Ma trận phân quyền RBAC giữa các môi trường trong Infisical

Loại bỏ file .env trên máy lập trình bằng Infisical CLI

Để chấm dứt hoàn toàn tình trạng tệp .env trôi nổi trên máy trạm của lập trình viên, toàn bộ đội ngũ sẽ tương tác với secret thông qua Infisical CLI.

1. Cài đặt Infisical CLI trên máy cá nhân của lập trình viên

Tùy thuộc vào hệ điều hành của máy trạm, kỹ sư thực hiện cài đặt như sau:

  • Trên macOS (thông qua Homebrew):
bash
  brew install infisical/get-cli/infisical
  • Trên Linux (Ubuntu/Debian):
bash
  curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | sudo -E bash
  sudo apt-get update && sudo apt-get install -y infisical
  • Trên Windows (thông qua Scoop hoặc tệp nhị phân tải về):
powershell
  scoop bucket add infisical https://github.com/Infisical/scoop-infisical.git
  scoop install infisical

2. Đăng nhập và liên kết dự án mã nguồn

Tại thư mục gốc của dự án trên máy trạm, lập trình viên thực hiện đăng nhập và trỏ tới máy chủ Infisical tự lưu trữ của công ty:

bash
# Đăng nhập tới máy chủ nội bộ
infisical login --domain=https://secrets.internal.example.com

Tiếp theo, khởi tạo liên kết dự án:

bash
infisical init

Lệnh này sẽ hiển thị danh sách các Organization và Project có trên hệ thống để lập trình viên lựa chọn. Sau khi chọn xong, Infisical chỉ tạo ra một tệp duy nhất là .infisical.json chứa mã định danh dự án (workspaceId). Tệp này hoàn toàn an toàn và có thể commit lên Git mà không sợ rò rỉ bất kỳ dữ liệu nhạy cảm nào.

3. Kỹ thuật nạp biến trực tiếp vào bộ nhớ tiến trình (Runtime Injection)

Thay vì chạy ứng dụng bằng các lệnh quen thuộc như npm run dev, python app.py hay go run main.go, lập trình viên sẽ bọc lệnh đó phía sau infisical run:

bash
# Đối với ứng dụng Node.js
infisical run --env=dev -- npm run dev

# Đối với ứng dụng Python
infisical run --env=dev -- python app.py

# Đối với ứng dụng Golang
infisical run --env=dev -- go run main.go

Nguyên lý hoạt động chi tiết:

  1. Lệnh infisical run sẽ gửi một yêu cầu xác thực bảo mật tới máy chủ Infisical và tải toàn bộ các cặp khóa-giá trị của môi trường dev về bộ nhớ RAM của CLI.
  2. CLI khởi tạo một tiến trình con (child process) để chạy lệnh phía sau dấu -- (ví dụ npm run dev), đồng thời truyền toàn bộ các biến môi trường này vào bảng biến môi trường của tiến trình con đó.
  3. Ứng dụng đọc các biến môi trường trực tiếp từ RAM thông qua các lệnh chuẩn (process.env trong Node.js, os.environ trong Python hoặc os.Getenv trong Go) mà không nhận thấy bất kỳ sự khác biệt nào.
  4. Không có bất kỳ tệp tin .env nào được ghi xuống ổ đĩa. Khi lập trình viên nhấn tổ hợp phím Ctrl + C để dừng chương trình, tiến trình con kết thúc và toàn bộ vùng nhớ chứa biến môi trường lập tức được hệ điều hành giải phóng.
Cơ chế nạp Secret vào bộ nhớ tiến trình bằng Infisical CLI

Tích hợp CI/CD tự động bằng Universal Auth (Machine Identity)

Trong chu trình triển khai phần mềm liên tục (CI/CD), một lỗi phổ biến là sao chép toàn bộ biến môi trường vào mục Repository Secrets của GitHub hoặc GitLab. Cách làm này gây khó khăn khi cần cập nhật biến số, bởi quản trị viên phải đi vào từng repository riêng lẻ để chỉnh sửa thủ công.

Infisical giải quyết vấn đề này thông qua cơ chế Universal Auth (xác thực danh tính máy tự động).

Bước 1: Khởi tạo Machine Identity trên Infisical

  1. Trên giao diện Infisical, vào mục Access Control -> Machine Identities -> Create Identity.
  2. Đặt tên định danh: github-actions-deployer.
  3. Gán quyền: Chọn vai trò chỉ được đọc (Read-only) tại môi trường staging và prod của dự án tương ứng.
  4. Chọn phương thức xác thực Universal Auth, sau đó tạo mã Client Secret.
  5. Hệ thống sẽ cấp cho bạn cặp thông tin: Client ID và Client Secret.

Bước 2: Khai báo vào GitHub Actions Secrets

Trên repository của dự án GitHub, bạn chỉ cần lưu duy nhất hai biến bảo mật trong phần Settings -> Secrets and variables -> Actions:

  • INFISICAL_CLIENT_ID
  • INFISICAL_CLIENT_SECRET

Bước 3: Biên soạn pipeline tự động kéo secret tại thời gian chạy

Tạo tệp quy trình triển khai .github/workflows/deploy.yml:

yaml
name: Deploy Application

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Source Code
        uses: actions/checkout@v4

      - name: Fetch Production Secrets from Infisical
        uses: Infisical/secrets-action@v1.0.7
        with:
          client-id: ${{ secrets.INFISICAL_CLIENT_ID }}
          client-secret: ${{ secrets.INFISICAL_CLIENT_SECRET }}
          env: prod
          domain: "https://secrets.internal.example.com"

      - name: Deploy Container with Runtime Injected Secrets
        run: |
          echo "Triển khai ứng dụng với biến môi trường nạp trực tiếp vào runtime..."
          # Biến môi trường lấy từ Infisical được truyền thẳng vào runtime của container
          # Cách làm này ngăn chặn triệt để nguy cơ lộ lọt secret vào Docker Image Metadata (docker history)
          docker run -d \
            --name production-app \
            --restart unless-stopped \
            -e DB_HOST="${DB_HOST}" \
            -e PAYMENT_API_KEY="${PAYMENT_API_KEY}" \
            -p 3000:3000 \
            myregistry.internal.example.com/app:latest

Nhờ cơ chế này, bất kỳ khi nào bạn cần xoay vòng mật khẩu (Rotate Password) hoặc cập nhật khóa API trên môi trường sản xuất, bạn chỉ cần chỉnh sửa một lần duy nhất trên Infisical Dashboard. Trong lần chạy pipeline tiếp theo, GitHub Actions sẽ tự động kéo giá trị mới nhất về mà không cần bất kỳ can thiệp nào vào mã nguồn hay cấu hình repository.

Quản lý vòng đời Secret: Versioning, Rollback và Audit Logs

Một nền tảng SecretOps đạt chuẩn doanh nghiệp phải cung cấp khả năng kiểm soát toàn bộ vòng đời của dữ liệu nhạy cảm:

1. Quản lý lịch sử phiên bản (Secret Versioning)

Mỗi khi một biến số bị thay đổi nội dung (ví dụ từ DB_HOST=10.0.0.10 thành DB_HOST=10.0.0.20), Infisical không ghi đè mất dữ liệu cũ mà sẽ tự động lưu lại lịch sử thay đổi kèm theo số phiên bản (v1, v2, v3).

2. Khôi phục nhanh trong một thao tác (One-Click Rollback)

Nếu một kỹ sư sơ ý cập nhật sai thông tin cổng kết nối của Redis khiến ứng dụng trên Production bị lỗi, bạn không cần phải lục tìm xem giá trị cũ là gì. Quản trị viên chỉ cần mở lịch sử của biến đó trên Infisical Dashboard và nhấn Rollback để khôi phục lại giá trị của phiên bản trước đó ngay tức thì.

3. Nhật ký kiểm toán minh bạch (Audit Trail)

Mọi hành động diễn ra trong hệ thống đều được ghi lại với đầy đủ dữ kiện:

  • Người dùng nào (hoặc Machine Identity nào).
  • Từ địa chỉ IP nào.
  • Đã thực hiện hành động gì: Xem (Read), Sao chép (Copy), Cập nhật (Update) hay Xóa (Delete) biến số.
  • Thời điểm chính xác diễn ra hành vi.

Nhật ký kiểm toán giúp doanh nghiệp đáp ứng đầy đủ các tiêu chuẩn bảo mật nghiêm ngặt như SOC 2, ISO 27001 và hỗ trợ đắc lực cho công tác điều tra nếu chẳng may xảy ra sự cố nghi ngờ lộ thông tin.

Chiến lược sao lưu và Kế hoạch ứng phó sự cố (Disaster Recovery)

Khi vận hành một hệ thống quản lý bí mật tập trung, câu hỏi quan trọng nhất cần đặt ra là: Nếu máy chủ Infisical bị hỏng phần cứng hoặc gặp thảm họa, ứng dụng có tiếp tục chạy được không và làm thế nào để phục hồi dữ liệu?

1. Nguyên tắc bảo vệ khóa ENCRYPTION_KEY

Như đã nhấn mạnh, chuỗi ENCRYPTION_KEY là thành phần sinh tử. Bạn cần thực hiện quy trình bảo vệ khóa nghiêm ngặt:

  • In chuỗi ENCRYPTION_KEY ra văn bản giấy và cất giữ trong két sắt của người phụ trách công nghệ.
  • Lưu trữ bản sao khóa trong một phần mềm quản lý mật khẩu cấp quản trị độc lập (đặt ngoài cụm hạ tầng đang vận hành).
  • Cần tránh lưu tệp .env chứa ENCRYPTION_KEY vào cùng thư mục sao lưu cơ sở dữ liệu trên cùng một máy chủ.

2. Thiết lập quy trình sao lưu cơ sở dữ liệu tự động

Dữ liệu của Infisical nằm trọn vẹn trong PostgreSQL. Bạn thiết lập một cronjob chạy hàng ngày để sao lưu và mã hóa bản sao:

bash
# Trích xuất và nén cơ sở dữ liệu
docker compose exec -T infisical-db pg_dump -U infisical infisical | gzip > /opt/backups/infisical_$(date +%Y%m%d_%H%M%S).sql.gz

# Đẩy bản sao lưu sang vùng lưu trữ Object Storage từ xa (như Cloudflare R2 hoặc S3)
rclone copy /opt/backups/ r2:enterprise-backups/infisical/

3. Cơ chế chịu lỗi của ứng dụng tại thời gian chạy (Runtime Resilience)

Khi ứng dụng của bạn khởi động bằng lệnh infisical run, các biến môi trường được nạp vào bộ nhớ RAM của tiến trình. Điều này có nghĩa là: Nếu máy chủ Infisical tạm thời bị mất kết nối hoặc khởi động lại, các ứng dụng đang chạy bình thường sẽ không bị ảnh hưởng, bởi chúng đã có sẵn biến môi trường trong RAM.

Tuy nhiên, để đề phòng trường hợp khẩn cấp khi máy chủ Infisical gặp sự cố kéo dài đúng thời điểm ứng dụng cần khởi động lại, Tech Lead nên duy trì một bản xuất cấu hình dự phòng được mã hóa bằng GPG:

bash
# Xuất cấu hình môi trường production ra tệp mã hóa GPG an toàn
infisical export --env=prod | gpg --symmetric --cipher-algo AES256 -o emergency_prod_secrets.env.gpg

Tệp mã hóa này có thể được lưu trữ tại một vị trí an toàn riêng biệt và chỉ được giải mã để phục hồi thủ công khi hệ thống gặp thảm họa bất khả kháng.

Việc loại bỏ tệp .env và chuyển sang vận hành Infisical là một bước tiến căn bản giúp chuẩn hóa quy trình làm việc của đội ngũ kỹ thuật, loại bỏ rủi ro lộ bí mật qua mã nguồn Git và bảo vệ an toàn cho dữ liệu doanh nghiệp. Để hoàn thiện kiến trúc bảo mật toàn diện cho hạ tầng phát triển trong Cụm 2, bạn nên kết hợp Infisical với hệ thống đăng nhập tập trung Authentik qua giao thức OIDC và đưa toàn bộ các cổng quản trị này vào mạng nội bộ Zero Trust để ngăn chặn nguy cơ quét cổng từ mạng ngoài.

Nội dung hướng dẫn này có hữu ích với hệ thống của bạn không?

Chia sẻ bài viết hữu ích

Gửi bài viết này cho đồng nghiệp

Đọc tiếp

Bài nên đọc tiếp

Xem tất cả bài về Docker & Application