Dela via


Köra uppdrag under användarkonton i Batch

Anteckning

Användarkontona som beskrivs i den här artikeln skiljer sig från användarkonton som används för RDP (Remote Desktop Protocol) eller Secure Shell (SSH) av säkerhetsskäl.

Information om hur du ansluter till en nod som kör konfigurationen av den virtuella Linux-datorn via SSH finns i Installera och konfigurera xrdp för att använda Fjärrskrivbord med Ubuntu. Information om hur du ansluter till noder som kör Windows via RDP finns i Ansluta och logga in på en virtuell Azure-dator som kör Windows.

En uppgift i Azure Batch körs alltid under ett användarkonto. Som standard körs uppgifter under standardanvändarkonton utan administratörsbehörighet. I vissa scenarier kanske du vill konfigurera användarkontot som du vill att en uppgift ska köras under. I den här artikeln beskrivs typerna av användarkonton och hur du konfigurerar dem för ditt scenario.

Typer av användarkonton

Azure Batch innehåller två typer av användarkonton för aktiviteter som körs:

  • Automatiska användarkonton. Automatiska användarkonton är inbyggda användarkonton som skapas automatiskt av Batch-tjänsten. Som standard körs aktiviteter under ett automatiskt användarkonto. Du kan konfigurera specifikationen för automatisk användare för en uppgift för att ange under vilket automatiskt användarkonto en uppgift ska köras. Med specifikationen för automatisk användare kan du ange höjningsnivån och omfattningen för det automatiska användarkonto som kör uppgiften.

  • Ett namngivet användarkonto. Du kan ange ett eller flera namngivna användarkonton för en pool när du skapar poolen. Varje användarkonto skapas på varje nod i poolen. Förutom kontonamnet anger du lösenordet för användarkontot, utökade privilegier och, för Linux-pooler, den privata SSH-nyckeln. När du lägger till en uppgift kan du ange det namngivna användarkonto som aktiviteten ska köras under.

Viktigt!

Batch-tjänstversionen 2017-01-01.4.0 introducerade en oförenlig ändring som kräver att du uppdaterar koden för att anropa den versionen eller senare. Se Uppdatera koden till det senaste Batch-klientbiblioteket för snabba riktlinjer för att uppdatera Batch-koden från en äldre version.

Användarkontoåtkomst till filer och kataloger

Både ett automatiskt användarkonto och ett namngivet användarkonto har läs-/skrivåtkomst till uppgiftens arbetskatalog, delade katalog och aktivitetskatalog för flera instanser. Båda typerna av konton har läsåtkomst till katalogerna för start och jobbförberedelse.

Om en aktivitet körs under samma konto som användes för att köra en startaktivitet har aktiviteten läs- och skrivbehörighet till startaktivitetskatalogen. På samma sätt, om en aktivitet körs under samma konto som användes för att köra en jobbförberedelseaktivitet, har aktiviteten läs- och skrivåtkomst till arbetsförberedelseaktivitetskatalogen. Om en aktivitet körs under ett annat konto än startaktiviteten eller jobbförberedelseaktiviteten har aktiviteten endast läsbehörighet till respektive katalog.

Viktigt!

Distinkta uppgiftsanvändare i Batch är inte en tillräcklig säkerhetsgräns för isolering mellan aktiviteter och dess associerade uppgiftsdata. I Batch är gränsen för säkerhetsisolering på poolnivå. Felaktig åtkomstkontroll för Batch-API:et kan dock leda till åtkomst till alla pooler under ett Batch-konto med tillräcklig behörighet. Se metodtips om poolsäkerhet.

Mer information om hur du kommer åt filer och kataloger från en uppgift finns i Filer och kataloger.

Förhöjd åtkomst för uppgifter

Användarkontots höjningsnivå anger om en aktivitet körs med förhöjd åtkomst. Både ett automatiskt användarkonto och ett namngivet användarkonto kan köras med förhöjd åtkomst. De två alternativen för höjdnivå är:

  • NonAdmin: Uppgiften körs som en standardanvändare utan förhöjd åtkomst. Standardhöjningsnivån för ett Batch-användarkonto är alltid NonAdmin.
  • Administratör: Uppgiften körs som en användare med förhöjd åtkomst och fungerar med fullständig administratörsbehörighet.

Automatiska användarkonton

Som standardinställning körs uppgifter i Batch under ett autoanvändarkonto, som en vanlig användare utan förhöjd åtkomst, och med poolomfång. Poolomfång innebär att uppgiften körs under ett automatiserat användarkonto som är tillgängligt för varje uppgift i poolen. Mer information om poolomfång finns i Köra en uppgift som automatisk användare med poolomfång.

Alternativet till poolräckvidd är aktivitetsräckvidd. När specifikationen för automatisk användare har konfigurerats för uppgiftsomfång skapar Batch-tjänsten endast ett automatiskt användarkonto för den uppgiften.

Det finns fyra möjliga konfigurationer för specifikationen för automatisk användare, som var och en motsvarar ett unikt automatiskt användarkonto:

  • Icke-administratörsåtkomst med aktivitetsomfång
  • Administratörsåtkomst (upphöjd) med aktivitetsomfång
  • Icke-administratörsåtkomst med poolomfång
  • Administratörsåtkomst med poolbegränsning

Anteckning

Automatiskt användarinvändarkonton med förhöjd administratörsåtkomst har direkt skrivåtkomst till alla andra aktivitetskataloger på beräkningsnoden som kör aktiviteten. Överväg att köra dina uppgifter med den lägsta möjliga behörighet som krävs för framgångsrik körning.

Kör en uppgift som en autonom användare med förhöjd åtkomst

Du kan konfigurera specifikationen för automatisk användare för administratörsbehörigheter när du behöver köra en uppgift med förhöjd åtkomst. En startaktivitet kan till exempel behöva förhöjd åtkomst för att installera programvara på noden.

Kommentar

Använd endast förhöjd åtkomst när det behövs. Ett vanligt användningsfall för att använda förhöjd administratörsåtkomst är för en startuppgift som måste installera programvara på beräkningsnoden innan andra aktiviteter kan schemaläggas. För efterföljande uppgifter bör du använda den installerade programvaran som en uppgiftsanvändare utan förhöjning av behörigheter.

Följande kodfragment visar hur du konfigurerar specifikationen för automatisk användare. Exemplen anger höjningsnivån till Admin och omfånget till 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)

Köra en uppgift som automatiserad användare med poolomfång

När en nod etableras skapas två automatiska användarkonton för hela poolen på varje nod i poolen, en med förhöjd åtkomst och en utan förhöjd åtkomst. Om du ställer in den automatiska användarens omfång till poolens omfång för en viss aktivitet, körs aktiviteten under ett av dessa två poolomfattande automatiska användarkonton.

När du anger poolomfång för den automatiska användaren körs alla uppgifter som körs med administratörsåtkomst under samma automatiska användarkonto för hela poolen. På samma sätt körs uppgifter som körs utan administratörsbehörighet under ett enda automatiskt användarkonto för hela poolen.

Fördelen med att köras under samma automatiska användarkonto är att uppgifter enkelt kan dela data med andra uppgifter som körs på samma nod. Det finns också prestandafördelar med återanvändning av användarkonton.

Att dela sådana hemligheter mellan uppgifter är ett scenario där det är användbart att köra uppgifter under ett av de två poolövergripande automatiska användarkontona. Anta till exempel att en startaktivitet måste etablera en hemlighet på noden som andra aktiviteter kan använda. Du kan använda Windows Data Protection API (DPAPI), men det kräver administratörsbehörighet. I stället kan du skydda hemligheten på användarnivå. Uppgifter som körs under samma användarkonto kan komma åt hemligheten utan förhöjd åtkomst.

Ett annat scenario där du kanske vill köra aktiviteter under ett användarkonto som skapats automatiskt med poolomfång är en fildelning i Message Passing Interface (MPI). En MPI-fildelning är användbar när noderna i MPI-uppgiften behöver arbeta med samma fildata. Huvudnoden skapar en fildelning som de underordnade noderna kan komma åt om de körs på samma automatiserade användarkonto.

Följande kodfragment ställer in omfånget för den automatiska användaren till poolomfånget för en uppgift i Batch .NET. Höjningsnivån utelämnas, så aktiviteten körs under det automatiska användarkontot för hela standardpoolen.

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

Namngivna användarkonton

Du kan definiera namngivna användarkonton när du skapar en pool. Ett namngivet användarkonto har ett namn och lösenord som du anger. Du kan ange höjningsnivån för ett namngivet användarkonto. För Linux-noder kan du också ange en privat SSH-nyckel.

Ett namngivet användarkonto finns på alla noder i poolen och är tillgängligt för alla aktiviteter som körs på dessa noder. Du kan definiera valfritt antal namngivna användare för en pool. När du lägger till en aktivitets- eller uppgiftssamling kan du ange att aktiviteten ska köras under ett av de namngivna användarkonton som definierats i poolen.

Ett namngivet användarkonto är användbart när du vill köra alla uppgifter i ett jobb under samma användarkonto, men isolera dem från aktiviteter som körs i andra jobb samtidigt. Du kan till exempel skapa en namngiven användare för varje jobb och köra varje jobbs uppgifter under det namngivna användarkontot. Varje jobb kan sedan dela en hemlighet med sina egna uppgifter, men inte med uppgifter som körs i andra jobb.

Du kan också använda ett namngivet användarkonto för att köra en uppgift som anger behörigheter för externa resurser, till exempel filresurser. Med ett namngivet användarkonto styr du användaridentiteten och kan använda användaridentiteten för att ange behörigheter.

Namngivna användarkonton aktiverar lösenordsfri SSH mellan Linux-noder. Du kan använda ett namngivet användarkonto med Linux-noder som behöver köra uppgifter med flera instanser. Varje nod i poolen kan köra uppgifter under ett användarkonto som definierats i hela poolen. Mer information om aktiviteter med flera instanser finns i Använda aktiviteter med flera instanser för att köra MPI-program.

Skapa namngivna användarkonton

Om du vill skapa namngivna användarkonton i Batch lägger du till en samling användarkonton i poolen. Följande kodfragment visar hur du skapar namngivna användarkonton i .NET, Java och Python. Dessa kodfragment visar hur du skapar både administratörs- och icke-administratörsnamnkonton i en pool.

Batch .NET-exempel (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();

Batch .NET-exempel (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();

Exempel på 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);

Exempel på Batch Python

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)

Kör en uppgift under ett namngivet användarkonto med förhöjd åtkomst

Om du vill köra en uppgift som en upphöjd användare anger du uppgiftens UserIdentity-egenskap till ett namngivet användarkonto som skapades med egenskapen ElevationLevel inställd på Admin.

Det här kodfragmentet anger att aktiviteten ska köras under ett namngivet användarkonto. Det här namngivna användarkontot definierades i poolen när poolen skapades. I det här fallet skapades det namngivna användarkontot med administratörsbehörighet:

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

Uppdatera koden till det senaste Batch-klientbiblioteket

Batch-tjänstversionen 2017-01-01.4.0 introducerade en icke-bakåtkompatibel ändring, och ersatte egenskapen runElevated, som finns tillgänglig i tidigare versioner, med egenskapen userIdentity. Följande tabeller innehåller en enkel mappning som du kan använda för att uppdatera koden från tidigare versioner av klientbiblioteken.

Batch .NET

Om koden använder... Uppdatera den till....
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 har inte angetts Ingen uppdatering krävs

Batch Java

Om koden använder... Uppdatera den till....
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 har inte angetts Ingen uppdatering krävs

Batch Python

Om koden använder... Uppdatera den till....
run_elevated=True user_identity=user där
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=user där
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated har inte angetts Ingen uppdatering krävs

Nästa steg