إدارة الأسرار وأمان البنية التحتية

HashiCorp Vault: إدارة الأسرار الديناميكية

4 دقيقة للقراءة

HashiCorp Vault هو المعيار الصناعي لإدارة الأسرار. يوفر أسراراً ديناميكية والتشفير كخدمة والتحكم الدقيق في الوصول.

لماذا Vault؟

الميزة الفائدة
الأسرار الديناميكية توليد بيانات اعتماد قصيرة العمر عند الطلب
التشفير كخدمة تشفير البيانات دون إدارة المفاتيح
تسجيل التدقيق تتبع كل وصول للأسرار
إدارة الإيجارات تدوير الأسرار التلقائي
طرق مصادقة متعددة OIDC، Kubernetes، AWS، GitHub

المفاهيم الأساسية

┌─────────────────────────────────────────────────────┐
│                    خادم Vault                        │
├─────────────────────────────────────────────────────┤
│                                                      │
│  ┌──────────────┐  ┌──────────────┐                │
│  │ طرق المصادقة │  │ محركات      │                │
│  │ • Kubernetes │  │ الأسرار     │                │
│  │ • OIDC       │  │ • KV         │                │
│  │ • AWS IAM    │  │ • Database   │                │
│  │ • GitHub     │  │ • AWS        │                │
│  └──────────────┘  │ • PKI        │                │
│         │          └──────────────┘                │
│         ▼                 │                         │
│  ┌──────────────┐        │                         │
│  │   السياسات   │◀───────┘                         │
│  │ (قواعد ACL)  │                                  │
│  └──────────────┘                                  │
│                                                      │
└─────────────────────────────────────────────────────┘

البدء

وضع التطوير

# بدء Vault في وضع التطوير (ليس للإنتاج)
vault server -dev

# في طرفية أخرى
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='root'

# التحقق
vault status

محرك أسرار KV

# تمكين محرك أسرار KV v2
vault secrets enable -path=secret kv-v2

# تخزين سر
vault kv put secret/myapp/config \
  api_key="sk-1234567890" \
  db_password="secure_password"

# استرجاع سر
vault kv get secret/myapp/config

# الحصول على حقل محدد
vault kv get -field=api_key secret/myapp/config

بيانات اعتماد قاعدة البيانات الديناميكية

بدلاً من كلمات المرور الثابتة، Vault يولد بيانات اعتماد مؤقتة:

# تمكين محرك أسرار قاعدة البيانات
vault secrets enable database

# تكوين اتصال PostgreSQL
vault write database/config/mydb \
  plugin_name=postgresql-database-plugin \
  connection_url="postgresql://{{username}}:{{password}}@db.example.com:5432/myapp" \
  allowed_roles="readonly" \
  username="vault_admin" \
  password="admin_password"

# إنشاء دور للوصول للقراءة فقط
vault write database/roles/readonly \
  db_name=mydb \
  creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
  default_ttl="1h" \
  max_ttl="24h"

# الحصول على بيانات اعتماد ديناميكية (بيانات جديدة كل مرة!)
vault read database/creds/readonly

الإخراج:

Key                Value
---                -----
lease_id           database/creds/readonly/abc123
lease_duration     1h
username           v-token-readonly-xyz789
password           A1B2C3D4E5F6G7H8

السياسات للتحكم في الوصول

# policy.hcl - سياسة المطور
path "secret/data/myapp/*" {
  capabilities = ["read"]
}

path "database/creds/readonly" {
  capabilities = ["read"]
}

# رفض الوصول لأسرار الإنتاج
path "secret/data/production/*" {
  capabilities = ["deny"]
}
# إنشاء السياسة
vault policy write developer policy.hcl

# تعيين السياسة لطريقة المصادقة
vault write auth/kubernetes/role/myapp \
  bound_service_account_names=myapp-sa \
  bound_service_account_namespaces=default \
  policies=developer \
  ttl=1h

تكامل CI/CD

GitHub Actions مع Vault

# .github/workflows/deploy.yml
jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write  # مطلوب لـ OIDC

    steps:
      - uses: actions/checkout@v4

      - name: Import Secrets from Vault
        uses: hashicorp/vault-action@v2
        with:
          url: https://vault.example.com
          method: jwt
          role: github-actions
          secrets: |
            secret/data/myapp/config api_key | API_KEY ;
            database/creds/readonly username | DB_USER ;
            database/creds/readonly password | DB_PASS

      - name: Deploy
        run: |
          # الأسرار متاحة كمتغيرات بيئة
          ./deploy.sh
        env:
          API_KEY: ${{ env.API_KEY }}
          DB_USER: ${{ env.DB_USER }}
          DB_PASS: ${{ env.DB_PASS }}

تكامل Kubernetes

# Pod مع Vault Agent sidecar
apiVersion: v1
kind: Pod
metadata:
  name: myapp
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "myapp"
    vault.hashicorp.com/agent-inject-secret-config: "secret/data/myapp/config"
spec:
  serviceAccountName: myapp-sa
  containers:
    - name: app
      image: myapp:latest
      # الأسرار متاحة في /vault/secrets/config

أفضل الممارسات

الممارسة لماذا
استخدم الأسرار الديناميكية يحد من نطاق الانفجار عند الاختراق
TTLs قصيرة 1 ساعة للتطوير، 15 دقيقة للإنتاج
دقق كل شيء فعّل تسجيل التدقيق إلى SIEM
مبدأ أقل الصلاحيات صلاحيات دنيا لكل خدمة
افصل مثيلات Vault التطوير/التجهيز مقابل الإنتاج

بعد ذلك، سنستكشف أسرار GitHub ومصادقة OIDC لحالات الاستخدام الأبسط. :::

اختبار

الوحدة 5: إدارة الأسرار وأمان البنية التحتية

خذ الاختبار