مدیریت Secrets (اسرار برنامه) و Azure Key Vault

مدیریت Secrets (اسرار برنامه) و Azure Key Vault

مدیریت Secrets (اسرار برنامه) و Azure Key Vault

منبع: Coding Clean, Reliable, and Safe REST APIs with ASP.NET Core 8 — Anthony Giretti

اعتبار ترجمه: ترجمه با کمک هوش مصنوعی

فصل ۹ — مدیریت Secrets (اسرار برنامه)

در طول کتاب چند نوع دادهٔ حساس استفاده شد؛ برای مثال Connection String پایگاه داده یا APM. ساده‌ترین راه ممکن این است که این مقادیر در فایل‌های Configuration محیطی مانند appsettings.json، appsettings.dev.json و appsettings.prod.json قرار گیرند و همراه Source Code وارد مخزن Git شوند. اما این روش دو مسئلهٔ جدی ایجاد می‌کند: Secretها کجا و چگونه باید امن ذخیره شوند و چگونه می‌توان آن‌ها را بدون انتشار در Source Code به‌روزرسانی کرد؟

این فصل دو موضوع را پوشش می‌دهد:

  • مقدمه‌ای بر مدیریت Application Secret
  • نمونهٔ عملی با Azure Key Vault

مقدمه‌ای بر مدیریت Secret

هر فردی که به Source Control دسترسی داشته باشد می‌تواند Secretهای محیط‌های مختلف را مشاهده کند، درحالی‌که مثلاً یک Developer یا Tester الزاماً نباید Password یا Connection String Production را بداند. این موضوع سطح حمله را افزایش می‌دهد و حتی یک عضو داخلی بدخواه نیز می‌تواند تهدید ایجاد کند.

برنامه‌ها خود یکی از نقاط ورودی حمله‌اند. اگر مهاجم به Source Code یا Configuration دسترسی پیدا کند، Secretهایی که دسترسی به Database یا Resourceهای دیگر می‌دهند خطر بسیار جدی خواهند بود. منبع برای نشان دادن اهمیت موضوع به رخداد Uber در سال ۲۰۱۶ اشاره می‌کند که در آن دسترسی غیرمجاز به Secretهای Database به افشای داده‌های میلیون‌ها حساب منجر شد.

برای کاهش چنین ریسکی، نمونهٔ فصل از Azure Key Vault استفاده می‌کند. هدف این فصل آموزش کامل Key Vault نیست، بلکه نشان دادن اصل جداسازی Secret از Source Code است. پیش‌نیاز نمونه یک Key Vault Resource، Vault URI و Azure Tenant ID است.

شکل ۹-۱ — بخش Tenant Properties در Azure Portal
شکل ۹-۲ — Tenant ID
تصویر منبع — صفحهٔ 387Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 387.

نمونه با Azure Key Vault

همان منطق را می‌توان برای Connection Stringهای Database، Application Insights یا هر Secret دیگر استفاده کرد. در Key Vault برای هر Secret یک نام و Value ساخته می‌شود؛ نمونهٔ کتاب Secretهای DemoDb1 و DemoDb2 را ایجاد می‌کند.

شکل ۹-۳ — ایجاد Secretها در Azure Key Vault

در سمت ASP.NET Core دو Package نصب می‌شوند:

  • Azure.Extensions.AspNetCore.Configuration.Secrets: برای وارد کردن Secretهای Azure Key Vault به Configuration برنامه.
  • Azure.Identity: برای Authentication به Azure بدون قراردادن Username/Password مخصوص Key Vault در Source Code و استفاده از Credentialهای محیط توسعه.
تصویر منبع — صفحهٔ 388Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 388.

Authentication محیط توسعه

در محیط Development، کاربر Visual Studio با همان Microsoft Account مرتبط با Azure احراز هویت می‌شود. DefaultAzureCredential می‌تواند این هویت را در زنجیرهٔ Credentialهای خود استفاده کند.

شکل ۹-۴ — ورود به Microsoft Account از Visual Studio

برای نمونهٔ کتاب Tenant ID به‌صورت Environment Variable با نام AZURE_TENANT_ID در Debug Settings پروژه قرار می‌گیرد.

شکل ۹-۵ — تنظیم Environment Variable با نام AZURE_TENANT_ID
تصویر منبع — صفحهٔ 389Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 389.

قرار دادن Vault URI در Configuration

Connection Stringهایی که باید محافظت شوند از appsettings.json حذف می‌شوند. فقط URI خود Key Vault باقی می‌ماند، چون Secret محسوب نمی‌شود:

"KeyVault": {
      "Uri": "{YourKeyvaultUri}"
    }
Listing 9-1 — Configuration مربوط به Azure Key Vault

در صورت تمایل می‌توان حتی این تنظیم را با قابلیت Manage User Secrets از فایل اصلی خارج کرد. Visual Studio در این حالت یک secrets.json محلی می‌سازد. هنگام اجرای پروژه، User Secrets به‌صورت شفاف با Configuration برنامه Merge می‌شود، اما فایل روی ماشین توسعه‌دهنده باقی می‌ماند و نباید به Repository Commit شود.

شکل ۹-۶ — گزینهٔ Manage User Secrets در Visual Studio
شکل ۹-۷ — فایل secrets.json
تصویر منبع — صفحهٔ 391Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 391.

افزودن Key Vault به Configuration

در Program.cs ابتدا Vault URI خوانده، سپس Key Vault به Configuration اضافه و در پایان Secretها دقیقاً مانند دیگر مقادیر Configuration خوانده می‌شوند.

var builder = WebApplication.CreateBuilder(args);

    ...

    var keyVaultUri = builder.Configuration.GetValue<string>("KeyVault:Uri");
    builder.Configuration.AddAzureKeyVault(new Uri(keyVaultUri),
    new DefaultAzureCredential());
    var dbConnection1 = builder.Configuration.GetValue<string>("DemoDb1");
    var dbConnection2 = builder.Configuration.GetValue<string>("DemoDb2");

    ...

    var app = builder.Build();

    ...

    app.Run();

DefaultAzureCredential در محیط Development از هویتی مانند Microsoft Account واردشده در Visual Studio استفاده می‌کند. در Production سازوکار Credential متفاوت است و معمولاً Cloud Architect یا DevOps یک Service Identity مناسب برای Workload ایجاد می‌کند؛ در نتیجه Password توسعه‌دهنده وارد Production نمی‌شود.

پس از اضافه شدن Provider، Secret با builder.Configuration.GetValue<T>("YourKey") خوانده می‌شود. نام Key باید با Secret ثبت‌شده در Vault مطابقت داشته باشد.

شکل ۹-۸ — بازیابی Secretها از Azure Key Vault
تصویر منبع — صفحهٔ 392Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 392.

جمع‌بندی فصل

مدیریت ضعیف Secret می‌تواند امنیت کل سامانه را تضعیف کند. Connection String، Password و Credential نباید صرفاً برای راحتی در Source Code یا Repository ذخیره شوند. Azure Key Vault یک نمونه از Secret Store خارجی است؛ در Cloudهای دیگر نیز سرویس‌های مشابه، از جمله AWS Key Management Service، وجود دارند. فصل بعد به جنبهٔ دیگری از امنیت برنامه یعنی Authentication و Authorization می‌پردازد.

تصاویر منبع مرتبط با این بخش

تصویر منبع — صفحهٔ 385Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 385.
تصویر منبع — صفحهٔ 386Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 386.
تصویر منبع — صفحهٔ 390Visual واقعی استخراج‌شده از PDF، مربوط به صفحهٔ 390.

منبع: Coding Clean, Reliable, and Safe REST APIs with ASP.NET Core 8 — Anthony Giretti.

فروش یا انتشار این ترجمه منوط به داشتن مجوز لازم از صاحب حقوق اثر است.

امتیاز کاربران به این مقاله

☆☆☆☆☆

0 نفر امتیاز داده اند. میانگین: 0.0 از 5

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

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

0 / 500

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620