19.5. Динамическое управление SA
19.5. Динамическое управление SA
Для повышения безопасности требуется периодическая смена ключей. Обычно для этого используется протокол типа IKE (RFC 2409 [43]).
ПРИМЕЧАНИЕ
В момент написания этой книги рабочая группа IETF по IPSec разрабатывала замену для протокола IKE.
Демон, обеспечивающий безопасность, регистрируется в ядре при помощи сообщения SADB_REGISTER, указывая в поле sadb_msg_satype (см. табл. 19.2) тип соглашения о безопасности, которое он умеет обрабатывать. Если демон может работать с несколькими типами соглашений, он должен отправить несколько сообщений SADB_REGISTER, зарегистрировав в каждом из них ровно один тип SA. В ответном сообщении SADB_REGISTER ядро указывает поддерживаемые алгоритмы шифрования или аутентификации (в отдельном расширении), а также длины ключей для этих алгоритмов. Расширение поддерживаемых алгоритмов описывается структурой sadb_supported, представленной в листинге 19.8. Структура содержит заголовок, за которым следуют описания алгоритма шифрования или аутентификации в полях sadb_alg.
Листинг 19.8. Структура, описывающая поддерживаемые алгоритмы
struct sadb_supported {
u_int16_t sadb_supported_len; /* длина расширения и списка алгоритмов / 8 */
u_int16_t sadb_supported_exttype; /* SADB_EXT_SUPPORTED_{AUTH,ENCRYPT} */
u_int32_t sadb_supported_reserved; /* зарезервировано для расширения в будущем */
};
/* далее следует список алгоритмов */
struct sadb_alg {
u_int8_t sadb_alg_id; /* идентификатор алгоритма из табл. 19.5 */
u_int8_t sadb_alg_ivlen; /* длина IV или нуль */
u_int16_t sadb_alg_minbits; /* минимальная длина ключа */
u_int16_t sadb_alg_maxbits; /* максимальная длина ключа */
u_int16_t sadb_alg_reserved; /* зарезервировано для расширения в будущем */
};
После заголовка sadb_supported следует по одной структуре sadb_alg для каждого алгоритма, поддерживаемого системой. На рис. 19.1 представлен возможный ответ на сообщение, регистрирующее обработчик SA типа SADB_SATYPE_ESP.
Рис. 19.1. Данные, возвращаемые ядром в ответ на команду SADB_REGISTER
Программа, представленная в листинге 19.9, просто регистрируется в ядре в качестве обработчика заданного механизма безопасности и выводит ответ ядра, содержащий список поддерживаемых алгоритмов.
Листинг 19.9. Регистрация демона-обработчика
//key/register.c
1 void
2 sadb_register(int type)
3 {
4 int s;
5 char buf[4096]; /* XXX */
6 struct sadb_msg msg;
7 int goteof;
8 int mypid;
9 s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
10 mypid = getpid();
11 /* формирование и отправка запроса SADB_REGISTER */
12 bzero(&msg, sizeof(msg));
13 msg.sadb_msg_version = PF_KEY_V2;
14 msg.sadb_msg_type = SADB_REGISTER;
15 msg.sadb_msg_satype = type;
16 msg.sadb_msg_len = sizeof(msg) / 8;
17 msg.sadb_msg_pid = mypid;
18 printf("Sending register message: ");
19 print_sadb_msg(&msg, sizeof(msg));
20 Write(s, &msg, sizeof(msg));
21 printf(" Reply returned: ");
22 /* Чтение и вывод ответа SADB_REGISTER, игнорирование всех прочих
сообщений */
23 for (;;) {
24 int msglen;
25 struct sadb_msg *msgp;
26 msglen = Read(s, &buf, sizeof(buf));
27 msgp = (struct sadb_msg*)&buf;
28 if (msgp->sadb_msg_pid == mypid &&
29 msgp->sadb_msg_type == SADB_REGISTER) {
30 print_sadb_msg(msgp, msglen);
31 break;
32 }
33 }
34 close(s);
35 }
Открытие сокета PF_KEY
1-9 Мы открываем сокет PF_KEY.
Сохранение PID
10 Поскольку ядро будет адресовать нам свои сообщения по идентификатору процесса, нам необходимо сохранить его, чтобы иметь возможность впоследствии отбирать интересующие нас сообщения.
Создание сообщения SADB_REGISTER
11-17 Подобно SADB_DUMP, сообщение SADB_REGISTER не требует никаких расширений. Мы обнуляем сообщение, после чего заполняем интересующие нас поля структуры.
Вывод и отправка сообщения
18-20 Мы отображаем подготовленное сообщение на экране при помощи функции print_sadb_msg, после чего записываем сообщение в сокет.
Ожидание ответа
23-30 Мы считываем сообщения из сокета, ожидая ответа на наше сообщение о регистрации. Ответ адресован по идентификатору процесса и представляет собой сообщение SADB_REGISTER. Он содержит список поддерживаемых алгоритмов, который выводится нашей функцией print_sadb_msg.
Данный текст является ознакомительным фрагментом.