Share via


Taken uitvoeren onder gebruikersaccounts in Batch

Notitie

De gebruikersaccounts die in dit artikel worden besproken, verschillen van gebruikersaccounts die worden gebruikt voor Remote Desktop Protocol (RDP) of Secure Shell (SSH), om veiligheidsredenen.

Zie Xrdp installeren en configureren voor het gebruik van Extern bureaublad met Ubuntu om verbinding te maken met een knooppunt waarop de configuratie van de virtuele Linux-machine via SSH wordt uitgevoerd. Als u verbinding wilt maken met knooppunten met Windows via RDP, raadpleegt u Hoe u verbinding maakt en zich aanmeldt bij een virtuele Azure-machine met Windows.

Zie Verbinding met extern bureaublad inschakelen voor een rol in Azure Cloud Services om verbinding te maken met een knooppunt dat via RDP wordt uitgevoerd.

Een taak in Azure Batch wordt altijd uitgevoerd onder een gebruikersaccount. Taken worden standaard uitgevoerd onder standaardgebruikersaccounts, zonder beheerdersmachtigingen. Voor bepaalde scenario's wilt u mogelijk het gebruikersaccount configureren waaronder u een taak wilt uitvoeren. In dit artikel worden de typen gebruikersaccounts besproken en hoe u deze configureert voor uw scenario.

Types gebruikersaccounts

Azure Batch biedt twee soorten gebruikersaccounts voor het uitvoeren van taken:

  • Automatische gebruikersaccounts. Automatische gebruikersaccounts zijn ingebouwde gebruikersaccounts die automatisch door de Batch-service worden gemaakt. Taken worden standaard uitgevoerd onder een automatisch gebruikersaccount. U kunt de specificatie voor automatische gebruikers configureren voor een taak om aan te geven onder welk automatisch gebruikersaccount een taak moet worden uitgevoerd. Met de specificatie voor automatische gebruikers kunt u het hoogte- en bereik van het automatische gebruikersaccount opgeven waarmee de taak wordt uitgevoerd.

  • Een benoemd gebruikersaccount. U kunt een of meer benoemde gebruikersaccounts voor een pool opgeven wanneer u de pool maakt. Elk gebruikersaccount wordt gemaakt op elk knooppunt van de pool. Naast de accountnaam geeft u het wachtwoord van het gebruikersaccount, het uitbreidingsniveau en, voor Linux-pools, de persoonlijke SSH-sleutel op. Wanneer u een taak toevoegt, kunt u het benoemde gebruikersaccount opgeven waaronder die taak moet worden uitgevoerd.

Belangrijk

De Batch-serviceversie 2017-01-01.4.0 heeft een belangrijke wijziging geïntroduceerd die vereist dat u uw code bijwerkt om die versie of hoger aan te roepen. Zie Uw code bijwerken naar de nieuwste Batch-clientbibliotheek voor snelle richtlijnen voor het bijwerken van uw Batch-code vanuit een oudere versie.

Gebruikersaccounttoegang tot bestanden en mappen

Zowel een automatisch gebruikersaccount als een benoemd gebruikersaccount hebben lees-/schrijftoegang tot de werkmap van de taak, gedeelde map en takenmap met meerdere exemplaren. Beide typen accounts hebben leestoegang tot de opstart- en taakvoorbereidingsmappen.

Als een taak wordt uitgevoerd onder hetzelfde account dat is gebruikt voor het uitvoeren van een begintaak, heeft de taak lees-/schrijftoegang tot de begintaakmap. Als een taak wordt uitgevoerd onder hetzelfde account dat is gebruikt voor het uitvoeren van een taakvoorbereidingstaak, heeft de taak lees-/schrijftoegang tot de map met taakvoorbereidingstaken. Als een taak wordt uitgevoerd onder een ander account dan de begintaak of taakvoorbereidingstaak, heeft de taak alleen leestoegang tot de respectieve map.

Zie Bestanden en mappen voor meer informatie over het openen van bestanden en mappen vanuit een taak.

Verhoogde toegang voor taken

Het uitbreidingsniveau van het gebruikersaccount geeft aan of een taak wordt uitgevoerd met verhoogde toegang. Zowel een automatisch gebruikersaccount als een benoemd gebruikersaccount kan worden uitgevoerd met verhoogde toegang. De twee opties voor hoogteniveau zijn:

  • NonAdmin: De taak wordt uitgevoerd als een standaardgebruiker zonder verhoogde toegang. Het standaardniveau voor benodigde bevoegdheden voor een Batch-gebruikersaccount is altijd NonAdmin.
  • Beheerder: De taak wordt uitgevoerd als gebruiker met verhoogde toegang en werkt met volledige beheerdersmachtigingen.

Automatisch gebruikersaccounts

Taken worden standaard uitgevoerd in Batch onder een automatisch gebruikersaccount, als standaardgebruiker zonder verhoogde toegang en met poolbereik. Het bereik van de pool betekent dat de taak wordt uitgevoerd onder een automatisch gebruikersaccount dat beschikbaar is voor elke taak in de pool. Zie Een taak uitvoeren als een automatische gebruiker met poolbereik voor meer informatie over poolbereik.

Het alternatief voor het bereik van de pool is het taakbereik. Wanneer de specificatie voor automatische gebruikers is geconfigureerd voor het taakbereik, maakt de Batch-service alleen een automatisch gebruikersaccount voor die taak.

Er zijn vier mogelijke configuraties voor de specificatie voor automatische gebruikers, die elk overeenkomen met een uniek automatisch gebruikersaccount:

  • Niet-beheerderstoegang met taakbereik
  • Beheerderstoegang (verhoogd) met taakbereik
  • Niet-beheerderstoegang met poolbereik
  • Beheerderstoegang met poolbereik

Belangrijk

Taken die onder het taakbereik worden uitgevoerd, hebben geen feitelijke toegang tot andere taken op een knooppunt. Een kwaadwillende gebruiker met toegang tot het account kan deze beperking echter omzeilen door een taak te verzenden die wordt uitgevoerd met beheerdersbevoegdheden en toegang heeft tot andere taakmappen. Een kwaadwillende gebruiker kan ook RDP of SSH gebruiken om verbinding te maken met een knooppunt. Het is belangrijk dat u de toegang tot uw Batch-accountsleutels beveiligt om een dergelijk scenario te voorkomen. Als u vermoedt dat uw account is aangetast, moet u uw sleutels opnieuw genereren.

Een taak uitvoeren als een automatische gebruiker met verhoogde toegang

U kunt de specificatie voor automatische gebruikers configureren voor beheerdersbevoegdheden wanneer u een taak met verhoogde toegang moet uitvoeren. Een begintaak heeft bijvoorbeeld verhoogde toegang nodig om software op het knooppunt te installeren.

Notitie

Gebruik alleen verhoogde toegang wanneer dat nodig is. Aanbevolen procedures raden u aan de minimale bevoegdheden toe te kennen die nodig zijn om het gewenste resultaat te bereiken. Als met een begintaak bijvoorbeeld software voor de huidige gebruiker wordt geïnstalleerd in plaats van voor alle gebruikers, kunt u mogelijk voorkomen dat u verhoogde toegang verleent tot taken. U kunt de specificatie voor automatisch gebruikers configureren voor groepsbereik en niet-beheerderstoegang voor alle taken die onder hetzelfde account moeten worden uitgevoerd, inclusief de begintaak.

De volgende codefragmenten laten zien hoe u de specificatie voor automatische gebruikers configureert. In de voorbeelden wordt het hoogteniveau Admin ingesteld op en het bereik op 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)

Een taak uitvoeren als een automatische gebruiker met poolbereik

Wanneer een knooppunt is ingericht, worden twee automatische gebruikersaccounts voor de hele groep gemaakt op elk knooppunt in de pool, één met verhoogde toegang en één zonder verhoogde toegang. Als u het bereik van de automatische gebruiker instelt op poolbereik voor een bepaalde taak, wordt de taak uitgevoerd onder een van deze twee automatische gebruikersaccounts voor de hele groep.

Wanneer u het groepsbereik voor de automatische gebruiker opgeeft, worden alle taken die worden uitgevoerd met beheerderstoegang uitgevoerd onder hetzelfde account voor automatische gebruikers voor de hele groep. Op dezelfde manier worden taken die zonder beheerdersmachtigingen worden uitgevoerd, ook uitgevoerd onder één gebruikersaccount voor de hele groep.

Notitie

De twee groepsbrede automatische gebruikersaccounts zijn afzonderlijke accounts. Taken die worden uitgevoerd onder het beheeraccount voor de hele groep, kunnen geen gegevens delen met taken die worden uitgevoerd onder het standaardaccount en omgekeerd.

Het voordeel van het uitvoeren onder hetzelfde automatische gebruikersaccount is dat taken gegevens kunnen delen met andere taken die op hetzelfde knooppunt worden uitgevoerd.

Het delen van geheimen tussen taken is één scenario waarbij het uitvoeren van taken onder een van de twee poolbrede automatische gebruikersaccounts nuttig is. Stel dat een begintaak een geheim moet inrichten op het knooppunt dat andere taken kunnen gebruiken. U kunt de Windows Data Protection-API (DPAPI) gebruiken, maar hiervoor zijn beheerdersbevoegdheden vereist. In plaats daarvan kunt u het geheim beveiligen op gebruikersniveau. Taken die onder hetzelfde gebruikersaccount worden uitgevoerd, hebben toegang tot het geheim zonder verhoogde toegang.

Een ander scenario waarin u mogelijk taken wilt uitvoeren onder een account voor automatische gebruikers met poolbereik, is een MPI-bestandsshare (Message Passing Interface). Een MPI-bestandsshare is handig wanneer de knooppunten in de MPI-taak moeten werken aan dezelfde bestandsgegevens. Het hoofdknooppunt maakt een bestandsshare waartoe de onderliggende knooppunten toegang hebben als ze worden uitgevoerd onder hetzelfde automatische gebruikersaccount.

Met het volgende codefragment wordt het bereik van de automatische gebruiker ingesteld op poolbereik voor een taak in Batch .NET. Het uitbreidingsniveau wordt weggelaten, zodat de taak wordt uitgevoerd onder het standaardgroepsbrede automatische gebruikersaccount.

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

Benoemde gebruikersaccounts

U kunt benoemde gebruikersaccounts definiëren wanneer u een pool maakt. Een benoemd gebruikersaccount heeft een naam en wachtwoord die u opgeeft. U kunt het hoogteniveau voor een benoemd gebruikersaccount opgeven. Voor Linux-knooppunten kunt u ook een persoonlijke SSH-sleutel opgeven.

Er bestaat een benoemd gebruikersaccount op alle knooppunten in de pool en is beschikbaar voor alle taken die op deze knooppunten worden uitgevoerd. U kunt een willekeurig aantal benoemde gebruikers voor een pool definiëren. Wanneer u een taak of taakverzameling toevoegt, kunt u opgeven dat de taak wordt uitgevoerd onder een van de benoemde gebruikersaccounts die in de pool zijn gedefinieerd.

Een benoemd gebruikersaccount is handig als u alle taken in een taak onder hetzelfde gebruikersaccount wilt uitvoeren, maar deze wilt isoleren van taken die tegelijkertijd in andere taken worden uitgevoerd. U kunt bijvoorbeeld een benoemde gebruiker voor elke taak maken en de taken van elke taak uitvoeren onder dat benoemde gebruikersaccount. Elke taak kan vervolgens een geheim delen met zijn eigen taken, maar niet met taken die in andere taken worden uitgevoerd.

U kunt ook een benoemd gebruikersaccount gebruiken om een taak uit te voeren waarmee machtigingen worden ingesteld voor externe resources, zoals bestandsshares. Met een benoemd gebruikersaccount beheert u de gebruikersidentiteit en kunt u die gebruikersidentiteit gebruiken om machtigingen in te stellen.

Benoemde gebruikersaccounts schakelen SSH zonder wachtwoord in tussen Linux-knooppunten. U kunt een benoemd gebruikersaccount gebruiken met Linux-knooppunten die taken met meerdere exemplaren moeten uitvoeren. Elk knooppunt in de pool kan taken uitvoeren onder een gebruikersaccount dat is gedefinieerd voor de hele pool. Zie Taken met meerdere exemplaren gebruiken om MPI-toepassingen uit te voeren voor meer informatie over taken met meerdere exemplaren.

Benoemde gebruikersaccounts maken

Als u benoemde gebruikersaccounts in Batch wilt maken, voegt u een verzameling gebruikersaccounts toe aan de groep. De volgende codefragmenten laten zien hoe u benoemde gebruikersaccounts maakt in .NET, Java en Python. Deze codefragmenten laten zien hoe u zowel beheerders- als niet-beheerdersaccounts maakt in een pool.

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

Voorbeeld van 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);

Voorbeeld van 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)

Een taak uitvoeren onder een benoemd gebruikersaccount met verhoogde toegang

Als u een taak wilt uitvoeren als een gebruiker met verhoogde bevoegdheid, stelt u de eigenschap UserIdentity van de taak in op een benoemd gebruikersaccount dat is gemaakt met de eigenschap ElevationLevel ingesteld op Admin.

Dit codefragment geeft aan dat de taak moet worden uitgevoerd onder een benoemd gebruikersaccount. Dit benoemde gebruikersaccount is gedefinieerd in de pool toen de pool werd gemaakt. In dit geval is het benoemde gebruikersaccount gemaakt met beheerdersmachtigingen:

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

Uw code bijwerken naar de nieuwste Batch-clientbibliotheek

De Batch-serviceversie 2017-01-01.4.0 heeft een belangrijke wijziging geïntroduceerd, waarbij de eigenschap runElevated wordt vervangen die beschikbaar is in eerdere versies met de eigenschap userIdentity. De volgende tabellen bieden een eenvoudige toewijzing die u kunt gebruiken om uw code bij te werken vanuit eerdere versies van de clientbibliotheken.

Batch .NET

Als uw code gebruikmaakt van... Werk het bij naar......
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 niet opgegeven Er is geen update vereist

Batch Java

Als uw code gebruikmaakt van... Werk het bij naar......
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 niet opgegeven Er is geen update vereist

Batch Python

Als uw code gebruikmaakt van... Werk het bij naar......
run_elevated=True user_identity=userwaar
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=userwaar
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated niet opgegeven Er is geen update vereist

Volgende stappen