BLOG
이번 포스팅에서는 AWS IoT 장치 관리로 일반적인 비즈니스 시나리오인 그룹 정책 기능을 사용하는 방법을 보여주는 시뮬레이션을 진행 합니다. 구체적으로 들여다 보겠습니다.
- 계층적 그룹 구조를 만들고 IoT 장치를 다른 그룹에 할당하는 방법
- 그룹 기반 정책에 따라 다른 IoT 장치에 메시지를 게시하는 방법
Scenario
IoT 장치 게이트웨이에 주문요청을 게시하는 씨애틀의 소매점을 예시로 보겠습니다. 게이트웨이는 주문 처리를 위해 AWS IoT Core에 메시지를 전송하고 AWS IoT Core는 주문 메시지를 샌프란시스코의 공장에 게시합니다.
이 시나리오에서는 AWS IoT 장치 관리를 사용하여 씨애틀의 IoT 게이트웨이 및 샌프란시스코의 제조 장비를 관리합니다.
각 그룹에는 각기 다른 정책이 주어집니다.
- 씨애틀 그룹의 장치는 특정 주제를 통해서만 메시지를 게시 할 수 있습니다. 또한, 다른 상점에 대한 정보를 게시 할 수 없습니다. 씨애틀 그룹은 AWS IoT Core로부터 메시지를 받지 않습니다.
- 샌프란시스코 그룹의 장치는 샌프란시스코로 지정된 메시지에만 반응할 수 있습니다. 이는 해당 장치가 다른 공장의 메시지를 수신 할 수 없음을 의미합니다.
Notes
- 시작하기 전에 그룹들은 계층적임을 유의해야 합니다. 상위 그룹과 하위 그룹을 신중하게 정의해야 합니다. 상위 그룹은 생성 된 후에 변경될 수 없습니다. 그룹을 다른 상위 그룹으로 이동할 수 없습니다.
- 그룹 정책 상속에 따라 하위 그룹의 장치는 상위 그룹의 정책을 상속하므로 그룹 계층과 정책 상속을 신중하게 설계해야 합니다. 일반적인 모범사례로서 상위 그룹에는 최소한의 허용 그룹 정책이 있어야 합니다. 하위 그룹에 더 많은 특정 사용 권한을 추가합니다. 정책 상속으로 인해 상위 그룹과 하위 그룹간에 충돌이 있는 경우 (예: 동일한 리소스에 Allow 명령문과 Deny 명령문이 모두 있는 경우) 작업이 명시적으로 거부됩니다. 그룹 정책 트리를 만들 때 이 점을 명심해야 합니다.
그룹 구성의 예
- AWS 관리 콘솔에 로그인하고 AWS IoT 콘솔을 실행 합니다. 관리 창 아래에 ‘new Groups’ 옵션을 찾습니다. 콘솔 또는 다음 CLI 명령을 사용하여 새 그룹을 만들 수 있습니다. 우리의 시나리오에서는 먼저 상위 그룹인 US를 만든 다음 두 개의 하위 그룹인 씨애틀과 샌프란시스코를 만듭니다. 파트너 그룹인 US에 두 개의 하위 그룹을 추가하고 그룹 계층을 확인해야 합니다.
# Create Parent Group#
aws iot create-thing-group –thing-group-name ‘US’
# Create Child Group and Assign to Parent Group
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’
- 우리의 시나리오에서 우리는 씨애틀Thing1과 샌프란시스코Thing1 두 가지를 만들 것 입니다. 각각의 것은 사물 레지스트리에 추가되고 명시된 그룹에 지정됩니다. MQTT TLS 1.2를 통해 디바이스 게이트웨이에 연결될 수 있도록 새로 작성된 사물에 인증서를 첨부해야 합니다. 자체 인증서를 사용하거나 AWS IoT Core CA를 사용할 수 있습니다. 이 예시에서는 AWS IoT Core CA를 사용하여 새 인증서를 할당합니다.
# Create a new IoT thing#
aws iot create-thing –thing-name SeattleThing1
aws iot create-thing –thing-name SanFranciscoThing1
# Create certificate and set it as active status
# Create certificate for SeattleThing1
aws iot create-keys-and-certificate –set-as-active
# Create certificate for SanFranciscoThing1
aws iot create-keys-and-certificate –set-as-active
# Attach certificate to IoT thing
aws iot attach-thing-principal –thing-name SeattleThing1 –principal <Certificate ARN>
aws iot attach-thing-principal –thing-name SanFranciscoThing1 –principal <Certificate ARN>
# Add IoT thing to group#
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
- AWS IoT 장치관리가 출시되기 전에는 개별 인증서에 정책을 첨부하고 정책을 별도로 관리해야 했습니다. 하지만 이제는 개별 인증서 대신 그룹에 정책을 첨부 할 수가 있습니다. 서로 다른 그룹 지정을 기반으로 정책을 만들게 됩니다. 씨애틀그룹은 씨애틀 주문 상태 주제만 게시할 수 있으며, 샌프란시스코 그룹은 AWS IoT Core의 주문 프로세스만 응할 수 있습니다. 콘솔 또는 다음 명령을 사용하여 정책을 만들 수 있습니다.
aws iot create-policy –policy-name <Policy Name>–policy-document <Policy Value>
- US 그룹의 경우, 최소 허용 정책을 사용하며, 게시/가입 프로세스 없이 장치가 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}/*”
}
]
}
- 정책을 만든 후에는 각 정책을 다른 그룹에 개별적으로 첨부 시킬 수 있습니다. 콘솔 또는 다음 CLI 명령을 사용하여 그룹에 정책을 첨부 할 수 있습니다.
aws iot attach-policy –target <Thing Group Arn> –policy-name <Policy Name>
- 세가지 정책을 첨부한 후에 주문 요청 시스템을 구축 할 수 있습니다. 이 시나리오에서는 MQTT.fx를 사용하여 MQTT 클라이언트 (AWS IoT Core에 연결하기 위해 씨애틀의 상점과 샌프란시스코의 공장을 대표함)로 작동합니다.
- 자 이제, 재미있는 부분으로 들어가겠습니다. 씨애틀에서 주문을 받는 상점을 시뮬레이션 한 다음 IoT 규칙을 사용하여 주문 요청 프로세스 시스템을 처리하는 샌프란시스코의 모든 공장을 시뮬레이션 할 수 있습니다. 씨애틀 / SeattleThing1 / OrderStatus 주제에서 OrderNumber 속성을 선택하고 샌프란시스코 / SanFranciscoThing1 / ProcessOrder 주제로 다시 게시하기 위해 IoT 규칙을 작성할 수 있습니다. 이렇게 하면 샌프란시스코 공장에서 시애틀 상점의 주문 요청을 처리하게 됩니다. 메시지를 샌프란시스코 대상으로 다시 게시 할 수 있도록 규칙 작업을 만들어야 합니다. Rules Engine에 대한 자세한 내용은 AWS IoT Developer Guide의 Rules for AWS IoT을 참조하십시오. 콘솔 또는 다음 CLI 명령을 사용하여 IoT 규칙을 만들 수 있습니다.
aws iot create-topic-rule –rule-name <Rule Name> –topic-rule-payload <Rule Value>
- 이제 MQTT.fx 클라이언트를 사용하여 시애틀 상점에서 주문 메시지를 게시 할 수 있습니다.
-
IoT규칙은 이 메시지에서 OrderNumber 속성을 선택하고 샌프란시스코 공장의 장치로 다시 게시할 것입니다. MQTT.fx 샌프란시스코 디바이스의 결과를 전송합니다.
부록
그룹에 정책을 연결하면 해당 정책이 그룹의 모든 디바이스에 적용됩니다. 테스트인증 API를 사용하여 프로덕션 환경의 실제 장치에 영향을 주지 않도록 정책을 테스트하는 것이 좋습니다. 다음 명령을 사용하여 예상 결과를 시뮬레이션할 수 있습니다.
- 먼저 다음 명령을 사용하여 그룹에 대해 현재 연결된 정책을 확인하십시오.
#Use the following command to verify the current effective policy on your thing, which only has one group policy attached#
aws iot test-authorization –auth-infos “[{\”actionType\”: \”CONNECT\”, \”resources\”:[<Thing ARN>]}, {\”actionType\”: \”PUBLISH\”, \”resources\”: [<Topic ARN>\”]}]” –client-id <Thing Name> –principal <certificate-ARN>
다음은 명령의 출력을 나타냅니다. 보시는 바와 같이,”연결”은 허용되는 동작이며,”게시”는 거부되었습니다.
{
“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.동일한 그룹에 대해 새 그룹 정책을 연결하기 전에 다음 명령을 사용하여 이 새 정책에 대한 결과를 확인하십시오.
#Use the following command to verify the result after new group policy attached#
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>]”
다음은 명령의 출력을 나타냅니다. 보시는 바와 같이, “연결”과 “게시” 모두 동작이 허용됩니다.
{
“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”
}
]
}
}
]
}
참고자료 링크:
- Thing Groups in the AWS IoT Developer Guide
- AWS IoT Policies in the AWS IoT Developer Guide
- Rules for AWS IoT in the AWS IoT Developer Guide
- MQTT.fx download page
원문 URL: https://aws.amazon.com/ko/blogs/iot/iot-device-management-group-policy/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.