RUS_-_Karejev_-_Razrabotka_Windows-prilozhenij
.pdf
EventLogPermission |
Журнал событий |
FileDialogPermission |
Диалоги открытия, сохранения файлов в пользовательском интерфейсе приложения |
FileIOPermission |
Работа с файлами |
IsolatedStorgeFilePermission |
Изолированное хранилище файлов |
MessageQueuePermission |
Очереди сообщений |
OleDbPermission |
Базы данных, доступ к которым осуществляется средствами поставщика данных OleDB |
PerformanceCounterPermission |
Счетчики производительности |
PrintingPermission |
Печать |
ReflectionPermission |
Информация о типах во время выполнения |
RegistryPermission |
Реестр |
SecurityPermission |
Работа с правами доступа |
ServiceControllerPermission |
Запуск или остановка Windows-служб |
SocketPermission |
Соединение с компьютером через порты |
SqlClientPermission |
Базы данных, доступ к которым осуществляется средствами SqlClient провайдера |
UIPermission |
Пользовательский интерфейс |
WebPermission |
Соединение с компьютерами через web-интерфейс |
В дополнение к встроенным разрешениям вы можете создать собственные, основываясь на классе CustomPermission.
Функционирование безопасностидоступакода
.NET Framework принудительно налагает разрешения на управляемый код. Каждая загружаемая сборка получает набор разрешений на доступ к различным ресурсам. Эти разрешения основаны на политике безопасности. В свою очередь, политика безопасности использует удостоверение сборки для определения набора разрешений. Другими словами, .NET Framework применяет политику безопасности компьютера для назначения набора разрешений.
Группа кода состоит из условий членства в группе и набора разрешений, которые могут быть назначены сборке, если она будет находиться в данной группе. Если сборка подходит по условию к какому-либо членству, то она может получить сопоставимые с этим членством разрешения. Когда сборка подходит по условию к какому-либо членству, то говорится, что эта сборка принадлежит тому членству. Например, одним из условий членства в группе может быть условие, чтобы производителем сборки была компания Microsoft. Из этого следует, что любая сборка, разработанная компанией Microsoft, будет иметь право получить весь набор разрешений, разрешенный этому членству. Одним из таких разрешений может быть доступ к папке Temp рабочего каталога или доступ к имени пользователя.
Сборка получает общий набор разрешений от всех членств, к которым она принадлежит.
Уровни безопасности
Существует несколько уровней безопасности: сеть, компьютер, пользователь, домен приложения (дополнительный уровень). В таблице 10.2 дано описание каждого уровня.
|
Таблица 10.2. Уровни безопасности |
Уровень безопасности |
Описание |
Сеть (Enterprise level) |
Уровень контролируется администратором сети и содержит группы кода, которые могут быть |
|
назначены любому управляемому коду во всей корпоративной сети |
Компьютер (Machine) |
Уровень контролируется администратором компьютера и содержит группы кода, которые могут быть |
|
назначены любому управляемому коду, выполняемому на данном компьютере |
Пользователь (User) |
Уровень контролируется пользователем компьютера и содержит группы кода, которые могут быть |
|
назначены любому управляемому коду, выполняемому от имени данного пользователя |
Домен приложения |
Дополнительный уровень, позволяющий изолировать, выгружать и ограничивать выполняемый |
(Application Domain) |
управляемый код |
Окончательный набор разрешений получается в результате суммы всех разрешений от каждой сборки, т.к. каждая сборка может иметь свой набор разрешений (рис. 10.4).
Рис. 10.4. Принцип работы безопасности доступа кода
Среда выполнения Common Language Runtime (CLR) также имеет стандартную политику безопасности и использует ее набор разрешений ( табл. 10.3).
|
Таблица 10.3. Набор разрешений CLR |
Отсутствие |
Отсутствуют какие-либо разрешения. Код не может быть запущен. Код из "небезопасной" зоны использует эту |
разрешений |
политику безопасности. |
(Nothing) |
|
Извлечение |
Предоставляет разрешение только на запуск приложения. Не разрешает приложению использовать какие- |
(Execution) |
либо ресурсы |
Интернет (Internet) |
Предоставляет разрешения на выполнение кода, открытие диалоговых окон, создание web-соединений с |
|
сайтом, с которого установлено приложение, и использование изолированного хранилища с ограниченным |
|
размером. По умолчанию, весь код из Интернета и "небезопасные" зоны используют эту политику |
|
безопасности |
Корпоративная |
Предоставляет разрешения на запуск кода; его выполнение без ограничений; использование изолированного |
интрасеть (Local |
хранилища без лимита; использование DNS-служб; использование таких данных, как имя пользователя и |
Intranet) |
временных переменных; создание web-соединения с сайтами, с которых взяты сборки, используемые в |
|
приложении; чтение и сохранение файлов из того же каталога, что и приложение. По умолчанию, весь код из |
|
сети использует эту политику безопасности |
Весь доступ |
Предоставляет все стандартные разрешения, кроме отмены верификации |
(Everything) |
|
Полный доступ (Full |
Предоставляет полный доступ ко всем ресурсам. По умолчанию, весь управляемый код локального |
Trust) |
компьютера использует эту политику безопасности |
Использование безопасностидоступакода
Каждое приложение, которое использует CLR, должно взаимодействовать с системой безопасности во время выполнения. Когда приложение выполняется, CLR автоматически проверяет все сборки приложения и возвращает набор разрешений. В зависимости от набора разрешений или ресурсов, с которыми работает приложение, оно либо выполняет заданные действия, либо генерирует исключение безопасности.
Настройки безопасности каждого компьютера индивидуальны. Они меняются в зависимости от пользователя, администратора компьютера или администратора сети, и нет никакой гарантии, что ваше приложение получит необходимые разрешения на выполнение операций.
Взаимодействие с системой безопасности во время выполнения осуществляется двумя способами: императивным и декларативным. Декларативный способ взаимодействия осуществляется с помощью атрибутов, императивный – с помощью объектов классов в вашем приложении. Некоторые операции могут быть выполнены с помощью одного из способов, а некоторые — любым из них.
Из-за того, что большинство разрешений уже встроены в .NET Framework, практически не приходится создавать собственные разрешения. Выполняемый код, взаимодействующий с определенными ресурсами, проходит проверку и получает разрешения на использование данных ресурсов. Итак, основной задачей на стадии разработки остается лишь документирование необходимых приложению разрешений для того, чтобы быть уверенным, что приложение их получит. Это делается с помощью запроса разрешений и утилит настройки политики безопасности.
Для того чтобы добавить запрос на определенное разрешение, необходимо добавить соответствующий атрибут в файл ApplicationInfo.cs проекта. При компиляции сборки эти атрибуты сохранятся в метаданных. Запросы на разрешения проверяются CLR во время загрузки сборки. Существует три вида запросов, описание которых приводится в таблице 10.4.
|
Таблица 10.4. |
Запрос |
Описание запроса |
Запрос минимального набора |
Запрашивает необходимый минимум для корректной работы приложения. Если это разрешение не |
разрешений |
назначено политикой безопасности, то CLR не выполнит операции, а сгенерирует исключение типа |
(RequestMinimum) |
PolicyException. Этим запросом необходимо пользоваться только для минимальных разрешений |
|
Представляет набор разрешений, с которыми может работать ваше приложение, но без которых оно |
Запрос дополнительного |
|
набора разрешений |
сможет корректно выполнять действия. Этим запросом описывают дополнительную |
(RequestOptional) |
функциональность приложения. Если это разрешение не назначено политикой безопасности, то |
|
приложение будет продолжать работать |
Запрос на отказ от |
Указываются разрешения, которые ваше приложение использовать не будет. Запросы указываются |
разрешений (RequestRefused) |
для обеспечения дополнительной безопасности |
В лекции 2 мы работали с проектом BinaryReadWrite. Скопируйте всю папку проекта и переименуйте ее в Permissions. Снова
поместите в папку bin\Debug какой-нибудь файл формата MP3 и назовите его music.mp3. Запустите проект и убедитесь в том, что в этой же папке появился записанный файл newmusic.mp3. Теперь добавляем пространство имен System.Security и соответствующий блок исключений:
using System; using System.IO;
using System.Security; namespace BinaryReadWrite
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
//Добавляем блок обработки исключений try
{
//Создаем новый поток Chtenie и указываем файл для чтения — music.mp3 FileStream Chtenie = new FileStream("music.mp3", FileMode.Open);
//Создаем экземпляр br класса BinaryReader и связываем его с потоком Chtenie BinaryReader br = new BinaryReader(Chtenie);
// Создаем массив типа байтов и //передаем ему размер в байтах — (например, 1000000 ) записываемого файла byte[] n = br.ReadBytes(1000000);
//Закрываем поток br.Close();
//Создаем новый поток Zapis и указываем название файла для записи
sozdanajamuzika.mp3
FileStream Zapis = new FileStream("newmusic.mp3", FileMode.CreateNew,
FileAccess.Write);
//Создаем экземпляр wr класса BinaryWriter и связываем его с потоком Zapis BinaryWriter wr = new BinaryWriter(Zapis);
// Можно связывать объект wr с потоком, создавая его без названия: //BinaryWriter wr = new BinaryWriter(new FileStream("sozdanajamuzika.mp3",
FileMode.CreateNew, FileAccess.Write));
//Передаем в поток массив байтов n wr.Write(n);
//Закрываем поток br.Close();
}
catch (SecurityException ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Листинг 10.1.
В окне Solution Explorer дважды щелкаем на файл AssemblyInfo.cs и для использования атрибутов добавляем пространство имен
System.Security.Permissions:
using System.Reflection;
using System.Runtime.CompilerServices; using System.Security.Permissions;
В конце листинга AssemblyInfo.cs определяем минимальный набор разрешений:
// Запрос минимального набора разрешений
[assembly: UIPermission(SecurityAction.RequestOptional, Window = UIPermissionWindow.SafeTopLevelWindows)]
[assembly: PermissionSet(SecurityAction.RequestOptional, Name = "LocalIntranet")]
Это разрешение не было назначено политикой безопасности, поэтому генерируется исключение (рис. 10.5).
увеличить изображение
Рис. 10.5. Сгенерированное исключение при определении минимального набора разрешений
Для получения доступа следует определять другие наборы разрешений и настраивать политику безопасности. Например, данный запрос разрешений указывает, что сборка не нуждается в дополнительных разрешениях:
[assembly:PermissionSet(SecurityAction.RequestOptional, Unrestricted = false)]
На диске, прилагаемом к книге, вы найдете приложение Permissions (Code\Glava10\ Permissions).
Администрированиеполитики безопасности
С помощью утилиты Microsoft .NET Framework 1.1 Configuration можно настраивать политику безопасности на компьютере. Для ее запуска переходим в Мой компьютер\Панель управления\Администрирование\Microsoft .NET Framework 1.1 Configuration. Открываем вкладку Runtime Security Policy (рис. 10.6).
увеличить изображение
Рис. 10.6. Утилита Microsoft .NET Framework 1.1 Configuration
Окно программы разделено на две части. В левой мы можем выбирать нужный объект, в правой немедленно выводится панель информации с описанием этого объекта и ссылками на возможные действия. Для каждого уровня безопасности — Enterprise, Machine и User (описание см. в табл. 10.2) — имеется своя настройка трех категорий — Code Groups, Permission Sets и Policy Assemblies. Поскольку сами категории совершенно одинаковы для всех уровней, выберем один уровень — Machine — и рассмотрим настройку доступа. Переходим на вкладку Machine —> Code Groups —> All Code —> My_Computer_Zone. На панели описания мы видим описание данной группы кода и ее свойства — условия членства в группе и набор разрешений для данной группы (рис. 10.7).
увеличить изображение
Рис. 10.7. Свойства группы My_Computer_Zone
В этой группе кода определяется доступ на локальном компьютере, аналогично на вкладках LocalIntranet_Zone и Internet_Zone — доступ внутри локальной сети и в Интернете. Если настройка доступа для групп кода My_Computer_Zone и LocalIntranet_Zone представляет ограниченный интерес, то изменение свойств Internet_Zone требуется гораздо чаще — ведь большинство деструктивных действий, совершаемых без ведома пользователя, осуществляется через Интернет. Щелкнем правой кнопкой мыши на группе Internet_Zone и в появившемся контекстном меню выберем "Свойства". На вкладке Membership Condition по умолчанию определено условие членства в этой группе — зона Internet. В выпадающем списке Condition Type, представляющем различные возможные условия вступления в членство этой группы, выбираем условие Strong Name. Теперь нам следует указать открытый ключ, в дополнение к нему можно задать название и версию сборки (рис. 10.8).
Рис. 10.8. Условие вступления Strong Name в членство группы Internet_Zone
После введения необходимых данных переключаемся на вкладку Permission Set, где определяем набор разрешений для этой группы. После завершения редактирования и закрытия окна свойств изменения вступят в силу. Для создания собственного набора разрешений щелкаем правой кнопкой на вкладке Permission Sets и выбираем пункт меню New (рис. 10.9).
Рис. 10.9. Создание набора разрешений Permission Sets
В появившемся окне вводим имя нового набора разрешений и его описание (рис. 10.10).
Рис. 10.10. Создание нового набора разрешений В следующем окне выбираем набор из предлагаемого списка разрешений (рис. 10.11).
Рис. 10.11. Добавление разрешений к новому набору
При выборе каждого разрешения появляется окно дополнительных свойств, предлагающих более детальную настройку — например, доступ только для чтения, для чтения и записи или только записи. Созданный набор разрешений отображается в списке Permission Sets и может быть использован для настройки политики безопасности учетной записи, компьютера или корпоративной сети.
Тестирование безопасностидоступакодаприложения. УтилитаCaspol.exe
Утилита командной строки caspol.exe, поставляемая с .NET Framework, позволяет просматривать и манипулировать политикой безопасности. Файл утилиты располагается в каталоге С\WINDOWS\Microsoft.NET\Framework\ v1.1.4322\ CasPol.exe.
Утилита caspol.exe отображает всю доступную информацию об уровне безопасности, установленном по умолчанию (Machine). Эта информация включает в себя иерархию групп кода, название набора разрешений и имена сборок, использующих политику Full Trust.
Утилита caspol.exe имеет следующий синтаксис:
caspol <параметры> <аргументы>
В таблице 10.5 приводится список некоторых параметров утилиты.
|
Таблица 10.5. Некоторые парметры утилиты caspol.exe |
|
Параметр |
Действие |
Примечания |
-l |
Список (List) |
Вывод всей доступной информации об уровне безопасности, установленном по умолчанию |
-lg |
Список групп кода (List |
Вывод списка групп кода уровня безопасности, установленного по умолчанию |
|
Group Code) |
|
-lp |
Список наборов |
Вывод списка наборов разрешений |
|
разрешений (List |
|
|
Permission Set) |
|
-ag |
Добавление группы кода |
Добавление новой группы кода в уровень безопасности |
|
(Add Code Group) |
|
-url |
URL |
Использование сборкой URL в качестве условия принадлежности к группе |
-n |
Название группы кода |
Задание имени для новой группы кода |
|
(Code Group Name) |
|
- |
Установка флага Exclusive |
Используется для тестирования. Любая сборка, встретившая условие группы кода, получает |
exclusive |
для уровня безопасности |
соответствующий набор разрешений. Например, это может применяться для предотвращения |
|
|
автоматического назначения набора разрешений Full Trust |
-cg |
Поменять группу кода |
Изменение существующей группы кода |
|
(Change Code Group) |
|
-rg |
Удалить группу кода |
Удаление существующей группы кода |
|
(Remove Code Group) |
|
Для работы с утилитой выбираем Пуск\Все программы\ Microsoft Visual Studio .NET 2003 \ Visual Studio .NET Tools \ Visual Studio .NET 2003 Command Prompt и в запустившейся командной строке вводим
caspol.exe
Появляется справка утилиты, которую затем можно снова вывести одной из команд
caspol –help caspol -? caspol /?
Для вывода информации о группах кода и наборов разрешений вводим
Рис. 10.12. Результат приложения WindowsIdentityandPrincipal
На диске, прилагаемом к книге, вы найдете приложение WindowsIdentityandPrincipal (Code\Glava10\ WindowsIdentityandPrincipal)
.
Использование объектовGenericIdentity иGenericPrincipal
Классы GenericPrincipal совместно с классом GenericIdentity применяются для реализации ролевой безопасности, не зависящей
от системы безопасности Windows. Например, у пользователя запрашиваются имя и пароль, которые затем сверяются с данными, хранящимися в приложении или локальной базе данных, и, после успешной проверки, создаются объекты GenericPrincipal и
GenericIdentity на основании введенных значений.
Для реализации ролевой безопасности на основе объектов классов GenericPrincipal и GenericIdentity необходимо выполнить следующие действия:
создать новый объект класса GenericIdentity и инициализировать его именем пользователя;
создать новый объект класса GenericPrincipal и инициализировать его только что созданным объектом класса
nericIdentity и строковым массивом, содержащим роли пользователя;
прикрепить созданный объект класса GenericPrincipal к текущему потоку. Прикрепление к текущему потоку необходимо для осуществления последующей проверки полномочий пользователя в коде приложения.
Синтаксис этих действий следующий:
//Создаем и инициализируем именем пользователя
//объект класса GenericIdentity
GenericIdentity identity = new GenericIdentity("Username"); // Создаем строковый массив, содержащий роли пользователя.
string[] userRoles = new string[]{"Administrator", "PowerUser", "GuestUser"};
//Создаем объект класса GenericPrincipal и инициализируем его
//объектом класса GenericIdentity identity и строковым массивом с
//ролями.
GenericPrincipal principal = new GenericPrincipal(identity, userRoles);
//Прикрепляем объект роли к текущему процессу.
//Этот и все дочерние процессы будут иметь данную роль. Thread.CurrentPrincipal = principal;
Создайте новое консольное приложение и назовите его GenericIdentityandPrincipal . Далее привожу листинг с комментариями:
using System;
using System.Threading;
using System.Security.Principal;
namespace GenericIdentityandPrincipal
{
///<summary>
///Summary description for Class1.
///</summary>
class Class1
{
[STAThread]
static void Main(string[] args)
{
//Создаем и прикрепляем объект роли. CreateGenericPrincipalAndIdentity(Roles.PowerUser);
//Вводим один из способов осуществления проверки роли. if(Thread.CurrentPrincipal.IsInRole("User"))
{
Console.WriteLine("У вас нет прав для работы с этим приложением");
}
else if(Thread.CurrentPrincipal.IsInRole("PowerUser"))
{
Console.WriteLine("Добро пожаловать, {0}. Ваша роль — Продвинутый пользователь",
Thread.CurrentPrincipal.Identity.Name);
}
else // Administrator
{
Console.WriteLine("Добро пожаловать, {0}. Ваша роль — Администратор", Thread.CurrentPrincipal.Identity.Name);
}
}
// Создание объектов личности и роли
static void CreateGenericPrincipalAndIdentity(Roles role)
{



