Fermer

août 23, 2018

Créer un service de jeton de sécurité avec le service de stockage d'objets –


Cet article a été publié à l'origine sur Alibaba Cloud . Merci de soutenir les partenaires qui rendent SitePoint possible.

Pensez-vous avoir un meilleur conseil pour tirer le meilleur parti des services Alibaba Cloud? Parlez-en nous et courez la chance de gagner un Macbook Pro (plus d'autres trucs sympas). Pour en savoir plus, cliquez ici .

Dans les jeux sur mobile, de nombreuses applications nécessitent que les développeurs séparent les ressources du lecteur. Cela inclut une gamme de choses, allant de l'enregistrement de fichiers au traitement des informations de profil utilisateur. En utilisant des méthodes traditionnelles, les développeurs peuvent gérer cette séparation, mais doivent prendre en compte de nombreux autres problèmes tels que la sécurité, l'évolutivité et les API.

Avec Object Storage Service ( OSS ), les clients peuvent stocker et gérer leurs objets facilement et efficacement. OSS fournit un service de traitement d'image en temps réel en ligne. Certains clients peuvent souhaiter des fonctionnalités supplémentaires, telles que permettre aux utilisateurs d’avoir un accès limité à un service comme OSS, mais avec une gestion sécurisée et centralisée.

Security Token Service fournit une gestion des autorisations d’accès à court terme pour les comptes Alibaba Cloud ou RAM . Grâce à STS, vous pouvez émettre des utilisateurs fédérés, gérés dans votre système de compte local, avec des informations d'identification d'accès qui personnalisent la durée d'expiration et les droits d'accès. Les utilisateurs fédérés peuvent utiliser les informations d'identification d'accès temporaire STS pour appeler directement l'API du service Alibaba Cloud ou pour se connecter à la console Alibaba Cloud Management pour accéder aux ressources authentifiées.

Dans ce scénario, nous testons les fonctionnalités de STS à l'aide d'OSS. 19659007] Conditions préalables

Il nécessite la possibilité d'ajuster les paramètres Gestion de l'accès aux ressources (RAM) et les rôles. Pour plus d'informations, voir Rôles .

L'exemple de code est écrit en Python. Bien que ce ne soit pas obligatoire, une compréhension de base de la programmation informatique est un avantage. L'exemple de code fourni dans ce didacticiel peut servir de modèle pouvant être modifié pour répondre à vos besoins spécifiques. De nombreuses personnes utilisent actuellement l'API brute pour gérer un environnement ou une application. Bien qu'un SDK soit disponible dans de nombreuses langues, l'API brute apporte plus de flexibilité.

Architecture

Dans ce diagramme, un utilisateur de RAM souhaite télécharger des images vers un dossier distinct dans un OSS. seau.

Le processus de téléchargement est le suivant:

  1. L'utilisateur assume un rôle de RAM pour les accès OSS en lecture et écriture pour un dossier spécifique dans Alibaba Cloud en appelant AssumeRole.
  2. STS renvoie un ensemble d'informations d'identification de sécurité temporaires.
  3. L'utilisateur applique les informations d'identification de sécurité temporaires pour accéder à OSS. L'utilisateur peut alors faire un appel en lecture ou en écriture sur l'objet.

Nous prenons OSS comme exemple ici. Toutefois, STS peut être utilisé pour accorder un accès temporaire à un large éventail de services Alibaba Cloud. Dans ce tutoriel, nous utilisons l'autorisation STS à granularité fine pour limiter l'accès à un compartiment OSS spécifique.

Implémentation

Trois fichiers de l'exemple de code sont les suivants:

  • sts.py
    • Il s'agit du code permettant d'assumer le rôle et de récupérer des informations essentielles telles que accessKeyId, accessKeySecret et securityToken.

Les fonctions disponibles sont les suivantes:

  • Génération de signatures pour garantir l'authenticité de la demande

L'exemple de code pour le fichier "sts.py" est le suivant:

 from base64 import b64encode
à partir de datetime import datetime
à partir de Crypto.Hash import SHA, HMAC
import md5, httplib, urllib, uuid, json
##### GESTION DES CONFIG
accessKeyId = ""
accessKeySecret = ""
##### GESTION DES FONCTIONS
def generateSignature (accessKeySecret, stringToSign):
    hmac = HMAC.new (accessKeySecret, stringToSign, SHA)
    retourne b64encode (hmac.digest ())
def getHttpsRequest (hôte, verbe, chemin):
    conn = httplib.HTTPSConnection (hôte)
    conn.request (verbe, chemin)
    retourne conn.getresponse ()
# ###### STS MANAGEMENT
host = "sts.aliyuncs.com"
verbe = "GET"
bucketName = ""
folderName = "1"
policy = '{"Statement": [{"Effect": "Allow","Action": ["oss:*"]"Resource": ["acs:oss:*:*:' + bucketName + '/' + folderName + '","acs:oss:*:*:' + bucketName + '/' + folderName + '/*"]}]"Version": "1"}'
dictionaryParams = {
    "AccessKeyId": accessKeyId,
    "Action": "AssumeRole",
    "DurationSeconds": "3600",
    "Format": "JSON",
    "Politique": politique,
    "RoleArn": "acs: ram :: 5081099437682835: role / ramtestossreadwrite",
    "RoleSessionName": "",
    "SignatureMethod": "HMAC-SHA1",
    "SignatureNonce": str (uuid.uuid1 ()),
    "SignatureVersion": "1.0",
    "Horodatage": datetime.strftime (datetime.utcnow (), "% Y-% m-% dT% H:% M:% SZ"),
    "Version": "2015-04-01"
}
stringToSign = ""
pour clé dans trié (dictionaryParams.iterkeys ()):
    value = urllib.quote (dictionaryParams [key]safe = "")
    si stringToSign! = "":
        stringToSign + = "&"
    stringToSign + = clé + "=" + valeur
stringToSign = verbe + "&% 2F &" + urllib.quote (stringToSign)
signature = generateSignature (accessKeySecret + "&", stringToSign)
dictionaryParams ["Signature"] = signature
params = urllib.urlencode (dictionaryParams)
path = "/?" + params
response = getHttpsRequest (hôte, verbe, chemin)
si response.status == 200:
    jsonData = json.loads (response.read ())
    print "Copier coller les informations respectives dans le fichier ossrest.py  n"
    print "accessKeyId:" + jsonData ['Credentials']['AccessKeyId']
     print "accessKeySecret:" + jsonData ['Credentials']['AccessKeySecret']
     print "securityToken:" + jsonData ['Credentials'] ['SecurityToken']
 
  • ossrest.py
    • Ce code permet de télécharger et de supprimer l'objet.

Les fonctions disponibles sont les suivantes:

  • Générer des signatures
  • Générer des en-têtes
  • Effectuer des requêtes HTTP
  • Charger des objets
  • Supprimer des objets

L'exemple de code pour le fichier "ossrest.py" est le suivant:

 from base64 import b64encode
à partir de datetime import datetime
à partir de Crypto.Hash import SHA, HMAC
import md5, httplib, urllib, uuid
##### CONFIG PRINCIPAL (STS)
accessKeyId = ""
accessKeySecret = ""
securityToken = ""
##### GESTION DES FONCTIONS
def generateSignature (accessKeySecret, stringToSign):
    hmac = HMAC.new (accessKeySecret, stringToSign, SHA)
    retourne b64encode (hmac.digest ())
def generateHeaders (verbe, canonicalizedResource = "/", canonicalizedOSSHeaders = {}, signature = {}):
    # autorisation
    stringToSign = verbe + " n"
    si "contenu" dans la signature:
        stringToSign + = md5.new (signature ["content"]). digest ()
    stringToSign + = " n"
    si "content_type" dans la signature:
        stringToSign + = signature ["content_type"]
    stringToSign + = " n"
    date = datetime.strftime (datetime.utcnow (), "% a,% d% b% Y% H:% M:% S GMT")
    stringToSign + = date + " n"
    si len (canonicalizedOSSHeaders):
        pour index, valeur dans canonicalizedOSSHeaders.items ():
            stringToSign + = index.lower () + ":" + valeur + " n"
    stringToSign + = canonicalizedResource
    signature = generateSignature (accessKeySecret, stringToSign)
    # en-têtes
    headers = {"Date": date, "Authorization": "OSS" + accessKeyId + ":" + signature}
    headers.update (canonicalizedOSSHeaders)
    renvoyer les en-têtes
def sendHttpsRequest (hôte, verbe, en-têtes, chemin = "/", params = ""):
    conn = httplib.HTTPSConnection (hôte)
    conn.request (verbe, chemin, paramètres, en-têtes)
    retourne conn.getresponse ()
##### GESTION D'OBJETS
canonicalizedOSSHeaders = {"x-oss-acl": "public-read", "x-oss-security-token": securityToken}
bucketName = ""
host = bucketName + ".oss-ap-southwest-1.aliyuncs.com"
hostMain = "oss-ap-southeast-1.aliyuncs.com"
folderName = "1"
fileName = ""
### UPLOAD OBJECT
verbe = "PUT"
canonicalizedResource = "/" + bucketName + "/" + folderName + "/" + nomfichier
headers = generateHeaders (verbe, canonicalizedResource, canonicalizedOSSHeaders)
response = sendHttpsRequest (hôte, verbe, en-têtes, "/" + nomFichier + "/" + nomfichier, ouvert (nomfichier, "rb"))
print "Objet" + fileName + "téléchargé avec succès dans" + bucketName + "/" + folderName + "bucket / folder."
print response.status, response.reason
print response.read ()
### DELETE OBJECT
verbe = "SUPPRIMER"
canonicalizedResource = "/" + bucketName + "/" + folderName + "/" + nomfichier
headers = generateHeaders (verbe, canonicalizedResource, canonicalizedOSSHeaders)
response = sendHttpsRequest (hôte, verbe, en-têtes, "/" + folderName + "/" + fileName)
print "Supprimé" + fileName + "objet"
print response.status, response.reason
print response.read ()
 
  • other_sample.py
    • Ceci est le code pour les autres scénarios. Ces échantillons peuvent ne pas être directement applicables à STS, mais sont fournis à titre d'exemple.

Les fonctions disponibles sont les suivantes:

  • Create buckets
  • Liste des compartiments
  • Upload objects
  • List objects
  • Delete objects
  • Delete buckets

L'exemple de code pour le fichier "other_sample.py" est le suivant:

 bucketName = ""
host = bucketName + ".oss-ap-southwest-1.aliyuncs.com"
fileName = ""
### CREATE BUCKET
verbe = "PUT"
signature = {}
canonicalizedResource = "/" + bucketName + "/"
headers = generateHeaders (verbe, signature, canonicalizedResource, canonicalizedOSSHeaders)
response = sendRequest (hôte, verbe, en-têtes)
print "Création réussie" + nom du compartiment + "compartiment"
print response.status, response.reason
print response.read ()
### liste liste
host = "oss-ap-southeast-1.aliyuncs.com"
verbe = "GET"
signature = {}
canonicalizedResource = "/"
headers = generateHeaders (verbe, signature, canonicalizedResource, canonicalizedOSSHeaders)
response = sendRequest (hôte, verbe, en-têtes)
imprimer "Seaux classés avec succès".
print response.status, response.reason
print response.read ()
### UPLOAD OBJECT
verbe = "PUT"
signature = {}
canonicalizedResource = "/" + bucketName + "/" + nomfichier
headers = generateHeaders (verbe, signature, canonicalizedResource, canonicalizedOSSHeaders)
response = sendRequest (hôte, verbe, en-têtes, "/" + nomfichier, ouvert (nomfichier, "rb"))
print "Objet" + FileName + "téléchargé avec succès dans" + bucketName + "bucket".
print response.status, response.reason
print response.read ()
### OBJET DE LA LISTE
verbe = "GET"
signature = {}
canonicalizedResource = "/" + bucketName + "/"
headers = generateHeaders (verbe, signature, canonicalizedResource, canonicalizedOSSHeaders)
response = sendRequest (hôte, verbe, en-têtes)
print "Objets listés avec succès dans" + bucketName + "bucket".
print response.status, response.reason
print response.read ()
### DELETE OBJECT
verbe = "SUPPRIMER"
signature = {}
canonicalizedResource = "/" + bucketName + "/" + nomfichier
headers = generateHeaders (verbe, signature, canonicalizedResource, canonicalizedOSSHeaders)
response = sendRequest (hôte, verbe, en-têtes, "/" + nomfichier)
print "Supprimé" + fileName + "objet"
print response.status, response.reason
print response.read ()
### DELETE BUCKET
verbe = "SUPPRIMER"
signature = {}
canonicalizedResource = "/" + bucketName + "/"
headers = generateHeaders (verbe, signature, canonicalizedResource, canonicalizedOSSHeaders)
response = sendRequest (hôte, verbe, en-têtes)
print "Supprimé" + bucketName + "bucket".
print response.status, response.reason
print response.read ()

Les réponses attendues sont les suivantes:

sts.py :

ossrest.py :

]

Conclusion

Cet exemple porte sur OSS mais le service STS peut également être utilisé pour contrôler l'accès à d'autres services Alibaba Cloud. Le cas d'utilisation décrit dans ce tutoriel est le jeu. D'autres scénarios ou services nécessitant un accès à court terme à l'OSS peuvent inclure:

  • Applications Web
  • Applications mobiles

Informations supplémentaires




Source link