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.

Данный текст является ознакомительным фрагментом.