Azure Data Lake Storage'da ACL'leri yönetmek için Python kullanma

Bu makalede, dizinlerin ve dosyaların erişim denetim listelerini almak, ayarlamak ve güncelleştirmek için Python'ın nasıl kullanılacağı gösterilmektedir.

ACL devralma, bir üst dizin altında oluşturulan yeni alt ögeler için daha önce kullanıma sunulmuştur. Ancak, her alt öğe için bu değişiklikleri tek tek yapmak zorunda kalmadan bir üst dizinin mevcut alt öğelerine ACL'leri yinelemeli olarak ekleyebilir, güncelleştirebilir ve kaldırabilirsiniz.

Paket (Python Paket Dizini) | Örnekler | Özyinelemeli ACL örnekleri | API başvurusu | 1. Nesil ile 2. Nesil eşlemesi Geri | Bildirim Ver

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Hiyerarşik ad alanı (HNS) etkinleştirilmiş Azure depolama hesabı. Oluşturmak için bu yönergeleri izleyin.
  • Python 3.8+
  • Azure CLI sürümü 2.6.0 veya üzeri.
  • Aşağıdaki güvenlik izinlerinden biri:
    • Hedef kapsayıcı, depolama hesabı, üst kaynak grubu veya abonelik kapsamında Depolama Blobu Veri Sahibi rolü atanmış, sağlanan bir Microsoft Entra Id güvenlik sorumlusu.
    • ACL ayarlarını uygulamayı planladığınız hedef kapsayıcının veya dizinin sahibi olan kullanıcı. ACL'leri özyinelemeli olarak ayarlamak için, hedef kapsayıcıdaki veya dizindeki tüm alt öğeleri içerir.
    • Depolama hesabı anahtarı.

Projenizi ayarlama

Bu bölümde, Python için Azure Data Lake Storage istemci kitaplığıyla çalışmak üzere bir proje hazırlama adımları açıklanmaktadır.

Proje dizininizden komutunu kullanarak pip install Azure Data Lake Storage ve Azure Identity istemci kitaplıkları için paketleri yükleyin. Azure hizmetlerine parolasız bağlantılar için azure-identity paketi gereklidir.

pip install azure-storage-file-datalake azure-identity

Ardından kod dosyanızı açın ve gerekli içeri aktarma deyimlerini ekleyin. Bu örnekte, .py dosyamıza aşağıdakileri ekleyeceğiz:

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

Hesaba bağlanma

Bu makaledeki kod örneklerini çalıştırmak için depolama hesabını temsil eden bir DataLakeServiceClient örneği oluşturmanız gerekir. İstemci nesnesini Microsoft Entra Id kimlik bilgileriyle veya bir hesap anahtarıyla yetkilandırabilirsiniz.

Microsoft Entra ID ile uygulamanızın kimliğini doğrulamak için Python için Azure kimlik istemci kitaplığını kullanabilirsiniz.

Not

Erişimi yetkilendirmek için Microsoft Entra Id kullanıyorsanız güvenlik sorumlunuza Depolama Blobu Veri Sahibi rolünün atandığından emin olun. ACL izinlerinin nasıl uygulandığı ve bunların değiştirilmesinin etkileri hakkında daha fazla bilgi edinmek için bkz . Azure Data Lake Storage'da erişim denetimi modeli.

İlk olarak, güvenlik sorumlunuza aşağıdaki Azure rol tabanlı erişim denetimi (Azure RBAC) rollerinden birini atayın:

Role ACL ayarı özelliği
Depolama Blob Verileri Sahibi Hesaptaki tüm dizinler ve dosyalar.
Depolama Blobu Veri Katılımcısı Yalnızca güvenlik sorumlusuna ait dizinler ve dosyalar.

Ardından bir DataLakeServiceClient örneği oluşturun ve DefaultAzureCredential sınıfının yeni bir örneğini geçirin.

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

Verilere erişimi yetkilendirmek için DefaultAzureCredential kullanma hakkında daha fazla bilgi edinmek için bkz. Genel Bakış: Azure SDK'yı kullanarak Azure'da Python uygulamalarının kimliğini doğrulama.

ACL'leri ayarlama

Bir ACL ayarladığınızda, tüm girdileri dahil olmak üzere ACL'nin tamamını değiştirirsiniz. Bir güvenlik sorumlusunun izin düzeyini değiştirmek veya var olan diğer girişleri etkilemeden ACL'ye yeni bir güvenlik sorumlusu eklemek istiyorsanız, bunun yerine ACL'yi güncelleştirmeniz gerekir. ACL'yi değiştirmek yerine güncelleştirmek için bu makalenin ACL'leri güncelleştirme bölümüne bakın.

Bu bölümde şunların nasıl yapıldığını görebilirsiniz:

  • Dizinin ACL'sini ayarlama
  • Dosyanın ACL'sini ayarlama

Dizinin ACL'sini ayarlama

DataLakeDirectoryClient.get_access_control yöntemini çağırarak dizinin erişim denetim listesini (ACL) alın ve DataLakeDirectoryClient.set_access_control yöntemini çağırarak ACL'yi ayarlayın.

Bu örnek adlı my-directorydizinin ACL'sini alır ve ayarlar. Dize rwxr-xrw- , sahibi olan kullanıcıya okuma, yazma ve yürütme izinleri verir, sahip olan gruba yalnızca okuma ve yürütme izinleri verir ve diğer tüm kullanıcılara okuma ve yazma izni verir.

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)

Ayrıca bir kapsayıcının kök dizininin ACL'sini alabilir ve ayarlayabilirsiniz. Kök dizini almak için FileSystemClient._get_root_directory_client yöntemini çağırın.

Dosyanın ACL'sini ayarlama

DataLakeFileClient.get_access_control yöntemini çağırarak bir dosyanın erişim denetim listesini (ACL) alın ve DataLakeFileClient.set_access_control yöntemini çağırarak ACL'yi ayarlayın.

Bu örnek adlı my-file.txtdosyanın ACL'sini alır ve ayarlar. Dize rwxr-xrw- , sahibi olan kullanıcıya okuma, yazma ve yürütme izinleri verir, sahip olan gruba yalnızca okuma ve yürütme izinleri verir ve diğer tüm kullanıcılara okuma ve yazma izni verir.

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’leri özyinelemeli olarak belirleme

Bir ACL ayarladığınızda, tüm girdileri dahil olmak üzere ACL'nin tamamını değiştirirsiniz. Bir güvenlik sorumlusunun izin düzeyini değiştirmek veya var olan diğer girişleri etkilemeden ACL'ye yeni bir güvenlik sorumlusu eklemek istiyorsanız, bunun yerine ACL'yi güncelleştirmeniz gerekir. ACL'yi değiştirmek yerine güncelleştirmek için bu makalenin ACL'leri yinelemeli olarak güncelleştirme bölümüne bakın.

DataLakeDirectoryClient.set_access_control_recursive yöntemini çağırarak ACL'leri özyinelemeli olarak ayarlayın.

Varsayılan bir ACL girdisi ayarlamak istiyorsanız, dizeyi default: her ACL giriş dizesinin başına ekleyin.

Bu örnek adlı my-parent-directorydizinin ACL'sini ayarlar.

Bu yöntem, varsayılan ACL'nin ayarlanıp ayarlanmayacağını belirten adlı is_default_scope boole parametresini kabul eder. Bu parametre ise True, ACL girdileri listesinden önce dizesi default:yer alır. Bu örnekteki girdiler şu izinleri verir: sahip olan kullanıcı için okuma, yazma ve yürütme izinleri, sahip olan grup için okuma ve yürütme izinleri ve diğer tüm kullanıcılar için okuma izinleri. Bu örnekteki son ACL girdisi, nesne kimliğine xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx sahip belirli bir kullanıcıya okuma izinleri verir.

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)

Toplu iş boyutu belirterek ACL'leri toplu olarak özyinelemeli olarak işleyen bir örneği görmek için Python örneğine bakın.

ACL'leri özyinelemeli olarak güncelleştirme

Bir ACL'yi güncelleştirdiğinizde, ACL'yi değiştirmek yerine ACL'yi değiştirirsiniz. Örneğin, ACL'de listelenen diğer güvenlik sorumlularını etkilemeden ACL'ye yeni bir güvenlik sorumlusu ekleyebilirsiniz. ACL'yi güncelleştirmek yerine değiştirmek için bu makalenin ACL'leri ayarlama bölümüne bakın.

Bir ACL'yi özyinelemeli olarak güncelleştirmek için, güncelleştirmek istediğiniz ACL girişiyle yeni bir ACL nesnesi oluşturun ve ardından bu nesneyi güncelleştirme ACL işleminde kullanın. Mevcut ACL'yi almayın, yalnızca güncelleştirilecek ACL girdilerini sağlayın. DataLakeDirectoryClient.update_access_control_recursive yöntemini çağırarak bir ACL'yi özyinelemeli olarak güncelleştirin. Varsayılan bir ACL girdisini güncelleştirmek istiyorsanız, dizeyi default: her ACL giriş dizesinin başına ekleyin.

Bu örnek, yazma iznine sahip bir ACL girdisi güncelleştirir.

Bu örnek adlı my-parent-directorydizinin ACL'sini ayarlar. Bu yöntem, varsayılan ACL'nin güncelleştirilip güncelleştirilmeyeceğini belirten adlı is_default_scope boole parametresini kabul eder. parametresi ise True, güncelleştirilmiş ACL girdisinin önüne dizesi default:eklenir.

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)

Toplu iş boyutu belirterek ACL'leri toplu olarak özyinelemeli olarak işleyen bir örneği görmek için Python örneğine bakın.

ACL girdilerini özyinelemeli olarak kaldırma

Bir veya daha fazla ACL girdisini kaldırabilirsiniz. ACL girdilerini özyinelemeli olarak kaldırmak için, kaldırılacak ACL girdisi için yeni bir ACL nesnesi oluşturun ve ardından bu nesneyi ACL'yi kaldırma işleminde kullanın. Mevcut ACL'yi almayın, yalnızca kaldırılacak ACL girdilerini sağlayın.

DataLakeDirectoryClient.remove_access_control_recursive yöntemini çağırarak ACL girdilerini kaldırın. Varsayılan bir ACL girdisini kaldırmak istiyorsanız, dizeyi default: ACL giriş dizesinin başına ekleyin.

Bu örnek, adlı my-parent-directorydizinin ACL'sinden bir ACL girdisini kaldırır. Bu yöntem, girdinin varsayılan ACL'den kaldırılıp kaldırılmayacağını belirten adlı is_default_scope boole parametresini kabul eder. Bu parametre ise True, güncelleştirilmiş ACL girdisinin önüne dizesi default:eklenir.

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)

Toplu iş boyutu belirterek ACL'leri toplu olarak özyinelemeli olarak işleyen bir örneği görmek için Python örneğine bakın.

Hatalardan kurtarma

Çalışma zamanı veya izin hatalarıyla karşılaşabilirsiniz. Çalışma zamanı hataları için, işlemi baştan yeniden başlatın. Güvenlik sorumlusunun değiştirilmekte olan dizin hiyerarşisindeki bir dizin veya dosyanın ACL'sini değiştirmek için yeterli izni yoksa izin hataları oluşabilir. İzin sorununu giderin ve devam belirteci kullanarak işlemi hata noktasından sürdürmeyi veya işlemi baştan yeniden başlatmayı seçin. Baştan yeniden başlatmayı tercih ediyorsanız devamlılık belirtecini kullanmanız gerekmez. ACL girişlerini herhangi bir olumsuz etki olmadan yeniden uygulayın.

Bu örnek, hata durumunda bir devamlılık belirteci döndürür. Uygulama, hata giderildikten sonra bu örnek yöntemi yeniden çağırabilir ve devamlılık belirtecini geçirebilir. Bu örnek yöntem ilk kez çağrılırsa, uygulama devamlılık belirteci parametresi için değerini None geçirebilir.

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

Toplu iş boyutu belirterek ACL'leri toplu olarak özyinelemeli olarak işleyen bir örneği görmek için Python örneğine bakın.

İşlemin izin hataları tarafından kesintisiz tamamlanmasını istiyorsanız, bunu belirtebilirsiniz.

İşlemin kesintisiz tamamlanmasını sağlamak için DataLakeDirectoryClient.set_access_control_recursive yöntemine bir devamlılık belirteci geçirmeyin.

Bu örnek, ACL girdilerini özyinelemeli olarak ayarlar. Bu kod bir izin hatasıyla karşılaşırsa, bu hatayı kaydeder ve yürütmeye devam eder. Bu örnek, konsoldaki hata sayısını yazdırır.

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)

Toplu iş boyutu belirterek ACL'leri toplu olarak özyinelemeli olarak işleyen bir örneği görmek için Python örneğine bakın.

En iyi yöntemler

Bu bölümde, ACL'leri özyinelemeli olarak ayarlamak için bazı en iyi yöntem yönergeleri sağlanır.

Çalışma zamanı hatalarını işleme

Çalışma zamanı hatası birçok nedenden oluşabilir (Örneğin: kesinti veya istemci bağlantısı sorunu). Çalışma zamanı hatasıyla karşılaşırsanız özyinelemeli ACL işlemini yeniden başlatın. ACL'ler olumsuz bir etkiye neden olmadan öğelere yeniden uygulanabilir.

İzin hatalarını işleme (403)

Özyinelemeli bir ACL işlemi çalıştırırken erişim denetimi özel durumuyla karşılaşırsanız, AD güvenlik sorumlunuz dizin hiyerarşisindeki bir veya daha fazla alt öğeye ACL uygulamak için yeterli izne sahip olmayabilir. İzin hatası oluştuğunda işlem durdurulur ve bir devam belirteci sağlanır. İzin sorununu düzeltin ve kalan veri kümesini işlemek için devamlılık belirtecini kullanın. Zaten başarıyla işlenen dizinlerin ve dosyaların yeniden işlenmesi gerekmez. Özyinelemeli ACL işlemini yeniden başlatmayı da seçebilirsiniz. ACL'ler olumsuz bir etkiye neden olmadan öğelere yeniden uygulanabilir.

Referans

Hedef depolama hesabı veya kapsayıcı kapsamında Depolama Blobu Veri Sahibi rolü atanmış bir Microsoft Entra güvenlik sorumlusu sağlamanızı öneririz.

Performans

Gecikme süresini azaltmak için, özyinelemeli ACL işlemini depolama hesabınızla aynı bölgede bulunan bir Azure Sanal Makinesi'nde (VM) çalıştırmanızı öneririz.

ACL sınırları

Bir dizine veya dosyaya uygulayabileceğiniz maksimum ACL sayısı 32 erişim ACL'leri ve 32 varsayılan ACL'dir. Daha fazla bilgi için bkz. Azure Data Lake Storage 2. Nesil'de erişim denetimi.

Ayrıca bkz.