📄 rfc2367.txt
字号:
uint16_t sadb_lifetime_exttype;
uint32_t sadb_lifetime_allocations;
uint64_t sadb_lifetime_bytes;
uint64_t sadb_lifetime_addtime;
uint64_t sadb_lifetime_usetime;
};
/* sizeof(struct sadb_lifetime) == 32 */
sadb_lifetime_allocations
对于CURRENT,安全关联分配的不同的连接数、端点或流量;对
于HARD和SOFT,指在期满前安全关联可以分配的连接数、端点或
流量。
sadb_lifetime_bytes
对于CURRENT,使用这个安全关联处理了多少个字节;对于HARD
和SOFT,在期满之前,可以处理的字节数。
sadb_lifetime_addtime
对于CURRENT,指安全关联建立时的时间,以秒计;对于HARD和
SOFT,指安全关联建立后在期满之前的时间。
对于这样的时间字段,系统假定64位可以足够存放POSIX时间类
型值。如果不够,这个字段必须重新修订。
sadb_lifetime_usetime
对于CURRENT,指安全关联第一次使用的时间,以秒计;对于HARD
和SOFT,指安全关联第一次使用后在期满之前的时间。
安全关联的各项生存期指的关系是逻辑或,这意味着如果字节和时间值,或者
多项时间值被检查,第一个符合范围的值将导致生存期期满。
2.3.3 地址扩展项
地址扩展项说明一个或多个与安全关联有关的地址。当安全关联扩展项存在时
源和目的地址的扩展项必须存在。地址扩展项的格式如下:
struct sadb_address {
uint16_t sadb_address_len;
uint16_t sadb_address_exttype;
uint8_t sadb_address_proto;
uint8_t sadb_address_prefixlen;
uint16_t sadb_address_reserved;
};
/* sizeof(struct sadb_address) == 8 */
/* 紧跟的是一些sockaddr结构格式的地址 */
sockaddr结构应该系统实现的PF_KEY的sockaddr结构相一致。如果系统有sa_len
消息中的sockaddrs也应有;如果没有sa_len字段,sockaddrs也不应有。sockaddrs
中的非地址信息,像AF_INET sockaddrs的sin_zero和AF_INET6 sockaddrs的sin6_
flowinfo必须大于零。所有的消息的端口值(如sin_port和sin6_port)必须为零,
除了SADB_ACQUIRE消息,其发起者应填入相对应的TCP或UDP会话者的端口号。如果
端口号非零,那么sadb_address_proto字段,通常为零,必须填入传输协议值。如
果sadb_address_prefixlen非零,那么地址有一个指定长度的前缀(常常用在KM访
问控制决策)。这些附加字段有利于密钥关联程序。
在一个消息中,安全关联的源和目的地址必须在同一个协议族,必须同时有或
没有。代理地址可以在不同的协议族,并且对于多数的安全协议,代表实际的包的
发起者(例如:内部信息包的源地址在隧道中)。
源地址必须是单播地址或者是非指定地址(如:INADDR_ANY)。目的地址可以
是任一有效地址(单播、多播或广播)。代理地址应是单播地址(这里是试验性的
安全协议,代理可以不同于以上描述)。
2.3.4 密钥扩展项
密钥扩展项说明了一个或多个与安全关联有关的密钥。由于安全原因,消息中
的密钥扩展项不是永远存在。其格式如下:
struct sadb_key {
uint16_t sadb_key_len;
uint16_t sadb_key_exttype;
uint16_t sadb_key_bits;
uint16_t sadb_key_reserved;
};
/* sizeof(struct sadb_key) == 8 */
/* 紧跟的是密钥 */
sadb_key_bits 位数,有效的密钥长度。如果为零将导致错误。
密钥扩展项有两种.认证密钥(如:IPsec AH,OSPF MD5)和加密密钥(如:
IPsec ESP)。PF_KEY只处理符合格式的密钥,不处理密钥素材。例如,当使用
ISAKMP/Oakley时,密钥关联进程总是负责在将Diffie-Hellman算法的计算结果通
过PF_KEY发送至内核之前转换成要求的格式。制定这项规则的原因是PF_KEY被设计
成支持多种安全协议(不仅仅是IP安全)和多种密钥管理机制,包括没有“密钥素
材”概念的手工管理。一个清晰的不受协议约束的接口可以支持不同的操作系统和
不同的安全协议。
如果一个算法的密钥定义了奇偶位(如:DES),那么PF_KEY使用的密钥也必须
包含奇偶位。这意味着一个DES密钥永远是64位长。
当一个安全协议只需要一个认证密钥及?或一个加密密钥时,使用适当的密钥
扩展进行完全格式转换。当一个安全协议的同一个函数需要多个密钥(如:3DES使
用2或3个密钥和非对称算法),这两个完全格式的密钥必须按顺序连在一起以便输
出包处理。在这种情况下,算法必须能够根据提供的信息确定每个密钥的长度。密
钥的总长度(当与使用的算法的知识相结合)通常提供足够的信息去做出确定。
密钥始终通过PF_KEY接口按序传递以便输出包的处理。对于输入包的处理,密
钥的顺序可能与PF_KEY接口使用的规范级连顺序不同。具体实现负责使用正确的密
钥顺序处理输入和输出包。
例如,两个单播地址的节点使用ESP、3个密钥的3DES安全关联通信。在发送节
点的输出SA和接收节点的输入SA各自的加密密钥扩展项中都依次包含key-A、key-B、
key-C。输出SA依次使用key-A、key-B、key-C加密,输入SA依次使用key-C、key-B、
key-C解密(注意:3DES实际上是加密-解密-加密)。3DES使用的规范的顺序key-A、
key-B、key-C已文档化。规范的“加密”顺序如同这个例子。[Sch96]
密钥数据位的有效位从高到低排列。例如:22位密钥将占3个字节,最低的两
位不包含密钥素材,5个额外的填充字节用来64位边界对齐。
这里有一个关于奇数位16进制密钥的用户接口问题,与PF_KEY不是直接有关。
考虑以下16位数:
0x123
需要两个字节储存。如果没有其它信息,不清楚究竟是存储为:
01 23 或 12 30
作者的看法是样板(0x123 == 0x0123)是解释这个多义性的最好方法。附加
信息(如:写成0x0123或0x1230,或者说明那只是12位数字)将解决这个问题。
2.3.5 身份扩展项
身份扩展项包含了端点的身份特征。这些信息被密钥管理程序用来选择协商中
使用的身份证书。出于访问控制的目的,内核也可以提供这些信息给网络安全程序
去鉴别远端实体。如果这个扩展项不存在,密钥管理必须以地址扩展项中的地址作
为安全关联的唯一身份。其格式如下:
struct sadb_ident {
uint16_t sadb_ident_len;
uint16_t sadb_ident_exttype;
uint16_t sadb_ident_type;
uint16_t sadb_ident_reserved;
uint64_t sadb_ident_id;
};
/* sizeof(struct sadb_ident) == 16 */
/* 紧跟身份字符串,如果存在 */
sadb_ident_type 紧跟的身份信息的类型。稍后详述。
sadb_ident_id 身份字符串不存在时使用的标识符。POSIX用户标识符将使用这
个字段。稍后详述。
文本表示的身份信息包含在一个C字符串中紧跟在sadb_ident扩展项后。字符
串的格式由sadb_ident_type的值确定,稍后详述。
2.3.6 敏感度扩展项
敏感度扩展包含安全关联的安全标签信息。如果这个扩展项不存在,就不能从
安全关联获得敏感度关联的数据;如果存在,数据包上的外在安全标签的需求被回
避。其格式如下:
struct sadb_sens {
uint16_t sadb_sens_len;
uint16_t sadb_sens_exttype;
uint32_t sadb_sens_dpd;
uint8_t sadb_sens_sens_level;
uint8_t sadb_sens_sens_len;
uint8_t sadb_sens_integ_level;
uint8_t sadb_sens_integ_len;
uint32_t sadb_sens_reserved;
};
/* sizeof(struct sadb_sens) == 16 */
/* 紧跟:
uint64_t sadb_sens_bitmap[sens_len];
uint64_t sadb_integ_bitmap[integ_len]; */
sadb_sens_dpd 说明可以判读等级和间隔位图的保护进程。
sadb_sens_sens_level
敏感度等级
sadb_sens_sens_len
敏感度位图的长度,64位字对齐。
sadb_sens_integ_level
完整性等级
sadb_sens_integ_len
完整性位图的长度,64位字对齐。
敏感度扩展设计来支持分离式或多级别安全系统的Bell-LaPadula[BL74]安全
模型、Clark-Wilson[CW87]商业安全模型及/或Biba完整模型[Biba77]。这些正式
的模型常用来实现各种各样的安全策略。详细的安全策略定义超出本文档的讨论范
围。每一个位图必须64位边界对齐。
2.3.7 提议扩展项
提议扩展项包含了可选择的算法参数,其格式如下:
struct sadb_prop {
uint16_t sadb_prop_len;
uint16_t sadb_prop_exttype;
uint8_t sadb_prop_replay;
uint8_t sadb_prop_reserved[3];
};
/* sizeof(struct sadb_prop) == 8 */
/* 紧跟:
struct sadb_comb sadb_combs[(sadb_prop_len *
sizeof(uint64_t) - sizeof(struct sadb_prop)) /
sizeof(struct sadb_comb)]; */
结构头后是按优先排序的提议的参数联合列表。如果一个联合被选择,那么各
字段值将存入相同定义的各字段中。
注意:某些安全协议中的部分算法有IV长度变量,
联合的格式如下:
struct sadb_comb {
uint8_t sadb_comb_auth;
uint8_t sadb_comb_encrypt;
uint16_t sadb_comb_flags;
uint16_t sadb_comb_auth_minbits;
uint16_t sadb_comb_auth_maxbits;
uint16_t sadb_comb_encrypt_minbits;
uint16_t sadb_comb_encrypt_maxbits;
uint32_t sadb_comb_reserved;
uint32_t sadb_comb_soft_allocations;
uint32_t sadb_comb_hard_allocations;
uint64_t sadb_comb_soft_bytes;
uint64_t sadb_comb_hard_bytes;
uint64_t sadb_comb_soft_addtime;
uint64_t sadb_comb_hard_addtime;
uint64_t sadb_comb_soft_usetime;
uint64_t sadb_comb_hard_usetime;
};
/* sizeof(struct sadb_comb) == 72 */
sadb_comb_auth 如果联合被接受,其值将存入sadb_sa_auth中。
sadb_comb_encrypt
如果联合被接受,其值将存入sadb_sa_encrypt中。
sadb_comb_auth_minbits;
sadb_comb_auth_maxbits;
最小和最大认证密钥长度,位数。如果sadb_comb_auth为零,这
两个字段的值必须为零;如果sadb_comb_auth非零,其值必须非
零。如果联合被接受,KEY_AUTH的sadb_key_bits字段值将在两
者之间。最小字段值不能大于最大字段值。
sadb_comb_encrypt_minbits;
sadb_comb_encrypt_maxbits;
最小和最大加密密钥长度,位数。如果sadb_comb_encrypt为零,
这两个字段的值必须为零;如果sadb_comb_encrypt非零,其值
必须非零。如果联合被接受,KEY_ENCRYPT的sadb_key_bits字段
值将在两者之间。最小字段值不能大于最大字段值。
sadb_comb_soft_allocations
sadb_comb_hard_allocations
如果联合被接受,其值将分别存入SOFT和HARD生存期的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -