1. บทนำ
เมื่อสร้างแอปพลิเคชัน ASP.NET 2.0 นักพัฒนามักจะจัดเก็บข้อมูลการกำหนดค่าที่ละเอียดอ่อนไว้ในไฟล์ Web.config ตัวอย่างทั่วไปที่สุดคือสตริงการเชื่อมต่อฐานข้อมูล แต่ข้อมูลที่ละเอียดอ่อนอื่นๆ ที่รวมอยู่ในไฟล์ Web.config รวมถึงข้อมูลการเชื่อมต่อเซิร์ฟเวอร์ SMTP และข้อมูลประจำตัวผู้ใช้ ฯลฯ แม้ว่า ASP.NET จะสามารถกำหนดค่าเริ่มต้นให้ปฏิเสธคำขอ HTTP ทั้งหมดสำหรับทรัพยากรไฟล์ที่มีนามสกุล .config ได้ อย่างไรก็ตาม หากแฮกเกอร์สามารถเข้าถึงระบบไฟล์ของเว็บเซิร์ฟเวอร์ของคุณได้ ข้อมูลที่ละเอียดอ่อนก็ยังสามารถถูกขโมยได้ ตัวอย่างเช่น บางทีคุณอาจอนุญาตให้เข้าถึง FTP โดยไม่ระบุชื่อไปยังเว็บไซต์ของคุณโดยไม่ได้ตั้งใจ ดังนั้นจึงอนุญาตให้แฮกเกอร์ดาวน์โหลดไฟล์ Web.config ของคุณผ่านโปรโตคอล FTP
โชคดีที่ ASP.NET 2.0 ช่วยบรรเทาปัญหานี้โดยอนุญาตให้คุณเข้ารหัสส่วนที่เลือกของไฟล์ Web.config เช่นส่วน
ในบทความนี้ เราจะพูดถึงวิธีการเข้ารหัสและถอดรหัสส่วนการตั้งค่าการกำหนดค่านี้โดยทางโปรแกรม และตรวจสอบการใช้โปรแกรมบรรทัดคำสั่ง aspnet_regiis.exe จากนั้นเราจะประเมินตัวเลือกการเข้ารหัสที่มีให้โดย ASP.NET 2.0 นอกจากนี้ เราจะหารือโดยย่อถึงวิธีการเข้ารหัสข้อมูลการกำหนดค่าใน ASP.NET เวอร์ชัน 1.x
2. สถานที่
ก่อนที่เราจะเริ่มหารือเกี่ยวกับวิธีการเข้ารหัสข้อมูลการกำหนดค่า ASP.NET 2.0 โปรดจำประเด็นต่อไปนี้:
1. การเข้ารหัสทุกรูปแบบประกอบด้วยความลับบางประเภท และความลับนี้จะถูกใช้เมื่อเข้ารหัสและถอดรหัสข้อมูล อัลกอริธึมการเข้ารหัสแบบสมมาตรจะใช้คีย์เดียวกันเมื่อเข้ารหัสและถอดรหัสข้อความ ในขณะที่อัลกอริธึมการเข้ารหัสแบบอสมมาตรใช้คีย์ที่แตกต่างกันสำหรับการเข้ารหัสและถอดรหัส ไม่ว่าจะใช้เทคโนโลยีใดก็ตาม สิ่งที่สำคัญที่สุดคือความปลอดภัยของคีย์ถอดรหัส
2. เทคโนโลยีการเข้ารหัสการกำหนดค่าที่มีให้โดย ASP.NET 2.0 ได้รับการออกแบบมาเพื่อป้องกันไม่ให้แฮกเกอร์สามารถเรียกค้นไฟล์การกำหนดค่าของคุณได้ในทางใดทางหนึ่ง แนวคิดก็คือหากมีไฟล์ Web.config ของคุณบนคอมพิวเตอร์ของแฮ็กเกอร์ เขาจะไม่สามารถถอดรหัสส่วนที่เข้ารหัสได้ อย่างไรก็ตาม เมื่อเพจ ASP.NET บนเว็บเซิร์ฟเวอร์ร้องขอข้อมูลจากไฟล์การกำหนดค่าที่เข้ารหัส ข้อมูลนั้นจะต้องถูกถอดรหัสก่อนจึงจะสามารถใช้งานได้ (และสิ่งนี้เกิดขึ้นโดยที่คุณไม่ต้องเขียนโค้ดใดๆ) ดังนั้น หากแฮกเกอร์สามารถอัปโหลดเว็บเพจ ASP.NET ไปยังระบบของคุณเพื่อสอบถามไฟล์การกำหนดค่าและแสดงผลลัพธ์ เขาก็สามารถดูการตั้งค่าที่เข้ารหัสเป็นข้อความธรรมดาได้ (สำหรับรายละเอียด โปรดดูตัวอย่างหน้า ASP.NET ที่ให้ไว้ในบทความนี้ ซึ่งแสดงวิธีการเข้ารหัสและถอดรหัสส่วนต่างๆ ของไฟล์ Web.config ดังที่คุณเห็น หน้า ASP.NET สามารถเข้าถึง (และแสดง) ข้อมูลที่เข้ารหัส (รูปแบบข้อความธรรมดา)
3. การเข้ารหัสและถอดรหัสข้อมูลการกำหนดค่าต้องใช้ต้นทุนประสิทธิภาพที่แน่นอน ดังนั้นจึงเป็นเรื่องปกติที่จะเข้ารหัสเฉพาะส่วนของการกำหนดค่าที่มีข้อมูลที่ละเอียดอ่อนเท่านั้น ตัวอย่างเช่น อาจไม่จำเป็นต้องเข้ารหัสส่วนการกำหนดค่า
3. ข้อมูลประเภทใดที่สามารถเข้ารหัสได้
ก่อนที่เราจะวิเคราะห์วิธีการเข้ารหัสข้อมูลการกำหนดค่า ASP.NET 2.0 ให้เราดูก่อนว่าข้อมูลการกำหนดค่าใดบ้างที่สามารถเข้ารหัสได้ การใช้ไลบรารีที่จัดทำโดย .NET Framework 2.0 นักพัฒนาสามารถเข้ารหัสส่วนการกำหนดค่าส่วนใหญ่ในไฟล์ Web.config หรือ machine.config ส่วนการกำหนดค่าเหล่านี้เป็นองค์ประกอบ XML ที่เป็นโหนดลูกขององค์ประกอบ
<?xml version="1.0"?>
<การกำหนดค่า xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 "">
<สายเชื่อมต่อ>
<เพิ่มชื่อ="MembershipConnectionString" ConnectionString="connectionString"/>
</สตริงการเชื่อมต่อ><
<คอมไพล์ debug="true"/>
<โหมดการรับรองความถูกต้อง = "แบบฟอร์ม" />
แต่ละส่วนเหล่านี้สามารถเลือกเข้ารหัสได้ ไม่ว่าจะโดยทางโปรแกรมหรือผ่าน aspnet_regiis.exe (เครื่องมือบรรทัดคำสั่ง) เมื่อเข้ารหัส ข้อความที่เข้ารหัสจะถูกจัดเก็บไว้ในไฟล์การกำหนดค่าโดยตรง ตัวอย่างเช่น หากเราต้องเข้ารหัสส่วน
<การกำหนดค่า xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 "">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">>
<<ข้อมูลที่เข้ารหัส>
<ข้อมูลการเข้ารหัส>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
ข้อมูลการเข้ารหัส>
</ข้อมูลที่ถูกเข้ารหัส><
</สตริงการเชื่อมต่อ><
<คอมไพล์ debug="true"/>
<โหมดการรับรองความถูกต้อง = "แบบฟอร์ม" />
</system.web>
นอกจากนี้ ยังมีส่วนการกำหนดค่าบางส่วนที่คุณไม่สามารถเข้ารหัสโดยใช้เทคนิคนี้:
· <processModel><
· <รันไทม์>
·
·<การเริ่มต้น>
·
· <configProtectedData><
· <ส่วนประกอบดาวเทียม>
· <การตั้งค่าการเข้ารหัส>
· <การทำแผนที่ชื่อคริปโต>
·
ในการเข้ารหัสส่วนการกำหนดค่าเหล่านี้ คุณต้องเข้ารหัสค่าเหล่านี้และเก็บไว้ในรีจิสทรี มีเครื่องมือบรรทัดคำสั่ง 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 The (sectionName) ส่งกลับค่า อินสแตนซ์ ConfigurationSection สุดท้าย คุณสามารถรับออบเจ็กต์ SectionInformation ผ่านคุณสมบัติ SectionInformation ของอินสแตนซ์ ConfigurationSection
ด้านล่างนี้ เราจะอธิบายปัญหาผ่านตัวอย่างโค้ดง่ายๆ:
privatevoid ProtectSection(stringsectionName, string provider)
-
การกำหนดค่า config = WebConfigurationManager
OpenWebConfiguration (คำขอ ApplicationPath);
ส่วน ConfigurationSection = config.GetSection (ชื่อส่วน);
ถ้า (ส่วน != null &&!section.SectionInformation.IsProtected)
-
Section.SectionInformation.ProtectSection (ผู้ให้บริการ);
config.บันทึก();
-
-
โมฆะส่วนตัว UnProtectSection (ชื่อส่วนสตริง) {
การกำหนดค่า config =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ส่วน ConfigurationSection = config.GetSection n (ชื่อส่วน);
ถ้า (ส่วน != null && ส่วน SectionInformation.IsProtected)
-
Section.SectionInformation.UnprotectSection();
config.บันทึก();
}
คุณสามารถเรียกเมธอด ProtectSection(sectionName, provider) นี้ได้จากเพจ ASP.NET พารามิเตอร์ที่เกี่ยวข้องคือชื่อส่วน (เช่น ConnectionStrings) และผู้ให้บริการ (เช่น DataProtectionConfigurationProvider) และจะเปิดไฟล์ Web.config โดยอ้างอิงถึง ในส่วนนี้ มีการเรียกเมธอด ProtectSection(provider) ของออบเจ็กต์ SectionInformation และสุดท้ายการเปลี่ยนแปลงการกำหนดค่าจะถูกบันทึก
ในทางกลับกัน เมธอด UnProtectSection(ผู้ให้บริการ) จะใช้การถอดรหัสของส่วนการกำหนดค่าเฉพาะ ในที่นี้ จะต้องส่งเฉพาะส่วนที่จะถูกถอดรหัสเท่านั้น เราไม่จำเป็นต้องรบกวนผู้ให้บริการ เนื่องจากข้อมูลนั้นถูกจัดเก็บไว้ในแท็กที่มาพร้อมกับส่วนที่เข้ารหัสแล้ว (นั่นคือ ส่วน
โปรดจำไว้ว่าเมื่อข้อมูลนี้ถูกเข้ารหัส เมื่ออ่านจากเพจ ASP.NET (นั่นคือ การอ่านข้อมูลสตริงการเชื่อมต่อจากตัวควบคุม SqlDataSource หรือโดยทางโปรแกรมผ่าน ConfigurationManager.ConnectionStrings[connStringName].ConnectionString) ASP.NET จะถอดรหัสโดยอัตโนมัติ สตริงการเชื่อมต่อและส่งกลับค่าข้อความธรรมดา กล่าวอีกนัยหนึ่ง คุณไม่จำเป็นต้องเปลี่ยนรหัสเลยหลังจากใช้การเข้ารหัส ค่อนข้างเท่ห์ใช่มั้ย?
ในเว็บไซต์ ASP.NET 2.0 ตัวอย่างที่ดาวน์โหลดจากบทความนี้ คุณจะพบเพจตัวอย่างที่แสดงไฟล์ Web.config ของไซต์ ซึ่งมีกล่องข้อความหลายบรรทัดและปุ่มควบคุมเว็บที่เกี่ยวข้องสำหรับการกำหนดค่าการเข้ารหัสส่วนต่างๆ ไฟล์. ตัวอย่างนี้ยังใช้เมธอด ProtectSection() และ UnProtectSection() ที่กล่าวถึงข้างต้น
6. ใช้เครื่องมือบรรทัดคำสั่ง aspnet_regiis.exe
คุณยังสามารถใช้เครื่องมือบรรทัดคำสั่ง aspnet_regiis.exe เพื่อเข้ารหัสและถอดรหัสส่วนการกำหนดค่าของไฟล์ Web.config คุณสามารถค้นหาได้ใน "%WINDOWSDIR%Microsoft.Net ไดเรกทอรี Frameworkversion" เครื่องมือ ในการเข้ารหัสส่วนในไฟล์ Web.config คุณสามารถใช้คีย์เครื่อง DPAPI ในเครื่องมือบรรทัดคำสั่งนี้ได้ดังนี้:
รูปแบบทั่วไปของการเข้ารหัสไฟล์ Web.config สำหรับเว็บไซต์เฉพาะ:
aspnet_regiis.exe -pef ส่วน Physical_directory - ผู้ให้บริการ prov
หรือ:
aspnet_regiis.exe -pe ส่วน -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 Section -app virtual_directory
ตัวอย่างเฉพาะของการถอดรหัสไฟล์ Web.config ของเว็บไซต์เฉพาะ:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
หรือ:
คุณยังสามารถระบุได้ว่า aspnet_regiis.exe ดำเนินการหรือไม่ machine.config การเข้ารหัส/ถอดรหัสไฟล์
[เคล็ดลับ] การเข้ารหัสการตั้งค่าการกำหนดค่าใน ASP.NET เวอร์ชัน 1.x
เพื่อปกป้องการตั้งค่าการกำหนดค่าใน ASP.NET เวอร์ชัน 1.x นักพัฒนาจำเป็นต้องเข้ารหัสและจัดเก็บการตั้งค่าที่ละเอียดอ่อนในรีจิสทรีของเว็บเซิร์ฟเวอร์และใช้ที่เก็บข้อมูลคีย์ A "แข็งแกร่ง" วิธี. แทนที่จะจัดเก็บเนื้อหาที่เข้ารหัส (เช่นใน ASP.NET 2.0) ไฟล์การกำหนดค่าจะมีการอ้างอิงถึงคีย์รีจิสทรีที่เก็บค่าที่เข้ารหัสไว้ ตัวอย่างเช่น:
password="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
Microsoft จัดเตรียมเครื่องมือบรรทัดคำสั่ง aspnet_setreg.exe ให้กับนักพัฒนาเพื่อเข้ารหัสข้อมูลการกำหนดค่าที่ละเอียดอ่อน และย้ายไปยังทางเข้ารีจิสทรีที่ "แข็งแกร่ง" น่าเสียดายที่เครื่องมือนี้ใช้ได้กับการตั้งค่าการกำหนดค่าเฉพาะเท่านั้น ในทางตรงกันข้าม ASP.NET 2.0 อนุญาตให้เข้ารหัสส่วนการกำหนดค่าใดก็ได้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ aspnet_setreg.exe ในแอปพลิเคชัน ASP.NET 1.x ดู KB#32990 บน MSDN ขออภัย โปรแกรมบรรทัดคำสั่งนี้สามารถเข้ารหัสเฉพาะส่วนที่กำหนดไว้ล่วงหน้าในการตั้งค่าคอนฟิกูเรชัน และไม่อนุญาตให้คุณเข้ารหัสสตริงการเชื่อมต่อฐานข้อมูลและข้อมูลละเอียดอ่อนอื่นๆ ที่คุณเพิ่มด้วยตนเอง
ในบทความนี้ เราได้เรียนรู้วิธีใช้ตัวเลือกการเข้ารหัสต่างๆ ที่ได้รับจาก ASP.NET 2.0 เพื่อปกป้องข้อมูลส่วนการกำหนดค่า นอกจากนี้ เรายังกล่าวถึงวิธีใช้เทคนิคการเขียนโปรแกรมและaspnet_regiis.exe
เพื่อเข้ารหัสส่วนการกำหนดค่าใน Web.config ตามลำดับ . การปกป้องการตั้งค่าการกำหนดค่าที่ละเอียดอ่อนช่วยให้มั่นใจได้ว่าเว็บไซต์ของคุณจะถูกแฮ็กได้ยากขึ้น โดยทำให้การค้นหาการตั้งค่าการกำหนดค่าที่ละเอียดอ่อนทำได้ยากขึ้น ปัจจุบัน ASP.NET 2.0 มีเทคโนโลยีการเข้ารหัสและถอดรหัสที่ค่อนข้างง่ายอยู่แล้ว และไม่มีเหตุผลใดที่นักพัฒนาจะไม่ใช้วิธีนี้เพื่อปกป้องการตั้งค่าการกำหนดค่าที่ละเอียดอ่อนของคุณ