Köra uppgifter under användarkonton i Batch
Kommentar
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.
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 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 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 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 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ä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.
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 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 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 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 poolomfång
Viktigt!
Aktiviteter som körs under aktivitetsomfånget har inte de facto åtkomst till andra aktiviteter på en nod. En obehörig användare med åtkomst till kontot kan dock kringgå den här begränsningen genom att skicka en uppgift som körs med administratörsbehörighet och som har å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 kan ha komprometterats bör du återskapa dina nycklar.
Kör 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.
Kommentar
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 startuppgift till exempel installerar programvara för den aktuella användaren kan du i stället för för alla användare 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 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, en med förhöjd åtkomst och en utan förhöjd åtkomst. Om du anger omfånget för den automatiska användaren till 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 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.
Kommentar
De två automatiska användarkontona för hela poolen är separata konton. Uppgifter som körs under det poolomfattande administrativa kontot kan inte dela data med uppgifter som körs under standardkontot och vice versa.
Fördelen med att köras under samma automatiska användarkonto är att uppgifter 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 uppgifter under ett av de två automatiska användarkontona i 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 behöver arbeta med samma fildata. Huvudnoden skapar en filresurs som de underordnade noderna kan komma åt om de körs under samma automatiska 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 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 aktiviteter 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: 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();
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: "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 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=user var user = batchmodels.UserIdentity( auto_user=batchmodels.AutoUserSpecification( elevation_level=batchmodels.ElevationLevel.admin)) |
run_elevated=False |
user_identity=user var 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
- Lär dig mer om Batch-tjänstens arbetsflöde och primära resurser , till exempel pooler, noder, jobb och uppgifter.
- Lär dig mer om filer och kataloger i Azure Batch.