KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программное обеспечение » Уильям Стивенс - UNIX: разработка сетевых приложений

Уильям Стивенс - UNIX: разработка сетевых приложений

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Уильям Стивенс, "UNIX: разработка сетевых приложений" бесплатно, без регистрации.
Перейти на страницу:

После вызова функции подготовленное сообщение записывается в сокет.

Чтение ответов

19-30 Программа считывает сообщения и выводит их в цикле при помощи функции print_sadb_msg. Последнее сообщение последовательности имеет порядковый номер 0, что мы трактуем как «конец файла».

Закрытие сокета PF_KEY

31 Мы закрываем открытый в начале работы сокет управления ключами.

Обработка аргументов командной строки

38-48 На долю функции main остается не так уж много работы. Программа принимает единственный аргумент — тип соглашений о безопасности, которые должны быть запрошены из базы. По умолчанию тип равен SADB_SATYPE_UNSPEC. Указав другой тип в аргументе командной строки, пользователь может выбрать интересующие его записи. Наша программа вызывает нашу же функцию getsatypebyname, возвращающую значение типа (константу) по его названию.

Вызов функции sadb_dump

49 Наконец, мы вызываем функцию sadb_dump, которая уже была описана.

Пробный запуск

Ниже приведен пример выполнения программы дампа базы данных безопасности в системе с двумя статическими соглашениями о безопасности.

macosx % dump Sending dump message:

SADB Message Dump, errno 0, satype Unspecified, seq 0, pid 20623

Messages returned:

SADB Message Dump, errno 0. satype IPsec AH, seq 1, pid 20623

SA: SPI=258 Replay Window=0 State=Mature

Authentication Algorithm: HMAC-MD5

Encryption Algorithm: None

[unknown extension 19]

Current lifetime:

0 allocations, 0 bytes

added at Sun May 18 16:28:11 2003, never used

Source address: 2.3.4.5/128 (IP proto 255)

Dest address: 6.7.8.9/128 (IP proto 255)

Authentication key. 128 bits: 0x20202020202020200202020202020202

SADB Message Dump, errno 0, satype IPsec AH, seq 0, pid 20623

SA: SPI=257 Replay Window=0 State=Mature

Authentication Algorithm: HMAC-MD5

Encryption Algorithm: None

[unknown extension 19]

Current lifetime:

0 allocations, 0 bytes

added at Sun May 18 16:26:24 2003, never used

Source address: 1.2.3.4/128 (IP proto 255)

Dest address: 5.6.7.8/128 (IP proto 255)

Authentication key, 128 bits: 0x10101010101010100101010101010101

19.4. Создание статического соглашения о безопасности

Наиболее прямолинейным методом добавления соглашения о безопасности в базу является отправка сообщения SADB_ADD с заполненными параметрами, которые могут задаваться вручную. Последнее затрудняет смену ключей, которая необходима для предотвращения криптоаналитических атак, но зато упрощает настройку. Элис и Боб договариваются о ключах и алгоритмах без использования линий связи. Мы приводим последовательность действий по созданию и отправке сообщения SADB_ADD.

Сообщение SADB_ADD обязано иметь три расширения: соглашение о безопасности, адрес и ключ. Оно может дополняться и другими расширениями: временем жизни, личными данными и параметром важности (sensitivity). Сначала мы опишем обязательные расширения.

Расширение SA описывается структурой sadb_sa, представленной в листинге 19.3.

Листинг 19.3. Расширение SA

struct sadb_sa {

 u_int16_t sadb_sa_len;     /* длина расширения / 8 */

 u_int16_t sadb_sa_exttype; /* SADB_EXT_SA */

 u_int32_t sadb_sa_spi;     /* индекс параметров безопасности (SPI) */

 u_int8_t  sadb_sa_replay;  /* размер окна защиты от повторов или нуль */

 u_int8_t  sadb_sa_state;   /* состояние SA. см. табл. 19.4 */

 u_int8_t  sadb_sa_auth;    /* алгоритм аутентификации, см. табл. 19.5 */

 u_int8_t  sadb_sa_encrypt; /* алгоритм шифрования, см. табл. 19.5 */

 u_int32_t sadb_sa_flags;   /* флаги */

};


Таблица 19.4. Использование расширений

Состояние SA Описание Возможность использования SADB_SASTATE_LARVAL В процессе создания Нет SADB_SASTATE_MATURE Полностью сформированное Да SADB_SASTATE_DYING Превышено гибкое ограничение на время жизни Да SADB_SASTATE_DEAD Превышено жесткое ограничение на время жизни Нет

Таблица 19.5. Алгоритмы аутентификации и шифрования

Алгоритм Описание Ссылка SADB_AALG_NONE Без аутентификации SADB_AALG_MD5HMAC HMAC-MD5-96 RFC 2403 SADB_AALG_SHA1HMAC HMAC-SHA-1-96 RFC 2404 SADB_EALG_NONE Без шифрования SADB_EALG_DESCBC DES-CBC RFC 2405 SADB_EALG_3DESCBC 3DES-CBC RFC 1851 SADB_EALG_NULL NULL RFC 2410

Поле sadb_sa_spi содержит индекс параметров безопасности (security parameters index, SPI). Это значение вместе с адресом получателя и используемым протоколом (например, IPSec АН) уникально идентифицирует соответствующее соглашение о безопасности. При получении пакета значение SPI используется для поиска соглашения, относящегося к пакету. При отправке пакета значение помещается в него для использования получателем. Никаких иных значений SPI не имеет, поэтому назначаться индекс может последовательно, в случайном порядке или с использованием метода, рекомендуемого собеседником. Поле sadb_sa_replay задает размер окна защиты от повторов. Поскольку статические соглашения о защите не дают возможности задействовать эту защиту, мы устанавливаем поле равным нулю. Значение поля sadb_sa_state меняется в зависимости от состояния динамически создаваемых соглашений о безопасности (см. табл. 19.4). Создаваемые вручную соглашения существуют исключительно в состоянии SADB_SASTATE_MATURE. С другими состояниями мы встретимся в разделе 19.5.

Поля sadb_sa_auth и sadb_sa_encrypt определяют алгоритмы аутентификации и шифрования для данного соглашения. Возможные значения этих полей перечислены в табл. 19.5. Единственное значение поля sadb_sa_flags определено в POSIX как константа SADB_SAFLAGS_PFS. Этот флаг требует совершенной безопасности пересылки (perfect forward security), которая состоит в том утверждении, что значение ключа не должно зависеть от предыдущих подключений или какого-либо главного ключа. Флаг используется при запросе ключей у приложения, заведующего ими, но не при создании статических соглашений.

Следующее обязательное расширение команды SADB_ADD должно содержать адреса отправителя и получателя, задаваемые константами SADB_EXT_ADDRESS_SRC и SADB_EXT_ADDRESS_DST. При необходимости может быть указан адрес прокси-сервера SADB_EXT_ADDRESS_PROXY. Подробнее об обработке адресов прокси-серверов вы можете прочесть в RFC 2367 [73]. Адреса задаются в структуре sadb_address, представленной в листинге 19.4. Поле sadb_address_exttype определяет тип адреса (отправителя, получателя или прокси-сервера). Поле sadb_address_proto позволяет выбрать протокол IP или произвольный протокол (значение 0). Поле sadb_address_prefixlen описывает значимый префикс адреса. Это позволяет использовать одно соглашение для множества адресов. За структурой sadb_address следует структура sockaddr соответствующего семейства (например, sockaddr_in или sockaddr_in6). Номер порта из структуры sockaddr используется только в том случае, если поле sadb_address_proto задает протокол, поддерживающий номера портов (например, IPPROTO_TCP).

Листинг 19.4. Структура sadb_address

struct sadb_address {

 u_int16_t sadb_address_len;       /* длина расширения с адресом / 8 */

 u_int16_t sadb_address_exttype;   /* SADB_EXT_ADDRESS_{SRC,DST,PROXY} */

 u_int8_t  sadb_address_proto;     /* протокол IP или 0 (любой) */

 u_int8_t  sadb_address_prefixlen; /* # значащих битов адреса */

 u_int16_t sadb_address_reserved;  /* зарезервирован для послед. использования */

};

/* далее следует структура sockaddr соответствующего семейства */

Завершают список обязательных расширений сообщения SADB_ADD ключи аутентификации и шифрования — расширения SADB_EXT_KEY_AUTH и SADB_EXT_KEY_ENCRYPT, описываемые структурой sadb_key (листинг 19.5). Поле sadb_key_exttype определяет тип ключа (ключ аутентификации или шифрования), поле sadb_key_bits задает длину ключа в битах, а сам ключ следует за структурой sadb_key.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*