UNIX: разработка сетевых приложений
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:\n");19 print_sadb_msg(&msg, sizeof(msg));20 Write(s, &msg, sizeof(msg));21 printf("\nReply returned:\n");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Мы открываем сокет PF_KEY.1-9Сохранение PIDПоскольку ядро будет адресовать нам свои сообщения по идентификатору процесса, нам необходимо сохранить его, чтобы иметь возможность впоследствии отбирать интересующие нас сообщения.10Создание сообщения SADB_REGISTERПодобно11-17, сообщениеSADB_DUMPне требует никаких расширений. Мы обнуляем сообщение, после чего заполняем интересующие нас поля структуры.SADB_REGISTERВывод и отправка сообщенияМы отображаем подготовленное сообщение на экране при помощи функции18-20, после чего записываем сообщение в сокет.print_sadb_msgОжидание ответаМы считываем сообщения из сокета, ожидая ответа на наше сообщение о регистрации. Ответ адресован по идентификатору процесса и представляет собой сообщение23-30. Он содержит список поддерживаемых алгоритмов, который выводится нашей функциейSADB_REGISTER.print_sadb_msgПример
Мы запускаем программу
в системе, поддерживающей на несколько протоколов больше, чем описано в RFC 2367.registermacosx % <b>register -t ah</b>Sending register message:SADB Message Register, errno 0, satype IPsec AH, seq 0, pid 20746Reply returned:SADB Message Register, errno 0, satype IPsec AH, seq 0, pid 20746Supported authentication algorithms:HMAC-MD5 ivlen 0 bits 128-128HMAC-SHA-1 ivlen 0 bits 160-160Keyed MD5 ivlen 0 bits 128-128Keyed SHA-1 ivlen 0 bits 160-160Null ivlen 0 bits 0-2048SHA2-256 ivlen 0 bits 256-256SHA2-384 ivlen 0 bits 384-384SHA2-512 ivlen 0 bits 512-512Supported encryption algorithms:DES-CBC ivlen 8 bits 64-643DES-CBC ivlen 8 bits 192-192Null ivlen 0 bits 0-2048Blowfish-CBC ivlen 8 bits 40-448CAST128-CBC ivlen 8 bits 40-128AES ivlen 16 bits 128-256Если ядру требуется связаться с собеседником, а соответствующая политика требует наличия соглашения о безопасности, но соглашение таковое отсутствует, ядро отправляет на зарегистрировавшиеся для данного типа соглашения сокеты управления ключами сообщение
, в расширениях которого содержатся предлагаемые ядром алгоритмы и длины ключей. Предложение может представлять собой комбинацию поддерживаемых системой средств безопасности и политики, ограничивающей набор средств для конкретного собеседника. Алгоритмы, длины ключей и времена жизни объединяются в список в порядке предпочтительности использования. Когда демон-ключник получает сообщениеSADB_ACQUIRE, он выполняет действия, необходимые для выбора ключа, удовлетворяющего одной из предложенных ядром комбинаций, и устанавливает этот ключ в ядро. Для выбора SPI из нужного диапазона демон отправляет ядру сообщениеSADB_ACQUIRE. В ответ на это сообщение ядро создает соглашение о безопасности в состоянииSADB_GETSPI. Затем демон согласовывает параметры безопасности с удаленным собеседником, используя предоставленный ядром SPI, после чего отправляет ядру сообщениеSADB_SASTATE_LARVALдля завершения создания соглашения и перевода его в рабочее состояние (SADB_UPDATE). Динамически создаваемые соглашения обычно снабжаются гибким и жестким ограничениями на время жизни. Когда истекает один из этих сроков, ядро отправляет сообщениеSADB_SASTATE_MATURE, в котором указывается, какое именно достигнуто ограничение. По достижении гибкого ограничения соглашение переходит в состояниеSADB_EXPIRE, в котором оно еще может использоваться, однако процессу следует получить новое соглашение. Если же достигнуто жесткое ограничение, соглашение переходит в состояниеSADB_SASTATE_DYING, в котором оно больше не может использоваться для обеспечения безопасности и должно быть удалено из базы данных.SADB_SASTATE_DEAD19.6. Резюме
Сокеты управления ключами используются для взаимодействия с ядром, демонами-ключниками и другими обеспечивающими безопасность сущностями (такими как маршрутизирующие демоны). Соглашения о безопасности могут создаваться статически или динамически посредством протокола согласования ключей. Динамические ключи обычно характеризуются определенным временем жизни, по истечении которого (гибкое ограничение) демон-ключник получает соответствующее уведомление. Если соглашение не обновляется до достижения жесткого ограничения, оно становится недействительным.