Sdílet prostřednictvím


Spouštění úloh v uživatelských účtech ve službě Batch

Poznámka:

Uživatelské účty popisované v tomto článku se liší od uživatelských účtů používaných pro protokol RDP (Remote Desktop Protocol) nebo Secure Shell (SSH) z bezpečnostních důvodů.

Pokud se chcete připojit k uzlu s konfigurací virtuálního počítače s Linuxem přes SSH, přečtěte si téma Instalace a konfigurace xrdp pro použití Vzdálené plochy s Ubuntu. Pokud se chcete připojit k uzlům se systémem Windows přes protokol RDP, přečtěte si, jak se připojit k virtuálnímu počítači Azure s Windows a přihlásit se k němu.

Úloha ve službě Azure Batch se vždy spouští pod uživatelským účtem. Ve výchozím nastavení se úlohy spouštějí pod standardními uživatelskými účty bez oprávnění správce. V určitých scénářích můžete chtít nakonfigurovat uživatelský účet, pod kterým chcete spustit úlohu. Tento článek popisuje typy uživatelských účtů a způsob jejich konfigurace pro váš scénář.

Typy uživatelských účtů

Azure Batch poskytuje dva typy uživatelských účtů pro spouštění úloh:

  • Automatické uživatelské účty. Automatické uživatelské účty jsou předdefinované uživatelské účty vytvořené automaticky službou Batch. Ve výchozím nastavení se úkoly spouštějí pod automatickým uživatelským účtem. Můžete nakonfigurovat specifikaci automatického uživatele pro úlohu, která označuje, pod kterým automatickým uživatelským účtem má být úloha spuštěna. Specifikace automatického uživatele umožňuje zadat úroveň zvýšení oprávnění a rozsah účtu automatického uživatele, který spouští úlohu.

  • Pojmenovaný uživatelský účet. Při vytváření fondu můžete zadat jeden nebo více pojmenovaných uživatelských účtů pro fond. Každý uživatelský účet se vytvoří na každém uzlu v rámci fondu. Kromě názvu účtu zadáte také heslo uživatelského účtu, úroveň oprávnění a privátní klíč SSH pro Linuxové fondy. Když přidáte úkol, můžete určit pojmenovaný uživatelský účet, pod kterým má být úkol spuštěn.

Důležité

Služba Batch verze 2017-01-01.4.0 zavedla zásadní změnu, která vyžaduje aktualizaci kódu tak, aby využívala tuto verzi nebo novější. Rychlé pokyny k aktualizaci kódu ze starší verze najdete v tématu Aktualizace kódu na nejnovější klientskou knihovnu Batch.

Přístup k souborům a adresářům uživatelského účtu

Účet automatického uživatele i pojmenovaný uživatelský účet mají přístup pro čtení a zápis k pracovnímu adresáři úkolu, sdílenému adresáři a adresáři úkolů s více instancemi. Oba typy účtů mají ke spouštěcímu adresáři a adresáři přípravy úloh přístup pro čtení.

Pokud se úkol spouští pod stejným účtem, který byl použit ke spuštění spouštěcí úlohy, má úloha přístup pro čtení i zápis do spouštěcího adresáře úloh. Podobně platí, že pokud je úkol spuštěn pod stejným účtem, který byl použit ke spuštění úkolu přípravy úlohy, má úkol přístup pro čtení a zápis do adresáře úkolů přípravy úlohy. Pokud se úkol spouští pod jiným účtem, než je spouštěcí úkol nebo úkol přípravy úlohy, má úkol přístup jen pro čtení k příslušnému adresáři.

Důležité

Různí uživatelé úkolů ve službě Batch nejsou dostatečnou hranicí zabezpečení pro izolaci mezi úkoly a souvisejícími daty úkolů. Hranice izolace zabezpečení ve službě Batch je na úrovni fondu. Nesprávné řízení přístupu rozhraní API služby Batch ale může vést k přístupu ke všem fondům v rámci účtu Batch s dostatečným oprávněním. Podívejte se na osvědčené postupy týkající se zabezpečení bazénu.

Další informace o přístupu k souborům a adresářům z úkolu najdete v tématu Soubory a adresáře.

Přístup se zvýšenými oprávněními pro úkoly

Úroveň zvýšení oprávnění uživatelského účtu označuje, jestli se úloha spustí se zvýšeným přístupem. Jak automatický uživatelský účet, tak pojmenovaný uživatelský účet se mohou spouštět se zvýšenými oprávněními. Dvě možnosti pro úroveň nadmořské výšky jsou:

  • NonAdmin: Úloha se spustí jako standardní uživatel bez zvýšeného přístupu. Výchozí úroveň zvýšení oprávnění pro uživatelský účet Batch je vždy NonAdmin.
  • Správce: Úloha se spustí jako uživatel se zvýšeným přístupem a funguje s úplnými oprávněními správce.

Automatické uživatelské účty

Ve výchozím nastavení se úlohy spouští ve službě Batch pod automatickým uživatelským účtem, jako standardní uživatel bez zvýšeného přístupu a s oborem fondu. Rozsah fondu znamená, že úkol běží pod automatizovaným uživatelským účtem, který je k dispozici pro všechny úkoly ve fondu. Další informace o oboru fondu najdete v tématu Spuštění úlohy jako automatického uživatele v oboru fondu.

Alternativou k rozsahu fondu je rozsah úkolů. Pokud je pro obor úkolů nakonfigurovaná specifikace automatického uživatele, služba Batch pro danou úlohu vytvoří účet automatického uživatele.

Pro specifikaci automatického uživatele existují čtyři možné konfigurace, z nichž každá odpovídá jedinečnému automatickému uživatelskému účtu:

  • Přístup bez oprávnění správce s oborem úkolů
  • Přístup správce (se zvýšenými oprávněními) s oborem úkolů
  • Přístup bez správcovských oprávnění v rámci fondu
  • Přístup správce s oborem fondu

Poznámka:

Účty automatického uživatele se zvýšenými oprávněními správce mají přímý přístup k zápisu ke všem ostatním adresářům úkolů ve výpočetním uzlu, který úkol spouští. Zvažte spuštění úloh s nejnižšími oprávněními potřebnými k úspěšnému spuštění.

Spuštění úlohy jako uživatel automatického režimu se zvýšeným přístupem

Specifikaci automatického uživatele můžete nakonfigurovat pro oprávnění správce, když potřebujete spustit úlohu se zvýšeným přístupem. Spouštěcí úkol může například potřebovat přístup se zvýšenými oprávněními k instalaci softwaru na uzel.

Poznámka:

Přístup se zvýšenými oprávněními používejte pouze v případě potřeby. Typický případ použití pro použití přístupu správce se zvýšenými oprávněními je spouštěcí úkol, který musí nainstalovat software na výpočetní uzel, aby bylo možné naplánovat další úlohy. Pro následné úlohy byste měli použít nainstalovaný software jako uživatele úkolu bez zvýšení oprávnění.

Následující fragmenty kódu ukazují, jak nakonfigurovat specifikaci automatického uživatele. Příklady nastavily úroveň nadmořské výšky na Admin a rozsah na Task.

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)

Spuštění úlohy jako automatického uživatele v rámci oblasti fondu

Při zřizování uzlu se na každém uzlu ve fondu vytvoří dva účty automatického uživatele pro celý fond, jeden se zvýšeným přístupem a jeden bez zvýšeného přístupu. Nastavení oboru automatického uživatele na obor fondu pro daný úkol spustí úlohu v rámci jednoho z těchto dvou účtů automatického uživatele pro celý fond.

Když zadáte obor fondu pro automatického uživatele, všechny úlohy, které běží s přístupem správce, běží pod stejným automatickým uživatelským účtem pro celý fond. Podobně úlohy, které běží bez oprávnění správce, běží také pod jedním automatickým uživatelským účtem pro celý fond.

Výhodou spouštění pod stejným automatickým uživatelským účtem je, že úkoly můžou snadno sdílet data s jinými úkoly běžícími na stejném uzlu. Existují také výhody výkonu pro opakované použití uživatelského účtu.

Sdílení tajemství mezi úkoly je jedním ze scénářů, kdy je užitečné spouštět úkoly v rámci jednoho ze dvou automatických uživatelských účtů pro celý fond. Předpokládejme například, že spouštěcí úkol musí poskytnout tajný údaj na uzel, který mohou využívat ostatní úkoly. Můžete použít rozhraní API služby Windows Data Protection (DPAPI), ale vyžaduje oprávnění správce. Místo toho můžete tajný kód chránit na úrovni uživatele. Úlohy spuštěné pod stejným uživatelským účtem mají přístup k tajnému kódu bez zvýšeného přístupu.

Dalším scénářem, ve kterém můžete chtít spouštět úlohy v rámci automatického uživatelského účtu s oborem fondu, je sdílená složka MPI (Message Passing Interface). Sdílená složka MPI je užitečná, když uzly během úlohy MPI musí pracovat se stejnými daty souboru. Hlavní uzel vytvoří sdílenou složku, ke které mají podřízené uzly přístup, pokud jsou spuštěné pod stejným automatickým uživatelským účtem.

Následující úryvek kódu nastaví obor automatizovaného uživatele na obor fondu pro úlohu v rámci Batch .NET. Úroveň zvýšení oprávnění se vynechá, takže úloha se spustí v rámci standardního automatického uživatelského účtu pro celý fond.

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

Pojmenované uživatelské účty

Pojmenované uživatelské účty můžete definovat při vytváření fondu. Pojmenovaný uživatelský účet má zadané jméno a heslo. Můžete zadat úroveň zvýšení oprávnění pro pojmenovaný uživatelský účet. Pro uzly s Linuxem můžete také zadat privátní klíč SSH.

Pojmenovaný uživatelský účet existuje na všech uzlech ve fondu a je k dispozici pro všechny úlohy spuštěné na těchto uzlech. Pro fond můžete definovat libovolný počet pojmenovaných uživatelů. Když přidáte úlohu nebo kolekci úkolů, můžete určit, že se úloha spustí pod jedním z pojmenovaných uživatelských účtů definovaných ve fondu.

Pojmenovaný uživatelský účet je užitečný, když chcete spouštět všechny úkoly v úloze pod stejným uživatelským účtem, ale izolovat je od úkolů spuštěných v jiných úlohách současně. Můžete například vytvořit pojmenovaného uživatele pro každou úlohu a spouštět úkoly jednotlivých úloh pod tímto pojmenovaným uživatelským účtem. Každá úloha pak může sdílet tajný kód s vlastními úkoly, ale ne s úkoly spuštěnými v jiných úlohách.

Pojmenovaný uživatelský účet můžete také použít ke spuštění úlohy, která nastaví oprávnění k externím prostředkům, jako jsou sdílené složky. S pojmenovaným uživatelským účtem řídíte identitu uživatele a tuto identitu uživatele můžete použít k nastavení oprávnění.

Pojmenované uživatelské účty umožňují mezi uzly Linuxu SSH bez hesla. Pojmenovaný uživatelský účet můžete použít s uzly Linuxu, které potřebují spouštět úlohy s více instancemi. Každý uzel ve fondu může spouštět úkoly pod uživatelským účtem definovaným v celém fondu. Další informace o úlohách s více instancemi naleznete v tématu Použití úloh s více instancemi ke spouštění aplikací MPI.

Vytvoření pojmenovaných uživatelských účtů

Pokud chcete vytvořit pojmenované uživatelské účty ve službě Batch, přidejte do fondu kolekci uživatelských účtů. Následující fragmenty kódu ukazují, jak vytvořit pojmenované uživatelské účty v .NET, Javě a Pythonu. Tyto ukázky kódu demonstrují, jak vytvořit pojmenované administrátorské a neadministrátorské účty ve fondu.

Příklad batch .NET (Windows)

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

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

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

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

Příklad batch .NET (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> isUbuntu2404 = imageRef =>
    imageRef.Publisher == "Canonical" &&
    imageRef.Offer == "ubuntu-24_04-lts" &&
    imageRef.Sku.Contains("server");

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

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

// 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: 2,
    virtualMachineSize: "Standard_d2s_v3",
    virtualMachineConfiguration: virtualMachineConfiguration);
// Add named user accounts.
pool.UserAccounts = new List<UserAccount>
{
    new UserAccount(
        name: "adminUser",
        password: "A1bC2d",
        elevationLevel: ElevationLevel.Admin,
        linuxUserConfiguration: new LinuxUserConfiguration(
            uid: 12345,
            gid: 98765,
            sshPrivateKey: new Guid().ToString()
            )),
    new UserAccount(
        name: "nonAdminUser",
        password: "A1bC2d",
        elevationLevel: ElevationLevel.NonAdmin,
        linuxUserConfiguration: new LinuxUserConfiguration(
            uid: 45678,
            gid: 98765,
            sshPrivateKey: new Guid().ToString()
            )),
};

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

Příklad Batch Java

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);

Příklad Batch Pythonu

users = [
    batchmodels.UserAccount(
        name='pool-admin',
        password='A1bC2d',
        elevation_level=batchmodels.ElevationLevel.admin)
    batchmodels.UserAccount(
        name='pool-nonadmin',
        password='A1bC2d',
        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)

Spuštění úlohy pod pojmenovaným uživatelským účtem se zvýšeným přístupem

Pokud chcete spustit úlohu jako uživatele se zvýšenými oprávněními, nastavte vlastnost UserIdentity úkolu na pojmenovaný uživatelský účet, který byl vytvořen s jeho vlastností ElevationLevel nastavenou na Admin.

Tento fragment kódu určuje, že úloha by se měla spustit pod pojmenovaným uživatelským účtem. Tento pojmenovaný uživatelský účet byl definován ve fondu už při jeho vytvoření. V tomto případě byl pojmenovaný uživatelský účet vytvořen s oprávněními správce:

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

Aktualizace kódu na nejnovější klientskou knihovnu Služby Batch

Služba Batch ve verzi 2017-01-01.4.0 zavedla zásadní změnu, nahrazující vlastnost runElevated dostupnou ve starších verzích vlastností userIdentity. Následující tabulky poskytují jednoduché mapování, které můžete použít k aktualizaci kódu ze starších verzí klientských knihoven.

Dávka .NET

Pokud váš kód používá... Aktualizujte ho na......
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 není zadáno Nevyžaduje se žádná aktualizace.

Batch Java

Pokud váš kód používá... Aktualizujte ho na......
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 neuvedeno. Nevyžaduje se žádná aktualizace.

Dávkové zpracování v Pythonu

Pokud váš kód používá... Aktualizujte ho na......
run_elevated=True user_identity=userkde
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=userkde
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated nespecifikováno. Nevyžaduje se žádná aktualizace.

Další kroky