Файл machine.config

153

Управление конфигурацией в ASP.NET осуществляется с помощью конфигурационных файлов XML. В них хранится вся информация, необходимая для настройки основных параметров приложения ASP.NET, а также параметров, специфичных для вашего приложения.

Конфигурирование начинается с файла machine.config, который находится в каталоге с:\Windows\Microsoft.NET\Framework\[версия]\Config. В этом файле определяются поддерживаемые разделы конфигурационных файлов, настраивается рабочий процесс ASP.NET и регистрируются поставщики, которые могут использоваться для работы расширенных средств, таких как профили, членство и безопасность на основе ролей.

По сравнению с ASP.NET 1.x, в последних версиях ASP.NET файл machine.config был значительно упрощен. Для оптимизации процесса инициализации многие используемые по умолчанию параметры, которые раньше отображались в файле machine.config, теперь инициализируются программно. Однако их все равно можно видеть, открыв новый файл machine.config.comments (который находится в том же каталоге, что и machine.config). В этом файле содержится полная текстовая версия всех стандартных параметров вместе с описательными комментариями (это похоже на файл machine.config в ASP.NET 1.x).

Файл machine.config.comments позволяет узнать, какие параметры используются по умолчанию, и затем добавить в machine.config параметры с переопределенными значениями.

Наряду с файлом machine.config ASP.NET использует корневой файл web.config, который находится в том же каталоге и содержит дополнительные параметры настройки. Эти параметры настройки регистрируют основные обработчики HTTP и модули ASP.NET, устанавливают правила поддержки браузеров и определяют политику безопасности.

Все веб-приложения на компьютере наследуют параметры, указанные в этих двух файлах. Однако большинство из этих параметров представляет собой, по сути, основополагающие детали, которые никогда не нужно трогать. Многие из них не применяются, когда приложение развертывается на веб-сервере IIS, потому что заменяются похожими параметрами в IIS (которые имеют собственный конфигурационный файл по имени ApplicationHost.config). В следующем разделе описано одно исключение из этого правила — важный фрагмент информации, который по-прежнему размещен в файле machine.config.

Раздел <machineKey>

В разделе <machineKey> можно устанавливать специфичный для каждого сервера ключ, который должен использоваться для шифрования данных и создания цифровых подписей. Шифрование может применяться вместе с несколькими средствами ASP.NET. В ASP.NET оно автоматически используется для защиты cookie-наборов аутентификации с помощью форм, но его также можно применять и для защиты данных состояния представления. Упомянутый ключ также используется и для аутентификации с помощью внепроцессных поставщиков состояния сеанса.

Как правило, раздел <machineKey> принимает следующую форму:

<machineKey validationKey="AutoGenerate,IsolateApps" 
   decryptionKey="AutoGenerate, IsolateApps" validation="SHA1" />

Значение AutoGenerate,IsolateApps показывает, что ASP.NET будет создавать и сохранять ключи, специфичные для машины и для приложения. Другими словами, каждое приложение использует отличающийся, автоматически генерируемый ключ. Это помогает защититься от потенциальных атак, направленных на множество сайтов.

Если вам не нужны ключи, специфичные для приложения, можете выбрать применение одного ключа для всех приложений на текущем компьютере, как показано ниже:

<machineKey validationKey="AutoGenerate" 
   decryptionKey="AutoGenerate" validation="SHA1" />

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

Чтобы решить эту проблему, понадобится определить ключ явным образом в файле machine.config. Ниже показан пример элемента <machineKey> с двумя определенными атрибутами ключа:

<machineKey 
  validationKey="1EA54E005915332011232149..." 
  decryptionKey="1EA54E005915332011232149..." validation="SHA1" />

Можно также жестко закодировать ключи, специфичные для приложения, добавив элемент <machineKey> в файл web.config, который размещен в виртуальном каталоге приложения. Этот подход понадобится, если вы окажетесь в ситуации, в которой комбинируются оба описанных ранее сценария. (К примеру, так нужно будет поступить, если вы запускаете приложение на множестве серверов и эти серверы содержат множество приложений, которым необходимы отдельные ключи.)

Значение validationKey может иметь от 40 до 128 символов. Настоятельно рекомендуется использовать ключи максимально возможной длины. Значение decryptionKey может иметь 16 или 48 символов. Если определено 16 символов, будет применяться шифрование по стандарту DES (Data Encryption Standard — стандарт шифрования данных). Если определено 48 символов, будет использоваться шифрование Triple DES (тройной DES, или 3DES). (Тройное шифрование означает, что алгоритм DES будет применяться три раза подряд.) Взломать шифр 3DES гораздо сложнее, чем DES, поэтому рекомендуется всегда использовать для decryptionKey именно 48 символов. Если задаваемая длина либо один из ключей будут выходить за пределы разрешенных значений, ASP.NET вернет страницу с сообщением об ошибке при запросе приложения.

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

Ниже показана общая подпрограмма CreateMachineKey(), которая создает случайную серию байтов с помощью криптографически устойчивого генератора случайных чисел. Метод CreateMachineKey() принимает один параметр, который определяет количество используемых символов. Результат возвращается в шестнадцатеричном формате, необходимом для файла machine.config:

public static string CreateMachineKey(int length)
{
        // Создать массив байтов
        byte[] random = new byte[length/2];
        
        // Создать криптографически устойчивый генератор случайных чисел 
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
        
        // Заполнить массив байтов случайными байтами
        rng.GetBytes(random); 

        // Создать StringBuilder для размещения результата после 
        // его преобразования в шестнадцатеричный формат
        System.Text.StringBuilder machineKey = new System.Text.StringBuilder(length); 
        
        // Проход в цикле по массиву случайных байтов с присоединением 
        // каждого значения к StringBuilder
        for (int i = 0; i < random.Length; i++)
            machineKey.Append(String.Format("{0:X2}", random[i]));
        
        return machineKey.ToString (); 
} 

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

protected void Page_Load(object sender, EventArgs e)
{
        txtDecryptionKey.Text = CreateMachineKey(48);
        txtValidationKey.Text = CreateMachineKey(128);
}

Далее эту информацию можно скопировать и вставить в файл machine.config на каждом компьютере веб-сайта. Такой подход гораздо удобнее и безопаснее, чем создание ключей вручную.

Наряду с атрибутами validationKey и decryptionKey, которые были описаны выше, можно также выбрать алгоритм, который должен использоваться для создания хеш-кода состояния представления. Для максимально устойчивого шифрования рекомендуется применять алгоритм SHA1, но кроме него также доступны следующие алгоритмы: MD5 (Message Digest 5), который имеет более высокие показатели по производительности, AES (Rijndael) и 3DES (Triple DES).

К названию алгоритма может быть добавлен атрибут проверки достоверности, показывающий, какой метод шифрования должен использоваться для регистрационного удостоверения (login ticket), которое применяется в случае аутентификации с помощью форм. Допустимыми значениями являются AES, DES, 3DES и Auto (используется по умолчанию и варьируется в зависимости от того, какие параметры применяются для аутентификации с помощью форм).

Инструмент IIS Manager (Диспетчер IIS) также позволяет изменять параметры ключей машины. Для этого выберите компьютер веб-сервера в дереве веб-сайта и дважды щелкните на значке Machine Key (Ключ машины). В этой точке можно даже создавать новые случайные ключи для проверки и расшифровки, щелкая на опции Generate Keys (Генерировать ключи) в столбце Actions (Действия) в крайней справа области окна IIS Manager.

Пройди тесты
Лучший чат для C# программистов