亚马逊AWS官方博客

在零售场景中使用 AWS IoT Device Management 处理订单请求 | AWS 上的物联网

Original URL:https://aws.amazon.com/blogs/iot/iot-device-management-group-policy/
在此博文中,我们将模拟常见的商业场景,以向您展示如何在 AWS IoT Device Management 中使用组策略功能。具体来说,我们将描述:
  • 如何创建分层组结构及如何将您的 IoT 设备分配到不同的组。
  • 如何基于组策略将消息发布到不同的 IoT 设备。

 

场景

我们将使用西雅图一家零售店作为示例,该零售店向 IoT 设备网关发布订单请求。网关将订单消息发送给 AWS IoT Core 进行处理,而 AWS IoT Core 则将订单消息发布给旧金山的工厂。

在此情况中,我们将使用 AWS IoT Device Management 管理西雅图的 IoT 网关队列和旧金山的制造设备队列。

将给每个组分配不同的策略。

  • 对于西雅图组,设备只能通过特定主题发布其消息。他们不能发布有关其他任何商店的信息。西雅图零售店将不会从 AWS IoT Core 接收消息。
  • 对于旧金山组,设备只能订阅为旧金山工厂指定的消息。这表示,这些设备不能从其他工厂接收消息。

 

 

注释

  • 开始前,请注意组是分层的。您必须仔细定义父级组和子级组。父级组创建后不能更改。您不能将某个组移动到另一个父级组中。
  • 根据组策略继承,子级组中的设备会继承父级组的策略,因此,您必须仔细设计您的组分层结构和策略继承。通常情况下,最好的做法是父级组应具有最严格的组策略。为子级组添加更具体的权限。由于策略继承原因,如果父级组与子级组之间发生冲突(例如,如果同一个资源上同时具有 Allow 语句和 Deny 语句),则该操作将被显式拒绝。在创建组策略树时,请记住这一点。

 

组配置示例

1.     登录 AWS 管理控制台并打开 AWS IoT 控制台。您将在“管理”下找到新的“组”选项。您可以使用控制台或下列 CLI 命令创建新组。在我们的场景中,我们将先创建一个父级组 – 美国,然后再创建两个子级组 – 西雅图和旧金山。您需要添加两个子级组到其父级组美国中,并验证您的组分层结构。

#创建父级组#

aws iot create-thing-group --thing-group-name 'US'

#创建子级组并分配到父级组

aws iot create-thing-group --thing-group-name 'Seattle' --parent-group-name 'US'
aws iot create-thing-group --thing-group-name 'San_Francisco' --parent-group-name 'US'

2.     对于我们的场景,我们将创建两个事物:SeattleThing1 and SanFranciscoThing1.然后将每个事物添加到事物注册表中并分配到其命名组中。您需要将证书附加到新创建的事物中,以便该事物可以通过 MQTT TLS 1.2 与设备网关连接。您可以使用自己的证书或使用 AWS IoT Core CA。在此示例中,我们将使用 AWS IoT Core CA 为每个事物分配一个新证书。

#创建新的 IoT 事物#

aws iot create-thing --thing-name SeattleThing1
aws iot create-thing --thing-name SanFranciscoThing1

#创建证书并将其设置为活动状态

#为 SeattleThing1 创建证书

aws iot create-keys-and-certificate --set-as-active

#为 SanFranciscoThing1 创建证书

aws iot create-keys-and-certificate --set-as-active

#将证书附加到 IoT 事物

aws iot attach-thing-principal --thing-name SeattleThing1 --principal <Certificate ARN>
aws iot attach-thing-principal --thing-name SanFranciscoThing1 --principal <Certificate ARN>

#将 IoT 事物添加到组中#

aws iot add-thing-to-thing-group --thing-name SeattleThing1 --thing-group-name Seattle
aws iot add-thing-to-thing-group --thing-name SanFranciscoThing1 --thing-group-name San_Francisco

3.     在发布 AWS IoT Device Management 之前,您需要将策略附加到单个证书并单独管理策略。现在,您可以将策略附加到组中而不是各个证书中。您可以根据不同的组分配来创建策略。西雅图组只允许发布到西雅图订单状态主题,旧金山组只允许订阅到 AWS IoT Core 中的订单处理主题。您可以使用控制台或下列命令创建策略。

aws iot create-policy --policy-name <Policy Name>--policy-document <Policy Value>

a.     对于美国组,我们将使用最严格的策略,该策略只允许设备连接到 AWS IoT Core,而不需要任何发布/订阅过程。

{
    "Version": "2012-10-17",
    "Statement": [
     {
       "Effect": "Allow",
       "Action": "iot:Connect",
       "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:client/${iot:ClientId}"
     }
   ]
}

b.     对于西雅图组,我们将使用下列策略:

{
    "Version": "2012-10-17",
    "Statement": [
     {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/Seattle/${iot:Connection.Thing.ThingName}/*"
     }
   ]
}

c.     对于旧金山组,我们将使用下列策略:

{
    "Version": "2012-10-17",
    "Statement": [
     {
       "Effect": "Allow",
       "Action": "iot:Subscribe",
       "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topicfilter/San_Francisco/*"
     },
     {
       "Effect": "Allow",
       "Action": "iot:Receive",
       "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/San_Francisco/${iot:Connection.Thing.ThingName}/*"
     }
   ]
}

4.     创建策略后,您可以将每个策略单独附加到不同组中。您可以使用控制台或下列 CLI 命令将策略附加到组中。

aws iot attach-policy --target <Thing Group Arn> --policy-name <Policy Name>

5.     附加三个策略后,您可以构建自己的订单请求系统。在此情况下,我们将 MQTT.fx 用作 MQTT 客户端(它代表西雅图的商店和旧金山的工厂)来连接 AWS IoT Core。

6.     现在,我们来进入有趣的部分。我们可以模拟西雅图接收订单的商店,然后再模拟旧金山使用 IoT 规则处理订单请求处理系统的工厂。我们可以创建 IoT 规则以从 Seattle/SeattleThing1/OrderStatus 主题中选择 OrderNumber 属性,然后将其重新发布到 San_Francisco/SanFranciscoThing1/ProcessOrder 主题。这样,西雅图店的订单请求将由旧金山工厂处理。您需要创建规则操作,以便可以将消息重新发布到旧金山主题。有关规则引擎的信息,请参阅 AWS IoT 开发人员指南中的 AWS IoT 规则。您可以使用控制台或下列 CLI 命令创建 IoT 规则:

aws iot create-topic-rule –rule-name <Rule Name> --topic-rule-payload <Rule Value>

7.     现在,您可以使用 MQTT.fx 客户端发布西雅图店的订单消息。

8.     IoT 规则将选择此消息中的 OrderNumber 属性并将其重新发布到旧金山工厂设备中。您将从 MQTT.fx 旧金山设备中接收结果。

附录

当您将策略附加到某个组时,该策略将应用至该组中的所有设备。我们建议您使用 TestAuthorization API 在本地测试您的策略,这样便不会影响生产环境中的真实设备。您可以使用下列命令模拟预期结果。

1.     首先,使用下列命令验证您的组的当前附加策略:

#使用下面的命令在您的事物上验证当前有效的策略,该事物只附加了一个组策略#

aws iot test-authorization --auth-infos "[{\"actionType\": \"CONNECT\", \"resources\":[<Thing ARN>]}, {\"actionType\": \"PUBLISH\", \"resources\": [<Topic ARN>\"]}]" --client-id <Thing Name> --principal <certificate-ARN>

下面显示命令输出。如您所见,“CONNECT”操作被允许,“PUBLISH”被拒绝。

{
    "authResults": [
     {
       "authDecision": "ALLOWED",
       "authInfo": {
       "actionType": "CONNECT",
       "resources": [
          "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:client/SeattleThing1"
        ]
      },
     "denied": {
       "implicitDeny": {
          "policies": []
        },
     "explicitDeny": {
       "policies": []
        }
      },
      "missingContextValues": [],
       "allowed": {
         "policies": [
          {
            "policyName": "GroupManagement-US",
            "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US"
          }
        ]
        }
      },
      {
       "authDecision": "IMPLICIT_DENY",
       "authInfo": {
         "actionType": "PUBLISH",
         "resources": [
            "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:topic/Seattle/SeattleThing1"
           ]
       },
       "denied": {
         "implicitDeny": {
            "policies": [
             {
                "policyName": "GroupManagement-US",
                "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US"
             }
           ]
         },
       "explicitDeny": {
         "policies": []
         }
       },
       "missingContextValues": [],
           "allowed": {
               "policies": []
              }
          }
     ]
}

2.     在您开始为同一个组附加新的组策略之前,使用以下命令验证该新策略的结果:

#在附加完成新的组策略后使用以下命令验证结果d#

aws iot test-authorization --auth-infos "[{\"actionType\": \"CONNECT\", \"resources\": [<Thing ARN>]}, {\"actionType\": \"PUBLISH\", \"resources\": [<Topic ARN>]}]" --client-id <Thing Name> --principal <certificate-ARN> --policy-names-to-add "[<New Group Policy Name>]"

下面显示命令输出。如您所见,“CONNECT”和“PUBLISH”都是允许的操作。

{
    "authResults": [
      {
        "authDecision": "ALLOWED",
        "authInfo": {
            "actionType": "CONNECT",
            "resources": [
                "arn:aws:iot:ap-northeast-1: XXXXXXXXXXX:client/SeattleThing1"
             ]
         },
     "denied": {
        "implicitDeny": {
            "policies": [
              {
                "policyName": "GroupManagement-Seattle",
                "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-Seattle"
              }
             ]
        },
     "explicitDeny": {
        "policies": []
        }
      },
     "missingContextValues": [],
        "allowed": {
            "policies": [
              {
                "policyName": "GroupManagement-US",
                "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US"
              }
            ]
         }
      },
      {
     "authDecision": "ALLOWED",
        "authInfo": {
            "actionType": "PUBLISH",
            "resources": [
                "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/Seattle/SeattleThing1"
            ]
        },
     "denied": {
        "implicitDeny": {
            "policies": [
             {
                "policyName": "GroupManagement-US",
                "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US"
             }
             ]
        },
     "explicitDeny": {
        "policies": []
      }
      },
      "missingContextValues": [],
        "allowed": {
            "policies": [
             {
                "policyName": "GroupManagement-Seattle",
                "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-Seattle"
             }
             ]
        }
      }
   ]
}

参考链接:

·     AWS IoT 开发人员指南中的事物组

·     AWS IoT 开发人员指南中的 AWS IoT 策略

·     AWS IoT 开发人员指南中的 AWS IoT 规则

·      MQTT.fx 下载页面