이 문서에서는 Azure IoT Hub DPS(Device Provisioning Service)를 보호하기 위한 사용 가능한 옵션을 설명합니다. 프로비전 서비스는 인증 및 권한을 사용하여 각 엔드포인트에 대한 액세스 권한을 부여 합니다 . 사용 권한을 통해 인증 프로세스는 기능에 따라 서비스 인스턴스에 대한 액세스를 제한할 수 있습니다.
이 문서에서는 다음에 대해 설명합니다.
프로비전 서비스에서 서비스 및 디바이스 REST API에 대한 사용 권한을 확인하는 데 사용하는 인증 프로세스 및 토큰입니다.
서비스 API에 액세스하기 위해 백 엔드 앱에 부여할 수 있는 다양한 권한입니다.
Authentication
디바이스 API는 키 기반 및 X.509 인증서 기반 디바이스 인증을 지원합니다.
서비스 API는 백 엔드 앱에 대한 키 기반 인증을 지원합니다.
키 기반 인증을 사용하는 경우 Device Provisioning Service는 보안 토큰을 사용하여 서비스를 인증하여 유선으로 키를 보내지 않도록 합니다. 또한 보안 토큰은 시간 유효성 및 범위에서 제한됩니다. Azure IoT Hub Device Provisioning SDK는 특별한 구성 없이 토큰을 자동으로 생성합니다.
경우에 따라 SDK를 사용하지 않고 HTTP Device Provisioning Service REST API를 직접 사용해야 할 수 있습니다. 다음 섹션에서는 REST API에 대해 직접 인증하는 방법을 설명합니다.
디바이스 API 인증
디바이스 API는 디바이스에서 Device Provisioning Service를 확인하고 IoT Hub 연결을 수신하는 데 사용됩니다.
비고
인증된 연결을 받으려면 먼저 등록을 통해 Device Provisioning Service에 디바이스를 등록해야 합니다. 서비스 API를 사용하여 등록을 통해 디바이스를 프로그래밍 방식으로 등록합니다.
디바이스는 프로비저닝 프로세스의 일부로 디바이스 API에 인증해야 합니다. 디바이스가 인증하는 데 사용하는 방법은 등록 그룹 또는 개별 등록을 설정할 때 정의됩니다. 인증 방법이 무엇이든 간에 디바이스는 자체 프로비저닝을 위해 다음 URL에 HTTPS PUT을 발급해야 합니다.
https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
키 기반 인증을 사용하는 경우 보안 토큰은 다음 형식으로 HTTP 권한 부여 요청 헤더에 전달됩니다.
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
키 기반 인증을 위한 보안 토큰 구조
보안 토큰은 다음 형식으로 HTTP 권한 부여 요청 헤더에 전달됩니다.
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
예상 값은 다음과 같습니다.
| 가치 | Description |
|---|---|
{signature} |
양식의 HMAC-SHA256 서명 문자열입니다 {URL-encoded-resourceURI} + "\n" + expiry.
중요: 키는 base64에서 디코딩되고 HMAC-SHA256 계산을 수행하는 키로 사용됩니다. |
{expiry} |
1970년 1월 1일 epoch 0시 UTC 이후의 초 수에 대한 UTF8 문자열입니다. |
{URL-encoded-resourceURI} |
{ID_Scope}/registrations/{registration_id}의 소문자 URL 인코딩 |
{policyName} |
디바이스 API의 경우 이 정책은 항상 "등록"입니다. |
다음 Python 코드 조각은 함수 generate_sas_token이(가) 대칭 키 인증 유형을 사용하여 개별 등록을 위한 입력 uri, key, policy_name, expiry에서 토큰을 계산하는 방법을 보여줍니다.
from base64 import b64encode, b64decode, encode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC
def generate_sas_token(uri, key, policy_name, expiry=3600):
ttl = time() + expiry
sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest())
rawtoken = {
'sr' : uri,
'sig': signature,
'se' : str(int(ttl)),
'skn' : policy_name
}
return 'SharedAccessSignature ' + urlencode(rawtoken)
print(generate_sas_token("myIdScope/registrations/mydeviceregistrationid", "00mysymmetrickey", "registration"))
결과는 다음 출력과 유사합니다.
SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration
다음 예제에서는 공유 액세스 서명을 사용하여 Device API를 인증하는 방법을 보여 있습니다.
curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding: utf-8' -H 'Authorization: [token]' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
대칭 키 기반 등록 그룹을 사용하는 경우 먼저 등록 그룹 키를 사용하여 키를 생성 device symmetric 해야 합니다. 등록 그룹 기본 또는 보조 키를 사용하여 디바이스에 대한 등록 ID의 HMAC-SHA256 계산합니다. 그런 다음 결과를 Base64 형식으로 변환하여 파생된 디바이스 키를 가져옵니다. 코드 예제를 보려면 디바이스 키 파생을 참조하세요. 디바이스 대칭 키가 파생되면 이전 예제를 사용하여 디바이스를 등록할 수 있습니다.
경고
디바이스 코드에 그룹 마스터 키를 포함하지 않도록 하려면 디바이스에서 디바이스 키를 파생시키는 프로세스를 수행해야 합니다.
인증서 기반 인증
X.509 인증서 기반 인증에 대한 개별 등록 또는 등록 그룹을 설정하는 경우 디바이스는 발급된 X.509 인증서를 사용하여 Device API에 증명해야 합니다. 등록을 설정하고 디바이스 인증서를 생성하는 방법에 대한 다음 문서를 참조하세요.
등록이 설정되고 디바이스 인증서가 발급되면 다음 예제에서는 디바이스의 X.509 인증서를 사용하여 Device API에 인증하는 방법을 보여 줍니다.
curl -L -i -X PUT –cert ./[device_cert].pem –key ./[device_cert_private_key].pem -H 'Content-Type: application/json' -H 'Content-Encoding: utf-8' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
서비스 API 인증
서비스 API는 등록 상태를 검색하고 디바이스 등록을 제거하는 데 사용됩니다. 또한 이 서비스는 백 엔드 앱에서 개별 그룹 및 등록 그룹을 프로그래밍 방식으로 관리하는 데 사용됩니다. 서비스 API는 백 엔드 앱에 대한 키 기반 인증을 지원합니다.
서비스 API 엔드포인트에 액세스할 수 있는 적절한 권한이 있어야 합니다. 예를 들어 백 엔드 앱은 서비스에 보내는 모든 메시지와 함께 보안 자격 증명을 포함하는 토큰을 포함해야 합니다.
Azure IoT Hub Device Provisioning Service는 공유 액세스 정책에 대해 토큰을 확인하여 엔드포인트에 대한 액세스 권한을 부여합니다. 대칭 키와 같은 보안 자격 증명은 유선으로 전송되지 않습니다.
액세스 제어 및 권한
다음과 같은 방법으로 권한을 부여할 수 있습니다.
공유 액세스 권한 부여 정책. 공유 액세스 정책은 사용 권한의 조합을 부여할 수 있습니다. Azure Portal에서 또는 Device Provisioning Service REST API를 사용하여 프로그래밍 방식으로 정책을 정의할 수 있습니다. 새로 만든 프로비저닝 서비스에는 다음과 같은 기본 정책이 있습니다.
provisioningserviceowner: 모든 권한이 있는 정책입니다. 자세한 내용은 사용 권한을 참조하세요.
비고
Device Provisioning Service 리소스 공급자는 Azure Resource Manager의 모든 공급자와 마찬가지로 Azure 구독을 통해 보호됩니다.
보안 토큰을 생성하고 사용하는 방법에 대한 자세한 내용은 다음 섹션을 참조하세요.
HTTP는 유일하게 지원되는 프로토콜이며 권한 부여 요청 헤더에 유효한 토큰을 포함하여 인증 을 구현합니다.
Example
SharedAccessSignature sr =
mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\
비고
Azure IoT Hub Device Provisioning Service SDK는 서비스에 연결할 때 토큰을 자동으로 생성합니다.
보안 토큰
Device Provisioning Service는 보안 토큰을 사용하여 서비스를 인증하여 유선으로 키를 보내지 않도록 합니다. 또한 보안 토큰은 시간 유효성 및 범위에서 제한됩니다. Azure IoT Hub Device Provisioning Service SDK는 특별한 구성 없이 토큰을 자동으로 생성합니다. 일부 시나리오에서는 보안 토큰을 직접 생성하고 사용해야 합니다. 이러한 시나리오에는 HTTP 표면의 직접 사용이 포함됩니다.
보안 토큰 구조
보안 토큰을 사용하여 IoT Hub Device Provisioning Service의 특정 기능에 대한 서비스에 대한 시간 제한 액세스 권한을 부여합니다. 프로비전 서비스에 연결할 수 있는 권한을 얻으려면 서비스에서 공유 액세스 또는 대칭 키로 서명된 보안 토큰을 보내야 합니다.
공유 액세스 키로 서명된 토큰은 공유 액세스 정책 권한과 연결된 모든 기능에 대한 액세스 권한을 부여합니다.
보안 토큰의 형식은 다음과 같습니다.
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
예상 값은 다음과 같습니다.
| 가치 | Description |
|---|---|
| {signature} | 양식의 HMAC-SHA256 서명 문자열입니다 {URL-encoded-resourceURI} + "\n" + expiry.
중요: 키는 base64에서 디코딩되고 HMAC-SHA256 계산을 수행하는 키로 사용됩니다. |
| {만료} | 1970년 1월 1일 epoch 0시 UTC 이후의 초 수에 대한 UTF8 문자열입니다. |
| {URL로 인코딩된-resourceURI} | 소문자 리소스 URI의 소문자 URL 인코딩. IoT Device Provisioning Service의 호스트 이름(프로토콜 없음)부터 이 토큰으로 액세스할 수 있는 엔드포인트의 URI 접두사(세그먼트별)입니다. 예: mydps.azure-devices-provisioning.net. |
| {policyName} | 이 토큰이 참조하는 공유 액세스 정책의 이름입니다. |
비고
URI 접두사는 문자가 아닌 세그먼트별로 계산됩니다. 예를 들어, /a/b는 /a/b/c의 접두사이지만 /a/bc의 접두사는 아닙니다.
다음 Node.js 코드 조각은 입력에서 토큰을 계산하는 generateSasToken 이라는 함수를 보여 줍니다 resourceUri, signingKey, policyName, expiresInMins. 다음 섹션에서는 다양한 토큰 사용 사례에 대한 다양한 입력을 초기화하는 방법을 자세히 설명합니다.
var generateSasToken = function(resourceUri, signingKey, policyName, expiresInMins) {
resourceUri = encodeURIComponent(resourceUri);
// Set expiration in seconds
var expires = (Date.now() / 1000) + expiresInMins * 60;
expires = Math.ceil(expires);
var toSign = resourceUri + '\n' + expires;
// Use crypto
var hmac = crypto.createHmac('sha256', new Buffer(signingKey, 'base64'));
hmac.update(toSign);
var base64UriEncoded = encodeURIComponent(hmac.digest('base64'));
// Construct authorization string
var token = "SharedAccessSignature sr=" + resourceUri + "&sig="
+ base64UriEncoded + "&se=" + expires + "&skn="+ policyName;
return token;
};
비교를 통해 보안 토큰을 생성하는 동일한 Python 코드는 다음과 같습니다.
from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC
def generate_sas_token(uri, key, policy_name, expiry=3600):
ttl = time() + expiry
sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
print sign_key
signature = b64encode(HMAC(b64decode(key), sign_key, sha256).digest())
rawtoken = {
'sr' : uri,
'sig': signature,
'se' : str(int(ttl)),
'skn' : policy_name
}
return 'SharedAccessSignature ' + urlencode(rawtoken)
비고
IoT Device Provisioning Service 컴퓨터에서 토큰의 시간 유효성이 검사되므로 토큰을 생성하는 컴퓨터의 클록에 대한 드리프트는 최소여야 합니다.
서비스 구성 요소의 보안 토큰 사용
서비스 구성 요소는 앞에서 설명한 대로 적절한 권한을 부여하는 공유 액세스 정책을 사용하여 보안 토큰만 생성할 수 있습니다.
엔드포인트에 노출되는 서비스 함수는 다음과 같습니다.
| 엔드포인트 | 기능성 |
|---|---|
{your-service}.azure-devices-provisioning.net/enrollments |
Device Provisioning Service를 사용하여 디바이스 등록 작업을 제공합니다. |
{your-service}.azure-devices-provisioning.net/enrollmentGroups |
디바이스 등록 그룹을 관리하기 위한 작업을 제공합니다. |
{your-service}.azure-devices-provisioning.net/registrations/{id} |
디바이스 등록 상태를 검색하고 관리하기 위한 작업을 제공합니다. |
예를 들어 미리 생성된 공유 액세스 정책을 enrollmentread 사용하여 생성된 서비스는 다음 매개 변수를 사용하여 토큰을 만듭니다.
- 리소스 URI:
{mydps}.azure-devices-provisioning.net, - 정책
enrollmentread의 키 중 하나인 서명 키, - 정책 이름:
enrollmentread, - 임의의 만료 시간.backn
var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread';
var policyKey = '...';
var token = generateSasToken(endpoint, policyKey, policyName, 60);
모든 등록 레코드를 읽을 수 있는 액세스 권한을 부여하는 결과는 다음과 같습니다.
SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread
SDK 및 샘플
참조 문서:
다음 참조 문서에서는 IoT Device Provisioning Service에 대한 액세스를 제어하는 방법에 대한 자세한 정보를 제공합니다.
디바이스 프로비저닝 서비스 권한
다음 표에서는 IoT Device Provisioning Service에 대한 액세스를 제어하는 데 사용할 수 있는 권한을 나열합니다.
| 허가 | 비고 |
|---|---|
| ServiceConfig | 서비스 구성을 변경할 수 있는 액세스 권한을 부여합니다. 이 권한은 백 엔드 클라우드 서비스에서 사용됩니다. |
| EnrollmentRead | 디바이스 등록 및 등록 그룹에 대한 읽기 권한을 부여합니다. 이 권한은 백 엔드 클라우드 서비스에서 사용됩니다. |
| EnrollmentWrite | 디바이스 등록 및 등록 그룹에 대한 쓰기 권한을 부여합니다. 이 권한은 백 엔드 클라우드 서비스에서 사용됩니다. |
| RegistrationStatusRead | 디바이스 등록 상태에 대한 읽기 권한을 부여합니다. 이 권한은 백 엔드 클라우드 서비스에서 사용됩니다. |
| RegistrationStatusWrite | 디바이스 등록 상태에 대한 삭제 액세스 권한을 부여합니다. 이 권한은 백 엔드 클라우드 서비스에서 사용됩니다. |