Udostępnij za pomocą


Utwórz spersonalizowaną SAS dla kontenera lub bloba z Pythonem

Sygnatura dostępu współdzielonego (SAS) umożliwia udzielanie ograniczonego dostępu do kontenerów i obiektów blob w koncie magazynowym. Podczas tworzenia sygnatury dostępu współdzielonego określasz jego ograniczenia, w tym zasoby usługi Azure Storage, do których może uzyskiwać dostęp klient, jakie uprawnienia mają w tych zasobach i jak długo sygnatura dostępu współdzielonego jest prawidłowa.

Każdy SAS jest podpisany przy użyciu klucza. Sygnaturę dostępu współdzielonego można podpisać na jeden z dwóch sposobów:

  • Za pomocą klucza utworzonego przy użyciu poświadczeń firmy Microsoft Entra. Sygnatura dostępu współdzielonego podpisana przy użyciu poświadczeń Microsoft Entra to sygnatura dostępu współdzielonego z delegowaniem użytkownika. Klient, który tworzy sygnaturę dostępu współdzielonego dla delegacji użytkownika, musi mieć przypisaną rolę RBAC na platformie Azure, która zawiera akcję Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. Aby dowiedzieć się więcej, zobacz Tworzenie delegowanej sygnatury dostępu współdzielonego użytkownika.
  • Przy użyciu klucza konta przechowywania. Token SAS usługi i token SAS konta są podpisane przy użyciu klucza konta magazynowego. Klient, który tworzy sygnaturę dostępu współdzielonego usługi, musi mieć bezpośredni dostęp do klucza konta lub mieć przypisane uprawnienie Microsoft.Storage/storageAccounts/listkeys/action. Aby dowiedzieć się więcej, zobacz Tworzenie sygnatury dostępu współdzielonego dla usługi (SAS) lub Tworzenie sygnatury dostępu współdzielonego dla konta (SAS).

Uwaga

Sygnatura dostępu współdzielonego, oparta na delegowaniu użytkownika, oferuje lepsze zabezpieczenia niż sygnatura podpisana kluczem konta magazynu. Firma Microsoft zaleca używanie SAS delegowania użytkownika, jeśli jest to możliwe. Aby uzyskać więcej informacji, zobacz Udzielanie ograniczonego dostępu do danych za pomocą sygnatur dostępu współdzielonego (SAS).

W tym artykule pokazano, jak za pomocą poświadczeń Microsoft Entra utworzyć sygnaturę dostępu delegowania użytkownika (SAS) dla kontenera lub blob przy użyciu biblioteki klienta usługi Azure Storage dla języka Python.

Informacje o delegowaniu użytkownika przy użyciu sygnatury dostępu współdzielonego (SAS)

Token SAS umożliwiający dostęp do kontenera lub obiektu blob może być zabezpieczony przy użyciu poświadczeń Microsoft Entra lub klucza konta. Sygnatura dostępu współdzielonego zabezpieczona przy użyciu poświadczeń Microsoft Entra nazywana jest SAS delegowanym przez użytkownika, ponieważ token OAuth 2.0 używany do podpisania sygnatury jest żądany w imieniu użytkownika.

Firma Microsoft zaleca korzystanie z poświadczeń firmy Microsoft, jeśli jest to możliwe jako najlepsze rozwiązanie w zakresie zabezpieczeń, zamiast używać klucza konta, co może być łatwiejsze w przypadku naruszenia zabezpieczeń. Jeśli projekt aplikacji wymaga sygnatur dostępu współdzielonego, użyj poświadczeń Microsoft Entra, aby utworzyć sygnaturę dostępu delegowanego użytkownika dla lepszego zabezpieczenia. Aby uzyskać więcej informacji na temat sygnatury dostępu współdzielonego dla delegowania użytkownika, zobacz Tworzenie sygnatury dostępu współdzielonego dla delegowania użytkownika.

Uwaga

Każdy klient, który posiada prawidłową sygnaturę dostępu współdzielonego, może uzyskać dostęp do danych na koncie magazynu zgodnie z tym, co dopuszcza ta sygnatura. Ważne jest, aby chronić SAS przed złośliwym lub niezamierzonym użyciem. Zachowaj ostrożność podczas dystrybucji SAS i miej plan na odwołanie zawłaszczonego SAS.

Aby uzyskać więcej informacji na temat sygnatur dostępu współdzielonego, zobacz Udzielanie ograniczonego dostępu do zasobów usługi Azure Storage przy użyciu sygnatur dostępu współdzielonego (SAS).

Przypisywanie ról platformy Azure w celu uzyskania dostępu do danych

Gdy podmiot zabezpieczeń firmy Microsoft Entra próbuje uzyskać dostęp do danych, podmiot zabezpieczeń musi mieć uprawnienia do zasobu. Niezależnie od tego, czy podmiotem zabezpieczeń jest tożsamość zarządzana na platformie Azure, czy konto użytkownika Microsoft Entra uruchamiające kod w środowisku deweloperskim, musi mieć przypisaną rolę platformy Azure, która przyznaje dostęp do danych. Aby uzyskać informacje na temat przypisywania uprawnień za pośrednictwem kontroli dostępu opartej na rolach platformy Azure, zobacz Przypisywanie roli platformy Azure w celu uzyskania dostępu do danych obiektów blob.

konfigurowanie projektu

Aby pracować z przykładami kodu w tym artykule, wykonaj następujące kroki, aby skonfigurować projekt.

Instalowanie pakietów

Zainstaluj następujące pakiety przy użyciu polecenia pip install:

pip install azure-storage-blob azure-identity

Konfigurowanie kodu aplikacji

Dodaj następujące import dyrektywy:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    ContainerClient,
    BlobClient,
    BlobSasPermissions,
    ContainerSasPermissions,
    UserDelegationKey,
    generate_container_sas,
    generate_blob_sas
)

Uzyskiwanie uwierzytelnionego poświadczenia tokenu

Aby uzyskać poświadczenie tokenu, które pozwoli twojemu kodowi autoryzować żądania do usługi Blob Storage, utwórz instancję klasy DefaultAzureCredential. Aby uzyskać więcej informacji na temat używania klasy DefaultAzureCredential do autoryzowania tożsamości zarządzanej w celu uzyskania dostępu do usługi Blob Storage, zobacz Biblioteka klienta tożsamości platformy Azure dla języka Python.

Poniższy fragment kodu pokazuje, jak uzyskać poświadczenia tokenu uwierzytelnionego i użyć go do utworzenia klienta dla usługi Blob storage.

# Construct the blob endpoint from the account name
account_url = "https://<storage-account-name>.blob.core.windows.net"

#Create a BlobServiceClient object using DefaultAzureCredential
blob_service_client = BlobServiceClient(account_url, credential=DefaultAzureCredential())

Aby dowiedzieć się więcej na temat autoryzowania dostępu do usługi Blob Storage z aplikacji przy użyciu zestawu SDK języka Python, zobacz Uwierzytelnianie aplikacji języka Python w usługach platformy Azure.

Pobieranie klucza delegowania użytkownika

Każdy SAS jest podpisany przy użyciu klucza. Aby utworzyć delegowaną przez użytkownika sygnaturę dostępu współdzielonego (SAS), należy najpierw zażądać klucza delegowania użytkownika, który jest następnie używany do podpisania tej sygnatury. Klucz delegowania użytkownika jest analogiczny do klucza konta, który jest używany do podpisywania SAS usługi lub SAS konta, z tą różnicą, że opiera się na poświadczeniach Microsoft Entra. Gdy klient żąda klucza delegowania użytkownika przy użyciu tokenu OAuth 2.0, usługa Blob Storage zwraca klucz delegowania użytkownika w imieniu użytkownika.

Po uzyskaniu klucza delegacji użytkownika możesz użyć tego klucza, aby tworzyć dowolną liczbę sygnatur udostępniania dostępu przy użyciu delegacji użytkownika w czasie ważności klucza. Klucz delegowania użytkownika jest niezależny od tokenu OAuth 2.0 używanego do jego uzyskania, dlatego token nie musi być odnawiany, jeśli klucz jest nadal prawidłowy. Możesz określić czas, przez który klucz pozostaje ważny, maksymalnie siedem dni.

Użyj jednej z następujących metod, aby zażądać klucza delegowania użytkownika:

Poniższy przykład kodu pokazuje, jak zażądać klucza delegowania użytkownika:

def request_user_delegation_key(self, blob_service_client: BlobServiceClient) -> UserDelegationKey:
    # Get a user delegation key that's valid for 1 day
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(days=1)

    user_delegation_key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    return user_delegation_key

Utwórz sygnaturę dostępu współdzielonego dla delegowania użytkowników

Można utworzyć SAS delegowania użytkownika dla kontenera lub obiektu blob w zależności od potrzeb aplikacji.

Po uzyskaniu klucza delegacji użytkownika możesz utworzyć delegowaną sygnaturę dostępu użytkownika. Można utworzyć sygnaturę dostępu współdzielonego dla delegowania użytkownika, aby przyznać ograniczony dostęp do zasobu kontenera, używając następującej metody:

Klucz delegowania użytkownika do podpisania SAS jest przekazywany do metody jako argument user_delegation_key. Dozwolone uprawnienia są przekazywane do metody jako argumentu permission i są zdefiniowane w klasie ContainerSasPermissions .

W poniższym przykładzie kodu pokazano, jak utworzyć sygnaturę dostępu współdzielonego delegowania użytkownika dla kontenera:

def create_user_delegation_sas_container(self, container_client: ContainerClient, user_delegation_key: UserDelegationKey):
    # Create a SAS token that's valid for one day, as an example
    start_time = datetime.datetime.now(datetime.timezone.utc)
    expiry_time = start_time + datetime.timedelta(days=1)

    sas_token = generate_container_sas(
        account_name=container_client.account_name,
        container_name=container_client.container_name,
        user_delegation_key=user_delegation_key,
        permission=ContainerSasPermissions(read=True),
        expiry=expiry_time,
        start=start_time
    )

    return sas_token

Użyj delegowanego użytkownika SAS do autoryzowania obiektu klienta

Możesz użyć delegowanego SAS użytkownika, aby autoryzować obiekt klienta do wykonywania operacji na kontenerze lub obiekcie Blob na podstawie uprawnień przyznanych przez SAS.

W poniższym przykładzie kodu pokazano, jak użyć delegowanej sygnatury dostępu współdzielonego użytkownika utworzonej we wcześniejszym przykładzie w celu autoryzowania obiektu ContainerClient. Ten obiekt klienta może być używany do wykonywania operacji na zasobie kontenera w oparciu o uprawnienia przyznane przez SAS.

# The SAS token string can be appended to the resource URL with a ? delimiter
# or passed as the credential argument to the client constructor
sas_url = f"{container_client.url}?{sas_token}"

# Create a ContainerClient object with SAS authorization
container_client_sas = ContainerClient.from_container_url(container_url=sas_url)

Zasoby

Aby dowiedzieć się więcej na temat tworzenia sygnatury dostępu delegowanego użytkownika przy użyciu biblioteki klienta usługi Azure Blob Storage dla języka Python, zobacz następujące zasoby.

Przykłady kodu

Operacje interfejsu API REST

Zestaw Azure SDK dla języka Python zawiera biblioteki, które bazują na interfejsie API REST platformy Azure, umożliwiając interakcję z operacjami interfejsu API REST za pomocą znanych paradygmatów języka Python. Metoda biblioteki klienta do pobierania klucza delegowania użytkownika używa następujących operacji interfejsu API REST:

Zasoby biblioteki klienta

Zobacz też

  • Ten artykuł jest częścią przewodnika dla deweloperów usługi Blob Storage dla języka Python. Aby dowiedzieć się więcej, zobacz pełną listę artykułów z przewodnika dla deweloperów w temacie Tworzenie aplikacji w języku Python.