UNIX: разработка сетевых приложений
Sending dump message:SADB Message Dump, errno 0, satype Unspecified, seq 0, pid 6283Messages returned:SADB Message Dump, errno 0, satype IPsec AH, seq 0, pid 6283SA: SPI=39030 Replay Window=0 State=MatureAuthentication Algorithm: HMAC-SHA-1Encryption Algorithm: None[unknown extension 19]Current lifetime:36 allocations. 0 bytesadded at Thu Jun 5 21:01:31 2003, first used at Thu Jun 5 21:15:07 2003Source address: 127.0.0.1/128 (IP proto 255)Dest address: 127.0.0.1/128 (IP proto 255)Authentication key. 160 bits: 0x0123456789abcdef0123456789abcdef01234567Из этого дампа видно, что ядро изменило значение протокола с 0 на 255. Это артефакт реализации, а не общее свойство сокетов PF_KEY. Кроме того, ядро изменило длину префикса с 32 на 128. Это какая-то проблема, связанная с протоколами IPv4 и IPv6. Ядро возвращает расширение (с номером 19), которое не обрабатывается нашей программой выведения дампа. Неизвестные расширения пропускаются (их длина имеется в соответствующем поле). Наконец, возвращается расширение времени жизни (листинг 19.7), содержащее информацию о текущем времени жизни соглашения о безопасности.
Листинг 19.7. Структура расширения времени жизни
struct sadb_lifetime {u_int16_t sadb_lifetime_len; /* длина расширения / 8 */u_int16_t sadb_lifetime_exttype; /* SADB_EXT_LIFETIME_{SOFT,HARD,CURRENT} */u_int32_t sadb_lifetime_allocations; /* количество соединений, конечныхточек или потоков */u_int64_t sadb_lifetime_bytes; /* количество байтов */u_int64_t sadb_lifetime_addtime; /* время создания либо время от созданиядо устаревания */u_int64_t sadb_lifetime_usetime; /* время первого использования или время отпервого использования до устаревания */};Расширения времени жизни бывают трех типов. Расширения
иSADB_LIFETIME_SOFTзадают гибкое и жесткое ограничения на время жизни соглашения. СообщениеSADB_LIFETIME_HARDотправляется ядром в случае превышения гибкого ограничения на время жизни. После достижения жесткого ограничения использование соглашения прекращается. РасширениеSADB_EXPIREвозвращается в ответ наSADB_LIFETIME_CURRENT,SADB_DUMPиSADB_EXPIREи описывает соответствующие параметры текущего соглашения.SADB_GET19.5. Динамическое управление SA
Для повышения безопасности требуется периодическая смена ключей. Обычно для этого используется протокол типа IKE (RFC 2409 [43]).
ПРИМЕЧАНИЕВ момент написания этой книги рабочая группа IETF по IPSec разрабатывала замену для протокола IKE.
Демон, обеспечивающий безопасность, регистрируется в ядре при помощи сообщения
, указывая в полеSADB_REGISTER(см. табл. 19.2) тип соглашения о безопасности, которое он умеет обрабатывать. Если демон может работать с несколькими типами соглашений, он должен отправить несколько сообщенийsadb_msg_satype, зарегистрировав в каждом из них ровно один тип SA. В ответном сообщенииSADB_REGISTERядро указывает поддерживаемые алгоритмы шифрования или аутентификации (в отдельном расширении), а также длины ключей для этих алгоритмов. Расширение поддерживаемых алгоритмов описывается структуройSADB_REGISTER, представленной в листинге 19.8. Структура содержит заголовок, за которым следуют описания алгоритма шифрования или аутентификации в поляхsadb_supported.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для каждого алгоритма, поддерживаемого системой. На рис. 19.1 представлен возможный ответ на сообщение, регистрирующее обработчик SA типаsadb_alg.SADB_SATYPE_ESPРис. 19.1. Данные, возвращаемые ядром в ответ на команду SADB_REGISTER
Программа, представленная в листинге 19.9, просто регистрируется в ядре в качестве обработчика заданного механизма безопасности и выводит ответ ядра, содержащий список поддерживаемых алгоритмов.
Листинг 19.9. Регистрация демона-обработчика
//key/register.c1 void2 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);
