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
, key
policy_name
expiry
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.
Rövid útmutató – Szimulált X.509-eszköz üzembe helyezése az Azure IoT Hubon
Rövid útmutató – X.509-eszközök regisztrálása az Azure Device Provisioning Service-be
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:
Megosztott hozzáférés-engedélyezési szabályzatok. A megosztott hozzáférési szabályzatok az engedélyek tetszőleges kombinációját adhatják meg. Szabályzatokat definiálhat az Azure Portalon, vagy programozott módon a Device Provisioning Service REST API-kkal. Az újonnan létrehozott kiépítési szolgáltatás az alábbi alapértelmezett szabályzattal rendelkezik:
provisioningserviceowner: Minden engedéllyel rendelkező szabályzat. Részletes információkért tekintse meg az engedélyeket .
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
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. |