网络访问控制策略(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:开发组开发组下的所有用户
飞网IP100.14.22.3拥有给定飞网IP的设备
子网网段范围192.168.1.0/24给定子网中的任何IP
主机my-hostmy-host字段中定义的任意IP
标签tag:design分配'design'标签的所有设备
自动组autogroup:members具有相同属性或角色的用户、目标或用户名的设备
  • proto字段,可选,指定允许访问的协议。
协议名称proto值IANA 协议编号
互联网组管理协议(ICMP)igmp2
IPv4封装IPv44
传输控制协议(TCP)tcp6
外部网关协议(EGP)egp8
任何私人内部网关igp9
用户数据包协议(UDP)udp17
通用路由封装协议(GRE)gre47
封装安全负载(ESP)esp50
身份认证头协议(AH)ah51
流控制传输协议(SCTP)sctp132
  • dst字段,表示访问目标列表,列表中的每个元素的格式为: dst host:ports 来表示。
类型示例含义
任何*无限制(即所有访问目标)
用户张三@teamname张三用户身份的所有设备
group:开发组开发组下的所有用户
飞网IP100.14.22.3拥有给定飞网IP的设备
子网网段范围192.168.1.0/24给定子网中的任何IP
主机my-hostmy-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是否按预期工作。

acceptdeny字段分别指定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指定是接受连接还是对其接受身份验证。

  • accept接受来自已在飞网上进行身份验证的用户的连接。
  • check表示用户根据checkPeriod的时间定期进行身份验证。

src连接源,可以是用户、组或标签。

dst连接目标,可以是用户或标签。注意,与acls配置段不同,不能指定端口。默认为22端口。

users主机上允许的用户名集合。也可以指定允许除了某个特定用户之外的任何用户。

checkPeriodactioncheck时,指定在需要检查之前允许连接的时间段。这可以以分钟或小时为单位指定,最短为一分钟,最多为 168 小时(一周。如果未指定,默认为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
}
上次更新: