ایمن سازی رشته های اتصال در SQL Server 2008
حفاظت از منابع اطلاعات یکی از مهمترین اهداف در ایمن سازی یک برنامه است. اگر رشته اتصال ایمن نشده باشد، پتانسیل آسیب پذیری ایجاد می کند.
ایمن سازی رشته های اتصال
حفاظت از منابع اطلاعات یکی از مهمترین اهداف در ایمن سازی یک برنامه است. اگر رشته اتصال ایمن نشده باشد، پتانسیل آسیب پذیری ایجاد می کند. ذخیره رشته اتصال به صورت plain text یا باقیماندن آن در حافظه تمام سیستم شما را به خطر می اندازد. رشته های اتصال قرارگرفته در کد source شما با استفاده ازMSIL Disassembler (Ildasm.exe)۱ که جهت مشاهده زبان واسط مایکروسافت(Microsoft intermediate language (MSIL)) در یک compiled assembly استفاده می شود، قابل خواندن است.
اجتناب از آسیب پذیری های امنیتی
آسیب پذیری های امنیتی ناشی از رشته های اتصال برپایه نوع authentication مورد استفاده، اینکه چگونه در حافظه ذخیره شده اند و روشی که در جهت construct آنها در زمان اجرا به کار رفته است، رخ می دهند.
استفاده از Windows Authentication
جهت محدودسازی دسترسی به منابع داده، شما می بایست اطلاعات اتصال را همجون نام کاربری، کلمه عبور و نام منبع داده را امن نمایید، توصیه ما این است که تا جایی که ممکن است از Windows authentication( گاهی منظور از آن Integrated Security است.) استفاده نمایید. Windows authentication در یک رشته اتصال با استفاده از کلمات کلیدی Integrated Security یا Trusted_Connection تعیین می شود، که بدین ترتیب نیاز به استفاده از نام کاربری و کلمه عبور را برطرف می کند. هنگام استفاده از Windows Authentication، کاربران توسط ویندوز authenticate شده و به سرور و منابع داده تعیین شده با دادن مجوز به کاربران و گروه های ویندوز ، دسترسی پیدا می کنند.
در موقعیتی هایی که استفاده از Windows authentication امکانپذیر نیست، می بایست دقت بسیار بیشتری به خرج بدهید چراکه مشخصات هویتی کاربران در رشته اتصال ظاهر می شود. در برنامه های ASP.NET، می توانید یک حساب ویندوز را به عنوان هویت ثابت جهت ارتباط به پایگاه داده و سایر منابع شبکه پیکربندی کنید. شما imperdonation را در عنصر هویتی در فایل Web.config فعال می کنید و یک نام کاربری و رمز عبور تعیین می نمایید.
حساب هویتی ثابت بهتر است یک حساب low-privilege باشد که تنها مجوزهای ضروری به پایگاه داده به آن داده شده باشد. بعلاوه بهتر است فایل پیکربندی را encrypt نمایید تا نام کاربری و رمز عبور به صورت clear text نمایش داده نشوند.
از UDLها استفاده ننمایید
از ذخیره کردن رشته های اتصال مربوط به یک OleDbConnection۲ در یک فایل Universal Data Link (UDL) پرهیز نمایید. UDLها به صورت clear text ذخیره شده اند و امکان encrypt شدن ندارند. یک فایل UDL یک منبع external file-based در برنامه شماست، آن را نمی توان با استفاده از .NET Framework ایمن یا encrypt کرد.
جلوگیری از حملات Injection رشته اتصال
یک حمله injection رشته اتصال، زمانی که یک dynamic string concatenation جهت ایجاد رشته های اتصال بر پایه ورودی کاربر استفاده می شود، رخ می دهد. اگر ورودی های کاربر معتبر نباشند و از متن یا کارکترهای malicious استفاده شده باشند، نفوذگر به صورت بالقوه می تواند به داده ها یا دیگر منابع روی سرور دسترسی پیدا کند. جهت تصحیح این مشکل، ADO.NET2.0، کلاس های جدید سازنده رشته های اتصال را معرفی می کند تا syntax رشته اتصال را validate نموده و مطمئن شود که پارامترهای اضافی معرفی نشده اند. برای اطلاعات بیشتر این لینک را ملاحظه فرمایید: Building Connection Strings۳.
استفاده از پیش فرض جهت Persist Security info
استفاده از مقادیر پیش فرض جهت Persist Security info نادرست است، ما توصیه می کنیم این مقادیر پیش فرض را برای تمامی رشته های اتصال استفاده نمایید. تنظیم Persist Security info بر روی true یا yes امکان بدست آوردن اطلاعات حساس امنیتی (که شامل نام کاربری و کلمه عبور می شوند) از یک connection، پس از اینکه آن باز شده باشد را امکانپذیر می کند. وقتی Persist Security info بر روی false یا no تنظیم شده اند، اطلاعات امنیتی پس از اینکه جهت باز کردن connection استفاده شد، جهت اطمینان از اینکه یک منبع غیرقابل اطمینان به اطلاعات حساس امنیتی دسترسی نداشته باشد، کنار گذاشته می شود.
ذخیره رشته های اتصال در فایل های Configuration
همچنین شما می توانید رشته های اتصال را در فایل های configuration قرار دهید که ممکن است نیاز به قراردادن آنها در کد برنامه تان نباشد. فایل های configuration فایل های استاندارد XML هستند که دات نت فریم ورک برای آنها مجموعه مشترکی از عناصر را تعریف کرده است. رشته اتصال در فایل های configuration به صورت معمول در عنصر <connectionStrings> در فایل app.config در خصوص برنامه های ویندوز یا فایل web.config در خصوص یک برنامه ASP.NET ذخیره می شود. برای اطلاعات بیشتر در خصوص اصول ذخیره و بازیابی رشته های اتصال در فایل های configuration، Working with Connection Strings۴ را ملاحظه فرمایید.
Encrypt کردن بخش های فایل configuration با استفاده از Protected Configuration
ASP.NET2.0 قابلیتی را ارائه می کند که به protected configuration معروف است. این قابلیت به شما امکان می دهد تا اطلاعات حساس در فایل configuration را encrypt کنید. اگرچه در درجه اول برای زبان asp.net طراحی شده است با این حال protected configuration جهت encrypt بخش های فایل configuration در برنامه های ویندوز نیز می تواند استفاده شود. جهت توصیف دقیق تری از قابلیت های جدید protected configuration،
Encrypting Configuration Information Using Protected Configuration۵ را ملاحظه فرمایید.
تجزیه فایل configuration زیر، بخش connectionStrings را پس از اینکه encrypt شده است، نشان می دهد. configProtectionProvider تعیین کننده protected configuration provider به کار رفته جهت encrypt و decrypt رشته های اتصال می باشد. بخش EncryptedData شامل متن رمز شده می باشد.
وقتی رشته اتصال encryptشده در زمان اجرا بازیابی می شود، .NET Framework، provider تعیین شده جهت decrypt کردن CipherValue را به کار می برد و آن را برای برنامه شما قابل دسترس می نماید. شما نیازی به نوشتن کدهای اضافه جهت مدیریت پروسه decryption ندارید.
Protected Configuration providers
Protected configuration providers در بخش configProtectedData فایل machine.config در سیستم محلی ثبت شده اند. چنانچه در فایل تجزیه شده زیر قایل مشاهده است، دو بخش protected configuration providers تهیه شده توسط .NET Framework دیده می شوند. مقادیر نمایش داده شده در اینجا به جهت قابل خواندن بودن، کوتاه شده اند.
شما می توانید protected configuration providerهای اضافی را با افزودن آنها در فایل machine.config پیکربندی نمایید. همچنین شما می توانید protected configuration provider خود را با استفاده از inheriting از ProtectedConfigurationProvider6 abstract base class ایجاد نمایید. جدول زیر دو فایل پیکربندی موجود در .NET Framework را تشریح می کند.
Provider | شرح |
RSAProtectedConfigurationProvider۷ | از الگوریتم RSA encryption جهت encrypt و decrypt داده استفاده می نماید. الگوریتم RSA جهت هردوی public key encryption و digital signatures می تواند مورد استفاده قرار گیرد. آن همچنین با عنوان “public key” یا encryption نامتقارن شناخته شده است چرا که دو کلید متفاوت را به کار می گیرد. شما می توانید از ASP.NET IIS Registration Tool (Aspnet_regiis.exe)۸ جهت encrypt بخش های فایل Web.config و مدیریت encryption keyها استفاده نمایید. ASP.NET فایل configuration را در هنگام پردازش فایل encrypt می کند. identity برنامه های ASP.NET می بایسست دسترسی read به encryption key که جهت encrypt و decrypt بخش های encrypt شده استفاده می شود، داشته باشد. |
DPAPIProtectedConfigurationProvider۹ | جهت encrypt بخش های configuration از Windows Data Protection API (DPAPI) استفاده می نماید. همچنین از Windows built-in cryptographic services استفاده می نماید و می تواند به منظور هردو حفاظت machine-specific و user-account-specific پیکربندی شود. حفاظت Machine-specific جهت چندین برنامه بر روی یک سرور که نیاز به اشتراک گذاری اطلاعات دارند مفید است. حفاظت user-account-specific می تواند جهت سرویس هایی که با یک user identity مشخص اجرا می شوند، همچون محیط های میزبانی مشترک مورد استفاده قرار گیرند. هر برنامه تحت یک identity جداگانه که دسترسی را به منابعی همچون فایل ها و پایگاه های داده محدود می کند اجرا می شود. |
هر دو provider، encryption داده قدرتمندی را ارائه می کنند. در هر صورت اگر شما قصد استفاده از فایل configuration یکسان بر روی سرورهای متعدد، همچون یک Web farm را دارید، تنها RsaProtectedConfigurationProvider به شما این امکان را می دهد تا encryption keyهای مورد استفاده جهت encryption داده را export کنید و آن را بر روی سرور دیگر import نمایید. جهت اطلاعات بیشتر، Importing and Exporting Protected Configuration RSA Key Containers۱۰ را مشاهده نمایید.
استفاده از Configuration Classes
System.Configuration۱۱ namespace کلاس هایی را جهت کار با تنظیمات configuration به صورت برنامه ریزی شده، ایجاد می کند. کلاس ConfigurationManager۱۲ دسترسی به machine، برنامه و فایل های configuration کاربر را ایجاد می کند. اگر در حال ایجاد یک برنامه ASP.NET هستید، شما می توانید از کلاس WebConfigurationManager۱۳ که قابلیت یکسانی را ارائه می دهد در عین حال به شما امکان دسترسی به تنظیماتی که یکتا هستند را به برنامه های ASP.NET می دهد. همچون فایل <system.web>.
نکته: System.Security.Cryptography۱۴ namespace کلاس هایی را شامل می شود که اختیاراتی اضافی را جهت encrypt و decrypt داده می دهد. در صورتی که نیازمند cryptographic services هستید ولی به علت استفاده از configuration حفاظت شده، در دسترس نیستند، از این کلاس استفاده نمایید. برخی از این کلاس ها جهت unmanaged Microsoft CryptoAPI به صورت wrappers در آمده اند، در صورتی که بقیه کاملا به صورت مدیریت شده پیاده سازی شده اند. جهت اطلاعات بیشتر، Cryptographic Services۱۵ را مشاهده نمایید.
[irp posts=”۱۱۴۱۵″ name=”نحوه ی پیکربندی برنامه ی security configuration wizard”]
مثالی برای App.config
این مثال نشان می دهد که چگونه بخش connectionStrings در یک فایل app.config را جهت یک برنامه ویندوزی، encrypt و decrypt نمایید. در این مثال procedure نام برنامه را در قالب یک argument می گیرد(برای مثال “MyApplication.exe.config”). سپس فایل app.config به صورت encrypt شده در آمده و در پوشه محتوی فایل اجرایی با نام “MyApplication.exe.config” کپی خواهد شد.
نکته: رشته اتصال تنها در کامپیوتری که encryptشده بود، decrypt می شود.
این کد OpenExeConfiguration۱۶ method را جهت باز کردن فایل app.config جهت ویرایش به کار می برد و GetSection۱۷ method بخش connectionStrings را برمی گرداند. کد IsProtected۱۸ property را چک می کند، در صورتی که بخش موردنظر encrypt نشده باشد، ProtectSection۱۹ فراخوانی می کند. UnProtectSection۲۰ method به بخش encrypt شده invoke می کند. Save۲۱ method عملیات را کامل کرده و تغییرات را ذخیره می کند.
نکته: شما می بایست System.Configuration.dll را در پروژه خود ارجاع دهید تا کد شما اجرا شود.
مثالی برای Web.config
این مثال از OpenWebConfiguration۲۲ method در WebConfigurationManager استفاده می نماید. توجه کنید که در این صورت شما می توانید مسیر نسبی فایل Web.config را با استفاده از ” ~”(Tilde) مشخص نمایید. این کد نیاز به یک ارجاع به کلاس System.Web.Configuration دارد.
سوالات متداول