مقدمة عن إدارة الأسرار
الأسرار (Secrets) تشمل: مفاتيح API، كلمات مرور قواعد البيانات، توكنات JWT، مفاتيح التشفير. تخزينها في الكود المصدري خطر أمني كبير.
⚠️ لا تخزن الأسرار في الكود أبداً. أي شخص لديه صلاحية الوصول إلى الـ repository يمكنه رؤيتها.
متغيرات البيئة (Environment Variables)
أبسط وأشهر طريقة لإدارة الأسرار:
# .env
DB_PASSWORD=supersecret123
JWT_SECRET=my-jwt-secret
STRIPE_API_KEY=sk_live_xxxxx
SENDGRID_API_KEY=SG.xxxxx
استخدم مكتبة dotenv لتحميل المتغيرات:
require('dotenv').config();
const dbPassword = process.env.DB_PASSWORD;
const jwtSecret = process.env.JWT_SECRET;
قواعد ملفات .env
- أضف
.envإلى.gitignore - أنشئ
.env.exampleكمرجع بدون قيم حقيقية - لا تشارك ملف
.envمع أحد
# .env.example (آمن للنشر)
DB_PASSWORD=
JWT_SECRET=
STRIPE_API_KEY=
حلول Vault المركزية
HashiCorp Vault
const vault = require('node-vault')({
apiVersion: 'v1',
endpoint: 'https://vault.example.com',
token: process.env.VAULT_TOKEN,
});
const secrets = await vault.read('secret/data/api');
const dbPassword = secrets.data.data.DB_PASSWORD;
AWS Secrets Manager
const { SecretsManager } = require('@aws-sdk/client-secrets-manager');
const client = new SecretsManager({ region: 'us-east-1' });
const secret = await client.getSecretValue({ SecretId: 'prod/db/password' });
const dbPassword = JSON.parse(secret.SecretString).password;
الأسرار في CI/CD
في GitHub Actions:
name: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy
env:
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
API_KEY: ${{ secrets.API_KEY }}
run: ./deploy.sh
في Azure DevOps:
variables:
- group: Production-Secrets
تدوير الأسرار (Secret Rotation)
استراتيجيات للتدوير الدوري للأسرار:
// استخدام توكنات قصيرة الأمد (STS)
const sts = new AWS.STS();
const tempCredentials = await sts.getSessionToken({
DurationSeconds: 3600, // صلاحية ساعة
}).promise();
أفضل الممارسات
- لا تطبع الأسرار في logs أبداً
- لا تمرر الأسرار كـ arguments للدوال دون تأمين
- استخدم بيئات منفصلة لكل مرحلة (dev, staging, production)
- شفر الأسرار في قاعدة البيانات إذا اضطررت لتخزينها
- استخدم أدوات الكشف مثل
truffleHogوgit-secretsلفحص commits
# فحص repository عن أسرار مسربة
npx trufflehog --regex --entropy=False https://github.com/user/repo
ملخص
- استخدم متغيرات البيئة بدلاً من الكود الثابت
- استخدم vaults مثل HashiCorp Vault للبيئات الكبيرة
- لا تشارك ملفات
.envأبداً - دمج الأسرار مع CI/CD pipelines
- قم بتدوير الأسرار دورياً
🎯 التالي: تشفير البيانات (Data Encryption)