FILE
SCTP.rst
File preview with syntax highlighting.
linux-6.19.14/Documentation/translations/zh_CN/security/SCTP.rst
1.. SPDX-License-Identifier: GPL-2.0 2.. include:: ../disclaimer-zh_CN.rst 3 4:Original: Documentation/security/SCTP.rst 5 6:翻译: 7 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> 8 9==== 10SCTP 11==== 12 13SCTP的LSM支持 14============= 15 16安全钩子 17-------- 18 19对于安全模块支持,已经实现了三个特定于SCTP的钩子:: 20 21 security_sctp_assoc_request() 22 security_sctp_bind_connect() 23 security_sctp_sk_clone() 24 security_sctp_assoc_established() 25 26这些钩子的用法在下面的 `SCTP的SELinux支持`_ 一章中描述SELinux的实现。 27 28 29security_sctp_assoc_request() 30~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31将关联INIT数据包的 ``@asoc`` 和 ``@chunk->skb`` 传递给安全模块。 32成功时返回 0,失败时返回错误。 33:: 34 35 @asoc - 指向sctp关联结构的指针。 36 @skb - 指向包含关联数据包skbuff的指针。 37 38 39security_sctp_bind_connect() 40~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41将一个或多个IPv4/IPv6地址传递给安全模块进行基于 ``@optname`` 的验证, 42这将导致是绑定还是连接服务,如下面的权限检查表所示。成功时返回 0,失败 43时返回错误。 44:: 45 46 @sk - 指向sock结构的指针。 47 @optname - 需要验证的选项名称。 48 @address - 一个或多个IPv4 / IPv6地址。 49 @addrlen - 地址的总长度。使用sizeof(struct sockaddr_in)或 50 sizeof(struct sockaddr_in6)来计算每个ipv4或ipv6地址。 51 52 ------------------------------------------------------------------ 53 | BIND 类型检查 | 54 | @optname | @address contains | 55 |----------------------------|-----------------------------------| 56 | SCTP_SOCKOPT_BINDX_ADD | 一个或多个 ipv4 / ipv6 地址 | 57 | SCTP_PRIMARY_ADDR | 单个 ipv4 or ipv6 地址 | 58 | SCTP_SET_PEER_PRIMARY_ADDR | 单个 ipv4 or ipv6 地址 | 59 ------------------------------------------------------------------ 60 61 ------------------------------------------------------------------ 62 | CONNECT 类型检查 | 63 | @optname | @address contains | 64 |----------------------------|-----------------------------------| 65 | SCTP_SOCKOPT_CONNECTX | 一个或多个 ipv4 / ipv6 地址 | 66 | SCTP_PARAM_ADD_IP | 一个或多个 ipv4 / ipv6 地址 | 67 | SCTP_SENDMSG_CONNECT | 单个 ipv4 or ipv6 地址 | 68 | SCTP_PARAM_SET_PRIMARY | 单个 ipv4 or ipv6 地址 | 69 ------------------------------------------------------------------ 70 71条目 ``@optname`` 的摘要如下:: 72 73 SCTP_SOCKOPT_BINDX_ADD - 允许在(可选地)调用 bind(3) 后,关联额外 74 的绑定地址。 75 sctp_bindx(3) 用于在套接字上添加一组绑定地址。 76 77 SCTP_SOCKOPT_CONNECTX - 允许分配多个地址以连接到对端(多宿主)。 78 sctp_connectx(3) 使用多个目标地址在SCTP 79 套接字上发起连接。 80 81 SCTP_SENDMSG_CONNECT - 通过sendmsg(2)或sctp_sendmsg(3)在新关联上 82 发起连接。 83 84 SCTP_PRIMARY_ADDR - 设置本地主地址。 85 86 SCTP_SET_PEER_PRIMARY_ADDR - 请求远程对端将某个地址设置为其主地址。 87 88 SCTP_PARAM_ADD_IP - 在启用动态地址重配置时使用。 89 SCTP_PARAM_SET_PRIMARY - 如下所述,启用重新配置功能。 90 91 92为了支持动态地址重新配置,必须在两个端点上启用以下 93参数(或使用适当的 **setsockopt**\(2)):: 94 95 /proc/sys/net/sctp/addip_enable 96 /proc/sys/net/sctp/addip_noauth_enable 97 98当相应的 ``@optname`` 存在时,以下的 *_PARAM_* 参数会 99通过ASCONF块发送到对端:: 100 101 @optname ASCONF Parameter 102 ---------- ------------------ 103 SCTP_SOCKOPT_BINDX_ADD -> SCTP_PARAM_ADD_IP 104 SCTP_SET_PEER_PRIMARY_ADDR -> SCTP_PARAM_SET_PRIMARY 105 106 107security_sctp_sk_clone() 108~~~~~~~~~~~~~~~~~~~~~~~~ 109每当通过 **accept**\(2)创建一个新的套接字(即TCP类型的套接字),或者当 110一个套接字被‘剥离’时如用户空间调用 **sctp_peeloff**\(3),会调用此函数。 111:: 112 113 @asoc - 指向当前sctp关联结构的指针。 114 @sk - 指向当前套接字结构的指针。 115 @newsk - 指向新的套接字结构的指针。 116 117 118security_sctp_assoc_established() 119~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 120当收到COOKIE ACK时调用,对于客户端,对端的secid将被保存 121到 ``@asoc->peer_secid`` 中:: 122 123 @asoc - 指向sctp关联结构的指针。 124 @skb - 指向COOKIE ACK数据包的skbuff指针。 125 126 127用于关联建立的安全钩子 128---------------------- 129 130下图展示了在建立关联时 ``security_sctp_bind_connect()``、 ``security_sctp_assoc_request()`` 131和 ``security_sctp_assoc_established()`` 的使用。 132:: 133 134 SCTP 端点 "A" SCTP 端点 "Z" 135 ============= ============= 136 sctp_sf_do_prm_asoc() 137 关联的设置可以通过connect(2), 138 sctp_connectx(3),sendmsg(2) 139 or sctp_sendmsg(3)来发起。 140 这将导致调用security_sctp_bind_connect() 141 发起与SCTP对端端点"Z"的关联。 142 INIT ---------------------------------------------> 143 sctp_sf_do_5_1B_init() 144 响应一个INIT数据块。 145 SCTP对端端点"A"正在请求一个临时关联。 146 如果是首次关联,调用security_sctp_assoc_request() 147 来设置对等方标签。 148 如果不是首次关联,检查是否被允许。 149 如果允许,则发送: 150 <----------------------------------------------- INIT ACK 151 | 152 | 否则,生成审计事件并默默丢弃该数据包。 153 | 154 COOKIE ECHO ------------------------------------------> 155 sctp_sf_do_5_1D_ce() 156 响应一个COOKIE ECHO数据块。 157 确认该cookie并创建一个永久关联。 158 调用security_sctp_assoc_request() 159 执行与INIT数据块响应相同的操作。 160 <------------------------------------------- COOKIE ACK 161 | | 162 sctp_sf_do_5_1E_ca | 163 调用security_sctp_assoc_established() | 164 来设置对方标签 | 165 | | 166 | 如果是SCTP_SOCKET_TCP或是剥离的套接 167 | 字,会调用 security_sctp_sk_clone() 168 | 来克隆新的套接字。 169 | | 170 建立 建立 171 | | 172 ------------------------------------------------------------------ 173 | 关联建立 | 174 ------------------------------------------------------------------ 175 176 177SCTP的SELinux支持 178================= 179 180安全钩子 181-------- 182 183上面的 `SCTP的LSM支持`_ 章节描述了以下SCTP安全钩子,SELinux的细节 184说明如下:: 185 186 security_sctp_assoc_request() 187 security_sctp_bind_connect() 188 security_sctp_sk_clone() 189 security_sctp_assoc_established() 190 191 192security_sctp_assoc_request() 193~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 194将关联INIT数据包的 ``@asoc`` 和 ``@chunk->skb`` 传递给安全模块。 195成功时返回 0,失败时返回错误。 196:: 197 198 @asoc - 指向sctp关联结构的指针。 199 @skb - 指向关联数据包skbuff的指针。 200 201安全模块执行以下操作: 202 如果这是 ``@asoc->base.sk`` 上的首次关联,则将对端的sid设置 203 为 ``@skb`` 中的值。这将确保只有一个对端sid分配给可能支持多个 204 关联的 ``@asoc->base.sk``。 205 206 否则验证 ``@asoc->base.sk peer sid`` 是否与 ``@skb peer sid`` 207 匹配,以确定该关联是否应被允许或拒绝。 208 209 将sctp的 ``@asoc sid`` 设置为套接字的sid(来自 ``asoc->base.sk``) 210 并从 ``@skb peer sid`` 中提取MLS部分。这将在SCTP的TCP类型套接字及 211 剥离连接中使用,因为它们会导致生成一个新的套接字。 212 213 如果配置了IP安全选项(CIPSO/CALIPSO),则会在套接字上设置IP选项。 214 215 216security_sctp_bind_connect() 217~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 218根据 ``@optname`` 检查ipv4/ipv6地址所需的权限,具体如下:: 219 220 ------------------------------------------------------------------ 221 | BIND 权限检查 | 222 | @optname | @address contains | 223 |----------------------------|-----------------------------------| 224 | SCTP_SOCKOPT_BINDX_ADD | 一个或多个 ipv4 / ipv6 地址 | 225 | SCTP_PRIMARY_ADDR | 单个 ipv4 or ipv6 地址 | 226 | SCTP_SET_PEER_PRIMARY_ADDR | 单个 ipv4 or ipv6 地址 | 227 ------------------------------------------------------------------ 228 229 ------------------------------------------------------------------ 230 | CONNECT 权限检查 | 231 | @optname | @address contains | 232 |----------------------------|-----------------------------------| 233 | SCTP_SOCKOPT_CONNECTX | 一个或多个 ipv4 / ipv6 地址 | 234 | SCTP_PARAM_ADD_IP | 一个或多个 ipv4 / ipv6 地址 | 235 | SCTP_SENDMSG_CONNECT | 单个 ipv4 or ipv6 地址 | 236 | SCTP_PARAM_SET_PRIMARY | 单个 ipv4 or ipv6 地址 | 237 ------------------------------------------------------------------ 238 239 240`SCTP的LSM支持`_ 提供了 ``@optname`` 摘要,并且还描述了当启用动态地址重新 241配置时,ASCONF块的处理过程。 242 243 244security_sctp_sk_clone() 245~~~~~~~~~~~~~~~~~~~~~~~~ 246每当通过 **accept**\(2)(即TCP类型的套接字)创建一个新的套接字,或者 247当一个套接字被“剥离”如用户空间调用 **sctp_peeloff**\(3)时, 248``security_sctp_sk_clone()`` 将会分别将新套接字的sid和对端sid设置为 249``@asoc sid`` 和 ``@asoc peer sid`` 中包含的值。 250:: 251 252 @asoc - 指向当前sctp关联结构的指针。 253 @sk - 指向当前sock结构的指针。 254 @newsk - 指向新sock结构的指针。 255 256 257security_sctp_assoc_established() 258~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 259当接收到COOKIE ACK时调用,它将连接的对端sid设置为 ``@skb`` 中的值:: 260 261 @asoc - 指向sctp关联结构的指针。 262 @skb - 指向COOKIE ACK包skbuff的指针。 263 264 265策略声明 266-------- 267以下支持SCTP的类和权限在内核中是可用的:: 268 269 class sctp_socket inherits socket { node_bind } 270 271当启用以下策略功能时:: 272 273 policycap extended_socket_class; 274 275SELinux对SCTP的支持添加了用于连接特定端口类型 ``name_connect`` 权限 276以及在下面的章节中进行解释的 ``association`` 权限。 277 278如果用户空间工具已更新,SCTP将支持如下所示的 ``portcon`` 声明:: 279 280 portcon sctp 1024-1036 system_u:object_r:sctp_ports_t:s0 281 282 283SCTP对端标签 284------------ 285每个SCTP套接字仅分配一个对端标签。这个标签将在建立第一个关联时分配。 286任何后续在该套接字上的关联都会将它们的数据包对端标签与套接字的对端标 287签进行比较,只有在它们不同的情况下 ``association`` 权限才会被验证。 288这是通过检查套接字的对端sid与接收到的数据包中的对端sid来验证的,以决 289定是否允许或拒绝该关联。 290 291注: 292 1) 如果对端标签未启用,则对端上下文将始终是 ``SECINITSID_UNLABELED`` 293 (在策略声明中为 ``unlabeled_t`` )。 294 295 2) 由于SCTP可以在单个套接字上支持每个端点(多宿主)的多个传输地址,因此 296 可以配置策略和NetLabel为每个端点提供不同的对端标签。由于套接字的对端 297 标签是由第一个关联的传输地址决定的,因此建议所有的对端标签保持一致。 298 299 3) 用户空间可以使用 **getpeercon**\(3) 来检索套接字的对端上下文。 300 301 4) 虽然这不是SCTP特有的,但在使用NetLabel时要注意,如果标签分配给特定的接 302 口,而该接口‘goes down’,则NetLabel服务会移除该条目。因此,请确保网络启 303 动脚本调用 **netlabelctl**\(8) 来设置所需的标签(详细信息, 304 请参阅 **netlabel-config**\(8) 辅助脚本)。 305 306 5) NetLabel SCTP对端标签规则应用如下所述标签为“netlabel”的一组帖子: 307 https://www.paul-moore.com/blog/t. 308 309 6) CIPSO仅支持IPv4地址: ``socket(AF_INET, ...)`` 310 CALIPSO仅支持IPv6地址: ``socket(AF_INET6, ...)`` 311 312 测试CIPSO/CALIPSO时请注意以下事项: 313 a) 如果SCTP数据包由于无效标签无法送达,CIPSO会发送一个ICMP包。 314 b) CALIPSO不会发送ICMP包,只会默默丢弃数据包。 315 316 7) RFC 3554不支持IPSEC —— SCTP/IPSEC支持尚未在用户空间实现(**racoon**\(8) 317 或 **ipsec_pluto**\(8)),尽管内核支持 SCTP/IPSEC。
~/
Read-only file preview.