ACL-ek kezelése a Python használatával az Azure Data Lake Storage-ban
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ői könyvtár alatt létrehozott új gyermekelemek számára. 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 – hozzon létre egyet ingyenesen.
- A hierarchikus névtérrel (HNS) kompatibilis Azure Storage-fiók. Az alábbi utasításokat követve hozzon létre egyet.
- Python 3.8+
- 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
Ez a szakasz végigvezeti egy projekt előkészítésén a Pythonhoz készült Azure Data Lake Storage-ügyfélkódtár használatához.
A projektkönyvtárból telepítse az Azure Data Lake Storage- és Az Azure Identity-ügyfélkódtárak csomagjait a pip install
parancs használatával. Az Azure-szolgáltatásokhoz való jelszó nélküli kapcsolatokhoz az Azure-identitáscsomagra van szükség.
pip install azure-storage-file-datalake azure-identity
Ezután nyissa meg a kódfájlt, és adja hozzá a szükséges importálási utasításokat. Ebben a példában a következőket adjuk hozzá a .py fájlhoz:
from azure.identity import DefaultAzureCredential
from azure.storage.filedatalake import DataLakeServiceClient
Csatlakozás a fiókhoz
A cikkben szereplő példakódok futtatásához létre kell hoznia egy DataLakeServiceClient-példányt , amely a tárfiókot jelöli. Az ügyfélobjektumot a Microsoft Entra-azonosító hitelesítő adataival vagy egy fiókkulcsmal engedélyezheti.
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.
Feljegyzé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 hozzáférés-vezérlési modelljét.
Először rendelje hozzá az alábbi Azure szerepköralapú hozzáférés-vezérlési (Azure RBAC) szerepkörök egyikét a biztonsági taghoz:
Szerepkör | 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.
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-directory
beá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 True
paramé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-directory
beá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, True
akkor 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-directory
kö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, True
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.
Ajánlott eljárások
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.
Igazolás
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.