Aracılığıyla paylaş


Batch'te kullanıcı hesapları altında görevleri çalıştırma

Not

Bu makalede açıklanan kullanıcı hesapları, güvenlik nedeniyle Uzak Masaüstü Protokolü (RDP) veya Secure Shell (SSH) için kullanılan kullanıcı hesaplarından farklıdır.

SSH aracılığıyla Linux sanal makine yapılandırmasını çalıştıran bir düğüme bağlanmak için bkz. Ubuntu ile Uzak Masaüstü'nü kullanmak için xrdp'yi yükleme ve yapılandırma. RDP aracılığıyla Windows çalıştıran düğümlere bağlanmak için bkz. Windows çalıştıran bir Azure sanal makinesine bağlanma ve oturum açma.

RDP aracılığıyla çalıştıran bir düğüme bağlanmak için bkz. Azure Cloud Services'de Bir Rol için Uzak Masaüstü Bağlantısını Etkinleştirme.

Azure Batch'daki bir görev her zaman bir kullanıcı hesabı altında çalışır. Varsayılan olarak, görevler yönetici izinleri olmadan standart kullanıcı hesapları altında çalışır. Bazı senaryolarda, bir görevin çalıştırılmasını istediğiniz kullanıcı hesabını yapılandırmak isteyebilirsiniz. Bu makalede kullanıcı hesaplarının türleri ve bunların senaryonuz için nasıl yapılandırılacağı açıklanır.

Kullanıcı hesabı türleri

Azure Batch, görevleri çalıştırmak için iki tür kullanıcı hesabı sağlar:

  • Otomatik kullanıcı hesapları. Otomatik kullanıcı hesapları, Batch hizmeti tarafından otomatik olarak oluşturulan yerleşik kullanıcı hesaplarıdır. Varsayılan olarak, görevler otomatik kullanıcı hesabı altında çalışır. Görevin otomatik kullanıcı belirtimini, görevin hangi otomatik kullanıcı hesabı altında çalışması gerektiğini gösterecek şekilde yapılandırabilirsiniz. Otomatik kullanıcı belirtimi, görevi çalıştıracak otomatik kullanıcı hesabının yükseltme düzeyini ve kapsamını belirtmenize olanak tanır.

  • Adlandırılmış bir kullanıcı hesabı. Havuzu oluştururken havuz için bir veya daha fazla adlandırılmış kullanıcı hesabı belirtebilirsiniz. Her kullanıcı hesabı havuzun her düğümünde oluşturulur. Hesap adına ek olarak, kullanıcı hesabı parolasını, yükseltme düzeyini ve Linux havuzları için SSH özel anahtarını belirtirsiniz. Görev eklediğinizde, görevin altında çalıştırılması gereken adlandırılmış kullanıcı hesabını belirtebilirsiniz.

Önemli

Batch hizmeti sürüm 2017-01-01.4.0, kodunuzu bu sürümü veya sonraki bir sürümü çağırmak için güncelleştirmenizi gerektiren hataya neden olan bir değişiklik getirilmiştir. Batch kodunuzu eski bir sürümden güncelleştirmeye yönelik hızlı yönergeler için bkz. Kodunuzu en son Batch istemci kitaplığına güncelleştirme.

Dosya ve dizinlere kullanıcı hesabı erişimi

Hem otomatik kullanıcı hesabı hem de adlandırılmış kullanıcı hesabı, görevin çalışma dizinine, paylaşılan dizine ve çok örnekli görevler dizinine okuma/yazma erişimine sahiptir. Her iki hesap türü de başlangıç ve iş hazırlama dizinlerine okuma erişimine sahiptir.

Görev, başlangıç görevini çalıştırmak için kullanılan hesapla çalışıyorsa, görevin başlangıç görevi dizinine okuma-yazma erişimi vardır. Benzer şekilde, bir görev bir iş hazırlama görevini çalıştırmak için kullanılan hesapla çalışıyorsa, görevin iş hazırlama görev dizinine okuma-yazma erişimi vardır. Görev, başlangıç görevinden veya iş hazırlama görevinden farklı bir hesapta çalışıyorsa, görevin yalnızca ilgili dizine okuma erişimi vardır.

Görevdeki dosyalara ve dizinlere erişme hakkında daha fazla bilgi için bkz . Dosyalar ve dizinler.

Görevler için yükseltilmiş erişim

Kullanıcı hesabının yükseltme düzeyi, görevin yükseltilmiş erişimle çalışıp çalışmadığını gösterir. Hem otomatik kullanıcı hesabı hem de adlandırılmış kullanıcı hesabı yükseltilmiş erişimle çalıştırılabilir. Yükseltme düzeyi için iki seçenek şunlardır:

  • NonAdmin: Görev, yükseltilmiş erişim olmadan standart bir kullanıcı olarak çalışır. Batch kullanıcı hesabı için varsayılan yükseltme düzeyi her zaman NonAdmin'dir.
  • Yönetici: Görev yükseltilmiş erişime sahip bir kullanıcı olarak çalışır ve tam Yönetici izinleriyle çalışır.

Otomatik kullanıcı hesapları

Varsayılan olarak, görevler Batch'te otomatik kullanıcı hesabı altında, yükseltilmiş erişimi olmayan standart bir kullanıcı olarak ve havuz kapsamıyla çalışır. Havuz kapsamı, görevin havuzdaki herhangi bir görev için kullanılabilen bir otomatik kullanıcı hesabı altında çalıştığı anlamına gelir. Havuz kapsamı hakkında daha fazla bilgi için bkz. Görevi havuz kapsamıyla otomatik kullanıcı olarak çalıştırma.

Havuz kapsamının alternatifi görev kapsamıdır. Otomatik kullanıcı belirtimi görev kapsamı için yapılandırıldığında, Batch hizmeti yalnızca bu görev için bir otomatik kullanıcı hesabı oluşturur.

Otomatik kullanıcı belirtimi için her biri benzersiz bir otomatik kullanıcı hesabına karşılık gelen dört olası yapılandırma vardır:

  • Görev kapsamıyla yönetici olmayan erişim
  • Görev kapsamıyla (yükseltilmiş) erişimi Yönetici
  • Havuz kapsamı ile yönetici olmayan erişim
  • Havuz kapsamıyla erişimi Yönetici

Önemli

Görev kapsamı altında çalışan görevlerin düğümdeki diğer görevlere fiili erişimi yoktur. Ancak, hesaba erişimi olan kötü amaçlı bir kullanıcı, yönetici ayrıcalıklarıyla çalışan ve diğer görev dizinlerine erişen bir görev göndererek bu kısıtlamaya geçici bir çözüm sağlayabilir. Kötü amaçlı bir kullanıcı bir düğüme bağlanmak için RDP veya SSH de kullanabilir. Böyle bir senaryoya engel olmak için Batch hesap anahtarlarınıza erişimi korumak önemlidir. Hesabınızın gizliliğinin ihlal edilmiş olabileceğinden şüpheleniyorsanız anahtarlarınızı yeniden oluşturduğunuzdan emin olun.

Yükseltilmiş erişimi olan bir görevi otomatik kullanıcı olarak çalıştırma

Yükseltilmiş erişime sahip bir görevi çalıştırmanız gerektiğinde yönetici ayrıcalıkları için otomatik kullanıcı belirtimini yapılandırabilirsiniz. Örneğin, bir başlangıç görevinin düğüme yazılım yüklemek için yükseltilmiş erişime ihtiyacı olabilir.

Not

Yükseltilmiş erişimi yalnızca gerektiğinde kullanın. En iyi yöntemler, istenen sonuca ulaşmak için gereken en düşük ayrıcalığı sağlamanızı önerir. Örneğin, bir başlangıç görevi tüm kullanıcılar yerine geçerli kullanıcı için yazılım yüklerse, görevlere yükseltilmiş erişim vermekten kaçınabilirsiniz. Başlangıç görevi de dahil olmak üzere aynı hesap altında çalışması gereken tüm görevler için havuz kapsamı ve yönetici olmayan erişim için otomatik kullanıcı belirtimini yapılandırabilirsiniz.

Aşağıdaki kod parçacıklarında otomatik kullanıcı belirtiminin nasıl yapılandırılır gösterilmektedir. Örnekler, yükseltme düzeyini Admin olarak, kapsamı ise olarak Taskayarlar.

Batch .NET

task.UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.Admin, scope: AutoUserScope.Task));

Batch Java

taskToAdd.withId(taskId)
        .withUserIdentity(new UserIdentity()
            .withAutoUser(new AutoUserSpecification()
                .withElevationLevel(ElevationLevel.ADMIN))
                .withScope(AutoUserScope.TASK));
        .withCommandLine("cmd /c echo hello");

Batch Python

user = batchmodels.UserIdentity(
    auto_user=batchmodels.AutoUserSpecification(
        elevation_level=batchmodels.ElevationLevel.admin,
        scope=batchmodels.AutoUserScope.task))
task = batchmodels.TaskAddParameter(
    id='task_1',
    command_line='cmd /c "echo hello world"',
    user_identity=user)
batch_client.task.add(job_id=jobid, task=task)

Görevi havuz kapsamına sahip otomatik kullanıcı olarak çalıştırma

Bir düğüm sağlandığında, havuzdaki her düğümde biri yükseltilmiş erişimli, diğeri de yükseltilmiş erişimi olmayan iki havuz genelinde otomatik kullanıcı hesabı oluşturulur. Belirli bir görev için otomatik kullanıcının kapsamını havuz kapsamına ayarlamak, görevi havuz genelindeki bu iki otomatik kullanıcı hesabından biri altında çalıştırır.

Otomatik kullanıcı için havuz kapsamını belirttiğinizde, yönetici erişimiyle çalışan tüm görevler aynı havuz genelinde otomatik kullanıcı hesabı altında çalıştırılır. Benzer şekilde, yönetici izinleri olmadan çalışan görevler de havuz genelindeki tek bir otomatik kullanıcı hesabı altında çalışır.

Not

Havuz genelindeki iki otomatik kullanıcı hesabı ayrı hesaplardır. Havuz genelinde yönetim hesabı altında çalışan görevler, standart hesap altında çalışan görevlerle veri paylaşamaz ve tam tersi de geçerlidir.

Aynı otomatik kullanıcı hesabı altında çalıştırmanın avantajı, görevlerin aynı düğümde çalışan diğer görevlerle veri paylaşabilmesidir.

Görevler arasında gizli dizileri paylaşma, görevleri havuz genelindeki iki otomatik kullanıcı hesabından birinde çalıştırmanın yararlı olduğu bir senaryodur. Örneğin, bir başlangıç görevinin düğüme diğer görevlerin kullanabileceği bir gizli dizi sağlaması gerektiğini varsayalım. Windows Veri Koruma API'sini (DPAPI) kullanabilirsiniz, ancak yönetici ayrıcalıkları gerektirir. Bunun yerine, gizli diziyi kullanıcı düzeyinde koruyabilirsiniz. Aynı kullanıcı hesabı altında çalışan görevler gizli diziye yükseltilmiş erişim olmadan erişebilir.

Görevleri havuz kapsamına sahip bir otomatik kullanıcı hesabı altında çalıştırmak isteyebileceğiniz bir diğer senaryo da İleti Geçirme Arabirimi (MPI) dosya paylaşımıdır. MPI görevindeki düğümlerin aynı dosya verileri üzerinde çalışması gerektiğinde MPI dosya paylaşımı yararlıdır. Baş düğüm, alt düğümlerin aynı otomatik kullanıcı hesabı altında çalışıyorsa erişebileceği bir dosya paylaşımı oluşturur.

Aşağıdaki kod parçacığı, Batch .NET'teki bir görevin otomatik kullanıcı kapsamını havuz kapsamına ayarlar. Yükseltme düzeyi atlandığından, görev standart havuz genelindeki otomatik kullanıcı hesabı altında çalışır.

task.UserIdentity = new UserIdentity(new AutoUserSpecification(scope: AutoUserScope.Pool));

Adlandırılmış kullanıcı hesapları

Havuz oluştururken adlandırılmış kullanıcı hesapları tanımlayabilirsiniz. Adlandırılmış bir kullanıcı hesabının sağladığınız bir adı ve parolası vardır. Adlandırılmış bir kullanıcı hesabı için yükseltme düzeyini belirtebilirsiniz. Linux düğümleri için bir SSH özel anahtarı da sağlayabilirsiniz.

Adlandırılmış bir kullanıcı hesabı havuzdaki tüm düğümlerde bulunur ve bu düğümlerde çalışan tüm görevler için kullanılabilir. Havuz için herhangi bir sayıda adlandırılmış kullanıcı tanımlayabilirsiniz. Bir görev veya görev koleksiyonu eklediğinizde, görevin havuzda tanımlanan adlandırılmış kullanıcı hesaplarından biri altında çalıştırılacağını belirtebilirsiniz.

Adlandırılmış kullanıcı hesabı, bir işteki tüm görevleri aynı kullanıcı hesabı altında çalıştırmak, ancak bunları aynı anda diğer işlerde çalışan görevlerden yalıtmak istediğinizde yararlıdır. Örneğin, her iş için adlandırılmış bir kullanıcı oluşturabilir ve her işin görevlerini bu adlandırılmış kullanıcı hesabı altında çalıştırabilirsiniz. Daha sonra her iş kendi görevleriyle bir gizli dizi paylaşabilir, ancak diğer işlerde çalışan görevlerle paylaşılmaz.

Dosya paylaşımları gibi dış kaynaklarda izinleri ayarlayan bir görevi çalıştırmak için adlandırılmış bir kullanıcı hesabı da kullanabilirsiniz. Adlandırılmış bir kullanıcı hesabıyla, kullanıcı kimliğini denetlersiniz ve izinleri ayarlamak için bu kullanıcı kimliğini kullanabilirsiniz.

Adlandırılmış kullanıcı hesapları, Linux düğümleri arasında parolasız SSH'yi etkinleştirir. Adlandırılmış bir kullanıcı hesabını, çok örnekli görevleri çalıştırması gereken Linux düğümleriyle kullanabilirsiniz. Havuzdaki her düğüm, havuzun tamamında tanımlanan bir kullanıcı hesabı altında görevleri çalıştırabilir. Çok örnekli görevler hakkında daha fazla bilgi için bkz. MPI uygulamalarını çalıştırmak için çok örnekli görevleri kullanma.

Adlandırılmış kullanıcı hesapları oluşturma

Batch'te adlandırılmış kullanıcı hesapları oluşturmak için havuza bir kullanıcı hesapları koleksiyonu ekleyin. Aşağıdaki kod parçacıkları .NET, Java ve Python'da adlandırılmış kullanıcı hesaplarının nasıl oluşturulacağını gösterir. Bu kod parçacıkları, bir havuzda hem yönetici hem de yönetici olmayan adlandırılmış hesapların nasıl oluşturulacağını gösterir.

Batch .NET örneği (Windows)

CloudPool pool = null;
Console.WriteLine("Creating pool [{0}]...", poolId);

// Create a pool using Virtual Machine Configuration.
pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 3,
    virtualMachineSize: "standard_d1_v2",
    VirtualMachineConfiguration: new VirtualMachineConfiguration(
    imageReference: new ImageReference(
                        publisher: "MicrosoftWindowsServer",
                        offer: "WindowsServer",
                        sku: "2019-datacenter-core",
                        version: "latest"),
    nodeAgentSkuId: "batch.node.windows amd64");

// Add named user accounts.
pool.UserAccounts = new List<UserAccount>
{
    new UserAccount("adminUser", "xyz123", ElevationLevel.Admin),
    new UserAccount("nonAdminUser", "123xyz", ElevationLevel.NonAdmin),
};

// Commit the pool.
await pool.CommitAsync();

Batch .NET örneği (Linux)

CloudPool pool = null;

// Obtain a collection of all available node agent SKUs.
List<NodeAgentSku> nodeAgentSkus =
    batchClient.PoolOperations.ListNodeAgentSkus().ToList();

// Define a delegate specifying properties of the VM image to use.
Func<ImageReference, bool> isUbuntu1804 = imageRef =>
    imageRef.Publisher == "Canonical" &&
    imageRef.Offer == "UbuntuServer" &&
    imageRef.Sku.Contains("20.04-LTS");

// Obtain the first node agent SKU in the collection that matches
// Ubuntu Server 20.04.
NodeAgentSku ubuntuAgentSku = nodeAgentSkus.First(sku =>
    sku.VerifiedImageReferences.Any(isUbuntu2004));

// Select an ImageReference from those available for node agent.
ImageReference imageReference =
    ubuntuAgentSku.VerifiedImageReferences.First(isUbuntu2004);

// Create the virtual machine configuration to use to create the pool.
VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(imageReference, ubuntuAgentSku.Id);

Console.WriteLine("Creating pool [{0}]...", poolId);

// Create the unbound pool.
pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 3,
    virtualMachineSize: "Standard_A1",
    virtualMachineConfiguration: virtualMachineConfiguration);
// Add named user accounts.
pool.UserAccounts = new List<UserAccount>
{
    new UserAccount(
        name: "adminUser",
        password: "xyz123",
        elevationLevel: ElevationLevel.Admin,
        linuxUserConfiguration: new LinuxUserConfiguration(
            uid: 12345,
            gid: 98765,
            sshPrivateKey: new Guid().ToString()
            )),
    new UserAccount(
        name: "nonAdminUser",
        password: "123xyz",
        elevationLevel: ElevationLevel.NonAdmin,
        linuxUserConfiguration: new LinuxUserConfiguration(
            uid: 45678,
            gid: 98765,
            sshPrivateKey: new Guid().ToString()
            )),
};

// Commit the pool.
await pool.CommitAsync();

Batch Java örneği

List<UserAccount> userList = new ArrayList<>();
userList.add(new UserAccount().withName(adminUserAccountName).withPassword(adminPassword).withElevationLevel(ElevationLevel.ADMIN));
userList.add(new UserAccount().withName(nonAdminUserAccountName).withPassword(nonAdminPassword).withElevationLevel(ElevationLevel.NONADMIN));
PoolAddParameter addParameter = new PoolAddParameter()
        .withId(poolId)
        .withTargetDedicatedNodes(POOL_VM_COUNT)
        .withVmSize(POOL_VM_SIZE)
        .withVirtualMachineConfiguration(configuration)
        .withUserAccounts(userList);
batchClient.poolOperations().createPool(addParameter);

Batch Python örneği

users = [
    batchmodels.UserAccount(
        name='pool-admin',
        password='******',
        elevation_level=batchmodels.ElevationLevel.admin)
    batchmodels.UserAccount(
        name='pool-nonadmin',
        password='******',
        elevation_level=batchmodels.ElevationLevel.non_admin)
]
pool = batchmodels.PoolAddParameter(
    id=pool_id,
    user_accounts=users,
    virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        node_agent_sku_id=sku_to_use),
    vm_size=vm_size,
    target_dedicated=vm_count)
batch_client.pool.add(pool)

Yükseltilmiş erişime sahip adlandırılmış bir kullanıcı hesabı altında görev çalıştırma

Bir görevi yükseltilmiş kullanıcı olarak çalıştırmak için görevin UserIdentity özelliğini , ElevationLevel özelliği olarak ayarlanmış şekilde oluşturulmuş adlandırılmış bir kullanıcı hesabı olarak Adminayarlayın.

Bu kod parçacığı, görevin adlandırılmış bir kullanıcı hesabı altında çalıştırılması gerektiğini belirtir. Bu adlandırılmış kullanıcı hesabı havuz oluşturulduğunda havuzda tanımlanmıştır. Bu durumda, adlandırılmış kullanıcı hesabı yönetici izinleriyle oluşturulmuştur:

CloudTask task = new CloudTask("1", "cmd.exe /c echo 1");
task.UserIdentity = new UserIdentity(AdminUserAccountName);

Kodunuzu en son Batch istemci kitaplığına güncelleştirme

Batch hizmeti sürüm 2017-01-01.4.0, önceki sürümlerde kullanılabilen runElevated özelliğini userIdentity özelliğiyle değiştirerek hataya neden olan bir değişiklik yaptı. Aşağıdaki tablolar, kodunuzu istemci kitaplıklarının önceki sürümlerinden güncelleştirmek için kullanabileceğiniz basit bir eşleme sağlar.

Batch .NET

Kodunuz kullanıyorsa... Şu şekilde güncelleştirin:...
CloudTask.RunElevated = true; CloudTask.UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.Admin));
CloudTask.RunElevated = false; CloudTask.UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.NonAdmin));
CloudTask.RunElevated belirtilmedi Güncelleştirme gerekmez

Batch Java

Kodunuz kullanıyorsa... Şu şekilde güncelleştirin:...
CloudTask.withRunElevated(true); CloudTask.withUserIdentity(new UserIdentity().withAutoUser(new AutoUserSpecification().withElevationLevel(ElevationLevel.ADMIN));
CloudTask.withRunElevated(false); CloudTask.withUserIdentity(new UserIdentity().withAutoUser(new AutoUserSpecification().withElevationLevel(ElevationLevel.NONADMIN));
CloudTask.withRunElevated belirtilmedi Güncelleştirme gerekmez

Batch Python

Kodunuz kullanıyorsa... Şu şekilde güncelleştirin:...
run_elevated=True user_identity=userNerede
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=userNerede
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated belirtilmedi Güncelleştirme gerekmez

Sonraki adımlar