Чтение онлайн

ЖАНРЫ

UNIX: разработка сетевых приложений
Шрифт:
Открытие сокета PF_KEY

1-8
Сначала мы открываем сокет
PF_KEY
. Для этого требуются определенные привилегии, поскольку сокет дает доступ к управлению ключами.

Формирование запроса SADB_DUMP

9-15
Мы начинаем с обнуления структуры
sadb_msg
, что позволяет нам не инициализировать поля, которые должны остаться нулевыми. Затем мы заполняем все интересующие нас поля по отдельности.

Если при открытии сокета в качестве третьего аргумента использовалась константа

PF_KEY_V2
, все сообщения, направляемые в такой сокет,
должны иметь версию
PF_KEY_V2
. Нужный нам тип сообщения —
SADB_DUMP
. Длина сообщения устанавливается равной длине заголовка без расширений, поскольку для запроса дампа расширения не нужны. Наконец, идентификатор процесса устанавливается равным идентификатору нашего процесса. Это обязательное условие для всех сообщений.

Отображение и отправка сообщения SADB_DUMP

16-18
Мы отображаем сообщение при помощи функции
print_sadb_msg
. Мы не приводим листинг этой функции, потому что он достаточно длинный и не представляет особого интереса, однако он включен в набор свободно распространяемых программ, доступный для скачивания с сайта этой книги. Функция принимает сообщение, подготовленное к отправке или полученное от ядра, и выводит всю содержащуюся в этом сообщении информацию в удобной для чтения форме.

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

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

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 Превышено жесткое ограничение на время жизни Нет
Поделиться с друзьями: