Share via


Köra uppgifter 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 Remote Desktop Protocol (RDP) 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.

Information om hur du ansluter till en nod som kör via RDP finns i Aktivera anslutning till fjärrskrivbord för en roll i Azure Cloud Services.

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 det användarkonto som du vill att en uppgift ska köras under. Den här artikeln beskriver 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 att köra uppgifter:

  • Konton för automatisk användare. Automatiskt användarinvändarkonton är inbyggda användarkonton som skapas automatiskt av Batch-tjänsten. Som standard körs uppgifter under ett automatiskt användarkonto. Du kan konfigurera specifikationen för automatisk användare för en aktivitet för att ange under vilket automatiskt användarkonto en aktivitet ska köras. Med specifikationen för automatisk användare kan du ange höjningsnivån och omfattningen för det automatiskt användarkonto som ska köra 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 användarkontolösenordet, utökade privilegier och, för Linux-pooler, den privata SSH-nyckeln. När du lägger till en aktivitet kan du ange det namngivna användarkonto som aktiviteten ska köras under.

Viktigt

Batch-tjänsten version 2017-01-01.4.0 introducerade en icke-bakåtkompatibel ä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äsbehörighet 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 skrivbehörighet till jobbförberedelseaktivitetskatalogen. Om en aktivitet körs under ett annat konto än startaktiviteten eller jobbförberedelseaktiviteten har aktiviteten endast läsbehörighet till respektive katalog.

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

Upphöjningsnivån för användarkontot 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öjningsnivå ä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.
  • Admin: Uppgiften körs som en användare med förhöjd åtkomst och fungerar med fullständiga administratörsbehörigheter.

Automatiskt användarinloggningskonton

Som standard körs uppgifter i Batch under ett automatiskt användarkonto, som en standardanvändare utan förhöjd åtkomst och med poolomfång. Poolomfång innebär att aktiviteten körs under ett automatiskt användarkonto som är tillgängligt för alla aktiviteter i poolen. Mer information om poolomfång finns i Köra en uppgift som en automatisk användare med poolomfång.

Alternativet till poolomfång är aktivitetsomfång. När specifikationen för automatisk användare har konfigurerats för aktivitetsomfå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
  • Admin (upphöjd) åtkomst med aktivitetsomfång
  • Icke-administratörsåtkomst med poolomfång
  • Admin åtkomst med poolomfång

Viktigt

Aktiviteter som körs under aktivitetsomfånget har inte de facto åtkomst till andra aktiviteter på en nod. Men en obehörig användare med åtkomst till kontot kan kringgå den här begränsningen genom att skicka en uppgift som körs med administratörsbehörighet och får åtkomst till andra aktivitetskataloger. En obehörig användare kan också använda RDP eller SSH för att ansluta till en nod. Det är viktigt att skydda åtkomsten till dina Batch-kontonycklar för att förhindra ett sådant scenario. Om du misstänker att ditt konto har komprometterats måste du återskapa dina nycklar.

Köra en uppgift som en automatisk 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.

Anteckning

Använd endast förhöjd åtkomst när det behövs. Bästa praxis rekommenderar att du beviljar den minsta behörighet som krävs för att uppnå önskat resultat. Om en startaktivitet till exempel installerar programvara för den aktuella användaren, i stället för för alla användare, kan du undvika att bevilja förhöjd åtkomst till uppgifter. Du kan konfigurera specifikationen för automatisk användare för poolomfång och icke-administratörsåtkomst för alla uppgifter som måste köras under samma konto, inklusive startaktiviteten.

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.

.NET för Batch

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

Python för Batch

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 en automatisk användare med poolomfång

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

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 automatiskt 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.

Anteckning

De två automatiska användarkontona för hela poolen är separata konton. Uppgifter som körs under det poolomfattande administrationskontot kan inte dela data med aktiviteter som körs under standardkontot och vice versa.

Fördelen med att köra under samma automatiskt användarkonto är att aktiviteter kan dela data med andra aktiviteter som körs på samma nod.

Att dela hemligheter mellan aktiviteter är ett scenario där det är användbart att köra aktiviteter under ett av de två automatiska användarkontona för hela poolen. 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 automatiskt användarkonto med poolomfång är en MPI-filresurs (Message Passing Interface). En MPI-filresurs är användbar när noderna i MPI-aktiviteten måste arbeta med samma fildata. Huvudnoden skapar en filresurs som de underordnade noderna kan komma åt om de körs under samma automatiskt användarkonto.

Följande kodfragment anger 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 uppgifts- 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 aktiviteter, men inte med aktiviteter som körs i andra jobb.

Du kan också använda ett namngivet användarkonto för att köra en aktivitet som anger behörigheter för externa resurser, till exempel filresurser. Med ett namngivet användarkonto styr du användaridentiteten och kan använda den 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örskonton och icke-administratörskonton 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: 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-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> 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-exempel

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-exempel

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)

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örigheter:

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

Uppdatera koden till det senaste Batch-klientbiblioteket

Batch-tjänsten version 2017-01-01.4.0 introducerade en icke-bakåtkompatibel ändring och ersatte den runElevated-egenskap som är 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.

.NET för Batch

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

Python för Batch

Om koden använder... Uppdatera den till...
run_elevated=True user_identity=userDär
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=userDä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