A Python használata az ACL-ek kezeléséhez az Azure Data Lake Storage Gen2-ben

Ez a cikk bemutatja, hogyan használhatja a Pythont a címtárak és fájlok hozzáférés-vezérlési listájának lekérésére, beállítására és frissítésére.

Az ACL-öröklés már elérhető a szülőkönyvtárban létrehozott új gyermekelemekhez. A szülőkönyvtár meglévő gyermekelemeit rekurzív módon is hozzáadhatja, frissítheti és eltávolíthatja anélkül, hogy ezeket a módosításokat külön-külön kellene végrehajtania minden gyermekelemhez.

Csomag (Python-csomagindex) | Minták | Rekurzív ACL-minták | API-referencia | Gen1-ről Gen2-leképezésre | Visszajelzés küldése

Előfeltételek

  • Azure-előfizetés. További információ: Ingyenes Azure-próbaidőszak lekérése.

  • Hierarchikus névtérrel (HNS) rendelkező tárfiók. Az alábbi utasításokat követve hozzon létre egyet.

  • Azure CLI-verzió 2.6.0 vagy újabb.

  • Az alábbi biztonsági engedélyek egyike:

    • Egy kiépített Microsoft Entra ID biztonsági tag , amely a Storage Blob Data Owner szerepkörhöz lett hozzárendelve, hatóköre a céltárolóra, tárfiókra, szülőerőforrás-csoportra vagy előfizetésre terjed ki.

    • Annak a céltárolónak vagy könyvtárnak a tulajdonosa, amelyre ACL-beállításokat kíván alkalmazni. Az ACL-ek rekurzív beállításához ez magában foglalja a céltárolóban vagy könyvtárban lévő összes gyermekelemet.

    • Tárfiókkulcs.

A projekt beállítása

Telepítse a Pythonhoz készült Azure Data Lake Storage ügyfélkódtárat pip használatával.

pip install azure-storage-file-datalake

Adja hozzá ezeket az importálási utasításokat a kódfájl tetejére.

from azure.storage.filedatalake import DataLakeServiceClient
from azure.identity import DefaultAzureCredential

Csatlakozás a fiókhoz

A cikkben szereplő kódrészletek használatához létre kell hoznia egy DataLakeServiceClient-példányt , amely a tárfiókot jelöli.

Csatlakozás a Microsoft Entra ID használatával

Megjegyzés:

Ha a Hozzáférés engedélyezéséhez Microsoft Entra-azonosítót használ, győződjön meg arról, hogy a biztonsági taghoz hozzárendelték a Storage Blob Data Owner szerepkört. Az ACL-engedélyek alkalmazásával és a módosításuk hatásaival kapcsolatos további információkért tekintse meg az Azure Data Lake Storage Gen2 hozzáférés-vezérlési modelljét.

A PythonHoz készült Azure Identity-ügyfélkódtár használatával hitelesítheti az alkalmazást a Microsoft Entra ID azonosítójával.

Először az alábbi Azure-szerepköralapú hozzáférés-vezérlési (Azure RBAC) szerepkörök egyikét kell hozzárendelnie a biztonsági taghoz:

Role ACL-beállítási képesség
Storage-blobadatok tulajdonosa A fiók összes könyvtára és fájlja.
Storage blobadat-közreműködő Csak a biztonsági tag tulajdonában lévő könyvtárak és fájlok.

Ezután hozzon létre egy DataLakeServiceClient-példányt , és adja át a DefaultAzureCredential osztály új példányát.

def get_service_client_token_credential(self, account_name) -> DataLakeServiceClient:
    account_url = f"https://{account_name}.dfs.core.windows.net"
    token_credential = DefaultAzureCredential()

    service_client = DataLakeServiceClient(account_url, credential=token_credential)

    return service_client

Az adatokhoz való hozzáférés engedélyezéséhez a DefaultAzureCredential használatával kapcsolatos további információkért lásd: Áttekintés: Python-alkalmazások hitelesítése az Azure-ban az Azure SDK használatával.

Csatlakozás fiókkulcs használatával

Az adatokhoz való hozzáférést a fiók hozzáférési kulcsával (megosztott kulcs) engedélyezheti. Ez a példa létrehoz egy DataLakeServiceClient-példányt , amely a fiókkulccsal van engedélyezve.

def get_service_client_account_key(self, account_name, account_key) -> DataLakeServiceClient:
    account_url = f"https://{account_name}.dfs.core.windows.net"
    service_client = DataLakeServiceClient(account_url, credential=account_key)

    return service_client

Figyelmeztetés

A megosztott kulccsal való engedélyezés nem ajánlott, mivel kevésbé biztonságos. Az optimális biztonság érdekében tiltsa le a megosztott kulccsal történő engedélyezést a tárfiókhoz, az Azure Storage-fiók megosztott kulcsának engedélyezésének megakadályozása című cikkben leírtak szerint.

A hozzáférési kulcsok és a kapcsolati sztring használatát a koncepcióalkalmazások vagy a fejlesztési prototípusok kezdeti ellenőrzésére kell korlátozni, amelyek nem férnek hozzá éles vagy bizalmas adatokhoz. Ellenkező esetben az Azure SDK-ban elérhető jogkivonatalapú hitelesítési osztályokat mindig előnyben kell részesíteni az Azure-erőforrásokhoz való hitelesítéskor.

A Microsoft azt javasolja, hogy az ügyfelek a Microsoft Entra-azonosítót vagy a közös hozzáférésű jogosultságkódot (SAS) használják az Azure Storage-adatokhoz való hozzáférés engedélyezéséhez. További információ: Műveletek engedélyezése adathozzáféréshez.

ACL-ek beállítása

Az ACL beállításakor a teljes ACL-t lecseréli, beleértve az összes bejegyzést is. Ha módosítani szeretné egy biztonsági tag engedélyszintét, vagy új biztonsági tagot szeretne hozzáadni az ACL-hez anélkül, hogy más meglévő bejegyzéseket érinteni kellene, akkor ehelyett frissítenie kell az ACL-t. Az ACL lecserélése helyett az ACL frissítéséről a cikk ACL-ek frissítése című szakaszában olvashat.

Ez a szakasz a következő lépéseket mutatja be:

  • Címtár ACL-jének beállítása
  • Fájl ACL-jének beállítása

Címtár ACL-jének beállítása

A címtár hozzáférés-vezérlési listájának (ACL) lekéréséhez hívja meg a DataLakeDirectoryClient.get_access_control metódust, és állítsa be az ACL-t a DataLakeDirectoryClient.set_access_control metódus meghívásával.

Ez a példa lekéri és beállítja egy névvel ellátott könyvtár ACL-ét my-directory. A sztring rwxr-xrw- olvasási, írási és végrehajtási engedélyeket ad a tulajdonos felhasználónak, a tulajdonoscsoportnak csak olvasási és végrehajtási engedélyeket ad, és minden másnak olvasási és írási engedélyt ad.

def manage_directory_permissions():
    try:
        file_system_client = service_client.get_file_system_client(file_system="my-file-system")

        directory_client = file_system_client.get_directory_client("my-directory")
        
        acl_props = directory_client.get_access_control()
        
        print(acl_props['permissions'])
        
        new_dir_permissions = "rwxr-xrw-"
        
        directory_client.set_access_control(permissions=new_dir_permissions)
        
        acl_props = directory_client.get_access_control()
        
        print(acl_props['permissions'])
    
    except Exception as e:
     print(e)

A tároló gyökérkönyvtárának ACL-ét is lekérheti és beállíthatja. A gyökérkönyvtár lekéréséhez hívja meg a FileSystemClient._get_root_directory_client metódust.

Fájl ACL-jének beállítása

Kérje le egy fájl hozzáférés-vezérlési listáját (ACL) a DataLakeFileClient.get_access_control metódus meghívásával, és állítsa be az ACL-t a DataLakeFileClient.set_access_control metódus meghívásával.

Ez a példa lekéri és beállítja egy nevű fájl ACL-ét my-file.txt. A sztring rwxr-xrw- olvasási, írási és végrehajtási engedélyeket ad a tulajdonos felhasználónak, a tulajdonoscsoportnak csak olvasási és végrehajtási engedélyeket ad, és minden másnak olvasási és írási engedélyt ad.

def manage_file_permissions():
    try:
        file_system_client = service_client.get_file_system_client(file_system="my-file-system")

        directory_client = file_system_client.get_directory_client("my-directory")
        
        file_client = directory_client.get_file_client("uploaded-file.txt")

        acl_props = file_client.get_access_control()
        
        print(acl_props['permissions'])
        
        new_file_permissions = "rwxr-xrw-"
        
        file_client.set_access_control(permissions=new_file_permissions)
        
        acl_props = file_client.get_access_control()
        
        print(acl_props['permissions'])

    except Exception as e:
     print(e)

ACL-ek rekurzív beállítása

Az ACL beállításakor a teljes ACL-t lecseréli, beleértve az összes bejegyzést is. Ha módosítani szeretné egy biztonsági tag engedélyszintét, vagy új biztonsági tagot szeretne hozzáadni az ACL-hez anélkül, hogy más meglévő bejegyzéseket érinteni kellene, akkor ehelyett frissítenie kell az ACL-t. Ha lecserélése helyett frissíteni szeretne egy ACL-t, tekintse meg a cikk rekurzív frissítési ACL-jeinek szakaszát.

Az ACL-ek rekurzív beállítása a DataLakeDirectoryClient.set_access_control_recursive metódus meghívásával.

Ha alapértelmezett ACL-bejegyzést szeretne beállítani, adja hozzá a sztringet default: az egyes ACL-bejegyzési sztringek elejéhez.

Ez a példa egy névvel ellátott könyvtár ACL-jének my-parent-directorybeállítását állítja be.

Ez a metódus egy logikai paramétert fogad el, is_default_scope amely meghatározza, hogy az alapértelmezett ACL-t kell-e beállítani. Ha ez a Trueparaméter, akkor az ACL-bejegyzések listáját a sztring default:előzi meg. A példában szereplő bejegyzések a következő engedélyeket biztosítják: olvasási, írási és végrehajtási engedélyek a tulajdonos felhasználó számára, olvasási és végrehajtási engedélyek a tulajdonoscsoporthoz, valamint olvasási engedélyek az összes többi felhasználó számára. A példában szereplő utolsó ACL-bejegyzés olvasási engedélyekkel rendelkezik egy xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx adott felhasználó számára.

def set_permission_recursively(is_default_scope):
    
    try:
        file_system_client = service_client.get_file_system_client(file_system="my-container")

        directory_client = file_system_client.get_directory_client("my-parent-directory")

        acl = 'user::rwx,group::r-x,other::r--,user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r--'   

        if is_default_scope:
           acl = 'default:user::rwx,default:group::r-x,default:other::r--,default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r--'

        directory_client.set_access_control_recursive(acl=acl)
        
        acl_props = directory_client.get_access_control()
        
        print(acl_props['permissions'])

    except Exception as e:
     print(e)

Ha egy olyan példát szeretne látni, amely a kötegméret megadásával rekurzív módon dolgozza fel az ACL-eket, tekintse meg a Python-mintát.

ACL-ek rekurzív frissítése

Az ACL frissítésekor az ACL-t módosítja ahelyett, hogy lecseréli az ACL-t. Hozzáadhat például egy új biztonsági tagot az ACL-hez anélkül, hogy az az ACL-ben felsorolt többi biztonsági tagot érintené. Ha frissíteni szeretné az ACL-t a frissítés helyett, olvassa el a cikk ACL-ek beállítása című szakaszát.

Az ACL rekurzív frissítéséhez hozzon létre egy új ACL-objektumot a frissíteni kívánt ACL-bejegyzéssel, majd használja ezt az objektumot az ACL-művelet frissítéséhez. Ne szerezze be a meglévő ACL-t, csak adja meg a frissíteni kívánt ACL-bejegyzéseket. Az ACL rekurzív frissítése a DataLakeDirectoryClient.update_access_control_recursive metódus meghívásával. Ha egy alapértelmezett ACL-bejegyzést szeretne frissíteni, adja hozzá a sztringet default: az egyes ACL-bejegyzési sztringek elejéhez.

Ez a példa egy írási engedéllyel rendelkező ACL-bejegyzést frissít.

Ez a példa egy névvel ellátott könyvtár ACL-jének my-parent-directorybeállítását állítja be. Ez a metódus elfogad egy logikai paramétert, amely is_default_scope megadja, hogy frissíteni kell-e az alapértelmezett ACL-t. ha ez a paraméter, Trueakkor a frissített ACL-bejegyzést a sztring default:előzi meg.

def update_permission_recursively(is_default_scope):
    
    try:
        file_system_client = service_client.get_file_system_client(file_system="my-container")

        directory_client = file_system_client.get_directory_client("my-parent-directory")
              
        acl = 'user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx'   

        if is_default_scope:
           acl = 'default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx'

        directory_client.update_access_control_recursive(acl=acl)

        acl_props = directory_client.get_access_control()
        
        print(acl_props['permissions'])

    except Exception as e:
     print(e)

Ha egy olyan példát szeretne látni, amely a kötegméret megadásával rekurzív módon dolgozza fel az ACL-eket, tekintse meg a Python-mintát.

ACL-bejegyzések rekurzív eltávolítása

Eltávolíthat egy vagy több ACL-bejegyzést. Az ACL-bejegyzések rekurzív eltávolításához hozzon létre egy új ACL-objektumot az ACL-bejegyzés eltávolításához, majd használja ezt az objektumot az ACL-művelet eltávolításához. Ne szerezze be a meglévő ACL-t, csak adja meg az eltávolítandó ACL-bejegyzéseket.

Távolítsa el az ACL-bejegyzéseket a DataLakeDirectoryClient.remove_access_control_recursive metódus meghívásával. Ha el szeretne távolítani egy alapértelmezett ACL-bejegyzést, adja hozzá a sztringet default: az ACL-bejegyzési sztring elejéhez.

Ez a példa eltávolít egy ACL-bejegyzést a névvel ellátott my-parent-directorykönyvtár ACL-éből. Ez a metódus egy logikai paramétert fogad el, is_default_scope amely megadja, hogy el kívánja-e távolítani a bejegyzést az alapértelmezett ACL-ből. ha ez a paraméter, Trueakkor a frissített ACL-bejegyzést a sztring default:előzi meg.

def remove_permission_recursively(is_default_scope):

    try:
        file_system_client = service_client.get_file_system_client(file_system="my-container")

        directory_client = file_system_client.get_directory_client("my-parent-directory")

        acl = 'user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

        if is_default_scope:
           acl = 'default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

        directory_client.remove_access_control_recursive(acl=acl)

    except Exception as e:
     print(e)

Ha egy olyan példát szeretne látni, amely a kötegméret megadásával rekurzív módon dolgozza fel az ACL-eket, tekintse meg a Python-mintát.

Helyreállítás hibákból

Futásidejű vagy engedélyhibákat tapasztalhat. Futásidejű hibák esetén indítsa újra a folyamatot az elejétől kezdve. Engedélyhibák akkor fordulhatnak elő, ha a rendszerbiztonsági tag nem rendelkezik elegendő engedéllyel a módosított címtár vagy fájl ACL-jének módosításához. Oldja meg az engedélyproblémát, majd válassza a folyamat folytatását a meghibásodási pontról egy folytatási jogkivonat használatával, vagy indítsa újra a folyamatot az elejétől. Nem kell a folytatási jogkivonatot használnia, ha az elejétől kezdve szeretne újraindulni. Az ACL-bejegyzéseket negatív hatás nélkül újra alkalmazhatja.

Ez a példa egy folytatási jogkivonatot ad vissza meghibásodás esetén. Az alkalmazás a hiba elhárítása után újra meghívhatja ezt a példametódust, és átadhatja a folytatási jogkivonatot. Ha ez a példametódus első alkalommal van meghívva, az alkalmazás átadhat egy értéket a folytatási jogkivonat paraméterének None .

def resume_set_acl_recursive(continuation_token):
    
    try:
        file_system_client = service_client.get_file_system_client(file_system="my-container")

        directory_client = file_system_client.get_directory_client("my-parent-directory")
              
        acl = 'user::rwx,group::rwx,other::rwx,user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r--'

        acl_change_result = directory_client.set_access_control_recursive(acl=acl, continuation=continuation_token)

        continuation_token = acl_change_result.continuation

        return continuation_token
        
    except Exception as e:
     print(e) 
     return continuation_token

Ha egy olyan példát szeretne látni, amely a kötegméret megadásával rekurzív módon dolgozza fel az ACL-eket, tekintse meg a Python-mintát.

Ha azt szeretné, hogy a folyamat megszakítás nélkül befejeződjön engedélyhibákkal, ezt megadhatja.

Annak érdekében, hogy a folyamat zavartalanul befejeződjön, ne adjon át folytatási jogkivonatot a DataLakeDirectoryClient.set_access_control_recursive metódusnak.

Ez a példa rekurzív módon állítja be az ACL-bejegyzéseket. Ha ez a kód engedélyezési hibát tapasztal, rögzíti a hibát, és folytatja a végrehajtást. Ez a példa a hibák számát nyomtatja ki a konzolon.

def continue_on_failure():
    
    try:
        file_system_client = service_client.get_file_system_client(file_system="my-container")

        directory_client = file_system_client.get_directory_client("my-parent-directory")
              
        acl = 'user::rwx,group::rwx,other::rwx,user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r--'

        acl_change_result = directory_client.set_access_control_recursive(acl=acl)

        print("Summary: {} directories and {} files were updated successfully, {} failures were counted."
          .format(acl_change_result.counters.directories_successful, acl_change_result.counters.files_successful,
                  acl_change_result.counters.failure_count))
        
    except Exception as e:
     print(e)

Ha egy olyan példát szeretne látni, amely a kötegméret megadásával rekurzív módon dolgozza fel az ACL-eket, tekintse meg a Python-mintát.

Best practices

Ez a szakasz az ACL-ek rekurzív beállítására vonatkozó ajánlott eljárásokat ismerteti.

Futtatókörnyezeti hibák kezelése

Futásidejű hiba több okból is előfordulhat (például kimaradás vagy ügyfélkapcsolati probléma). Ha futásidejű hibát tapasztal, indítsa újra a rekurzív ACL-folyamatot. Az ACL-ek újra alkalmazhatók az elemekre anélkül, hogy negatív hatással lenne.

Engedélyhibák kezelése (403)

Ha rekurzív ACL-folyamat futtatása közben hozzáférés-vezérlési kivételt tapasztal, előfordulhat, hogy az AD biztonsági tag nem rendelkezik elegendő engedéllyel ahhoz, hogy ACL-t alkalmazzon a címtárhierarchiában lévő gyermekelemek egy vagy több elemére. Engedélyhiba esetén a folyamat leáll, és egy folytatási jogkivonatot ad meg. Javítsa ki az engedélyproblémát, majd használja a folytatási jogkivonatot a fennmaradó adathalmaz feldolgozásához. A már sikeresen feldolgozott könyvtárakat és fájlokat nem kell újra feldolgozni. Dönthet úgy is, hogy újraindítja a rekurzív ACL-folyamatot. Az ACL-ek újra alkalmazhatók az elemekre anélkül, hogy negatív hatással lenne.

Hitelesítő adatok

Javasoljuk, hogy kiépítsen egy Microsoft Entra biztonsági tagot, amely a Tárolóblob-adattulajdonos szerepkörhöz lett hozzárendelve a céltárfiók vagy tároló hatókörében.

Teljesítmény

A késés csökkentése érdekében javasoljuk, hogy futtassa a rekurzív ACL-folyamatot egy Olyan Azure-beli virtuális gépen (VM), amely a tárfiókja régiójában található.

ACL-korlátok

A címtárakra vagy fájlokra alkalmazható ACL-ek maximális száma 32 hozzáférési ACL és 32 alapértelmezett ACL. További információért lásd: Hozzáférés-vezérlés az Azure Data Lake Storage Gen2-ben.

Kapcsolódó információk