مدل امنیتی سنتی که بر این فرض استوار بود که شبکههای داخلی امن و شبکههای خارجی خصمانه هستند، مدتهاست که فرو ریخته است. در عصر معماریهای بومی ابری، میکروسرویسها در ابرهای عمومی، مراکز داده در محل و مکانهای لبه توزیع شدهاند و محیطی پیچیده و سیال ایجاد کردهاند که در آن مفهوم «شبکه» منسوخ شده است. برای توسعهدهندگان متوسط تا پیشرفته، چالش دیگر تنها ایمنسازی یک مرز نیست، بلکه ایمنسازی بارهای کاری فردی است. اینجاست که پیادهسازی دسترسی شبکه با اعتماد صفر (ZTNA) بر اساس الگوهای BeyondCorp گوگل حیاتی میشود.
چرا میکروسرویسها به رویکرد اعتماد صفر نیاز دارند
معماریهای میکروسرویس گسترش قابل توجهی در سطح حمله ایجاد میکنند. با وجود صدها سرویس که از طریق یک شبکه API با یکدیگر ارتباط برقرار میکنند، حرکت جانبی به یک عامل تهدید اصلی تبدیل شده است. اگر مهاجمی یک پاد واحد در خوشه کوبرنیتس را به خطر بیندازد، بخشبندی سنتی شبکه اغلب در توقف حرکت آنها به سمت سایر سرویسها شکست میخورد. فلسفه BeyondCorp داستان را برعکس میکند: این فرض را دارد که هیچ شبکهای به طور پیشفرض قابل اعتماد نیست. در عوض، دسترسی بر اساس هر جلسه اعطا میشود و به شدت به کاربر، دستگاه و زمینه درخواست گره خورده است.
برای میکروسرویسها، این بدان معناست که ترافیک داخلی بین سرویسها باید با همان سطح بازرسی که برای ترافیک API خارجی وجود دارد، مورد توجه قرار گیرد. ما از لیستهای مجاز مبتنی بر IP به کنترل دسترسی مبتنی بر هویت حرکت میکنیم، به طوری که حتی اگر درخواستی از داخل VPC منشأ گرفته باشد، باید قبل از رسیدن به سرویس مقصد، احراز هویت و مجوزدهی شود.
الگوی پراکسی آگاه از هویت
ستون فقرات پیادهسازی ZTNA در محیط میکروسرویسها، پراکسی آگاه از هویت (IAP) است. به جای قرار دادن مستقیم سرویسها در معرض شبکه، هر درخواست از یک نقطه تصمیمگیری سیاست عبور میکند که هویت کاربر و وضعیت دستگاه را قبل از انتقال ترافیک تأیید میکند. این کار به طور موثر یک تونل امن بین کاربر و میکروسرویس خاص ایجاد میکند و نیاز به قرار دادن IP عمومی را دور میزند.
در عمل، این شامل استقرار یک پراکسی جانبی (sidecar) یا کنترلگر ورودی است که تمام ترافیک ورودی و خروجی را رهگیری میکند. این جزء به عنوان نگهبان عمل کرده، توکنها را اعتبارسنجی میکند و سیاستهایی را که توسط سیستم مدیریت هویت و دسترسی (IAM) تعریف شدهاند، اعمال میکند.
پیکربندی نقطه اعمال سیاست
بیایید به یک مثال عملی از نحوه اعمال این منطق با استفاده از یک پیکربندی عمومی برای OPA (عامل سیاست باز) یا یک پراکسی جانبی مشابه در محیط کوبرنیتس نگاه کنیم. سیاست باید نه تنها «چه کسی» درخواست میدهد، بلکه «چه زمینهای» وجود دارد را ارزیابی کند.
# policy.rego نمونه برای OPA
package kubernetes.authz
import data.users
default allow = false
allow {
input.request.user == "admin@example.com"
input.request.method == "GET"
input.resource.type == "pod"
input.resource.namespace == "production"
users["admin@example.com"].verified == true
users["admin@example.com"].device_compliant == true
}
allow {
input.request.user == "developer@example.com"
input.request.method == "GET"
input.resource.type == "pod"
input.resource.namespace == "development"
users["developer@example.com"].verified == true
}
این سیاست Rego دقت مورد نیاز را نشان میدهد. حتی اگر کاربری احراز هویت شده باشد، نمیتواند به فضای نام «production» دسترسی داشته باشد مگر اینکه دستگاه او به عنوان مطابقتدار علامتگذاری شده باشد و هویت خاص او تأیید شود. این کاملاً با اصل BeyondCorp همخوانی دارد که در آن اعتماد هرگز ضمنی نیست.
پیادهسازی احراز هویت سرویس به سرویس
ZTNA فقط برای کاربران انسانی نیست؛ برای ارتباطات سرویس به سرویس نیز به همان اندازه حیاتی است. در مدل BeyondCorp، سرویسها به عنوان موجوداتی عمل میکنند که باید هویت خود را به یکدیگر اثبات کنند. این معمولاً با استفاده از TLS متقابل (mTLS) یا JWT (توکن وب JSON) که توسط یک مرجع اعتماد مرکزی صادر شده است، محقق میشود.
وقتی سرویس A به سرویس B درخواست میدهد، درخواست باید شامل یک توکن امضای رمزنگاری شده باشد که سرویس B میتواند آن را در برابر یک مخزن کلید قابل اعتماد اعتبارسنجی کند. این کار از یک سرویس به خطر افتاده که خود را به جای دیگری جا میزند، جلوگیری میکند. ابزارهایی مانند Istio یا Linkerd دستتکانهای mTLS را خودکار میکنند و اطمینان حاصل میکنند که فقط سرویسهایی با گواهیهای معتبر میتوانند ارتباطات را برقرار کنند.
پیادهسازی سمت کلاینت را در یک میکروسرویس مبتنی بر Go که نیاز به mTLS دارد در نظر بگیرید:
// client.go - ایجاد اتصال امن mTLS
import (
"crypto/tls"
"crypto/x509"
"net/http"
)
func createSecureClient(certPath, keyPath, caPath string) (*http.Client, error) {
cert, err := tls.LoadX509KeyPair(certPath, keyPath)
if err != nil {
return nil, err
}
caCert, err := ioutil.ReadFile(caPath)
if err != nil {
return nil, err
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: caCertPool,
MinVersion: tls.VersionTLS13,
}
return &http.Client{
Transport: &http.Transport{
TLSClientConfig: tlsConfig,
},
}, nil
}
این قطعه کد اجبار فنی اعتماد را نشان میدهد. با بارگذاری گواهیهای خاص و الزام TLS 1.3، اطمینان حاصل میکنیم که ارتباط رمزگذاری شده است و هویت هر دو طرف قبل از تبادل هر دادهای تأیید میشود.
چالشها و بهترین شیوهها
گذار به یک مدل ZTNA برای میکروسرویسها بدون چالش نیست. بار عملکرد ناشی از اعتبارسنجی توکن و رمزنگاری میتواند بر تأخیر تأثیر بگذارد، اگرچه شتابدهندههای سختافزاری مدرن و استراتژیهای کشینگ کارآمد این موضوع را کاهش میدهند. علاوه بر این، پیچیدگی عملیاتی مدیریت هویتها برای هر دو انسان و ماشین میتواند قابل توجه باشد.
برای موفقیت، توسعهدهندگان باید ذهنیت «شکست امن» را اتخاذ کنند. اگر بررسی سیاست نمیتواند تکمیل شود، دسترسی باید رد شود، نه مجاز شود. علاوه بر این، نظارت و ثبت مداوم تمام تلاشهای دسترسی ضروری است. شما باید بدانید چه کسی، چه چیزی، چه زمانی و از کدام دستگاه دسترسی داشته است که امکان تشخیص سریع ناهنجاری را فراهم میکند.
نتیجهگیری
ایمنسازی میکروسرویسها در دنیای بومی ابری نیازمند تغییر بنیادین در دیدگاه است. با اتخاذ الگوهای BeyondCorp و پیادهسازی دسترسی شبکه با اعتماد صفر، سازمانها میتوانند از مرزهای شبکه شکننده فراتر رفته و به یک مدل امنیتی قوی و مبتنی بر هویت حرکت کنند. این رویکرد تضمین میکند که هر درخواست، چه از لپتاپ یک توسعهدهنده و چه از یک خط لوله خودکار، قبل از اعطای دسترسی به منابع حساس، به دقت بررسی شود. با ادامه رشد سطح حمله، ZTNA نه تنها یک بهترین شیوه، بلکه تنها مسیر قابل اجرا برای امنیت برنامههای مقاوم است.