网络访问控制策略(NACP)
1 介绍
飞网零信任的网络访问控制策略(即NACP,Network Access Control Policy),允许您自行决定飞网中的用户或设备间的访问关系。
飞网NACP默认“默认拒绝”任何访问,只有在NACP中明确允许的策略才会被允许,否则访问会被拒绝。
初始创建飞网网络时,为了方便用户的使用,飞网采用“全部允许”的初始访问策略 (Src": ["*"],"Dst": ["*:*"]
),允许所有接入飞网网络的设备相互访问。当需要限制访问时,可以通过“控制面板”的“访问控制”编辑访问控制规则。
访问规则可以利用用户组和设备标签来简化规则的数量。组可以将多台设备归入一组并统一管理;标签可以按设备用途添加标签实现基于属性的访问控制。组和标签结合可以实现强大的基于角色的访问控制。
飞网会将所有者与管理员定义的访问规则推送到网络中的所有设备,并由每个设备本地实施规则匹配和执行。
只有所有者、管理员或网络管理员才能编辑飞网网络访问控制策略。
2 NACP的总体结构
飞网的访问控制规则使用的是"JSON"格式的策略文件表达的。
{
"acls": [{..acl1..},{..acl2..},...],
"groups": {······},
"hosts": {······},
"tests": [······],
"tagOwners":{······},
"ssh": [······],
"disableIPv4": false,
"randomizeClientPort": false
}
3 访问控制策略文件包含几个配置段,详细如下:
3.1 用户:Users
您可以在源(src)和目标(dst)字段中指定用户。
用户必须使用“用户标识@团队网络名称”的格式引用,例如
'张三@teamname'
'张三'为用户标识(可在控制面板中用户网络的菜单栏中查看)
'teamname'为团队网络名称(可在控制面板中用户网络的网络名称中查看)
3.2 组:Groups
使用用户组Groups,可以便于对同组用户及同组用户的设备设置访问控制规则。注:同一个用户可以同时隶属于两个组,但一个组不能嵌套另一个组。
"groups": {
"group:开发组": [
"张三@teamname",
"李四@teamname"
],
"group:设计组": [
"王五@teamname",
"赵六@teamname"
]
},
自动组:Autogroup
autogroup是一个特殊的组,它会自动包含具有相同属性的用户、目标或用户名,然后您可以在访问规则中使用它们。
作为的类型 | Autogroup | 说明 |
---|---|---|
作为'src'或'dst' | autogroup:members | 用于允许作为飞网的直接成员(非共享用户)的任何用户访问。 |
作为'dst' | autogroup:internet | 用于允许任何用户通过飞网中的任何出口节点进行访问。 |
作为'dst' | autogroup:self | 用于允许与源用户身份相同的任何用户进行访问。 |
作为SSH用户 | autogroup:nonroot | 用于允许飞网SSH访问非root的任何用户 |
3.3 设备别名和网络别名:Hosts
用于对设备IP(或网段)设备取别名,如:设备IP-->设备别名;设备IP网段-->网络别名。
"hosts": {
"dns服务器": "100.1.2.3",
"研发区": "10.0.0.0/8"
},
3.4 访问控制规则:Acls
默认访问规则是拒绝的,也就是黑名单模式,只有在访问规则明确允许的情况下设备之间才能通信。所以 NACP 规则中的 action 值都写为accept(明示允许,不可省略)。 格式如下:
{
"Acls":[
{
"action": "accept",// 明示允许
"src": [ 源信息... ],
"proto": "protocol", // 可选
"dst": [ 目的信息... ]
}
]
}
src
列表中的每个元素可以是以下元素之一:
类型 | 示例 | 含义 |
---|---|---|
任何 | * | 对来源无限制 |
用户 | 张三@teamname | 张三用户身份的所有设备 |
组 | group:开发组 | 开发组下的所有用户 |
飞网IP | 100.14.22.3 | 拥有给定飞网IP的设备 |
子网网段范围 | 192.168.1.0/24 | 给定子网中的任何IP |
主机 | my-host | my-host字段中定义的任意IP |
标签 | tag:design | 分配'design'标签的所有设备 |
自动组 | autogroup:members | 具有相同属性或角色的用户、目标或用户名的设备 |
proto
字段,可选,指定允许访问的协议。
协议名称 | proto值 | IANA 协议编号 |
---|---|---|
互联网组管理协议(ICMP) | igmp | 2 |
IPv4封装 | IPv4 | 4 |
传输控制协议(TCP) | tcp | 6 |
外部网关协议(EGP) | egp | 8 |
任何私人内部网关 | igp | 9 |
用户数据包协议(UDP) | udp | 17 |
通用路由封装协议(GRE) | gre | 47 |
封装安全负载(ESP) | esp | 50 |
身份认证头协议(AH) | ah | 51 |
流控制传输协议(SCTP) | sctp | 132 |
dst
字段,表示访问目标列表,列表中的每个元素的格式为:dst host:ports
来表示。
类型 | 示例 | 含义 |
---|---|---|
任何 | * | 无限制(即所有访问目标) |
用户 | 张三@teamname | 张三用户身份的所有设备 |
组 | group:开发组 | 开发组下的所有用户 |
飞网IP | 100.14.22.3 | 拥有给定飞网IP的设备 |
子网网段范围 | 192.168.1.0/24 | 给定子网中的任何IP |
主机 | my-host | my-host字段中定义的任意IP |
标签 | tag:design | 分配'design'标签的所有设备 |
互联网接入 | autogroup:internet | 通过出口节点访问互联网的用户 |
自我设备 | autogroup:self | 用于允许与源用户身份相同的任何用户进行访问。 |
飞网设备 | autogroup:members | 用于允许作为飞网的直接成员(非共享用户)的任何用户访问。 |
ports
取值范围:
类型 | 示例 |
---|---|
任何 | * |
单个端口 | 22 |
多个端口 | 80,443 |
端口范围 | 1000-2000 |
3.5 ACL的测试:tests
测试部分允许您为访问控制规则编写断言,这些断言将在每次更改访问控制策略文件时进行检查。如果有断言未通过,新的访问控制策略文件将不被允许保存。
"tests": [
{ "src": "张三@teamname",
"accept": ["主机-1:20", "主机-2:80"],
"deny": ["10.10.10.1:22"]
}
],
• src
字段指定正在测试的用户身份。这可以是用户标识、组、ACL标签或映射到IP地址的主机。
• 测试用例将从对应的用户、组、标签或主机的角度运行,以检查ACL是否按预期工作。
• accept
和deny
字段分别指定ACL规则应接受或拒绝的目标。
3.6 标签所有者:TagOwners
标签所有者定义了可以应用于设备的标签,以及允许分配和使用每个标签的用户列表。标签代替了用户标识,也就是说,此时设备在飞网中的身份,已经不属于某个特定用户,而是属于分配给它的这个标签,针对用户的访问控制规则,将不再适用于配置了该标签的设备,而取决于该标签的访问控制策略。
"tagOwners": {
"tag:webserver": [
"group:设计组"
],
"tag:secureserver": [
"group:安全组",
"张三@teamname"
]
},
3.7 ssh
ssh
字段用于控制哪些用户可以通过飞网建立SSH连接,以及它们可以连接到哪些设备和以什么ssh用户名
"ssh": [
{
"action": "check", // "accept" or "check"
"src": ["autogroup:members"],
"dst": ["autogroup:self"],
"users":["autogroup:nonroot"],
"checkPeriod": "12h" // 校验期效默认为12小时
}
],
action
接受连接或对其接受身份验证
src
连接源,可以是用户、组或标签
dst
连接目标,可以是用户或标签。注意,与ACL不同,不能指定端口。默认为22端口。
users
主机上允许的用户名集合。也可以指定允许除了某个特定用户之外的任何用户。
checkPeriod
校验模式下的校验周期,如果未指定,则为12小时。
3.8 disableIPv4:false
表示飞网客户端在进行设备间通信时将同时使用IPv4和IPv6。如果设置为true,则只使用IPv6进行连接。默认为false。
3.9 randomizeClientPort: false
表示飞网客户端在连接设备时将使用固定的端口进行通信。如果设置为true,则每次连接会使用随机端口。默认为false。
3.10 ICEMap
自定义飞网的ICE中继服务器
"ICEMap": {
"OmitDefaultRegions": false,
"Regions": {
"901": {
"Nodes": [
{
"Name": "sx",
"RegionID": 901,
"HostName": "icesx.gmzta.com",
"ICEPort": "44380",
"STUNPort": "43478",
"STUNOnly": false
}
],
"RegionID": 901
}
}
}
4 飞网访问控制策略文件示例:
{
"acls": [
// “张三@teamname”用户下的所有设备可以访问主机名为"dnsserver"的设备
{
"action": "accept",
"src": ["张三@teamname"],
"dst": ["dns服务器:*"]
},
// “安全组”的用户可以访问所有的HTTPS服务器以及主机名为"研发区"的所有设备
{
"action": "accept",
"src": ["group:安全组"],
"dst": [
"*:443",
"研发区:*"
]
},
// “员工组”的用户可以通过HTTP访问"websites"标签的设备
{
"action": "accept",
"src": ["group:员工组"],
"proto": "tcp",
"dst": ["tag:websites:80"]
},
// “员工组”的用户仅允许IP协议16去访问“设计组”用户的所有设备
{
"action": "accept",
"src": ["group:员工组"],
"proto": "16",
"dst": ["group:设计组:*"]
},
// 用户“张三@teamname”和“设计组”的用户能访问标签为"soc"的设备
{
"action": "accept",
"src": ["张三@teamname", "group:设计组"],
"dst": ["tag:soc:*"]
},
// 所有标签为"soc"的用户的设备之间可以互相访问.
{
"action": "accept",
"src": ["tag:soc"],
"dst": ["tag:soc:*"]
},
// 被验证为同一用户上的设备可以在端口22上互相访问
{
"action": "accept",
"src": ["*"],
"dst": ["autogroup:self:22"]
}
],
// 对设备IP(或网段)设备取别名
"hosts": {
"dns服务器": "100.1.2.3",
"研发区": "10.0.0.0/8",
"sql服务器": "100.2.3.4"
},
// 创建了“安全组”与“员工组”
"groups": {
"group:安全组": [
"李四@teamname",
"王五@teamname"
],
"group:员工组": [
"李四@teamname",
"张三@teamname",
"王五@teamname",
"赵六@teamname"
]
},
"tagOwners": {
"tag:soc": ["张三@teamname"],
"tag:security": ["group:安全组"],
"tag:websites": ["group:设计组"]
},
"ssh": [
{
// 所有的飞网用户都可以作为非root用户通过SSH连接到自己的设备
"action": "accept",
"src": ["autogroup:members"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot"]
}
],
"tests": [
// “张三@teamname”用户上的设备可通过SSH访问“dns服务器”和标签为"soc"的设备
{
"src": "张三@teamname",
"accept": ["dns服务器:22", "tag:soc:22"]
},
// 标签为"security"的用户不允许访问主机为“sql服务器”的服务器
{
"src": "tag:security",
"deny": ["sql服务器:*"]
}
],
"disableIPv4": false,
"randomizeClientPort": false
}