본문 바로가기

프로그래밍/IoT

[AWS IoT] Policy(정책)_IoT Device와 서버 간의 Interface

반응형

2번의 포스팅을 통해 IoT Device가 통신을 할 수 있기 위한 IoT 인증서에 대해서 살펴보았다.

AWS IoT의 경우, MQTT Protocol에 따라서 통신을 하게 되는데 적절한 인증 방법과 유효한 인증서를 통해 MQTT Broker에 연결한 Device가 어떤 규격에 따라 통신을 할 수 있는지의 문제가 남아있다.

 

Web Application과 IoT Service에서의 Interface 비교

일반적인 Web Application을 생각해보면, Client와 Server 간의 통신에 대한 방법은 API Interface에 따라서 정해지게 된다.

HTTPS 기반의 REST API라고 생각해보면 어떤 Endpoint로 어떤 Method를 사용하여 Request를 보내고, 그에 대한 Response는 무엇인지가 정의되어 있다.

API Server의 구현체를 하나의 JSON Format에 따라 요약을 해둔 Swagger 문서와 같은 결과물을 얻을 수 있고, 이것이 Client와 Server 사이에 정해진 Interface가 된다.

당연히 API Interface에 정의되지 않은 형태로 통신이 이뤄져야만 한다.

 

IoT Service에서 사용하는 여러 통신 Protocol이 있겠지만, AWS IoT에서 사용하는 MQTT Protocol은 결국 socket이 기반이 된 실시간 통신 규약이다.

REST API와 방식의 차이만 있을 뿐이지 사전에 정의된 Interface에 따라서 적절한 통신이 이뤄져야 한다.

AWS IoT에서는 MQTT로 Device와 서버 간 데이터를 주고 받을 수 있는 Interface를 규정한 JSON 기반의 문서Policy(정책)라고 명시하고 있다.

 

IoT Core Policy 사용법

IoT Policy의 구체적인 내용은 AWS의 개발자 문서를 꼼꼼히 살펴보는 것을 추천한다.

다만, 주로 사용하는 항목에 대해서 간단하게 정리를 하면 아래와 같다.

1) 정책 작업의 종류

기본적으로 사용하는 MQTT 정책 작업의 종류는 다음과 같은 4가지가 있다.

  • iot:Connect - IoT Broker에 연결할 수 있는 권한을 정의한다. Connection 요청이 있을 때 확인하는 부분이다.
  • iot:Publish - MQTT에 Topic을 Publish(발송)할 수 있는 권한을 정의하는 것으로 Policy에 정의되지 않은 Topic을 발송할 경우 권한 오류가 발생한다.
  • iot:Receive - 메시지를 수신할 수 있는 권한으로 구체적으로 Client로 응답을 전송하게 되는 응답 Topic에 대한 권한을 제어한다.
  • iot:Subscribe - 특정 Topic 패턴과 일치하는 Topic에 대한 구독과 관련된 권한을 정의하는 것으로 구체적으로 수신하고자 하는 메시지에 대한 Topic의 공통 패턴으로 Subscribe를 정의한다.

2) 정책 작업 작성하기

AWS Console의 Policy 생성 화면

AWS Console에서 정책 생성하는 화면으로 접속하면, 위와 같은 페이지를 확인할 수 있다.

처음으로 나타나는 화면은 왼쪽의 "기본 모드" 화면이지만, 일반적으로 API에서 Policy를 생성하는 방식을 생각해보았을 때 우측과 같은 "고급 모드"로 정책을 생성하기를 권장한다.

 

그 외의 정책에 대한 구체적인 표현 방법은 아래의 AWS Documents를 활용하는 것이 좋다.

https://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/example-iot-policies.html

3) String을 통한 Policy 제어 - IAM 기반 & JSON Type

서두에 언급한 것과 같이 AWS IoT Policy의 기본적인 구조는 JSON Format이다.

즉, Key-Value 형식으로 되어있으며 각각은 String으로 표현되는 구조이다.

 

또한, AWS Policy의 경우 AWS IAM 정책과 동일한 규칙을 따른다.

그렇기 때문에 IAM JSON에서 제공하고 있는 여러가지 조건 연산자(Condition)을 Policy에서 사용하는 것이 가능하다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
                }
            }
        }
    ]
}

 AWS 공식 문서의 인증서 정책 예시(링크)에서도 IAM Policy Condition에서 제공하는 StringEquals 조건을 사용하는 방법을 제시하고 있다.

공식 문서에서 IAM 정책과 동일한 규칙을 따른다는 한 줄의 명시는 되어 있지만, 정책 예시 페이지에서 위의 예시를 제외한 다른 IAM Condition을 사용한 예시를 찾기는 어렵기 때문에 직접 동작 테스트를 해봐야하는 불편함은 있지만, 기본적인 동작 방식은 유추가 가능하다.

 

IoT Policy는 IoT Cert와 함께 서비스 인증을 처리하는 필수적인 component이기 때문에 보다 철저한 관리가 필요하다.

또한, IoT Service의 경우 요청과 응답 또는 case에 따른 분기로 기본적인 동작이 이뤄지는 IoT Device에 의해 서비스가 동작하기 때문에 불필요한 요청에 대한 block과 악의적인 공격에 대한 방어 로직을 위해서라도 인증서 관리와 함께 Interface 즉, Policy 관리가 중요하다.


Policy에 대한 기본적인 내용을 바탕으로 다음 포스팅에서는 실제 서비스에서 Policy를 설계할 때, 유의해야하는 부분과 Policy를 관리하는 방법에 대해서 다뤄보고자 한다.

반응형