Иллюстрированный самоучитель по Architecture .NET

Защита доступа к коду. Политика безопасности. Разрешения.

Одна из трудностей мира программ, таких, как компоненты от сторонних производителей и загружаемый по сети код, состоит в следующем: вы открываете свою систему для угрозы и риска, идущих от выполняемого кода неизвестного происхождения. Возможно, вы захотите, чтобы доступ к макросам такого приложения как Word был ограничен только документом, в котором они находятся. И безусловно, следует пресечь выполнение потенциально злонамеренных Web-сценариев. Кроме того, необходимо оградить свою систему от ошибок в программах, полученных от известных поставщиков. Для этого предназначена защита доступа к коду CAS (Code Access Security) – составная часть системы защиты .NET.

Политика безопасности

В основе защиты доступа к коду (CAS) лежит идея, что сборкам можно присваивать те или иные уровни доверия и ограничивать работу кода внутри этих сборок лишь некоторым набором операций. Безопасность доступа к коду еще называется безопасностью на основе подтверждения. Название подтверждение связано со следующим фактом: для принятия решений, что же можно делать коду, общеязыковая среда выполнения CLR использует некоторую информацию (подтверждение). Частью подтверждения может быть место, откуда код загружается, или цифровая подпись кода (кто именно его подписал). Политика безопасности – это конфигурируемый набор правил, используемый общеязыковой средой выполнения CLR для принятия таких решений. Эта политика устанавливается администраторами. Она может устанавливаться на уровне предприятия, машины, пользователя или прикладной области.

Разрешения

Политика безопасности определяется с помощью разрешений. Разрешения – это объекты, используемые для описания прав и полномочий сборок на доступ к другим объектам или на выполнение некоторых действий. Сборки могут запрашивать определенные разрешения. Именно политикой безопасности определяется, какие именно разрешения будут предоставлены сборке.

Вот, например, некоторые из тех классов, которые предоставляют разрешения:

  • SecurityPermission управляет доступом к системе безопасности. В понятие управления доступом входит право вызывать неуправляемый код, управлять потоками, принципалами, прикладными областями, подтверждениями и т.п.,
  • FilelOPermission управляет доступом к файловой системе;
  • ReflectionPermission управляет доступом к метаданным, не являющимся общедоступными, а также к динамической генерации модулей, типов и членов.

Все классы разрешений являются производными от базового класса CodeAccessPermission, поэтому они ведут себя одинаково.

Запрос на некоторые разрешения можно формировать с помощью значений параметров сборки. Общеязыковая среда выполнения CLR использует метаданные для определения того, какие именно разрешения запрашиваются. Затем, используя личность кода и уровень доверия, общеязыковая среда выполнения CLR на основе политики безопасности решит, можно ли предоставить эти разрешения.

Код перед выполнением определенных ветвей может с помощью программных средств требовать (то есть запрашивать), чтобы вызывающий его код имел те или иные разрешения. Если требование не выполняется, то общеязыковая среда выполнения CLR запускает исключение System::Security::SecurityException. Требуя любое разрешение, надо быть готовым перехватить это исключение и работать в ситуации, когда разрешение не предоставлено. Большинству программистов не нужно требовать разрешений, потому что библиотеки каркаса .NET делают это от вашего имени за вас. Впрочем, вы все равно должны быть готовы обеспечить обработку исключений.

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

Определение личности кода равнозначно вопросу опознавания в традиционной системы безопасности. А. вот вопрос о разрешениях решается на основе разрешений, предоставленных сборке ил и отнятых у нее.

Многие из классов, поддерживающих разрешения, находятся в пространстве имен System::Secunty::Permissions (Система::Безопасность::Разрешения). Кроме того, разрешения поддерживаются и некоторыми классами из пространств имен System::Net (Система::Сеть) и System::Data (Система::Данные).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.