Application Security

تقویت شبکه مش: پیاده‌سازی معماری اعتماد صفر در ارتباطات میکروسرویس

مدل امنیتی سنتی مبتنی بر محیط پیرامونی (Perimeter) منسوخ شده است. در یک معماری میکروسرویس توزیع‌شده، سرویس‌ها از طریق شبکه‌های داخلی ارتباط برقرار می‌کنند که دیگر صرفاً به دلیل قرارگیری در یک دیتاسنتر یا VPC ابری «قابل اعتماد» نیستند. ظهور تهدیدات پیچیده، از جمله حرکت جانبی مهاجمان و تهدیدات داخلی، نیازمند تغییر بنیادین در نحوه امنیت‌بخشی به ارتباطات بین سرویس‌ها است. اینجاست که معماری اعتماد صفر (ZTA) نه تنها یک واژهٔ تبلیغاتی، بلکه یک الزام مهندسی حیاتی می‌شود.

اعتماد صفر بر این اصل استوار است: «هرگز اعتماد نکنید، همیشه تأیید کنید.» برای میکروسرویس‌ها، این بدان معناست که هر درخواست، صرف‌نظر از مبدأ، باید احراز هویت، مجاز‌سازی و رمزنگاری شود. در این مطلب، بررسی خواهیم کرد که چگونه می‌توان این پارادایم را با استفاده از امنیت لایه انتقال متقابل (mTLS) و چارچوب‌های هویتی مانند SPIFFE (هویت Spiffe برای سازمان‌های فدرال لبه‌ای) پیاده‌سازی کرد.

مشکل اعتماد ضمنی

در گذشته، توسعه‌دهندگان فرض می‌کردند که ترافیک بین سرویس‌های درون یک خوشه (Cluster) ایمن است. این اعتماد ضمنی به مهاجمی که یکی از سرویس‌ها را نفوذ کرده است، اجازه می‌دهد با کمترین اصطکاک به صورت جانبی به سایر سرویس‌ها دسترسی پیدا کند. بدون ZTA، شما عملاً خانه‌ای را می‌سازید که درِ ورودی محکمی دارد اما قفلی برای اتاق‌های داخلی آن وجود ندارد.

پیاده‌سازی اعتماد صفر نیازمند حرکت از کنترل‌های مبتنی بر شبکه به کنترل‌های مبتنی بر هویت است. هر سرویس باید یک هویت منحصر‌به‌فرد و به‌صورت رمزنگاری‌شده قابل تأیید داشته باشد و هر کانال ارتباطی باید سیاست‌های دسترسی سخت‌گیرانه‌ای را بر اساس این هویت‌ها اعمال کند.

اجزای اصلی: SPIFFE و mTLS

برای عملیاتی‌سازی اعتماد صفر، ما به دو فناوری کلیدی تکیه می‌کنیم:

  1. SPIFFE/SPIRE: SPIFFE استانداردی برای مشخص‌سازی هویت‌ها فراهم می‌کند و SPIRE سیستم زمان اجرا (Runtime) است که این هویت‌ها را از طریق گواهی‌نامه‌های X.509 صادر می‌کند.
  2. mTLS: برخلاف TLS استاندارد که در آن فقط سرور هویت خود را اثبات می‌کند، mTLS نیاز دارد که هم کلاینت و هم سرور گواهی‌نامه ارائه دهند، که تضمین می‌کند هر دو طرف موجودیت‌های مشروع هستند.

با یکپارچه‌سازی SPIRE با یک شبکه مش (Service Mesh) مانند Istio یا Linkerd، می‌توانیم صدور و چرخش گواهی‌نامه‌ها را خودکار کنیم. این کار بار کاری دستی مدیریت گواهی‌نامه‌های SSL/TLS را حذف می‌کند و در عین حال تضمین می‌کند که هویت سرویس‌ها کوتاه‌مدت و قابل لغو باشند.

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

بیایید به یک مثال عملی از نحوه پیکربندی یک عامل SPIRE پایه بپردازیم که برای تأیید هویت یک سرویس عمل می‌کند. این پیکربندی به عامل SPIRE می‌گوید که کدام بار کاری (سرویس) را قابل اعتماد بداند و چه مخاطبی (شبکه مش) هویت حاصل باید داشته باشد.

# spire-server.conf
server {
  bind_address = "0.0.0.0"
  bind_port = "8081"
  data_dir = "/run/spire/data"
  log_level = "DEBUG"
  trust_domain = "example.org"
}

# Define the plugin for the workload
plugins {
  NodeAttestor "k8s_psat" {
    plugin_data {
      cluster = "my-k8s-cluster"
    }
  }

  KeyManager "disk" {
    plugin_data {
      keys_path = "/run/spire/data/keys.json"
    }
  }

  WorkloadAttestor "k8s" {
    plugin_data {
      # Skip Kubernetes token verification for simplicity in dev
      skip_k8s_server_tls_verify = true
    }
  }
}

# Define the policy for the specific microservice
authority {
  # Allow the "payment-service" to attest
  selector "k8s:pod-ns:payment"
  selector "k8s:pod-name:payment-service"
}

در این پیکربندی، دستورات selector مشخص می‌کنند که کدام پاد‌های (Pods) کوبرنِتس مجاز به ثبت‌نام با سرور SPIRE هستند. این امر تضمین می‌کند که تنها پاد payment-service اصیل می‌تواند هویت رمزنگاری‌شده لازم برای ارتباط با سایر سرویس‌ها را دریافت کند.

اعمال سیاست‌های مجاز‌سازی

پس از ایجاد هویت‌ها، مرحله بعدی مجاز‌سازی است. اعتماد صفر نه تنها تأیید می‌کند که شما کیستید، بلکه تأیید می‌کند که چه کاری مجاز به انجام آن هستید. این موضوع معمولاً توسط پراکسی‌های سایدکار (Sidecar) شبکه مش (مانند Envoy) مدیریت می‌شود.

برای مثال، در یک شبکه مش Istio، می‌توانید یک AuthorizationPolicy را برای محدود کردن دسترسی تعریف کنید. فرض کنید frontend-service مجاز به تماس مستقیم با internal-logging-service نیست. می‌توانید این موضوع را با نوشتن سیاست YAML زیر اعمال کنید:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-frontend-to-logging
  namespace: default
spec:
  selector:
    matchLabels:
      app: internal-logging-service
  action: DENY
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/frontend-service"]

این سیاست به صراحت هر درخواستی که از هویت frontend-service سرچشمه می‌گیرد را به internal-logging-service رد می‌کند، حتی اگر مسیر شبکه باز باشد. این کنترل دانه‌ای (Granular) ویژگی بارز یک پیاده‌سازی اعتماد صفر است.

نتیجه‌گیری

پیاده‌سازی اعتماد صفر در ارتباطات میکروسرویس یک پروژه یک‌باره نیست، بلکه فرآیندی مستمر برای استحکام‌بخشی به وضعیت امنیتی شماست. با اتخاذ استانداردهایی مانند SPIFFE و بهره‌گیری از TLS متقابل، سازمان‌ها می‌توانند فرضیات اعتماد ضمنی را حذف کنند و به‌طور قابل‌توجهی دامنه تخریب (Blast Radius) نقض‌های احتمالی را کاهش دهند.

برای توسعه‌دهندگان متوسط و پیشرفته، چالش در تعادل بین امنیت، قابلیت مشاهده (Observability) و عملکرد نهفته است. با این حال، منافع بلندمدت از نظر تاب‌آوری، انطباق و اعتماد در سیستم‌های توزیع‌شده، بسیار فراتر از هزینه‌های اولیه پیاده‌سازی است. با مقیاس کوچک شروع کنید، مدیریت هویت را خودکار کنید و سیاست‌های مجاز‌سازی خود را به دقت آزمایش کنید تا یک اکوسیستم میکروسرویس واقعاً امن بسازید.

Share: