تقویت امنیت ذخیرهسازی فایل در برنامههای وب داتنت با استفاده از اصل "کمترین امتیاز" در IIS
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۷/۱۳ ۱۱:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
LocalSystem یا یک حساب کاربری مدیر (Administrator) تنظیم میکنند. این یک اشتباه امنیتی مهلک است. اگر یک مهاجم بتواند از طریق برنامه وب نفوذ کند (مثلاً با بارگذاری یک شل مخرب)، به دلیل امتیاز بالای آن حساب، میتواند کنترل کامل سرور را به دست بگیرد.IIS AppPool\MyAppPool).# Set the application pool to use the default identity (not LocalSystem!) Set-ItemProperty "IIS:\AppPools\MyAppPool" -Name processModel.identityType -Value ApplicationPoolIdentity
Set-ItemProperty برای تغییر تنظیمات در IIS استفاده میشود."IIS:\AppPools\MyAppPool" Application Pool مورد نظر را مشخص میکند (در اینجا MyAppPool).processModel.identityType هویت فرآیند Worker را تعیین میکند.ApplicationPoolIdentity هویت منحصر به فرد و کمامتیاز را برای اجرای فرآیند برنامه وب تنظیم میکند.LocalSystem یا Administrator که میتوانند به فایلهای سیستمی دسترسی داشته باشند، جلوگیری میکند.# Grant minimal permissions to the upload directory
$uploadPath = "D:\Uploads"
$appPoolIdentity = "IIS AppPool\MyAppPool"
# Remove inherited permissions
$acl = Get-Acl $uploadPath
$acl.SetAccessRuleProtection($true, $false)
# Grant only Write permission (add Read if you need to serve files back)
$writePermission = New-Object System.Security.AccessControl.FileSystemAccessRule(
$appPoolIdentity,
"Write",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($writePermission)
Set-Acl $uploadPath $acl$uploadPath) و نام کامل هویت Application Pool ($appPoolIdentity) ذخیره میشوند. نام هویت همیشه به صورت IIS AppPool\نام_AppPool است.$acl = Get-Acl $uploadPath لیست کنترل دسترسی (Access Control List - ACL) فعلی پوشه آپلود را دریافت میکند.$acl.SetAccessRuleProtection($true, $false)
$true: مجوزهای این پوشه را از والد (مثلاً درایو D:) جدا میکند.$false: به جای کپی کردن مجوزهای والد، آنها را حذف میکند.Users یا Authenticated Users که به صورت پیشفرض دسترسی دارند، نتوانند به این پوشه دسترسی پیدا کنند.$appPoolIdentity"Write" (نوشتن). این تنها چیزی است که برای آپلود فایل لازم است. اعطای حق Modify یا Full Control خطرناک است."ContainerInherit,ObjectInherit" تضمین میکند که این مجوز فقط به زیرپوشهها و فایلهای درون پوشه آپلود اعمال شود.Set-Acl بر روی پوشه اعمال میشود.C:\Windows\System32) فایل بنویسد، سیستم عامل به دلیل عدم وجود مجوز در سطح Application Pool، عملیات را مسدود میکند..jpg, .png, .pdf) باید اجازه آپلود داشته باشند..jpg واقعاً یک تصویر JPEG باشد و نه یک فایل .exe تغییر نام داده شده).wwwroot یا مسیر اصلی سایت) ذخیره شوند.D:\Uploads که در مثال کد فوق ذکر شد) ذخیره کنید و برای ارائه آنها به کاربر، از یک Controller/Action در ASP.NET استفاده کنید که احراز هویت و مجوز دسترسی را قبل از ارسال فایل به کاربر بررسی میکند.web.config در آن پوشه قرار دهید تا اجرای اسکریپتها را به طور کامل محدود کند.web.config در پوشهی آپلود، میتواند امنیت را با غیرفعال کردن اجرای اسکریپتها بهطور کامل، تقویت کند..aspx, .ashx, .php, .exe) را آپلود کنند تا بتوانند از طریق آنها به سرور دسترسی پیدا کنند (معروف به Web Shell).web.config با تنظیمات محدودکننده در پوشهی آپلود، یک لایهی دفاعی دیگر را در سطح خود IIS ایجاد میکند. این تنظیمات، هرگونه تلاش برای اجرای فایلها را مستقیماً در وب سرور متوقف میکند.D:\Uploads در مثال قبلی) استفاده میکنید، قرار دهید:<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<clear />
</handlers>
<modules>
<remove name="ManagedEngine" />
</modules>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" /> </requestFiltering>
</security>
</system.webServer>
</configuration><handlers>
<clear />
</handlers>handlers در IIS مسئول نگاشت پسوندهای فایل به ماژولهای پردازشگر است. به عنوان مثال، Handler مربوط به ASP.NET، درخواستهای مربوط به فایلهای .aspx را به موتور داتنت ارجاع میدهد..aspx مخرب هم آپلود کند، IIS صرفاً آن را به عنوان یک فایل متنی یا باینری در نظر میگیرد و نه یک برنامه قابل اجرا، که عملاً از اجرای آن جلوگیری میکند.<modules>
<remove name="ManagedEngine" />
</modules>ManagedEngine مسئول بارگذاری و اجرای کدهای داتنت است.<requestLimits maxAllowedContentLength="52428800" />
maxAllowedContentLength، شما حداکثر اندازه مجاز فایل برای آپلود در این پوشه را محدود میکنید (در مثال فوق ۵۰ مگابایت). این کار جلوی حملات محرومسازی از سرویس (DoS) را میگیرد که مهاجم در آنها سعی میکند با ارسال فایلهای بسیار بزرگ، منابع سرور را مصرف کند.web.config در پوشه آپلود و ترکیب آن با مجوزهای محدود سیستم عامل (فقط Write) و اعتبارسنجی نوع فایل در کد داتنت، شما یک دیوار دفاعی چندلایه ایجاد میکنید که نفوذ به سرور از طریق آپلود فایل را عملاً غیرممکن میسازد. این مصداق واقعی اجرای اصل دفاع عمقی (Defense in Depth) است..jpg واقعاً یک تصویر JPEG باشد و نه یک فایل .exe تغییر نام داده شده).»