1. مقدمة
عند إنشاء تطبيقات ASP.NET 2.0، يقوم المطورون عادةً بتخزين معلومات التكوين الحساسة في ملف Web.config. المثال الأكثر شيوعًا هو سلسلة اتصال قاعدة البيانات، لكن المعلومات الحساسة الأخرى المضمنة في ملف Web.config تتضمن معلومات اتصال خادم SMTP وبيانات اعتماد المستخدم، وما إلى ذلك. على الرغم من أنه يمكن تكوين ASP.NET افتراضيًا لرفض جميع طلبات HTTP لموارد الملفات بامتداد .config؛ ومع ذلك، إذا تمكن أحد المتسللين من الوصول إلى نظام ملفات خادم الويب الخاص بك، فلا يزال من الممكن سرقة المعلومات الحساسة. على سبيل المثال، ربما سمحت عن طريق الخطأ بوصول FTP مجهول إلى موقع الويب الخاص بك، مما يسمح للمتسلل بتنزيل ملف Web.config الخاص بك عبر بروتوكول FTP.
لحسن الحظ، يساعد ASP.NET 2.0 على تخفيف هذه المشكلة عن طريق السماح لك بتشفير أجزاء محددة من ملف Web.config، مثل قسم <connectionStrings> أو بعض أقسام التكوين المخصصة التي يستخدمها التطبيق الخاص بك. يمكن بسهولة تشفير أقسام التكوين مسبقًا باستخدام التشفير أو aspnet_regiis.exe (برنامج سطر الأوامر). بمجرد تشفير إعدادات Web.config، تصبح محمية من أعين المتطفلين. علاوة على ذلك، عند استرداد إعدادات التكوين المشفرة برمجيًا من صفحة ASP.NET الخاصة بك، يقوم ASP.NET تلقائيًا بفك تشفير الجزء المشفر الذي يقرأه. باختصار، بمجرد تشفير معلومات التكوين، لن تحتاج إلى كتابة أي تعليمات برمجية أخرى أو اتخاذ أي إجراءات أخرى في التطبيق الخاص بك لاستخدام البيانات المشفرة.
سنناقش في هذه المقالة كيفية تشفير قسم إعدادات التكوين وفك تشفيره برمجيًا، وفحص استخدام برنامج سطر الأوامر aspnet_regiis.exe. سنقوم بعد ذلك بتقييم خيارات التشفير التي يوفرها ASP.NET 2.0. بالإضافة إلى ذلك، نناقش بإيجاز كيفية تشفير معلومات التكوين في الإصدار 1.x من ASP.NET.
2. الفرضية
قبل أن نبدأ مناقشة كيفية تشفير معلومات تكوين ASP.NET 2.0، يرجى تذكر النقاط التالية:
1. تحتوي جميع أشكال التشفير على نوع من السر، ويستخدم هذا السر عند تشفير البيانات وفك تشفيرها. تستخدم خوارزميات التشفير المتماثل نفس المفتاح عند تشفير الرسالة وفك تشفيرها، بينما تستخدم خوارزميات التشفير غير المتماثلة مفاتيح مختلفة للتشفير وفك التشفير. بغض النظر عن التكنولوجيا المستخدمة، فإن الشيء الأكثر أهمية هو مدى أمان مفتاح فك التشفير.
2. تم تصميم تقنية تشفير التكوين التي يوفرها ASP.NET 2.0 لمنع المتسللين من استرداد ملفات التكوين الخاصة بك بطريقة ما. الفكرة هي أنه إذا كان هناك ملف Web.config الخاص بك على جهاز الكمبيوتر الخاص بالمتسلل، فلن يتمكن من فك الجزء المشفر. ومع ذلك، عندما تطلب صفحة ASP.NET على خادم الويب معلومات من ملف تكوين مشفر، يجب فك تشفير البيانات قبل استخدامها (ويحدث هذا دون كتابة أي تعليمات برمجية). لذلك، إذا كان أحد المتسللين قادرًا على تحميل صفحة ويب ASP.NET إلى نظامك والتي تستعلم عن ملف التكوين وتعرض نتائجه، فيمكنه عرض الإعدادات المشفرة كنص عادي. (للحصول على التفاصيل، يرجى الرجوع إلى نموذج صفحة ASP.NET المتوفرة في هذه المقالة، والتي توضح كيفية تشفير وفك تشفير أجزاء مختلفة من ملف Web.config؛ وكما ترى، يمكن لصفحة ASP.NET الوصول إلى (وعرض) البيانات المشفرة (نموذج نص عادي)
3. يتطلب تشفير وفك تشفير معلومات التكوين تكلفة أداء معينة. لذلك، من الشائع تشفير أجزاء التكوين التي تحتوي على معلومات حساسة فقط. على سبيل المثال، قد لا تكون هناك حاجة لتشفير أقسام التكوين <compilation> أو <authorization>.
3. ما نوع المعلومات التي يمكن تشفيرها؟
قبل أن نحلل كيفية تشفير معلومات تكوين ASP.NET 2.0، دعونا نلقي نظرة أولاً على معلومات التكوين التي يمكن تشفيرها. باستخدام المكتبات المتوفرة بواسطة .NET Framework 2.0، يمكن للمطورين تشفير معظم أقسام التكوين في ملف Web.config أو Machine.config. أجزاء التكوين هذه هي عناصر XML وهي عقد فرعية لعنصر <configuration> أو <system.web>. على سبيل المثال، يحتوي ملف Web.config النموذجي التالي على ثلاثة إعدادات تكوين، تم تعريفها بشكل صريح على أنها:
<connectionStrings>، و<compilation>، و<authentication>.
<?xml الإصدار = "1.0"?>
<configuration xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<سلاسل الاتصال>
<أضف اسم = "MembershipConnectionString" ConnectionString = "connectionString"/>
</سلاسل الاتصال>
<system.web>
< تصحيح الأخطاء التجميعية = "صحيح"/>
<وضع المصادقة = "النماذج" />
</system.web>
يمكن تشفير كل قسم من هذه الأقسام اختياريًا، إما برمجيًا أو عبر aspnet_regiis.exe (أداة سطر الأوامر). عند التشفير، يتم تخزين النص المشفر مباشرة في ملف التكوين. على سبيل المثال، إذا أردنا تشفير قسم <connectionStrings> أعلاه، فقد يبدو ملف Web.config الناتج كما يلي: (ملاحظة: نظرًا لقيود المساحة، فقد حذفنا جزءًا كبيرًا من <CipherValue>)
<?xml version= "1.0"؟>
<configuration xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<بيانات مشفرة>
<بيانات التشفير>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</بيانات التشفير>
</بيانات مشفرة>
</سلاسل الاتصال>
<system.web>
< تصحيح الأخطاء التجميعية = "صحيح"/>
<وضع المصادقة = "النماذج" />
</system.web>
بالإضافة إلى ذلك، هناك بعض أجزاء التكوين التي لا يمكنك تشفيرها باستخدام هذه التقنية:
· <processModel>
· <وقت التشغيل>
· <مسكورليب>
·<بدء التشغيل>
· <system.runtime.remoting>
· <البيانات المحمية التكوين>
· <تجميعات الأقمار الصناعية>
· <إعدادات التشفير>
· <CryptoNameMapping>
· <cryptoClasses>
لتشفير أجزاء التكوين هذه، يجب عليك تشفير هذه القيم وتخزينها في السجل. توجد أداة سطر أوامر aspnet_setreg.exe يمكنها مساعدتك في هذه العملية؛ وسنناقش هذه الأداة لاحقًا في هذه المقالة.
[نصيحة] الفرق بين Web.Config وMachine.Config:
يحدد ملف Web.config إعدادات التكوين لتطبيق ويب محدد ويقع في الدليل الجذر للتطبيق بينما يحدد ملف Machine.config جميع إعدادات التكوين الموجودة على خادم الويب. إعدادات التكوين للموقع الموجود في الدليل $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG.
4. خيارات التشفير
يمكن للمطورين استخدام نموذج موفر ASP.NET 2.0 لحماية معلومات قسم التكوين، مما يسمح بتوصيل أي تطبيق بسلاسة إلى واجهة برمجة التطبيقات (API). يوفر .NET Framework 2.0 مزودين مضمنين لحماية معلومات قسم التكوين:
· موفر Windows Data Protection API (DPAPI) (DataProtectionConfigurationProvider): يستخدم هذا الموفر تقنية التشفير المضمنة في Windows لتشفير وفك تشفير أقسام التكوين. افتراضيًا، يستخدم هذا الموفر المفتاح الأصلي. يمكنك أيضًا استخدام مفاتيح المستخدم، ولكن هذا يتطلب القليل من التخصيص.
· مزود التكوين المحمي بـ RSA (RSAProtectedConfigurationProvider): يستخدم تشفير المفتاح العام RSA لتشفير وفك تشفير أقسام التكوين. باستخدام هذا الموفر، تحتاج إلى إنشاء حاوية مفاتيح تقوم بتخزين المفاتيح العامة والخاصة المستخدمة لتشفير معلومات التكوين وفك تشفيرها. يمكنك استخدام RSA في مزرعة متعددة الخوادم عن طريق إنشاء حاويات مفاتيح قابلة للتصدير.
بالطبع، يمكنك أيضًا إنشاء مزود إعدادات الحماية الخاص بك إذا لزم الأمر.
في هذه المقالة، نناقش فقط استخدام المفاتيح على مستوى الجهاز باستخدام موفر DPAPI. هذه هي أبسط طريقة إلى حد بعيد لأنها لا تتطلب إنشاء أي مفاتيح أو حاويات مفاتيح. الجانب السلبي، بالطبع، هو أنه لا يمكن استخدام ملف التكوين المشفر إلا على خادم الويب الذي قام بتنفيذ التشفير في المقام الأول؛ علاوة على ذلك، فإن استخدام مفتاح الجهاز سيسمح بفك تشفير النص المشفر بواسطة أي موقع على خادم الويب.
5. قم بتشفير قسم التكوين برمجيًا
تلخص فئة System.Configuration.SectionInformation وصف قسم التكوين. لتشفير قسم التكوين، ما عليك سوى استخدام طريقة ProtectSection(provider) لفئة sectionInformation، وتمرير اسم الموفر الذي تريد استخدامه لإجراء التشفير. للوصول إلى قسم تكوين معين في ملف Web.config الخاص بالتطبيق الخاص بك، يمكنك استخدام فئة WebConfigurationManager (في مساحة الاسم System.Web.Configuration) للإشارة إلى ملف Web.config الخاص بك، ثم استخدام GetSection الخاص به، حيث تقوم الطريقة (sectionName) بإرجاع ملف مثيل قسم التكوين. وأخيرًا، يمكنك الحصول على كائن sectionInformation عبر خاصية sectionInformation لمثيل ConfigurationSection.
أدناه، نوضح المشكلة من خلال مثال رمز بسيط:
Privatevoid ProtectSection(string sectionName, string Provider)
{
تكوين التكوين = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
قسم قسم التكوين = config.GetSection(sectionName);
إذا (القسم! = فارغ &&!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(provider);
config.Save();
}
}
باطلة خاصة UnProtectSection (سلسلة اسم القسم) {
Configuration config =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
قسم قسم التكوين = config.GetSection n(sectionName);
إذا (القسم! = فارغ && section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
config.Save();
}
يمكنك استدعاء طريقة ProtectSection(sectionName, Provider) من صفحة ASP.NET، والمعلمات المقابلة لها هي اسم قسم (مثل ConnectionStrings) وموفر (مثل DataProtectionConfigurationProvider)، وتفتح ملف Web.config، مرجعًا في هذا القسم، يتم استدعاء أسلوب ProtectSection(provider) لكائن sectionInformation، وفي النهاية يتم حفظ تغييرات التكوين.
من ناحية أخرى، تقوم طريقة UnProtectSection(provider) بتنفيذ فك تشفير قسم تكوين محدد. هنا، يجب تمرير القسم الذي سيتم فك تشفيره فقط - لا نحتاج إلى إزعاج الموفر نظرًا لأن هذه المعلومات مخزنة بالفعل في العلامة المصاحبة للقسم المشفر (أي قسم <connectionStrings> في المثال أعلاه، والذي يتم تشفيره لاحقًا، ويتضمن الموفر: <connectionStringsconfigProtectionProvider="DataProtectionConfigurationProvider">).
تذكر أنه بمجرد تشفير هذه البيانات، عند قراءتها من صفحة ASP.NET (أي قراءة معلومات سلسلة الاتصال من عنصر تحكم SqlDataSource أو برمجيًا عبر ConfigurationManager.ConnectionStrings[connStringName].ConnectionString)، سيقوم ASP.NET تلقائيًا بفك تشفير البيانات. سلسلة الاتصال وإرجاع قيمة نص عادي. بمعنى آخر، لا تحتاج إلى تغيير التعليمات البرمجية الخاصة بك على الإطلاق بعد تنفيذ التشفير. رائع، أليس كذلك؟
في نموذج موقع ASP.NET 2.0 الذي تم تنزيله من هذه المقالة، ستجد نموذج صفحة يعرض ملف Web.config الخاص بالموقع، والذي يحتوي على TextBox متعدد الأسطر وأزرار التحكم في الويب المقابلة لتكوين التشفير ملف. يستخدم هذا المثال أيضًا طريقتي ProtectSection() وUnProtectSection() التي تمت مناقشتها أعلاه.
6. استخدم أداة سطر الأوامر aspnet_regiis.exe
يمكنك أيضًا استخدام أداة سطر الأوامر aspnet_regiis.exe لتشفير وفك تشفير جزء التكوين من ملف Web.config، ويمكنك العثور على هذا في "%WINDOWSDIR%Microsoft.Net". Frameworkversion" الدليل.tool. لتشفير قسم في ملف Web.config، يمكنك استخدام مفتاح جهاز DPAPI في أداة سطر الأوامر هذه كما يلي:
نموذج شائع لتشفير ملف Web.config لموقع ويب محدد:
aspnet_regiis.exe -pef sectionphysic_directory - موفر Prov
أو:
aspnet_regiis.exe - قسم -app virtual_directory -prov
مثيل محدد لموفر يقوم بتشفير ملف Web.config لموقع ويب معين:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov " DataProtectionConfigurationProvider"
أو:
aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
نموذج شائع لفك تشفير ملف Web.config الخاص بموقع ويب معين:
aspnet_regiis.exe - قسم pdf Physical_directory
أو:
aspnet_regiis. exe -pd قسم -app virtual_directory
مثال محدد لفك تشفير ملف Web.config لموقع ويب محدد:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
أو:
يمكنك أيضًا تحديد تنفيذ aspnet_regiis.exe تشفير/فك تشفير ملف Machine.config.
[نصيحة] تشفير إعدادات التكوين في الإصدار 1.x من ASP.NET.
لحماية إعدادات التكوين في الإصدار 1.x من ASP.NET، يحتاج المطورون إلى تشفير الإعدادات الحساسة وتخزينها في سجل خادم الويب واستخدام وحدة تخزين مفاتيح "قوية". طريقة. بدلاً من تخزين المحتوى المشفر (كما هو الحال في ASP.NET 2.0)، يحتوي ملف التكوين ببساطة على مرجع إلى مفتاح التسجيل حيث يتم تخزين القيمة المشفرة. على سبيل المثال:
<identity impersonate="true"
اسم المستخدم = "التسجيل: HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG، اسم المستخدم"
كلمة المرور = "registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
توفر Microsoft للمطورين أداة سطر الأوامر aspnet_setreg.exe لتشفير معلومات التكوين الحساسة ونقلها إلى مدخل تسجيل "قوي". ولسوء الحظ، تعمل هذه الأداة فقط مع إعدادات تكوين محددة؛ وفي المقابل، يسمح ASP.NET 2.0 بتشفير أي قسم تكوين.
لمزيد من المعلومات حول استخدام aspnet_setreg.exe في تطبيق ASP.NET 1.x، راجع KB#32990 على MSDN. لسوء الحظ، يمكن لبرنامج سطر الأوامر هذا فقط تشفير الأقسام المحددة مسبقًا في إعدادات التكوين ولا يسمح لك بتشفير سلاسل اتصال قاعدة البيانات والمعلومات الحساسة الأخرى التي تضيفها بنفسك.
7. الاستنتاج
في هذه المقالة، تعلمنا كيفية استخدام خيارات التشفير المختلفة التي يوفرها ASP.NET 2.0 لحماية معلومات قسم التكوين، وناقشنا أيضًا كيفية استخدام تقنيات البرمجة وaspnet_regiis.exe لتشفير قسم التكوين في Web.config على التوالي. . تساعد حماية إعدادات التكوين الحساسة على ضمان زيادة صعوبة اختراق موقعك - وذلك من خلال زيادة صعوبة اكتشاف إعدادات التكوين الحساسة. واليوم، يوفر ASP.NET 2.0 بالفعل تقنية تشفير وفك تشفير سهلة نسبيًا، ولا يوجد سبب يمنع المطورين من استخدام هذه الطريقة لحماية إعدادات التكوين الحساسة لديك.