Разграничение доступа из кода в WCF - Первый взгляд на CAS

ОГЛАВЛЕНИЕ

Первый взгляд на CAS

.NET Framework определяет 24 различных полномочия безопасности, управляющие работой почти любого типа. Существуют полномочия для файлового ввода/вывода, интерфейса пользователя, безопасности, работы с сетью, доступа к данным и так далее. Тип полномочия может быть применен к определенному ресурсу, скажем полномочие читать из определенного файла в случае полномочия для файлового ввода/вывода или полномочия отображать определенные типы окон в случае полномочия для интерфейса пользователя. В полномочии также может быть полностью отказано (скажем, никаких операций файлового ввода/вывода вообще), либо оно может быть всеобъемлющим (скажем, неограниченный доступ на ввод/вывод из файлов).

Полномочия сгруппированы в наборы полномочий, и каждой сборке назначается свой набор. .NET Framework определяет некоторые стандартные наборы полномочий, такие как FullTrust («Полное доверие», подразумевает все полномочия) или Execution («Исполнение», полномочие только на доступ к ЦП). Администраторы могут использовать средство настройки .NET для определения собственных наборов полномочий, а разработчики могут определять нестандартные наборы полномочий программно – используя файл набора полномочий или определяя манифест приложения ClickOnce с набором полномочий, которых требует приложение.

CLR назначает каждой сборке ее набор полномочий при загрузке сборки. Эти полномочия даются сборкам на основе каких либо доказательств, идентифицирующих последние. Эти доказательства могут быть основаны на происхождении сборки, указывая место, откуда она загружена (например, всему коду, загружаемому из глобального кэша сборок (GAC), дается полное доверие), или на содержимом, указывая какой-либо аспект самой сборки, скажем ее строгое имя.

Каждой области приложения всегда назначается набор полномочий, именуемых политикой безопасности области приложения, и любая сборка, загружаемая в данный момент, попадает под действие этого набора – в противном случае она сталкивается с исключением безопасности. Новые области приложений запускаются с набором полномочий FullTrust, а поскольку весь код, происходящий с локальной машины, также по умолчанию получает FullTrust, большинство приложений на основе .NET работают только в своей исходной настройке, по сути не используя CAS вообще. Это делает программный год (а также пользователя, данные, компьютер и даже сеть) подверженным множеству несчастий – от преодоления безопасности вирусами или червями до простых ошибок пользователя.

Код, исполняющийся с иным уровнем доверия, чем полный, именуется частично доверенным кодом. Когда любая часть управляемого кода пытается получить доступ к ресурсу или выполнить операцию, используя.NET Framework (включая взаимодействие с управляемым кодом), .NET Framework проверяет наличие у сборки, содержащей этот код, необходимых полномочий на выполнение операции. Если у сборки отсутствует необходимое полномочие, .NET Framework выдает исключение безопасности, тем самым отменяя операцию.

Поскольку менее доверенная сборка, содержащая вредоносный код, может «заманить» доверенную сборку в выполнение операций, на выполнение которых у менее доверенной сборки нет полномочий, требовать полномочия только от сборки, выполняющей операцию, недостаточно. Поэтому .NET Framework перебирает весь стек источников вызова, убеждаясь, что каждый источник выше по стеку имеет необходимые полномочия. Этот анализ стека именуется требованием безопасности и выполняется вне зависимости от полномочий выполняющейся сборки.

Код может также подтвердить полномочие – то есть, заявить, что каждый источник вызова выше по стеку имеет требуемые полномочия. Подтверждение полномочия останавливает анализ стека. Код может подтверждать только те полномочия, которые он уже имеет, и только при условии, что у него есть специальное полномочие подтверждения безопасности.

При подтверждении одного полномочия всегда стоит требовать другого вместо него. Разработчики могут требовать или подтверждать полномочия программно, используя специальные классы полномочий или набор совпадающих атрибутов. Разработчики могут также активно отказывать в полномочиях на уровне сборки, класса или метода. Отказ в полномочиях или допуск лишь ограниченного набора полномочий, требуемых для выполнения кода, уменьшает область, открытую для атаки с приманкой. Дополнительные сведения о разграничении доступа из кода приведены в главе 12 второго издания моей книги «Programming .NET Components» («Программирование компонентов .NET»), где этой фундаментальной технологии и ее применениям посвящено более 100 страниц.