پرش به محتوای اصلی
امنیت سرور و هاست

فایل .env چیست و چگونه از افشای اطلاعات حساس آن جلوگیری کنیم؟

فایل .env برای نگهداری متغیرهای محیطی و تنظیمات برنامه استفاده می‌شود و ممکن است شامل اطلاعات حساسی مانند رمز پایگاه داده، API Key، Token و کلیدهای رمزنگاری باشد. افشای فایل .env از طریق Git، تنظیم نادرست وب‌سرور، Backup، Docker Image یا Log می‌تواند امنیت کل وب‌اپلیکیشن را تحت تأثیر قرار دهد. خارج‌کردن فایل از Public Web Root، استفاده از .gitignore، محدودسازی Permission، Secret Rotation و استفاده از Secret Manager در محیط‌های حساس از مهم‌ترین روش‌های محافظت از فایل .env هستند.

تیم امنیت رخنه‌کاو ۳۴ دقیقه مطالعه انتشار:

فایل .env یک فایل پیکربندی متنی برای نگهداری متغیرهای محیطی برنامه است و معمولاً اطلاعاتی مانند مشخصات اتصال پایگاه داده، API Key، Token، تنظیمات ایمیل و کلیدهای رمزنگاری را در خود نگه می‌دارد. اگر فایل .env به‌اشتباه در دسترس عمومی وب، مخزن Git، Backup، Log یا Artifactهای CI/CD قرار بگیرد، ممکن است اطلاعات حساس برنامه افشا شوند. برای جلوگیری از این اتفاق باید فایل .env خارج از دسترس مستقیم وب نگهداری شود، در Git ثبت نشود، Permission مناسبی داشته باشد و در محیط‌های حساس از Secret Manager و سیاست Rotation استفاده شود.

فایل .env یکی از رایج‌ترین اجزای پیکربندی در وب‌اپلیکیشن‌های امروزی است. بسیاری از Frameworkها و پروژه‌های PHP، Laravel، Node.js، Python، Ruby، Docker و حتی سیستم‌های مبتنی بر Microservice برای جداکردن تنظیمات محیط از Source Code از Environment Variable استفاده می‌کنند.

ایده اصلی بسیار منطقی است. برنامه نباید رمز پایگاه داده، API Key یا Secretهای خود را مستقیماً داخل Source Code قرار دهد. این اطلاعات بسته به محیط Development، Staging و Production متفاوت‌اند و باید بدون تغییر کد قابل تنظیم باشند.

مشکل از جایی آغاز می‌شود که توسعه‌دهنده تصور کند صرف قرارگرفتن یک Secret در فایل .env به معنای امن‌شدن آن است.

فایل .env خودش یک Vault یا سیستم رمزنگاری نیست.

در اغلب پروژه‌ها این فایل یک فایل متنی ساده است. اگر فردی بتواند آن را بخواند، معمولاً می‌تواند مقادیر داخل آن را نیز مشاهده کند.

به همین دلیل امنیت فایل .env بیشتر از آنکه به فرمت فایل وابسته باشد، به نحوه استقرار، Permissionها، تنظیمات وب‌سرور، Repository، Pipeline، Backup و مدیریت Secretهای سازمان بستگی دارد.

فایل .env چیست؟

نام .env از واژه Environment گرفته شده است.

این فایل معمولاً مجموعه‌ای از Key-Valueها را نگهداری می‌کند که برنامه هنگام اجرا آن‌ها را بارگذاری می‌کند.

یک نمونه ساده و غیرواقعی می‌تواند چنین باشد:

APP_ENV=production
APP_DEBUG=false

DB_HOST=database.internal
DB_PORT=3306
DB_DATABASE=example_app
DB_USERNAME=app_user
DB_PASSWORD=CHANGE_ME

MAIL_HOST=smtp.example.local
MAIL_USERNAME=mailer
MAIL_PASSWORD=CHANGE_ME

API_KEY=CHANGE_ME

برنامه هنگام Startup یا اجرای Request می‌تواند این مقادیر را دریافت کرده و براساس آن‌ها تنظیم شود.

برای مثال به‌جای اینکه رمز پایگاه داده در Source Code نوشته شود:

database_password = "real-password"

کد برنامه مقدار را از Environment دریافت می‌کند:

database_password = ENV["DB_PASSWORD"]

این جداسازی مزایای زیادی دارد:

  • Source Code میان چند محیط یکسان باقی می‌ماند.
  • Credentialهای Production لازم نیست در کد نوشته شوند.
  • تنظیمات Development و Production از یکدیگر جدا می‌شوند.
  • Deployment اتوماتیک ساده‌تر می‌شود.
  • Credentialها را می‌توان بدون تغییر Application Code تعویض کرد.

اما همه این مزایا فقط زمانی ارزش امنیتی دارند که Secretها به‌درستی مدیریت شوند. چه اطلاعاتی معمولاً داخل فایل .env قرار می‌گیرند؟

چه اطلاعاتی معمولاً داخل فایل .env قرار می‌گیرند؟

محتوای .env از پروژه‌ای به پروژه دیگر متفاوت است.

بعضی مقادیر صرفاً Configuration هستند و افشای آن‌ها تأثیر زیادی ندارد، اما برخی مقادیر Secret واقعی محسوب می‌شوند.

اطلاعات اتصال پایگاه داده

از رایج‌ترین موارد می‌توان به این متغیرها اشاره کرد:

DB_HOST
DB_PORT
DB_DATABASE
DB_USERNAME
DB_PASSWORD

در صورت افشای Credential معتبر، مهاجم ممکن است در شرایطی که Database از شبکه قابل دسترسی باشد یا Credential در سرویس دیگری قابل استفاده باشد، خطر جدی‌تری ایجاد کند.

حتی اگر Database مستقیماً از اینترنت قابل دسترسی نباشد، افشای Credential همچنان یک Incident امنیتی محسوب می‌شود.

API Keyها

بسیاری از برنامه‌ها با سرویس‌های خارجی ارتباط دارند:

PAYMENT_API_KEY
SMS_API_KEY
AI_API_KEY
STORAGE_ACCESS_KEY
MAP_API_KEY

شدت افشای API Key به Permissionهای همان Key بستگی دارد.

یک کلید Read Only محدود با یک Credential دارای دسترسی مدیریتی یکسان نیست.

به همین دلیل اصل Least Privilege در مدیریت API Key اهمیت زیادی دارد.

Tokenها

ممکن است .env شامل مواردی مانند این باشد:

BOT_TOKEN
WEBHOOK_SECRET
ACCESS_TOKEN
SERVICE_TOKEN

برخی Tokenها به یک سرویس خارجی دسترسی مستقیم ایجاد می‌کنند.

در این حالت حذف فایل .env از دسترس عمومی به‌تنهایی کافی نیست و Token افشاشده باید Revoke یا Rotate شود.

کلیدهای رمزنگاری

برخی Frameworkها یا برنامه‌ها کلیدهایی برای Encryption، Signing یا Session Management دارند.

برای مثال:

APP_KEY
JWT_SECRET
SIGNING_KEY
ENCRYPTION_KEY

این نوع Secretها ممکن است حساس‌تر از یک Password ساده باشند، زیرا تغییر آن‌ها می‌تواند روی داده‌های رمزگذاری‌شده، Sessionها یا Tokenهای موجود تأثیر بگذارد.

به همین دلیل Rotation این نوع Key باید با برنامه‌ریزی انجام شود.

اطلاعات سرویس ایمیل

مواردی مانند:

SMTP_HOST
SMTP_USERNAME
SMTP_PASSWORD

نیز ممکن است در فایل قرار داشته باشند.

افشای Credential ایمیل می‌تواند به ارسال پیام غیرمجاز، سوءاستفاده از اعتبار دامنه یا دسترسی به زیرساخت Mail منجر شود.

Credentialهای Cloud و Object Storage

یکی از خطرناک‌ترین موارد زمانی است که .env شامل Credentialهای Cloud باشد.

برای مثال:

ACCESS_KEY_ID
SECRET_ACCESS_KEY
STORAGE_TOKEN

میزان خطر کاملاً به سطح Permission این Credential بستگی دارد.

اگر Credential بیش از نیاز برنامه دسترسی داشته باشد، Impact افشای آن نیز بیشتر خواهد شد.

آیا فایل .env ذاتاً امن است؟

خیر.

.env فقط یک روش سازمان‌دهی Configuration است.

در حالت معمول هیچ قابلیت جادویی وجود ندارد که محتوای فایل را خودکار رمزگذاری کند.

اگر Permission سیستم‌عامل اجازه Read بدهد، فرایند مربوطه می‌تواند فایل را بخواند.

اگر وب‌سرور فایل را Publish کند، Client نیز ممکن است بتواند آن را دریافت کند.

اگر فایل وارد Git شود، نسخه آن می‌تواند در History Repository باقی بماند.

اگر فایل در Backup قرار بگیرد، Secretها وارد Backup می‌شوند.

اگر .env در Docker Image کپی شود، Credential ممکن است در Image Layer باقی بماند.

بنابراین بهتر است این اصل همیشه در طراحی در نظر گرفته شود:

.env = Configuration Container
.env ≠ Secret Vault

در محیط Production حتی Environment Variable نیز همیشه بهترین روش نگهداری Secret نیست. OWASP هشدار می‌دهد که Environment Variableها بسته به محیط ممکن است از طریق Processها، Debugging، Dumpها یا Logها در معرض دید قرار بگیرند و برای محیط‌های حساس استفاده از سازوکارهای اختصاصی Secrets Management می‌تواند مناسب‌تر باشد.

چرا افشای فایل .env خطرناک است؟

شدت خطر فایل .env به محتوای آن بستگی دارد.

تصور کنید یک فایل فقط شامل موارد زیر باشد:

APP_LANGUAGE=fa
APP_TIMEZONE=Asia/Tehran

افشای چنین اطلاعاتی احتمالاً Impact محدودی دارد.

اما اگر همان فایل حاوی موارد زیر باشد:

DATABASE_PASSWORD
PAYMENT_SECRET
JWT_SECRET
CLOUD_ACCESS_TOKEN
SMTP_PASSWORD

ریسک کاملاً متفاوت خواهد بود.

به همین دلیل هنگام ارزیابی افشای .env نباید فقط پرسید:

«آیا فایل قابل مشاهده بوده است؟»

سؤال مهم‌تر این است:

چه Secretهایی داخل آن وجود داشته‌اند و هر Secret چه Permission و Scopeای داشته است؟ فایل .env چگونه به‌اشتباه افشا می‌شود؟

فایل .env چگونه به‌اشتباه افشا می‌شود؟

افشای .env معمولاً نتیجه یک خطای پیچیده رمزنگاری نیست.

در بسیاری از موارد مشکل از Deployment یا Configuration اشتباه ایجاد می‌شود.

قرارگرفتن .env داخل Web Root

یکی از خطرناک‌ترین معماری‌ها قرارگرفتن فایل حساس در مسیری است که وب‌سرور فایل‌های آن را مستقیماً Serve می‌کند.

فرض کنیم ساختار برنامه چنین باشد:

/var/www/example/
    .env
    index.php
    app/
    vendor/
    uploads/

اگر Document Root مستقیماً روی /var/www/example/ قرار گرفته باشد و وب‌سرور دسترسی به Dotfileها را محدود نکرده باشد، سطح ریسک افزایش پیدا می‌کند.

معماری مناسب‌تر در بسیاری از Frameworkها این است که فقط Public Directory در معرض وب قرار گیرد:

/var/www/example/
    .env
    app/
    config/
    vendor/
    storage/

    public/
        index.php
        css/
        js/
        images/

و Document Root:

/var/www/example/public/

باشد.

در این حالت حتی اگر Rule جداگانه‌ای برای .env وجود نداشته باشد، فایل اساساً خارج از Web Root قرار دارد.

این روش نمونه خوبی از Defense in Depth است.

اشتباه در تنظیمات Apache یا Nginx

وب‌سرور باید از دسترسی HTTP به فایل‌های حساس جلوگیری کند.

Apache در مستندات امنیتی خود نیز مسدودکردن Dotfileهای حساس را توصیه می‌کند و نمونه‌ای از Deny کردن چنین فایل‌هایی ارائه می‌دهد.

برای Apache می‌توان بسته به معماری سرور Rule دفاعی متناسبی تعریف کرد.

نمونه محدود برای فایل .env:

<FilesMatch "^\.env">
    Require all denied
</FilesMatch>

اما نباید این Rule جایگزین معماری صحیح Document Root شود.

بهترین حالت این است که Secret اصلاً داخل Public Directory نباشد.

در Nginx نیز می‌توان دسترسی به مسیر حساس را مسدود کرد:

location = /.env {
    deny all;
}

Directive deny یکی از قابلیت‌های استاندارد کنترل دسترسی Nginx است.

باز هم اصل مهم این است:

فایل حساس نباید صرفاً به امید یک Rule وب‌سرور در Public Web Root نگهداری شود.

ثبت فایل .env در Git

یکی از شایع‌ترین خطاهای امنیتی این است که Developer فایل .env را به Repository اضافه کند.

Frameworkهایی مانند Laravel نیز صراحتاً توصیه می‌کنند .env در Source Control Commit نشود.

برای مثال معمولاً باید چیزی مشابه زیر داخل .gitignore وجود داشته باشد:

.env
.env.local
.env.production
.env.*.local

اما وجود .gitignore به‌تنهایی کافی نیست.

اگر فایل قبلاً Commit شده باشد چه؟

یک نکته مهم درباره Git این است که .gitignore فقط از Track شدن فایل‌های جدید جلوگیری می‌کند.

اگر فایل قبلاً Commit شده باشد، اضافه‌کردن آن به .gitignore لزوماً نسخه‌های قبلی را از History حذف نمی‌کند.

این وضعیت بسیار مهم است.

برای بررسی اینکه .env در وضعیت فعلی Repository Track می‌شود یا نه می‌توان در محیط توسعه مجاز از دستور زیر استفاده کرد:

git ls-files .env

برای بررسی Ignore شدن فایل:

git check-ignore -v .env

و برای بررسی سابقه فایل در Repository خودتان:

git log --all -- .env

این بررسی‌ها باید در Repository متعلق به خودتان یا محیطی که مجوز بررسی آن را دارید انجام شوند.

چرا حذف Commit کافی نیست؟

فرض کنید Developer متوجه شود Credential در Git قرار گرفته است.

او فایل را حذف می‌کند و Commit جدید می‌زند.

Secret هنوز ممکن است در Commitهای قبلی باقی مانده باشد.

همچنین ممکن است Repository قبلاً:

  • Clone شده باشد.
  • Fork شده باشد.
  • Cache شده باشد.
  • وارد Backup شده باشد.
  • در CI/CD Runner وجود داشته باشد.
  • توسط Developer دیگری دریافت شده باشد.

GitHub نیز تأکید می‌کند که اگر Secret افشا شده باشد، اقدام اصلی باید Revoke یا Rotate کردن Credential باشد؛ صرف حذف فایل یا Rewrite کردن History به‌تنهایی تضمین نمی‌کند Secret دیگر قابل سوءاستفاده نیست.

فایل .env.example چیست؟

به‌جای Commit کردن .env واقعی، معمولاً فایل نمونه‌ای مانند:

.env.example

داخل Repository قرار می‌گیرد.

این فایل فقط نام متغیرهای موردنیاز برنامه را مشخص می‌کند:

APP_ENV=production
APP_DEBUG=false

DB_HOST=
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

MAIL_HOST=
MAIL_USERNAME=
MAIL_PASSWORD=

PAYMENT_API_KEY=

هیچ Secret واقعی نباید داخل .env.example قرار بگیرد.

هدف این فایل Documentation است، نه نگهداری Credential.

Laravel نیز استفاده از .env.example با مقادیر Placeholder را برای مشخص‌کردن Environment Variableهای موردنیاز پروژه پشتیبانی می‌کند.

فایل‌های Backup یکی از خطرهای پنهان هستند

گاهی .env اصلی به‌درستی محافظت شده است، اما نسخه‌های Backup آن باقی مانده‌اند.

مثلاً:

.env.backup
.env.bak
.env.old
.env.save
.env-copy
.env.production.backup

اگر Web Server فقط Rule دقیقی برای .env داشته باشد، نسخه Backup ممکن است خارج از Rule قرار گیرد.

بنابراین بهتر است فایل Backup حساس داخل Web Root ساخته نشود.

Backupهای واقعی نیز باید:

  • Encrypt شوند.
  • Access Control مناسب داشته باشند.
  • Retention Policy مشخص داشته باشند.
  • دسترسی آن‌ها Audit شود.
  • پس از پایان دوره نگهداری حذف امن شوند.

Permission فایل .env

حتی وقتی فایل از HTTP قابل دسترسی نیست، Permission ضعیف سیستم‌عامل می‌تواند ریسک ایجاد کند.

اصل Least Privilege باید اعمال شود.

یعنی فقط User یا Processهایی که واقعاً به فایل نیاز دارند امکان خواندن آن را داشته باشند.

روی Linux می‌توان وضعیت Permission را بررسی کرد:

ls -l .env

یا:

stat .env

نباید بدون بررسی ساختار Deployment یک Permission ثابت برای همه سرورها تجویز کرد.

برای مثال اینکه Web Server، PHP-FPM، Container یا Deployment Agent تحت چه Userی اجرا می‌شوند روی Permission صحیح تأثیر می‌گذارد.

هدف این است که دسترسی به فایل فقط به حداقل Principalهای لازم محدود شود.

استفاده بی‌دلیل از Permissionهایی مانند:

777

برای فایل حساس انتخاب مناسبی نیست.

تفاوت فایل .env با Environment Variable

این دو اصطلاح گاهی یکی فرض می‌شوند، اما دقیقاً یکسان نیستند.

فایل .env معمولاً یک فایل متنی است که Library یا Framework آن را خوانده و مقادیر آن را وارد Configuration برنامه می‌کند.

Environment Variable در سطح Process یا سیستم‌عامل وجود دارد.

برای مثال برنامه ممکن است اصلاً فایل .env نداشته باشد و مقادیر را مستقیماً از Environment سیستم دریافت کند.

در محیط Production این الگو رایج است.

اما باید دقت کرد:

انتقال Secret از .env به Environment Variable به معنی حل کامل مسئله Secret Management نیست.

Environment Variable ممکن است بسته به سیستم از طریق مواردی مانند Debugging، Process Inspection، Crash Dump یا Logهای اشتباه افشا شود. OWASP به همین دلیل در محیط‌های حساس استفاده از Secret Management اختصاصی را ترجیح می‌دهد.

Secret Manager چیست؟

Secret Manager سیستمی است که مخصوص نگهداری و مدیریت Credentialها طراحی شده است.

برخلاف یک فایل متنی ساده، چنین سیستم‌هایی معمولاً قابلیت‌هایی مانند این دارند:

  • Access Control
  • Audit Logging
  • Secret Rotation
  • Encryption at Rest
  • Versioning
  • Dynamic Secrets
  • Expiration
  • Policy Management
  • Centralized Administration

در معماری حرفه‌ای ممکن است برنامه هنگام Startup یا Runtime Secret موردنیاز را از سرویس مخصوص دریافت کند.

این روش به‌خصوص در پروژه‌هایی با چند سرور، Microservice، Kubernetes یا CI/CD گسترده مناسب‌تر است.

البته Secret Manager نیز باید به‌درستی تنظیم شود.

اگر تمام سرویس‌ها دسترسی کامل به تمام Secretها داشته باشند، مزیت امنیتی آن تا حد زیادی کاهش پیدا می‌کند.

اصل Least Privilege برای Secretها

فرض کنید Application فقط باید اطلاعات یک Database مشخص را بخواند.

Credential آن برنامه نباید Administrator کل Database Server باشد.

یا اگر یک سرویس فقط باید فایل‌هایی را داخل یک Bucket خاص Upload کند، Credential آن نباید مدیریت کل Cloud Account را در اختیار داشته باشد.

بنابراین امنیت فایل .env فقط به مخفی‌کردن Secret محدود نمی‌شود.

اگر Secret افشا شود، Scope آن باید تا حد امکان کوچک باشد.

مدل مناسب:

Application A
   ↓
Credential A
   ↓
فقط Resourceهای موردنیاز Application A

نه:

Application A
   ↓
Global Admin Credential
   ↓
تمام زیرساخت

این تفاوت می‌تواند Impact یک Incident را به‌شدت کاهش دهد.

خطر استفاده از APP_DEBUG در Production

همه اطلاعات .env Secret نیستند، اما بعضی Configurationها می‌توانند امنیت سیستم را کاهش دهند.

یکی از نمونه‌های مهم Debug Mode است.

برای Production معمولاً باید تنظیمات Debug غیرفعال باشند:

APP_DEBUG=false

صفحات Debug ممکن است اطلاعاتی درباره:

  • File Path
  • Stack Trace
  • Query
  • Configuration
  • Internal Hostname
  • Package Version
  • Environment

نمایش دهند.

در برخی شرایط حتی ممکن است Secretهای حساس نیز وارد Exception Output یا Debug Dump شوند.

بنابراین Debug باید در Production محدود باشد.

Log کردن Environment یک اشتباه خطرناک است

بعضی Developerها برای Troubleshooting تمام Configuration را Log می‌کنند.

مثلاً در Startup:

Loaded environment:
DB_PASSWORD=...
API_TOKEN=...

این کار باعث می‌شود Secret از محل اصلی خود خارج شده و وارد Logging Infrastructure شود.

حالا افراد بیشتری ممکن است به آن دسترسی داشته باشند:

Application Developer
DevOps
Monitoring Team
Log Aggregator
Support Team
Backup System

Kubernetes و OWASP نیز نسبت به قرارگرفتن Secretها در Environment و سپس نشت آن‌ها از طریق Debugging و Log هشدار می‌دهند.

برنامه باید هنگام Logging مقادیر حساس را Redact کند.

مثلاً:

DB_PASSWORD=[REDACTED]
API_KEY=[REDACTED]
TOKEN=[REDACTED]
فایل .env و Docker

فایل .env و Docker

Docker یکی از محیط‌هایی است که مدیریت نادرست Secret در آن می‌تواند مشکل ایجاد کند.

یکی از اشتباهات رایج این است که Secret مستقیماً داخل Dockerfile قرار گیرد:

ENV API_KEY=REAL_SECRET

یا هنگام Build از ARG برای Secret دائمی استفاده شود.

OWASP هشدار می‌دهد Hardcode کردن Secret در ENV یا ARG می‌تواند باعث نشت Credential از Container Definition یا Artifactهای مرتبط شود.

کپی‌کردن .env داخل Docker Image

فرض کنید Dockerfile شامل:

COPY . .

باشد.

اگر .dockerignore فایل .env را حذف نکرده باشد، ممکن است فایل وارد Build Context و سپس Image شود.

بنابراین معمولاً باید در .dockerignore موارد حساس مشخص شوند:

.env
.env.*
.git

البته اگر Application واقعاً در Runtime به فایل نیاز دارد، بهتر است Secret هنگام Deployment Inject شود نه اینکه در Image ثابت Build شود.

اصل مناسب این است:

Build Artifact
      ↓
بدون Secret محیط واقعی
      ↓
Deploy
      ↓
Inject Secret

Docker Secrets

Docker Compose از مفهوم secrets برای ارائه داده‌های حساس به Serviceهایی که صراحتاً اجازه دریافت آن را دارند پشتیبانی می‌کند.

این طراحی از قرارگرفتن بی‌دلیل Secret در Application Image جلوگیری می‌کند.

در معماری Containerized باید بررسی شود:

  • کدام Container واقعاً Secret را نیاز دارد؟
  • Secret در Build Image وجود دارد یا Runtime Inject می‌شود؟
  • آیا Secret وارد Log شده است؟
  • آیا تمام Containerها به آن دسترسی دارند؟
  • آیا Secret بعد از Rotation به‌روز می‌شود؟
فایل .env در Kubernetes

فایل .env در Kubernetes

در Kubernetes معمولاً برای اطلاعات محرمانه از Secret Resource استفاده می‌شود.

اما یک سوءبرداشت مهم وجود دارد:

Base64 رمزنگاری نیست.

مقادیر data در Kubernetes Secret به Base64 تبدیل می‌شوند، اما Base64 هیچ Confidentiality واقعی ایجاد نمی‌کند. مستندات Kubernetes نیز صراحتاً اعلام می‌کنند Base64 یک روش Encryption نیست و Secretها به‌صورت پیش‌فرض ممکن است در Data Store مربوط به API Server بدون Encryption at Rest ذخیره شوند، مگر اینکه تنظیمات مربوطه فعال شده باشد.

بنابراین امنیت Kubernetes Secret نیازمند مواردی مانند:

  • RBAC مناسب
  • Encryption at Rest
  • محدودکردن دسترسی Podها
  • عدم Commit کردن Manifest دارای Secret
  • Audit
  • Rotation
  • جلوگیری از Logging

است.

CI/CD چگونه باعث افشای .env می‌شود؟

Pipelineهای CI/CD معمولاً به Secretهای زیادی دسترسی دارند.

برای مثال:

Deployment Token
Registry Password
SSH Key
Cloud Credential
Database Migration Credential

اگر Pipeline فایل .env تولید کند، باید چرخه عمر آن مشخص باشد.

مشکلات رایج عبارت‌اند از:

  • چاپ Secret در Build Log
  • Upload شدن .env به‌عنوان Artifact
  • قرارگرفتن فایل در Cache
  • باقی‌ماندن فایل روی Runner
  • دسترسی بیش از حد Jobها به Secret
  • استفاده از Credential مشترک میان Development و Production

Secretهای Pipeline بهتر است از Secret Storage خود CI/CD دریافت شوند و فقط در Jobهایی که نیاز واقعی دارند Inject شوند.

چرا Development و Production نباید Secret مشترک داشته باشند؟

استفاده از Password یا API Key یکسان در چند Environment باعث افزایش Blast Radius می‌شود.

معماری نامناسب:

Development
Staging
Production
     ↓
یک Database Password مشترک

اگر لپ‌تاپ Developer یا Repository آزمایشی افشا شود، Production نیز تحت تأثیر قرار می‌گیرد.

مدل بهتر:

Development → Credential جدا
Staging     → Credential جدا
Production  → Credential جدا

همچنین Permission هر Environment باید متناسب با نیاز همان محیط باشد.

Secret Rotation چیست؟

Rotation یعنی Credential قدیمی با Credential جدید جایگزین شود.

برای مثال:

Old API Key
      ↓
Create New Key
      ↓
Update Application
      ↓
Verify
      ↓
Revoke Old Key

در طراحی حرفه‌ای Rotation نباید یک Incident اضطراری غیرقابل پیش‌بینی باشد.

سیستم باید از ابتدا قابلیت تعویض Secret را داشته باشد.

اگر تغییر یک Password باعث چند ساعت Downtime شود، معماری Secret Management نیازمند بازنگری است.

چه زمانی Secret باید فوراً Rotate شود؟

اگر احتمال منطقی وجود داشته باشد که Credential افشا شده است، باید آن را Compromised در نظر گرفت.

برای مثال:

  • .env وارد Repository عمومی شده است.
  • Secret در Log عمومی دیده شده است.
  • Credential در Ticket یا Chat عمومی قرار گرفته است.
  • Backup ناامن افشا شده است.
  • Secret داخل Docker Image منتشرشده وجود داشته است.
  • سیستم Secret Scanning هشدار معتبر داده است.

در چنین شرایطی فقط حذف فایل کافی نیست.

GitHub نیز برای Secret افشاشده توصیه می‌کند ابتدا Credential مربوطه Revoked یا Rotated شود.

Secret Scanning چیست؟

Secret Scanning ابزاری برای جستجوی Credentialها در Source Code، Commit History و سایر منابع توسعه است.

این سیستم‌ها می‌توانند الگوهایی مانند:

  • API Key
  • Access Token
  • Private Key
  • Password
  • Credential شناخته‌شده سرویس‌ها

را شناسایی کنند.

GitHub Secret Scanning می‌تواند History Repository و بخش‌های مختلف مرتبط را برای Secretهای پشتیبانی‌شده بررسی کند و در صورت شناسایی Credential هشدار ایجاد کند.

در سازمان‌های بزرگ استفاده از Secret Scanning بهتر است فقط بعد از Push نباشد.

می‌توان کنترل‌هایی در چند مرحله داشت:

Developer Workstation
        ↓
Pre-Commit / IDE
        ↓
Push Protection
        ↓
Repository Scanning
        ↓
CI/CD
        ↓
Runtime Monitoring

GitHub همچنین قابلیت Push Protection را برای جلوگیری از ورود برخی Secretهای پشتیبانی‌شده قبل از ثبت آن‌ها ارائه می‌کند.

چگونه بررسی کنیم فایل .env به‌درستی محافظت شده است؟

این بررسی باید روی سیستم خودتان یا سامانه‌ای که مجوز بررسی آن را دارید انجام شود.

بررسی محل فایل

ابتدا مشخص کنید .env در چه مسیری قرار دارد.

سؤال اصلی:

آیا این مسیر داخل Document Root وب‌سرور است؟

اگر پاسخ مثبت است، معماری Deployment باید بررسی شود.

بررسی Git

بررسی کنید فایل Track نشده باشد:

git ls-files .env

Ignore بودن آن:

git check-ignore -v .env

و در صورت نیاز History پروژه خودتان:

git log --all -- .env

بررسی Permission

روی Linux:

ls -la .env

بررسی کنید چه User و Groupهایی اجازه Read دارند.

بررسی Backupها

فقط .env اصلی را جستجو نکنید.

نسخه‌هایی مانند:

.env.bak
.env.old
.env.backup
.env.production

نیز باید در Storage و Deployment Process بررسی شوند.

بررسی Docker Image

اطمینان حاصل کنید .env وارد Build Artifact نشده باشد.

.dockerignore را نیز بررسی کنید.

بررسی Logها

بررسی کنید Application در Startup یا Error Handler کل Environment را Log نکرده باشد.

بررسی CI/CD

مطمئن شوید Secretها در:

Build Log
Artifact
Cache
Report
Debug Output

ذخیره نمی‌شوند.

یک معماری امن برای مدیریت Configuration

یک معماری ساده و مناسب می‌تواند به این شکل باشد:

Source Code
     ↓
بدون Secret
     ↓
Build
     ↓
Artifact بدون Secret
     ↓
Deployment
     ↓
Secret Manager / Protected Environment
     ↓
Application Runtime

در این طراحی Secret در Source Repository و Build Artifact قرار ندارد.

برنامه فقط هنگام اجرا Credential موردنیاز خود را دریافت می‌کند.

این مدل به‌خصوص برای Cloud و Microservice مناسب است.

آیا باید تمام اطلاعات .env را داخل Secret Manager قرار دهیم؟

خیر.

همه Configurationها Secret نیستند.

برای مثال:

APP_LANGUAGE=fa
CACHE_DRIVER=redis
LOG_LEVEL=warning

ممکن است اطلاعات محرمانه محسوب نشوند.

بهتر است Configuration به دو گروه تقسیم شود:

Configuration عمومی

مانند:

APP_LOCALE
TIMEZONE
SERVICE_URL
FEATURE_FLAG

Secret

مانند:

PASSWORD
TOKEN
PRIVATE_KEY
API_SECRET
ENCRYPTION_KEY

این تفکیک باعث می‌شود Secret Manager فقط داده‌هایی را مدیریت کند که واقعاً نیازمند حفاظت ویژه هستند.

فایل .env و برنامه‌های Frontend

یکی از اشتباهات مهم قرار دادن Secret در پروژه Frontend است.

هر مقداری که در JavaScript سمت Browser Bundle شود باید در عمل قابل مشاهده توسط User در نظر گرفته شود.

اگر Build Tool متغیری را وارد Client Bundle کند، آن مقدار دیگر Secret واقعی نیست.

بنابراین:

Browser
↓
Untrusted Environment

API Secret، Database Password، Private Key و Credentialهای Backend نباید داخل Frontend Bundle قرار گیرند.

اگر Browser برای استفاده از یک سرویس خارجی به Credential نیاز دارد، معماری باید مشخص کند آیا آن Credential واقعاً Public Client Key است یا Secret Backend.

کلیدهای Public با Secret Key تفاوت دارند

همه Keyها محرمانه نیستند.

برخی سرویس‌ها Public Identifier یا Client Keyهایی ارائه می‌کنند که برای قرارگرفتن در Frontend طراحی شده‌اند.

اما این موضوع نباید براساس نام Key حدس زده شود.

مستندات Provider باید مشخص کنند:

Publishable Key
Public Key
Client Identifier

آیا قابل انتشار است یا نه.

در مقابل:

Secret Key
Private Key
Admin Token
Service Credential

باید محرمانه باقی بمانند.

چرا Encrypt کردن فایل .env همیشه راه‌حل نهایی نیست؟

Encrypt کردن Environment File می‌تواند در برخی Workflowها مفید باشد.

برای مثال Laravel از قابلیت Encryption فایل Environment نیز پشتیبانی می‌کند.

اما سؤال مهم این است:

کلید Decryption کجا نگهداری می‌شود؟

اگر فایل رمزگذاری شود ولی Key رمزگشایی کنار آن قرار داشته باشد، مزیت امنیتی محدود می‌شود.

همیشه باید چرخه کامل Secret را بررسی کرد:

Secret
↓
Encryption
↓
Encryption Key
↓
Access Policy
↓
Runtime Decryption

امنیت فقط جابه‌جایی Secret از یک فایل به فایل دیگر نیست.

دفاع چندلایه برای فایل .env

بهترین راهکار فقط یک تنظیم نیست.

امنیت واقعی از چند Layer تشکیل می‌شود.

لایه اول: فایل را در Git قرار ندهید

.gitignore را از ابتدای پروژه تنظیم کنید.

.env
.env.*
!.env.example

الگوی دقیق باید با ساختار پروژه سازگار باشد.

لایه دوم: فایل نمونه بدون Secret ایجاد کنید

.env.example باید فقط Placeholder داشته باشد.

لایه سوم: Document Root را صحیح تنظیم کنید

در Frameworkهایی که Public Directory دارند، فقط همان Directory باید از طریق وب Serve شود.

لایه چهارم: دسترسی وب‌سرور را محدود کنید

Dotfileها و Configuration Fileهای حساس باید از HTTP قابل دریافت نباشند.

لایه پنجم: Permission سیستم‌عامل را محدود کنید

فقط Processهای لازم اجازه Read داشته باشند.

لایه ششم: Environmentها را جدا کنید

Development، Staging و Production Secretهای مستقل داشته باشند.

لایه هفتم: Credential محدود ایجاد کنید

به‌جای Administrator Credential از Account اختصاصی Application استفاده کنید.

لایه هشتم: Secret Rotation داشته باشید

Credential باید قابل تعویض باشد.

لایه نهم: Secret Scanning فعال کنید

Repository و Pipeline را برای Credentialهای ناخواسته بررسی کنید.

لایه دهم: Secret Manager را برای محیط‌های حساس بررسی کنید

به‌خصوص در سیستم‌های Cloud، Container و Microservice. اگر فایل .env افشا شد چه کنیم؟

اگر فایل .env افشا شد چه کنیم؟

این بخش یکی از مهم‌ترین قسمت‌های Incident Response است.

اگر .env واقعاً یا احتمالاً در معرض فرد غیرمجاز قرار گرفته، نباید فقط فایل را مخفی و موضوع را تمام‌شده تلقی کرد.

۱. فایل را از دسترس خارج کنید

اولین اقدام مهار Exposure است.

Document Root، Web Server Rule، Repository یا Storage باید اصلاح شود.

۲. تمام Secretهای داخل فایل را شناسایی کنید

یک Inventory تهیه کنید:

Database Password
API Keys
SMTP Password
JWT Secret
Cloud Credentials
Webhook Secret
Private Keys

۳. Credentialها را اولویت‌بندی کنید

Credentialهای دارای دسترسی بالا، مالی یا Cloud اولویت بیشتری دارند.

۴. Secretهای افشاشده را Rotate یا Revoke کنید

این مهم‌ترین مرحله است.

حذف فایل باعث Invalid شدن Credential نمی‌شود.

۵. Sessionها و Tokenهای مرتبط را بررسی کنید

اگر Secret مرتبط با Signing یا Session افشا شده باشد، ممکن است نیاز به Invalid کردن Tokenها یا Sessionهای موجود باشد.

۶. Logها را بررسی کنید

باید مشخص شود:

Exposure از چه زمانی وجود داشته؟
چه درخواست‌هایی ثبت شده؟
آیا دسترسی غیرعادی دیده شده؟
Credential کجا استفاده شده؟

۷. Git History را بررسی کنید

اگر Secret وارد Repository شده است، علاوه بر Rotation می‌توان History را نیز براساس فرایند تیم پاک‌سازی کرد.

اما Rotation باید اولویت داشته باشد.

۸. Root Cause را اصلاح کنید

اگر علت:

Deployment اشتباه
Web Root اشتباه
Git Ignore ناقص
Backup ناامن
Pipeline Leak

بوده، همان فرایند باید اصلاح شود تا Incident دوباره تکرار نشود.

اشتباهات رایج در امنیت فایل .env

تصور اینکه نام فایل مخفی است

وجود نقطه در ابتدای .env آن را امن نمی‌کند.

Dotfile بودن یک Access Control نیست.

قرار دادن .env در Public Directory

این کار وابستگی امنیت را به Web Server Configuration افزایش می‌دهد.

استفاده از .gitignore بعد از Commit شدن فایل

.gitignore History قبلی را پاک نمی‌کند.

حذف Secret بدون Rotation

اگر Credential قبلاً دیده شده باشد، همچنان معتبر است.

استفاده از یک Credential برای همه محیط‌ها

این کار Impact افشا را افزایش می‌دهد.

استفاده از Admin Credential برای Application

Application معمولاً نباید Permission مدیریتی کامل داشته باشد.

ذخیره Secret در Docker Image

Image ممکن است در Registry، Cache یا سیستم‌های دیگر تکثیر شود.

قرار دادن Secret در Frontend

هر چیزی که Browser دریافت می‌کند باید در عمل قابل مشاهده در نظر گرفته شود.

Log کردن Configuration

Debugging نباید به افشای Secret منجر شود.

تصور اینکه Base64 رمزنگاری است

Base64 فقط Encoding است.

در Kubernetes نیز مستندات رسمی این موضوع را صریحاً یادآوری می‌کنند.

اشتراک‌گذاری .env از طریق پیام‌رسان

ارسال Environment File واقعی از طریق Chat، Ticket یا Email می‌تواند نسخه‌های اضافی و کنترل‌نشده ایجاد کند.

نگهداری Secret بدون Expiration

Credentialهای بسیار قدیمی که هیچ‌گاه Rotate نشده‌اند ریسک بیشتری ایجاد می‌کنند.

چک‌لیست امنیت فایل .env

برای بررسی امنیت پروژه می‌توان از این فهرست استفاده کرد:

  • آیا .env داخل Git Track نشده است؟
  • آیا .env.example فاقد Secret واقعی است؟
  • آیا .env خارج از Public Web Root قرار دارد؟
  • آیا Web Server دسترسی به فایل‌های حساس را مسدود کرده است؟
  • آیا Permission فایل محدود است؟
  • آیا Production Secret با Development متفاوت است؟
  • آیا Database User دارای Least Privilege است؟
  • آیا API Keyها Scope محدود دارند؟
  • آیا Credentialهای Cloud سطح دسترسی حداقلی دارند؟
  • آیا Secretها وارد Docker Image نشده‌اند؟
  • آیا .dockerignore بررسی شده است؟
  • آیا CI/CD Secretها را در Log چاپ نمی‌کند؟
  • آیا Artifactها حاوی .env نیستند؟
  • آیا Backupها Encrypt و محدود شده‌اند؟
  • آیا Debug در Production غیرفعال است؟
  • آیا Logها Secret را Redact می‌کنند؟
  • آیا Frontend فاقد Secret Backend است؟
  • آیا Secret Scanning فعال است؟
  • آیا Rotation Procedure وجود دارد؟
  • آیا Incident Response برای Secret Leak تعریف شده است؟
  • آیا Secret Manager برای Production بررسی شده است؟
  • آیا Kubernetes Secretها با RBAC مناسب محافظت می‌شوند؟
  • آیا Encryption at Rest برای Secrets حساس بررسی شده است؟
  • آیا افراد غیرضروری به Production Secretها دسترسی ندارند؟
  • آیا Secretهای بلااستفاده Revoked می‌شوند؟

فایل .env در معماری Zero Trust

اصل Zero Trust فقط درباره Network نیست.

در Secret Management نیز می‌توان همان منطق را اعمال کرد:

Never Trust
Always Verify
Least Privilege

اگر Service A به Secret مربوط به Service B نیاز ندارد، نباید آن را دریافت کند.

اگر Developer فقط به Development نیاز دارد، نباید Production Credential را داشته باشد.

اگر CI Job فقط Build انجام می‌دهد، نباید Deployment Secret دریافت کند.

اگر یک Application فقط Database Read نیاز دارد، نباید Write Permission داشته باشد.

هر Secret باید براساس نیاز واقعی توزیع شود.

نقش Audit در مدیریت Secretها

در سیستم‌های حرفه‌ای باید بتوان به سؤال‌های زیر پاسخ داد:

چه کسی به Secret دسترسی داشت؟
چه زمانی Secret ایجاد شد؟
چه زمانی Rotate شد؟
کدام Service از آن استفاده می‌کند؟
آخرین استفاده چه زمانی بوده؟
چه کسی Permission آن را تغییر داده؟

یک فایل .env محلی معمولاً چنین قابلیت‌هایی ندارد.

این یکی از دلایلی است که در زیرساخت‌های بزرگ استفاده از Central Secrets Management اهمیت پیدا می‌کند. چرخه عمر امن یک Secret

چرخه عمر امن یک Secret

Secret نباید فقط ایجاد و سپس فراموش شود.

یک Lifecycle مناسب می‌تواند چنین باشد:

Generate
   ↓
Store Securely
   ↓
Distribute
   ↓
Use
   ↓
Monitor
   ↓
Rotate
   ↓
Revoke
   ↓
Delete

در هر مرحله کنترل امنیتی خاصی لازم است.

Generate

Secret باید Strong و غیرقابل پیش‌بینی باشد.

Store

نباید در Source Code یا Repository عمومی قرار گیرد.

Distribute

فقط Serviceهای مجاز باید آن را دریافت کنند.

Use

Application نباید Secret را Log یا نمایش دهد.

Monitor

استفاده غیرعادی باید در صورت امکان قابل تشخیص باشد.

Rotate

Credential باید قابل جایگزینی باشد.

Revoke

نسخه قدیمی باید بی‌اعتبار شود.

Delete

Secretهای بلااستفاده نباید برای همیشه باقی بمانند.

E-E-A-T و اهمیت مستندسازی امنیت Secretها

امنیت پایدار فقط به Code محدود نیست.

یک تیم حرفه‌ای باید Procedure مشخصی برای Secret Management داشته باشد.

این Documentation می‌تواند شامل موارد زیر باشد:

مالک هر Secret
محل نگهداری
سطح دسترسی
روش Rotation
زمان انقضا
Serviceهای مصرف‌کننده
فرایند Incident Response

این اطلاعات باعث می‌شوند هنگام تغییر تیم، مهاجرت سرور یا Incident، مدیریت Credential وابسته به حافظه یک فرد نباشد.

آیا .env برای پروژه کوچک مناسب است؟

بله.

وجود .env ذاتاً اشتباه نیست.

برای پروژه کوچک یا Development Environment می‌تواند یک روش ساده و کاربردی باشد.

نکته این است که محدودیت آن شناخته شود.

برای یک پروژه ساده ممکن است ترکیب زیر کافی باشد:

.env خارج از Git
+
Document Root صحیح
+
Permission مناسب
+
Credential محدود
+
Backup امن

اما در یک سیستم بزرگ با ده‌ها Service، چند Environment و تعداد زیادی Developer، یک فایل متنی روی هر سرور مدیریت‌پذیری ضعیف‌تری خواهد داشت.

در چنین محیطی Secret Manager معمولاً انتخاب مناسب‌تری است.

آیا می‌توان .env را روی Shared Hosting امن نگه داشت؟

تا حد زیادی می‌توان ریسک را کاهش داد، اما سطح کنترل در Shared Hosting کمتر از Server اختصاصی است.

موارد مهم عبارت‌اند از:

  • قرار دادن فایل خارج از public_html در صورت پشتیبانی ساختار برنامه
  • بررسی Permission فایل
  • مسدودکردن HTTP Access
  • عدم نگهداری Backupهای حساس داخل Public Directory
  • عدم Commit فایل
  • استفاده از Credentialهای محدود
  • غیرفعال‌کردن Debug
  • بررسی پنل Hosting و Backupها

اگر Hosting اجازه جداسازی مناسب Public Root و Application Root را نمی‌دهد، این موضوع باید در Threat Model در نظر گرفته شود.

آیا WAF می‌تواند جلوی افشای .env را بگیرد؟

WAF می‌تواند به‌عنوان لایه مکمل برخی Requestهای مشکوک یا Probeهای رایج را مسدود کند.

اما WAF نباید کنترل اصلی باشد.

اگر فایل .env از طریق Web Server قابل Download باشد، مشکل اصلی Architecture و Server Configuration است.

مدل صحیح:

فایل خارج از Web Root
        +
Web Server Deny Rules
        +
WAF

نه:

فایل عمومی
+
امید به WAF

مانیتورینگ درخواست‌های مربوط به فایل‌های حساس

Web Server Log می‌تواند برای شناسایی تلاش برای دسترسی به فایل‌های حساس مفید باشد.

Apache نیز در مستندات امنیتی خود نمونه‌هایی برای بررسی درخواست‌های ردشده ارائه می‌کند و تأکید دارد Log نشان می‌دهد چه Requestهایی قبلاً اتفاق افتاده‌اند.

در محیط Production می‌توان Alertهایی برای Requestهای غیرعادی به مسیرهای Configuration تعریف کرد.

اما مشاهده چنین Requestهایی نباید باعث این تصور شود که «چون 403 برمی‌گردد، همه‌چیز امن است».

همچنان باید Root Cause و معماری Deployment بررسی شوند.

تفاوت حفاظت از .env با مخفی‌کردن .env

این دو مفهوم متفاوت‌اند.

مخفی‌کردن یعنی:

امیدوار باشیم کسی نام فایل را نداند.

حفاظت یعنی:

حتی اگر نام فایل کاملاً شناخته شده باشد،
Access Control اجازه دریافت آن را ندهد.

امنیت باید براساس مدل دوم طراحی شود.

نام .env کاملاً شناخته‌شده است و مخفی‌بودن آن هیچ Barrier امنیتی معناداری ایجاد نمی‌کند.

یک الگوی پیشنهادی برای پروژه‌های وب

برای یک وب‌اپلیکیشن معمولی می‌توان ساختاری مشابه زیر داشت:

/var/www/myapp/
│
├── .env
├── app/
├── config/
├── storage/
├── vendor/
│
└── public/
    ├── index.php
    ├── css/
    ├── js/
    └── images/

Web Server:

DocumentRoot = /var/www/myapp/public

Repository:

.env → ignored
.env.example → tracked

Production:

Real secrets
↓
Protected environment / secret store

Application:

فقط Credentialهای موردنیاز
↓
Least Privilege

Logging:

Secrets → Redacted

این الگو ساده است اما چند Trust Boundary مهم را به‌درستی جدا می‌کند.

سؤالات متداول درباره فایل .env

فایل .env چیست؟

فایل .env یک فایل Configuration است که برای تعریف Environment Variableهای برنامه استفاده می‌شود. این فایل ممکن است اطلاعات عادی یا Secretهایی مانند رمز Database و API Key را نگهداری کند.

آیا فایل .env رمزگذاری شده است؟

معمولاً خیر. در بسیاری از پروژه‌ها .env یک فایل متنی ساده است، مگر اینکه Framework یا Workflow خاصی برای Encryption آن در نظر گرفته شده باشد.

آیا فایل .env باید در GitHub قرار بگیرد؟

فایل .env واقعی که حاوی Credential و Secret است معمولاً نباید وارد Source Control شود. به‌جای آن می‌توان .env.example بدون Secret واقعی را Commit کرد.

اگر .env را بعداً به .gitignore اضافه کنیم کافی است؟

اگر فایل قبلاً Track یا Commit شده باشد خیر. .gitignore History قبلی Repository را پاک نمی‌کند.

اگر .env در GitHub قرار گرفته باشد چه کنیم؟

Credentialهای موجود در آن را در صورت احتمال Exposure افشاشده در نظر بگیرید، Secretها را Revoke یا Rotate کنید، Repository History را بررسی کنید و علت اصلی ورود فایل به Repository را برطرف کنید.

آیا حذف Repository مشکل را حل می‌کند؟

نه لزوماً. Secret ممکن است قبلاً Clone، Fork، Cache یا Backup شده باشد. Credential افشاشده باید در صورت امکان Invalid شود.

آیا .env باید داخل public_html باشد؟

در صورت امکان خیر. فایل‌های حاوی Secret بهتر است خارج از Public Web Root قرار داشته باشند.

آیا chmod 777 برای .env مناسب است؟

معمولاً خیر. فایل حساس باید براساس اصل Least Privilege فقط برای User و Processهای ضروری قابل خواندن باشد.

آیا Environment Variable از .env امن‌تر است؟

می‌تواند برخی مشکلات فایل محلی را کاهش دهد، اما Environment Variable نیز Secret Vault محسوب نمی‌شود و در بعضی محیط‌ها ممکن است از طریق Debugging، Process Inspection یا Log افشا شود.

آیا API Key را می‌توان در Frontend ENV قرار داد؟

اگر Build Tool مقدار را داخل JavaScript Browser قرار دهد، باید آن را قابل مشاهده در نظر گرفت. Secret Backend نباید در Client Bundle قرار گیرد.

آیا .env.example امن است؟

فقط زمانی که هیچ Credential واقعی داخل آن قرار نگرفته باشد. .env.example باید Placeholder و نام Variableها را نگهداری کند.

آیا Base64 برای محافظت از Secret کافی است؟

خیر. Base64 Encryption نیست و Confidentiality ایجاد نمی‌کند.

Docker Secret بهتر از قرار دادن رمز در Dockerfile است؟

در بسیاری از معماری‌ها بله، زیرا Secret در Runtime به Service مجاز ارائه می‌شود و لازم نیست داخل Image ثابت قرار گیرد.

اگر Database فقط Localhost باشد، افشای DB Password مهم است؟

بله. Credential افشاشده همچنان باید جدی گرفته شود. ممکن است همان Credential در سرویس دیگری استفاده شده باشد یا مهاجم در Incident دیگری بتواند به شبکه داخلی دسترسی پیدا کند.

آیا WAF از .env محافظت می‌کند؟

WAF فقط یک لایه مکمل است. حفاظت اصلی باید با Document Root صحیح، Web Server Configuration، Permission و Secret Management انجام شود.

هر چند وقت Secretها را Rotate کنیم؟

یک عدد ثابت برای تمام Secretها وجود ندارد. دوره Rotation باید براساس حساسیت Credential، قابلیت Provider، ریسک سیستم و Policy سازمان تعیین شود. Secret مشکوک به افشا باید بدون انتظار برای Rotation دوره‌ای بررسی و در صورت نیاز تعویض شود.

Secret Manager برای همه پروژه‌ها ضروری است؟

خیر. پروژه‌های کوچک ممکن است با .env محافظت‌شده به‌خوبی مدیریت شوند، اما با افزایش تعداد Server، Developer، Environment و Secretها استفاده از سیستم مرکزی مدیریت Secret ارزش بیشتری پیدا می‌کند.

جمع‌بندی

فایل .env یکی از ساده‌ترین و رایج‌ترین روش‌ها برای جداکردن Configuration از Source Code است، اما نباید آن را یک مکان ذاتاً امن برای نگهداری اطلاعات حساس تصور کرد. در بسیاری از پروژه‌ها .env یک فایل متنی معمولی است و امنیت آن کاملاً به نحوه ذخیره‌سازی، Deployment، Permission، Web Server، Git، Backup و فرایند مدیریت Secret بستگی دارد.

مهم‌ترین اصل این است که فایل .env واقعی نباید در Repository قرار بگیرد، نباید از طریق Public Web Root قابل دسترسی باشد و نباید بدون نیاز در Backup، Docker Image، Artifact یا Log تکثیر شود.

Secretهایی مانند Database Password، API Key، Token، Cloud Credential و Encryption Key باید براساس اصل Least Privilege مدیریت شوند. Development، Staging و Production نیز بهتر است Credentialهای مستقل داشته باشند تا افشای یک محیط به محیط دیگر سرایت نکند.

در زیرساخت‌های بزرگ‌تر، اتکا به فایل .env ساده به‌تنهایی کافی نیست. Secret Manager، Access Control، Audit، Rotation، Encryption at Rest و Secret Scanning می‌توانند کنترل‌های قدرتمندتری ایجاد کنند.

همچنین در صورت افشای .env نباید فقط فایل را حذف کرد. Secretهایی که احتمال دسترسی غیرمجاز به آن‌ها وجود داشته باید شناسایی، Revoke یا Rotate شوند و Logها، Repository History و Scope حادثه بررسی شود.

در نهایت، امنیت فایل .env بخشی از یک موضوع بزرگ‌تر به نام Secrets Management است. هدف اصلی نباید فقط پنهان‌کردن یک فایل باشد؛ هدف باید این باشد که هر Secret در تمام چرخه عمر خود، از ایجاد و ذخیره‌سازی تا استفاده، Rotation و حذف، فقط در اختیار Componentهایی قرار گیرد که واقعاً به آن نیاز دارند.

مطالب مرتبط