Политика безопасности хранится в нескольких XML-файлах конфигурации. Конфигурация защиты машины находится в файле security.config, который хранится в папке
\WINNT\Microsoft.NETXFramework\vx.x.xxxx\CONFIG. Конфигурация защиты пользователя также хранится в файле security. config, но этот файл хранится в другой папке, \Documents and Settings\UserName\Application DataXMicrosoft\CLR Security Config\vx.x.xxxx.
Редактировать эти XML-файлы напрямую не рекомендуется. Делать изменения в политике на уровнях предприятия, машины и пользователя можно с помощью сервисной программы caspol.exe (Code Access Security Policy, Политика защиты доступа к коду), запускаемой с командной строки.
Сервисная программа администрирования .NET Admin Tool, которая также позволяет изменять политику, имеет более дружественный интерфейс. Она была описана в главе 7 "Сборки и развертывание". Эта сервисная программа является дополнительным модулем, присоединенным к консоли ММС, ее можно запустить двойным щелчком на файле \WINNT\Microsoft.NET\Framework\vl. 0.2914 \mscorcf g.mse. (Если версия сервисной программы больше, то папка будет другой.) На Рисунок 13.4 показаны кодовые группы и наборы разрешений, определенные для машины, а также уровни политики безопасности текущего пользователя — именно так, как они отображаются в левой области окна сервисной программы администрирования .NET Admin Tool.
Давайте с помощью этого инструмента изучим текущие политики на машинном уровне. Вначале посмотрим на именованные наборы разрешений. Как видно из Рисунок 13.4, кроме именованных наборов разрешений, заданных по умолчанию, на машинном уровне пока что не создано ни одного такого набора. Если выбрать именованный набор разрешений Internet, а затем в правой области окна — View Permissions (Просмотр разрешений), то можно будет выбирать любое разрешение и просматривать его параметры. На Рисунок 13.5 как раз показаны параметры для разрешения Userlnterface, находящегося в именованном наборе Internet.
На Рисунок 13.6 показаны свойства кодовой группы в зоне Internet для политики на машинном уровне. Видно, что для этой группы выбран тип условия Zone (Зона), а значением, связанным с этим типом, является зона Internet. Просмотреть или выбрать именованный набор разрешений, связанный с зоной Internet, можно на вкладке Permission Set (Набор разрешений).
Чтобы показать, как политика безопасности влияет на выполнение кода, рассмотрим пример Policy (Политика). Этот пример, если не учитывать показанный ниже код, аналогичен уже рассмотренному примеру Evidence (Подтверждение) Кроме вывода информации, относящейся к подтверждению, при выполнении примера Policy (Политика) выводится также содержимое файла read txt.
String *filename = ".\\read.txt"; // Строка
try
{
String *fileWithFullPath = // Строка
Path::GetFullPath(filename); // имя файла
Filelnfo *file = new Filelnfo(filename); // имя файла
StreamReader *sr = file->OpenText(); // файл
String *text; // Строка
text = sr->ReadLine(); // текст
while (text '=0)
// пока (текст1 = 0)
{
Console::WriteLine(text); // текст
text = sr->ReadLine(); // текст
}
sr->Close();
}
catch(Exception *e) // Исключение
{
Console::WriteLine(e->Message); // Сообщение
}
Если, ничего не изменяя в пользовательской политике безопасности, заданной по умолчанию, выполнить программу Policy (Политика), то можно увидеть, что эта программа успешно читает файл Ну, а если сделать в политике описанные ниже изменения, то при попытке прочитать файл выполнение этого примера аварийно завершится с запуском исключения Security Exception (Исключение защиты)
На рис 13 7 показана проводимая по умолчанию пользовательская политика (Сейчас мы работаем не на машинном уровне, а на уровне пользователя )
Теперь, чтобы можно было управлять политикой безопасности для сборки примера Policy (Политика), мы добавим новый именованный набор разрешений, TestStrongName, а также новую именованную кодовую группу, TestStrongNameGroup
Чтобы добавить новый набор разрешений, щелкните правой клавишей мыши на узле PermissionSets, расположенном под нужным уровнем (в данном случае под уровнем пользователя (User)) Затем выберите команду New (Создать) Появится начальный экран диалога Create Permission Set (Создать набор разрешений), который можно заполнять данными так, как показано на Рисунок 13.8.
Затем щелкните на кнопке Next (Далее) Тогда вы увидите следующий экран диалога Create Permission Set (Создать набор разрешений), Рисунок 13.9.
Редактировать те или иные элементы набора разрешений можно, как показано на Рисунок 13.10, с помощью кнопок Add (Добавить) и Remove (Удалить) Установить значения параметров разрешения можно в диалоге Permission Settings (Параметры разрешения) (здесь не показан) при добавлении разрешения В диалоговом окне Permission Settings (Параметры разрешения) для конкретного разрешения можно выбрать все необходимые значения параметров, а также установить переключатель для того, чтобы сборки получили неограниченный доступ к конкретному разрешению Результат показан на рис 13 10
Чтобы завершить создание набора разрешений, щелкните на кнопке Finish (Готово) В конце названия узла политики User (Пользователь) должна появиться звездочка, которая означает, что узел был изменен, но изменения еще не сохранены Чтобы их сохранить, щелкните правой кнопкой мыши на узле политики User (Пользователь) и выберите команду Save (Сохранить)
Захотев изменить уже добавленное разрешение, в сервисной программе администрирования NET Admin Tool выполните двойной щелчок на названии разрешения, и сделайте нужные изменения На рис 1311 показано диалоговое окно, в котором можно изменять разрешение Userlnterface
Если вы изменили какую-либо политику, то в конце ее названия также появится звездочка, указывая, что эти изменения еще не сохранены. Чтобы их сохранить, щелкните правой кнопкой на узле политики User (Пользователь) и выберите команду Save (Сохранить).
Теперь это разрешение следует связать с кодовой группой, причем этой группе должна быть назначена сборка Policy.exe. Именем новой кодовой группы будет TestStrong-NameGroup. Данная группа создается путем выбора родительской группы (в нашем случае это All_Code) и затем в контекстном меню — команды New (Создать). Далее надо ввести нужную для мастера информацию. Появится диалоговое окно Create Code Group (Создать кодовую группу), которое заполняется так, как показано на Рисунок 13.12.
Введя в это окно нужную информацию, щелкните на кнопке Next (Далее). Тогда будет выведен второй экран диалога Create Code Group (Создать кодовую группу), который дает возможность указать условие членства кода в группе. Сборкам, удовлетворяющим указанному условию, будут предоставлены разрешения, относящиеся к этой кодовой группе. В поле со списком выберите, как на Рисунок 13.13, набор разрешений StrongName. Кроме того, укажемте открытый ключ для строгого имени сборки Policy.exe. Этот открытый ключ выводится при запуске программы Policy.exe; его также можно получить из сборки с помощью Ildasm.exe.
Щелкните на кнопке Next <Далее) — и вы увидите третий экран диалога Create Code Group (Создать кодовую груп пу), который дает возможность назначить кодовой группе тот или иной набор разрешений. Б$ ыберите созданный ранее набор TestStrongName (Рисунок 13.14).
После этого щелкните на кнопке Next (Далее), а затем — на кнопке Finish (Готово). Теперь надо будет сохранить политику в узле User (Пользователь); с этой целью нужно щелкнуть на узле правой кнопкой мыши и выбрать команду Save (Сохранить).
Чтобы просмотреть сделанные вами изменения, в сервисной программе администрирования .NET Admin Tool щелкните на TestStrongNameGroup и выберите Properties (Свойства). На Рисунок 13.15 показано, что группа TestStrongNameGroup связана со строгим именем в сборке policy.exe. А на Рисунок 13.16 видно, что эта группа связана с набором разрешений TestStrongName.
На вкладке General (Общие) установите, как показано на Рисунок 13.17, флажок "This policy level will only have the permissions from the permission set associated with this code group" ("Этот уровень политики будет иметь разрешения только из набора разрешений, связанного с данной кодовой группой").
Установка этого флажка означает, что для сборки будут использоваться только те разрешения, которые явно указаны в наборе разрешений. Если флажок не будет установлен, то вы не сможете увидеть запуск исключения безопасности, когда программа Policy (Политика) попытается что-либо записать в файл. Щелкните на кнопке ОК. Затем щелкните правой кнопкой на узле User (Пользователь) и выберите команду Save (Сохранить).
Вспомните, что в созданный ранее набор разрешений TestStrongName не было добавлено FilelOPermission. Еще вспомните, что программа Policy.exe пытается читать файл. Чтобы опять увидеть результат такого чтения, снова запустите Policy.exe. Теперь вы заметите, что эта программа запустила исключение безопасности (Security exception), потому что в связанном с ней наборе разрешений нет FilelOPermission.
На Рисунок 13.18 показаны новая кодовая группа, которая называется TestStrongNameGroup, а также новый набор разрешений. Этот набор разрешений называется TestStrongName. Он был добавлен на уровне политики пользователя, чтобы управлять политикой безопасности для сборки Policy (Политика).