Share via


Az Azure IoT Hub Device Provisioning Service (DPS) hozzáférésének szabályozása közös hozzáférésű jogosultságkódokkal és biztonsági jogkivonatokkal

Ez a cikk az Azure IoT Hub Device Provisioning Service (DPS) védelmének rendelkezésre álló lehetőségeit ismerteti. A kiépítési szolgáltatás hitelesítéssel és engedélyekkel biztosít hozzáférést az egyes végpontokhoz. Az engedélyek lehetővé teszik, hogy a hitelesítési folyamat a funkciók alapján korlátozza a szolgáltatáspéldányhoz való hozzáférést.

Ez a cikk a következőt ismerteti:

  • A hitelesítési folyamat és a kiépítési szolgáltatás jogkivonatai a Szolgáltatás és a Device REST API-k engedélyeinek ellenőrzésére szolgálnak.

  • A háttéralkalmazások számára a Service API eléréséhez adható különböző engedélyek.

Authentication

A Device API támogatja a kulcsalapú és az X.509 tanúsítványalapú eszközhitelesítést.

A Service API támogatja a háttéralkalmazások kulcsalapú hitelesítését.

Kulcsalapú hitelesítés használatakor a Device Provisioning Service biztonsági jogkivonatokkal hitelesíti a szolgáltatásokat, hogy elkerülje a kulcsok küldését a vezetéken. Emellett a biztonsági jogkivonatok időkorlátja és hatóköre korlátozott. Az Azure IoT Device Provisioning SDK-k speciális konfiguráció nélkül automatikusan létrehoznak jogkivonatokat.

Bizonyos esetekben előfordulhat, hogy közvetlenül, az SDK-k használata nélkül kell használnia a HTTP Device Provisioning Service REST API-kat. Az alábbi szakaszok azt ismertetik, hogyan hitelesíthetők közvetlenül a REST API-kon.

Eszköz API-hitelesítése

Az eszköz API-t az eszközök a Device Provisioning Service-nek való igazolásra és IoT Hub-kapcsolat fogadására használják.

Megjegyzés:

A hitelesített kapcsolat fogadásához először regisztrálni kell az eszközöket a Device Provisioning Service-ben egy regisztrációval. A Service API használatával programozott módon regisztrálhat egy eszközt egy regisztráción keresztül.

Az eszköznek hitelesítést kell végeznie az Eszköz API-val a kiépítési folyamat részeként. Az eszköz által a hitelesítéshez használt módszer egy regisztrációs csoport vagy egyéni regisztráció beállításakor lesz definiálva. A hitelesítési módszertől függetlenül az eszköznek https PUT-t kell kiadnia a következő URL-címre, hogy kiépüljön.

    https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01

Kulcsalapú hitelesítés használata esetén a rendszer egy biztonsági jogkivonatot ad át a HTTP-engedélyezési kérelem fejlécében a következő formátumban:

    SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI} 

Biztonsági jogkivonat-struktúra kulcsalapú hitelesítéshez

A biztonsági jogkivonat a HTTP-engedélyezési kérelem fejlécében a következő formátumban lesz átadva:

    SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI} 

A várt értékek a következők:

Érték Description
{signature} Az űrlap HMAC-SHA256 aláírási sztringje: {URL-encoded-resourceURI} + "\n" + expiry. Fontos: A kulcs a base64-ről van dekódolva, és kulcsként használható a HMAC-SHA256 számításhoz.
{expiry} UTF8 sztringek másodpercekig az 1970. január 1-jén (UTC) 00:00:00 (UTC) óta eltelt idő óta.
{URL-encoded-resourceURI} Kisbetűs URL-kódolás {ID_Scope}/registrations/{registration_id}
{policyName} A Device API esetében ez a szabályzat mindig "regisztráció".

Az alábbi Python-kódrészlet egy olyan függvényt generate_sas_token mutat be, amely kiszámítja a jogkivonatot a bemenetekből uri, keypolicy_nameexpiry egy szimmetrikus kulcsos hitelesítési típus használatával végzett egyéni regisztrációhoz.


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"))

Az eredménynek a következő kimenethez kell hasonlítania:


SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration 

Az alábbi példa bemutatja, hogyan történik a közös hozzáférésű jogosultságkód használata a Device API-val való hitelesítéshez.


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 

Ha szimmetrikus kulcsalapú regisztrációs csoportot használ, először létre kell hoznia egy device symmetric kulcsot a regisztrációs csoport kulcsával. A regisztrációs csoport elsődleges vagy másodlagos kulcsával kiszámíthatja az eszköz regisztrációs azonosítójának HMAC-SHA256 azonosítóját. Az eredmény ezután Base64 formátumba lesz konvertálva a származtatott eszközkulcs lekéréséhez. A példakódok megtekintéséhez lásd : Eszközök kiépítése szimmetrikus kulcsregisztrációs csoportok használatával. Az eszköz szimmetrikus kulcsának levezetése után az előző példák alapján regisztrálhatja az eszközt.

Figyelmeztetés:

Annak érdekében, hogy a csoport főkulcsát ne vegye fel az eszközkódba, az eszközkulcs származtatásának folyamatát le kell végezni az eszközről.

Tanúsítványalapú hitelesítés

Ha egyéni regisztrációs vagy regisztrációs csoportot állított be az X.509 tanúsítványalapú hitelesítéshez, az eszköznek a kiadott X.509-tanúsítványával kell igazolnia az Eszköz API-t. A regisztráció beállításáról és az eszköztanúsítvány létrehozásának módjáról az alábbi cikkekben olvashat.

A regisztráció beállítása és az eszköztanúsítvány kiadása után az alábbi példa bemutatja, hogyan hitelesíthető a Device API-val az eszköz X.509-tanúsítványával.


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 

Service API-hitelesítés

A Service API a regisztrációs állapot lekérésére és az eszközregisztrációk eltávolítására szolgál. A szolgáltatást a háttéralkalmazások is használják az egyes csoportok és a regisztrációs csoportok programozott kezelésére. A Service API támogatja a háttéralkalmazások kulcsalapú hitelesítését.

A Service API-végpontok eléréséhez megfelelő engedélyekkel kell rendelkeznie. Egy háttéralkalmazásnak például tartalmaznia kell egy biztonsági hitelesítő adatokat tartalmazó jogkivonatot, valamint a szolgáltatásnak küldött összes üzenetet.

Az Azure IoT Hub Device Provisioning Service hozzáférést biztosít a végpontokhoz a jogkivonat megosztott hozzáférési szabályzatokkal való ellenőrzésével. A biztonsági hitelesítő adatokat, például a szimmetrikus kulcsokat soha nem küldi el a rendszer a vezetéken keresztül.

Hozzáférés-vezérlés és engedélyek

Engedélyeket a következő módokon adhat meg:

Megjegyzés:

A Device Provisioning Service erőforrás-szolgáltatót az Azure-előfizetése védi, ahogy az Azure Resource Manager összes szolgáltatója is.

A biztonsági jogkivonatok készítéséről és használatáról a következő szakaszban olvashat bővebben.

A HTTP az egyetlen támogatott protokoll, és a hitelesítést úgy valósítja meg, hogy egy érvényes jogkivonatot tartalmaz az Engedélyezési kérelem fejlécében.

Példa

SharedAccessSignature sr = 
   mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\

Megjegyzés:

Az Azure IoT Device Provisioning Service SDK-k automatikusan létrehoznak jogkivonatokat a szolgáltatáshoz való csatlakozáskor.

Biztonsági jogkivonatok

A Device Provisioning Service biztonsági jogkivonatokkal hitelesíti a szolgáltatásokat, hogy elkerülje a kulcsok küldését a vezetéken. Emellett a biztonsági jogkivonatok időkorlátja és hatóköre korlátozott. Az Azure IoT Device Provisioning Service SDK-k speciális konfiguráció nélkül automatikusan létrehoznak jogkivonatokat. Egyes forgatókönyvek esetében a biztonsági jogkivonatokat közvetlenül kell létrehoznia és használnia. Ilyen forgatókönyvek például a HTTP-felület közvetlen használata.

Biztonsági jogkivonat-struktúra

Biztonsági jogkivonatokkal időkorlátos hozzáférést biztosít a szolgáltatások számára az IoT Device Provisioning Service adott funkcióihoz. A kiépítési szolgáltatáshoz való csatlakozás engedélyezéséhez a szolgáltatásoknak megosztott hozzáféréssel vagy szimmetrikus kulccsal aláírt biztonsági jogkivonatokat kell küldenie.

A megosztott hozzáférési kulccsal aláírt jogkivonat hozzáférést biztosít a megosztott hozzáférési szabályzat engedélyeivel társított összes funkcióhoz.

A biztonsági jogkivonat formátuma a következő:

SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}

A várt értékek a következők:

Érték Description
{signature} Az űrlap HMAC-SHA256 aláírási sztringje: {URL-encoded-resourceURI} + "\n" + expiry. Fontos: A kulcs a base64-ről van dekódolva, és kulcsként használható a HMAC-SHA256 számításhoz.
{lejárat} UTF8 sztringek másodpercekig az 1970. január 1-jén (UTC) 00:00:00 (UTC) óta eltelt idő óta.
{URL-encoded-resourceURI} A kisbetűs erőforrás URI-jának kisbetűs URL-kódolása. Az ezzel a jogkivonattal elérhető végpontok URI-előtagja (szegmens szerint), kezdve az IoT Device Provisioning Service gazdagép nevével (protokoll nélkül). For example, mydps.azure-devices-provisioning.net.
{policyName} Annak a megosztott hozzáférési szabályzatnak a neve, amelyre ez a jogkivonat hivatkozik.

Megjegyzés:

Az URI-előtagot szegmens és nem karakter alapján számítjuk ki. Például /a/b egy előtag a következőhöz /a/b/c , de nem a következőhöz /a/bc: .

Az alábbi Node.js kódrészlet egy generateSasToken nevű függvényt mutat be, amely a bemenetekből számítja ki a jogkivonatotresourceUri, signingKey, policyName, expiresInMins. A következő szakaszok részletesen ismertetik, hogyan inicializálhatók a különböző jogkivonat-használati esetek különböző bemenetei.

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;
};

Összehasonlításként az egyenértékű Python-kód egy biztonsági jogkivonat létrehozásához a következő:

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)

Megjegyzés:

Mivel a jogkivonat érvényességi ideje érvényesítve van az IoT Device Provisioning Service-gépeken, a jogkivonatot létrehozó gép órájának eltérésének minimálisnak kell lennie.

Biztonsági jogkivonatok használata szolgáltatásösszetevőkből

A szolgáltatásösszetevők csak olyan megosztott hozzáférési szabályzatok használatával hozhatnak létre biztonsági jogkivonatokat, amelyek a korábban ismertetetteknek megfelelően biztosítják a megfelelő engedélyeket.

A végpontokon az alábbi szolgáltatásfüggvények érhetők el:

Végpont Functionality
{your-service}.azure-devices-provisioning.net/enrollments Eszközregisztrációs műveleteket biztosít a Device Provisioning Service szolgáltatással.
{your-service}.azure-devices-provisioning.net/enrollmentGroups Műveleteket biztosít az eszközregisztrációs csoportok kezeléséhez.
{your-service}.azure-devices-provisioning.net/registrations/{id} Műveleteket biztosít az eszközregisztrációk állapotának lekéréséhez és kezeléséhez.

Például egy előre létrehozott megosztott hozzáférési szabályzattal enrollmentread létrehozott szolgáltatás létrehoz egy jogkivonatot a következő paraméterekkel:

  • erőforrás URI-ja: {mydps}.azure-devices-provisioning.net,
  • aláírókulcs: a szabályzat egyik kulcsa enrollmentread ,
  • szabályzat neve: enrollmentread,
  • bármely lejárati idő.backn

Create a shared access policy for your Device Provisioning Service instance in the portal

var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread'; 
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

Az eredmény, amely hozzáférést adna az összes regisztrációs rekord olvasásához, a következő lenne:

SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread

SDK és minták

Referenciatémakörök:

Az alábbi referenciatémakörök további információt nyújtanak az IoT Device Provisioning Service-hez való hozzáférés szabályozásáról.

Eszközkiépítési szolgáltatás engedélyei

Az alábbi táblázat az IoT Device Provisioning Service-hez való hozzáférés szabályozásához használható engedélyeket sorolja fel.

Permission Jegyzetek
ServiceConfig Hozzáférést biztosít a szolgáltatáskonfigurációk módosításához.
Ezt az engedélyt a háttérbeli felhőszolgáltatások használják.
EnrollmentRead Olvasási hozzáférést biztosít az eszközregisztrációkhoz és a regisztrációs csoportokhoz.
Ezt az engedélyt a háttérbeli felhőszolgáltatások használják.
EnrollmentWrite Írási hozzáférést biztosít az eszközregisztrációkhoz és a regisztrációs csoportokhoz.
Ezt az engedélyt a háttérbeli felhőszolgáltatások használják.
RegistrationStatusRead Olvasási hozzáférést biztosít az eszközregisztrációs állapothoz.
Ezt az engedélyt a háttérbeli felhőszolgáltatások használják.
RegistrationStatusWrite Törlési hozzáférést biztosít az eszközregisztrációs állapothoz.
Ezt az engedélyt a háttérbeli felhőszolgáltatások használják.