إدارة الأسرار وأمان البنية التحتية
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 لحالات الاستخدام الأبسط. :::