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

Poznámka

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

Pokud se chcete připojit k uzlu, na kterém běží konfigurace virtuálního počítače s Linuxem přes SSH, přečtěte si téma Instalace a konfigurace xrdp pro používání Vzdálené plochy s Ubuntu. Pokud se chcete připojit k uzlům s Windows přes protokol RDP, přečtěte si téma Připojení a přihlášení k virtuálnímu počítači Azure s Windows.

Pokud se chcete připojit k uzlu, na kterém běží protokol RDP, přečtěte si téma Povolení připojení ke vzdálené ploše pro roli v Azure Cloud Services.

Úloha v Azure Batch vždy běží pod uživatelským účtem. Ve výchozím nastavení se úlohy spouští 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 úlohu spustit. Tento článek popisuje typy uživatelských účtů a jejich konfiguraci pro váš scénář.

Typy uživatelských účtů

Azure Batch poskytuje dva typy uživatelských účtů pro spuštěné úlohy:

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

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

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 volal tuto nebo novější verzi. Rychlé pokyny pro aktualizaci kódu Batch ze starší verze najdete v tématu Aktualizace kódu na nejnovější klientskou knihovnu Služby Batch.

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

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

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

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

Zvýšený přístup k úkolům

Úroveň zvýšení oprávnění uživatelského účtu označuje, jestli se úloha spouští se zvýšeným přístupem. Účet automatického uživatele i pojmenovaný uživatelský účet můžou běžet se zvýšeným přístupem. Dvě možnosti pro úroveň zvýšení úrovně jsou:

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

Účty automatického uživatele

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. Obor fondu znamená, že úloha běží pod automatickým uživatelským účtem, který je k dispozici pro libovolný úkol ve fondu. Další informace o rozsahu fondu najdete v tématu Spuštění úlohy jako automatického uživatele s oborem fondu.

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

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

  • Přístup bez oprávnění správce s oborem úlohy
  • Správa přístup (se zvýšenými oprávněními) s oborem úlohy
  • Přístup bez oprávnění správce s oborem fondu
  • Správa přístup s oborem fondu

Důležité

Úkoly spuštěné v rámci oboru úkolů nemají de facto přístup k jiným úkolům na uzlu. Uživatel se zlými úmysly s přístupem k účtu ale může toto omezení obejít odesláním úlohy, která běží s oprávněními správce a přistupuje k jiným adresářům úloh. Uživatel se zlými úmysly může také použít protokol RDP nebo SSH pro připojení k uzlu. Abyste takovému scénáři zabránili, je důležité chránit přístup ke klíčům účtu Batch. Pokud máte podezření, že váš účet mohl být napaden, nezapomeňte klíče znovu vygenerovat.

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

Pokud potřebujete spustit úlohu se zvýšeným přístupem, můžete nakonfigurovat specifikaci automatického uživatele pro oprávnění správce. Spouštěcí úloha může například vyžadovat 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 jenom v případě potřeby. Osvědčené postupy doporučují udělení minimálního oprávnění potřebného k dosažení požadovaného výsledku. Pokud například spouštěcí úloha nainstaluje software pro aktuálního uživatele místo pro všechny uživatele, můžete se vyhnout udělení přístupu se zvýšenými oprávněními k úkolům. Můžete nakonfigurovat specifikaci automatického uživatele pro obor fondu a přístup bez oprávnění správce pro všechny úlohy, které musí běžet pod stejným účtem, včetně spouštěcí úlohy.

Následující fragmenty kódu ukazují, jak nakonfigurovat specifikaci automatického uživatele. Příklady nastaví úroveň zvýšení na Admin a obor 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ý uživatel s oborem fondu

Při zřízení uzlu se na každém uzlu ve fondu vytvoří dva automatické uživatelské účty pro celý fond, jeden se zvýšeným přístupem a jeden bez přístupu se zvýšenými oprávněními. Nastavení oboru automatického uživatele na rozsah fondu pro danou úlohu spustí úlohu pod jedním z těchto dvou účtů automatického uživatele pro celý fond.

Když pro automatického uživatele zadáte obor fondu, budou všechny úlohy spuštěné s přístupem správce spuštěné pod stejným účtem automatického uživatele 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.

Poznámka

Dva účty automatického uživatele pro celý fond jsou samostatné účty. Úlohy spuštěné pod účtem pro správu pro celý fond nemůžou sdílet data s úkoly spuštěnými pod standardním účtem a naopak.

Výhodou spuštění pod stejným účtem automatického uživatele je, že úlohy můžou sdílet data s jinými úkoly spuštěnými na stejném uzlu.

Sdílení tajných kódů mezi úkoly je jedním ze scénářů, kdy je užitečné spouštět úkoly pod jedním ze dvou účtů automatického uživatele v rámci celého fondu. Předpokládejme například, že spouštěcí úkol potřebuje zřídit tajný kód pro uzel, který můžou používat jiné úkoly. Můžete použít rozhraní API pro ochranu dat systému Windows (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, kdy můžete chtít spouštět úlohy pod automatickým uživatelským účtem s oborem fondu, je sdílená složka MPI (Message Passing Interface). Sdílená složka MPI je užitečná, když uzly v úloze MPI potřebují pracovat na stejných souborových datech. 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í fragment kódu nastaví obor automatického uživatele na obor fondu pro úlohu ve službě Batch .NET. Úroveň zvýšení oprávnění se vynechá, takže úloha běží pod standardním automatickým uživatelským účtem 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, aby se úloha spouštěla 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 úlohy v úloze pod stejným uživatelským účtem, ale současně je izolovat od úloh spuštěných v jiných úlohách. Můžete například vytvořit pojmenovaného uživatele pro každou úlohu a spouštět úlohy každé úlohy pod tímto pojmenovaným uživatelským účtem. Každá úloha pak může sdílet tajný kód se svými vlastními úkoly, ale ne s úkoly spuštěnými v jiných úlohách.

Pojmenovaný uživatelský účet můžete použít také 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 můžete ji použít k nastavení oprávnění.

Pojmenované uživatelské účty umožňují bez hesla SSH mezi uzly s Linuxem. Pojmenovaný uživatelský účet můžete použít s linuxovými uzly, které potřebují spouštět úlohy s více instancemi. Každý uzel ve fondu může spouštět úlohy pod uživatelským účtem definovaným v celém fondu. Další informace o úlohách s více instancemi najdete 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 fragmenty kódu ukazují, jak ve fondu vytvořit účty s názvem správce i účty bez oprávnění správce.

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

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

Příklad Služby Batch v Javě

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='******',
        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)

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

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

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 ve fondu definován při jeho vytvoření. V tomto případě se vytvořil pojmenovaný uživatelský účet 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 Batch

Služba Batch verze 2017-01-01.4.0 zavedla zásadní změnu, která nahradila 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 z dřívějších verzí klientských knihoven.

Batch .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 neurčené 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 neurčené Nevyžaduje se žádná aktualizace.

Batch Python

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 neurčené Nevyžaduje se žádná aktualizace.

Další kroky