امنیت دسترسی به کد
امنیت دسترسی به کد (به انگلیسی: Code Access Security) با کوتهنوشت CAS راهحل شرکت مایکروسافت برای «جلوگیری» از انجام «کارهای مجوزخواه» برای کد نامطمئن است. موقعی که CLR یک اسمبلی را بارگذاری کند، به یک «گواهی» دربارهٔ اسمبلی دست مییابد، و سپس از آن استفاده میکند تا «گروه کدی» که اسمبلی به آن تعلق دارد را شناسایی کند. یک «گروه کدی» شامل یک مجموعه مجوز است (یعنی شامل یک یا بیشتر مجوز است). کدی که یک عمل مجوزخواه را اجرا میکند، یک درخواست دسترسی به کد را باید اجرا کند، و این درخواست باعث میشود که CLR روی پشته تماس راه برود، و مجموعه مجوز اعطا شده به اسمبلی هر شگرد موجود در پشته تماس را بازرسی نماید. گروه کدی و مجموعه مجوز توسط مدیر ماشین تعیین میشوند، یعنی مدیر در واقع خطمشی امنیتی را تعریف میکند.
گواهی
یک گواهی میتواند هر نوع اطلاعات مرتبط با یک اسمبلی باشد. انواع گواهی پیشفرضی که توسط امنیت دسترسی به کد داتنت استفاده میشود، شامل این موارد است:
- دایرکتوری کاربردی: دایرکتوری که اسمبلی در آن قرار دارد.
- منتشرکننده: امضای دیجیتال منتشرکننده اسمبلی (نیاز دارد که اسمبلی توسط گواهینامه کد امضا گردد)
- URL: یوآرال کاملی است که اسمبلی از آن اجرا میگردد.
- سایت: نام میزبان URL یا دامنه دوردست یا VPN
- منطقه (زون): منطقه امنیتی که اسمبلی در آن قرار دارد.
- درهمک: درهمک رمزنگارانه اسمبلی، این درهمک تعیینکننده نسخه خاصی است.
- نام نیرومند: ترکیبی از نام اسمبلی، ورژن، و کلید عمومی برای کلید امضایی است که از آن برای امضای اسمبلی استفاده میشود. کلید امضایی یک گواهینامه X.509 نیست، بلکه یک جفت کلید سفارشی است که توسط یک «ابزار نامگذاری نیرومند» (مثل SN.EXE یا ویژوال استودیو) تولید شدهاست.
توسعهدهنده میتواند از گواهیهای سفارشی استفاده کند (که به آن گواهی اسمبلی هم گفته میشود) اما در این زمینه، به نوشتن یک اسمبلی امنیتی نیاز است و در نسخه ۱٫۱ داتنت این امکان کار نمیکند.
گواهی مبتنی بر درهمک اسمبلی را به سادگی میتوان در کد به دست آورد. برای مثال در C#، به کمک عبارت کدی زیر میتوان یک یک گواهی را به دستآورد:
this.GetType().Assembly.Evidence
خطمشی
یک خطمشی مجموعهای از عبارتها است که از گواهی استفاده میکند تا عضویت در یک گروه کدی را تعیین نماید. یک گروه کدی در واقع یک مجموعه مجوز را برای اسمبلیهای موجود در آن گروه تحویل میدهد. چهار نوع خطمشی در داتنت وجود دارد:
- سازمانی: خطمشی برای خانواده ماشینها که بخشی از یک نصب اکتیو دایرکتوری است.
- ماشین: خطمشی برای ماشین فعلی.
- کاربر: خطمشی برای کاربر وارد شده.
- دامنهاپ: خطمشی برای دامنه برنامه کاربردی درحالاجرا.
سه خطمشی اول در فایلهای XML ذخیره میگردد، و توسط ابزار پیکربندی داتنت 1.1 (mscorcfg.msc) اداره میگردد. خطمشی نهایی از طریق کد برای دامنه کاربردی فعلی اداره میگردد.
امنیت دسترسی به کد، «گواهی اسمبلی» را به هر «خطمشی» ارائه میدهد، و سپس اشتراک آنها را میگیرد (که نتیجه، مجوزهایی است که در همه مجموعه مجوزهای تولیدشده مشترک است) و به عنوان مجوزهای اعطاشده به اسمبلی شناخته میشود.
به صورت پیشفرض، خطمشیهای سازمانی، کاربری، و دامنهاپ اعتماد کامل را به دست میدهند (یعنی به همه اسمبلیها اجازه داشتن همه مجوزها را میدهد) و خطمشی ماشین محدود کنندهتر است. و به دلیل آنکه در نهایت اشتراکگیری میشود، این یعنی مجموعه مجوز نهایی، توسط «خطمشی ماشین» تعیین میگردد.
توجه کنید که سامانه خطمشی در چارچوب داتنت ۴٫۰ حذف شدهاست.[1]
گروه کدی
«گروه کدی» یک قطعه گواهی را به یک مجموعه مجوز نامدار مرتبط میکند. مدیر از ابزار پیکربندی داتنت استفاده میکند، تا نوع خاص گواهی را تعیین نماید (مثلاً سایت) و همچنین یک مقدار خاص برای آن گواهی را تعیین کند (مثلاً www.mysite.com) و سپس مجموعه مجوزی که به آن گروه کدی اعطا خواهد شد را تعیین میکند.
درخواستها
کدی که یک عمل مجوزخواه را اجرا میکند، باید یک درخواست برای یک یا بیشتر مجوز بدهد. این درخواست منجر به آن میشود که CLR روی پشته تماس حرکت کند، و برای هر شگرد، CLR اطمینان حاصل میکند که مجوزهای درخواستشده در میان مجوزهای اعطاشده به اسمبلی شگرد قرار دارد. اگر مجوز اعطا نشود، آنوقت یک استثنای امنیتی پرتاب خواهد شد. این موضوع از اجرای اعمال مجوزخواه توسط کد دانلود شده جلوگیری میکند. برای مثال، اگر اسمبلی از یک سایت نامطمئن دانلود شده باشد، این اسمبلی مجوزهای IO فایلی را ندارد، بنابراین اگر اسمبلی سعی کند که به یک فایل دسترسی بیابد، یک استثنا پرتاب میشود که از فراخوانی آن جلوگیری میکند.
منابع
- مشارکتکنندگان ویکیپدیا. «Code Access Security». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۵ اسفند ۱۳۹۹.