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.

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 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 má být úkol spuštěný automatickým uživatelským účtem. Specifikace automatického uživatele umožňuje zadat úroveň zvýšení oprávnění a rozsah účtu automatického uživatele, který spustí ú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 fondu. Kromě názvu účtu zadáte také heslo uživatelského účtu, úroveň zvýšení oprávnění a privátní klíč SSH pro fondy Linuxu. 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 volala 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.

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. Automaticky uživatelský účet i pojmenovaný uživatelský účet se dají spustit se zvýšeným přístupem. Dvě možnosti úrovně zvýšení úrovně 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. Obor fondu znamená, že úloha běží pod automatický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 s oborem fondu.

Alternativou k oboru 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 oprávnění správce s oborem fondu
  • Přístup správce s oborem fondu

Důležité

Úkoly spuštěné v 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á se spouští s oprávněními správce a přistupuje k jiným adresářům úkolů. Uživatel se zlými úmysly může k připojení k uzlu použít také protokol RDP nebo SSH. Je důležité chránit přístup k klíčům účtu Batch, aby se zabránilo takovému scénáři. Pokud máte podezření, že váš účet mohl být napadený, nezapomeňte znovu vygenerovat klíče.

Spuštění úlohy jako automatického uživatele 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. Osvědčené postupy doporučují udělení minimálních oprávnění potřebných k dosažení požadovaného výsledku. Pokud například spouštěcí úkol nainstaluje software pro aktuálního uživatele místo pro všechny uživatele, můžete se vyhnout udělení zvýšeného přístupu 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 úkoly, které je potřeba spustit ve stejném účtu, včetně spouštěcího úkolu.

Následující fragmenty kódu ukazují, jak nakonfigurovat specifikaci automatického uživatele. Příklady nastavily úroveň zvýšení úrovně Admin oprávnění 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 s oborem 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.

Poznámka:

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

Výhodou spuštění pod stejným automatickým uživatelským účtem je, že úkoly můžou sdílet data s ostatními úkoly běžící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 v rámci jednoho ze dvou účtů automatického uživatele pro celý fond. Předpokládejme například, že spouštěcí úkol musí zřídit tajný kód uzlu, který můžou používat jiné ú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 v úloze MPI musí pracovat na stejných datech 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í 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 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 fragmenty kódu ukazují, jak vytvořit účty s názvem správce i nesprávce 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: 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", "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> 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: "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 při vytvoření fondu. 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 verze 2017-01-01.4.0 zavedla zásadní změnu, která nahrazuje 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.

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 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 není zadáno. 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 není zadáno. Nevyžaduje se žádná aktualizace.

Další kroky