File Index
Files and directories
Sign in
FILE

SCTP.rst

File preview with syntax highlighting.

linux-6.19.14/Documentation/translations/zh_CN/security/SCTP.rst RESTRUCTUREDTEXT
  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.