قبل از هر چیزی بهتر است تعریفی از app secret ها داشته باشم. به اطلاعات حساسی اطلاق میشود که شما در پیکربندی های برنامه از آن استفاده میکنید، مانند Public Key جهت رمزنگاری ها، یا Connect Strings جهت اتصال به بانک های اطلاعاتی.
یک نمونه از App Secrets در فایل appsettings.jspn:
{
"ConnectionStrings": {
"DefaultConnection": "Server=myServer;Database=myDB;User Id=myUser;Password=myPassword;"
}
}
ذخیره سازی بصورت App Secrets در محیط توسعه با چالشهای متعددی روبرو است که در صورت عدم توجه کافی، میتواند منجر به آسیبپذیریهای امنیتی شود. برخی از این چالشها عبارتند از:
www.yoursite.com/appsettings.json
ذخیره سازی درBackend-Source : قرار دادن مستقیم در کد منبع برنامه، حتی خطرناکتر از ذخیره سازی در فایلهای پیکربندی است. این روش نه تنها App Secrets را در معرض دید قرار میدهد، بلکه ردیابی و مدیریت آنها را نیز دشوار میسازد.
نمونه از تفکیک محیط توسعه در appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft": "Warning"
}
}
}
نمونه از تفکیک محیط پروژه در appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Default": "Error",
"Microsoft": "Error"
}
}
}
و پیاده سازی این تفکیک ها در program.cs:
public class Startup
{
private readonly IWebHostEnvironment _env;
public Startup(IWebHostEnvironment env)
{
_env = env;
}
public void ConfigureServices(IServiceCollection services)
{
if (_env.IsDevelopment())
{
services.AddDbContext(options =>
options.UseSqlite("Data Source=local.db"));
}
else if (_env.IsProduction())
{
services.AddDbContext(options =>
options.UseSqlServer("Server=prodServer;Database=prodDB;User Id=admin;Password=strongpassword;"));
}
}
}
راهکارهای امن ذخیره سازی App Secrets برنامه در محیط توسعه ASP.NET Core
خوشبختانه، ASP.NET Core ابزارها و مکانیسمهای قدرتمندی را برای مدیریت امن App Secrets برنامه در محیط توسعه فراهم کرده است. در ادامه به بررسی این راهکارها میپردازیم:
1. ابزار User Secrets
ابزار User Secrets، که به طور خاص برای محیط توسعه طراحی شده است، یک راه حل امن و کارآمد برای ذخیره سازی App Secrets برنامه به صورت محلی در دستگاه توسعه دهنده ارائه میدهد.
نحوه عملکرد:
مزایای استفاده از User Secrets:
نحوه استفاده از User Secrets:
net8.0
enable
enable
your-unique-secret-id
dotnet user-secrets set "Authentication:Jwt:SecretKey" "your-secret-key-here"
لیست کردن تمام App Secrets:
dotnet user-secrets list
حذف یک کلید امینتی:
dotnet user-secrets remove "Authentication:Jwt:SecretKey"
پاک کردن تمام App Secrets:
dotnet user-secrets clear
public class MyService
{
private readonly IConfiguration _configuration;
public MyService(IConfiguration configuration)
{
_configuration = configuration;
}
public string GetSecretKey()
{
return _configuration["Authentication:Jwt:SecretKey"];
}
}
2. متغیرهای محیطی (Environment Variables)
متغیرهای محیطی یک روش استاندارد برای پیکربندی برنامهها در سیستم عاملهای مختلف هستند. در محیط توسعه ASP.NET Core نیز میتوان از متغیرهای محیطی برای ذخیره سازی App Secrets برنامه استفاده کرد.
نحوه عملکرد:
مزایای استفاده از متغیرهای محیطی:
معایب استفاده از متغیرهای محیطی برای App Secrets:
نحوه استفاده از متغیرهای محیطی:
export Authentication__Jwt__SecretKey="your-secret-key-here"
نکته: توجه داشته باشید که کاراکتر : در نام کلیدهای پیکربندی ASP.NET Core باید با __ (دو خط زیر) در نام متغیرهای محیطی جایگزین شود.
public class MyService
{
private readonly IConfiguration _configuration;
public MyService(IConfiguration configuration)
{
_configuration = configuration;
}
public string GetSecretKeyFromEnvironment()
{
return _configuration["Authentication:Jwt:SecretKey"];
}
}
3. Azure Key Vault (برای سناریوهای تیمی و پیشرفته)
اگر در یک محیط تیمی کار میکنید یا نیاز به مدیریت امنتر و متمرکزتر App Secrets در محیط توسعه دارید، Azure Key Vault یک گزینه قدرتمند است.
نحوه عملکرد:
مزایای استفاده از Azure Key Vault در توسعه:
معایب استفاده از Azure Key Vault در توسعه:
نحوه استفاده از Azure Key Vault در توسعه:
using Azure.Identity;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var settings = config.Build();
if (hostingContext.HostingEnvironment.IsDevelopment())
{
config.AddAzureKeyVault(
new Uri($"https://{settings["KeyVault:VaultName"]}.vault.azure.net/"),
new DefaultAzureCredential());
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});
}
در این مثال، KeyVault:VaultName باید در appsettings.json یا از طریق متغیرهای محیطی تنظیم شود. DefaultAzureCredential به طور خودکار سعی میکند تا با استفاده از روشهای مختلف (مانند ورود به Visual Studio، Azure CLI و غیره) احراز هویت کند. برای سناریوهای تیمی، استفاده از یک Application ثبت شده و ClientSecretCredential یا ManagedIdentityCredential توصیه میشود.
4. فایلهای پیکربندی مخصوص محیط توسعه (appsettings.Development.json)
ASP.NET Core امکان استفاده از فایلهای پیکربندی مخصوص محیط را فراهم میکند. فایل appsettings.Development.json به طور خودکار در محیط توسعه بارگیری میشود و میتواند تنظیمات خاص این محیط، از جمله App Secrets (با احتیاط)، را در خود جای دهد.
نحوه عملکرد:
مزایای استفاده از appsettings.Development.json:
معایب استفاده از appsettings.Development.json برای App Secrets:
توصیه: از appsettings.Development.json بیشتر برای تنظیمات غیرحساس مخصوص محیط توسعه مانند لاگینگ دقیقتر یا آدرسهای سرویسهای محلی استفاده کنید. برای App Secrets، از User Secrets یا Azure Key Vault استفاده کنید.
بهترین روش ها برای مدیریت امن App Secrets در توسعه
علاوه بر انتخاب روش مناسب برای ذخیره سازی، رعایت بهترین روش های زیر نیز برای مدیریت امن App Secrets برنامه در محیط توسعه ضروری است:
ملاحظات امنیتی تکمیلی
جمع بندی
مدیریت امن App Secrets برنامه در محیط توسعه ASP.NET Core یک جنبه حیاتی از فرآیند توسعه نرمافزار است. استفاده از ابزار User Secrets به عنوان یک راه حل ساده و امن برای توسعه محلی توصیه میشود.
جهت کسب اطلاعات بیشتر شما را دعوت به مطالعه مقاله ماکروسافت میکنم:
https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-7.0&tabs=windows
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.