Feladatok futtatása felhasználói fiókok alatt a Batchben

Feljegyzés

A cikkben tárgyalt felhasználói fiókok biztonsági okokból eltérnek a Távoli asztali protokollhoz (RDP) vagy a Secure Shellhez (SSH) használt felhasználói fiókoktól.

Ha SSH-n keresztül szeretne csatlakozni egy Linux rendszerű virtuálisgép-konfigurációt futtató csomóponthoz, olvassa el az xrdp telepítése és konfigurálása a Távoli asztal Ubuntuval való használatához című témakört. Ha RDP-n keresztül szeretne csatlakozni a Windowst futtató csomópontokhoz, olvassa el a Windowst futtató Azure-beli virtuális gépekhez való csatlakozást és bejelentkezést ismertető témakört.

Az Azure Batchben lévő feladatok mindig felhasználói fiók alatt futnak. A feladatok alapértelmezés szerint rendszergazdai engedélyek nélkül, standard felhasználói fiókokban futnak. Bizonyos esetekben érdemes konfigurálni azt a felhasználói fiókot, amely alatt futtatni szeretné a feladatot. Ez a cikk ismerteti a felhasználói fiókok típusait és azok konfigurálását az Ön forgatókönyvéhez.

Felhasználói fiókok típusai

Az Azure Batch kétféle felhasználói fiókot biztosít a feladatok futtatásához:

  • Automatikus felhasználói fiókok. Az automatikus felhasználói fiókok olyan beépített felhasználói fiókok, amelyeket a Batch szolgáltatás automatikusan hoz létre. Alapértelmezés szerint a feladatok automatikus felhasználói fiók alatt futnak. A tevékenységek automatikus felhasználói specifikációját úgy konfigurálhatja, hogy jelezze, melyik automatikus felhasználói fiókban kell futtatnia egy feladatot. Az automatikus felhasználói specifikáció lehetővé teszi a feladatot futtató automatikus felhasználói fiók jogosultságszintjének és hatókörének megadását.

  • Névvel ellátott felhasználói fiók. A készlet létrehozásakor megadhat egy vagy több elnevezett felhasználói fiókot egy készlethez. Minden felhasználói fiók a készlet minden csomópontján létrejön. A fióknév mellett meg kell adnia a felhasználói fiók jelszavát, a jogosultságszintszintet és a Linux-készletek esetében az SSH titkos kulcsát. Feladat hozzáadásakor megadhatja azt a elnevezett felhasználói fiókot, amely alatt a feladatnak futnia kell.

Fontos

A Batch szolgáltatás 2017-01-01.4.0-s verziója olyan kompatibilitástörő változást vezetett be, amely megköveteli, hogy frissítse a kódot az adott verzió vagy újabb verzió meghívásához. A Batch-kód régebbi verzióról való frissítésével kapcsolatos rövid útmutatókért tekintse meg a Kód frissítése a Legújabb Batch-ügyfélkódtárra című témakört.

Felhasználói fiók hozzáférése fájlokhoz és könyvtárakhoz

Az automatikus felhasználói fiók és a nevesített felhasználói fiók egyaránt olvasási/írási hozzáféréssel rendelkezik a tevékenység munkakönyvtárához, megosztott könyvtárához és többpéldányos tevékenységkönyvtárához. Mindkét típusú felhasználói fiók olvasási hozzáféréssel rendelkezik az indítási és feladat-előkészítési könyvtárakhoz.

Ha egy tevékenység ugyanabban a fiókban fut, mint amelyet egy indítási tevékenység futtatásához használtak, a tevékenység írás-olvasási hozzáféréssel rendelkezik a kezdő tevékenység könyvtárához. Hasonlóképpen, ha egy tevékenység ugyanabban a fiókban fut, amely egy feladat-előkészítési tevékenység futtatásához volt használva, a tevékenység olvasási-írási hozzáféréssel rendelkezik a feladat-előkészítési tevékenység könyvtárához. Ha egy tevékenység a kezdési vagy a feladat-előkészítési tevékenységétől eltérő fiókban fut, akkor a tevékenység csak olvasási hozzáféréssel rendelkezik a megfelelő könyvtárhoz.

Fontos

A Batch különböző tevékenységfelhasználói nem elegendő biztonsági határt alkotnak a tevékenységek és a kapcsolódó tevékenységadatok elkülönítéséhez. A Batch rendszerben a biztonsági elkülönítés határa a fürt szintjén van. A Batch API nem megfelelő hozzáférés-vezérlése azonban a Batch-fiók összes készletének megfelelő engedélyekkel való elérését eredményezheti. Tekintse meg a medencebiztonságra vonatkozó ajánlott eljárásokat.

A fájlok és könyvtárak feladatból való eléréséről további információt a Fájlok és könyvtárak című témakörben talál.

Emelt szintű hozzáférés a tevékenységekhez

A felhasználói fiók jogosultságszintje azt jelzi, hogy egy tevékenység emelt szintű hozzáféréssel fut-e. Az automatikus felhasználói fiók és a névvel ellátott felhasználói fiók is rendszergazdai hozzáféréssel futtatható. A szintszint két lehetősége a következő:

  • NonAdmin: A feladat normál felhasználóként fut emelt szintű hozzáférés nélkül. A Batch felhasználói fiókok alapértelmezett emelési szintje mindig NonAdmin.
  • Rendszergazda: A feladat rendszergazdai jogosultsággal rendelkező felhasználóként fut, és teljes rendszergazdai engedélyekkel működik.

Automatikus felhasználói fiókok

A feladatok alapértelmezés szerint a Batchben automatikus felhasználói fiók alatt futnak, normál, rendszergazdai hozzáféréssel nem rendelkező felhasználóként és készlet hatókörrel. A készlet hatóköre azt jelenti, hogy a tevékenység egy automatikus felhasználói fiók alatt fut, amely a készlet bármely tevékenységéhez elérhető. A készlet hatókörével kapcsolatos további információkért lásd: Feladat futtatása készlethatókörrel automatikus felhasználóként.

A készlet hatókörének alternatíva a tevékenység hatóköre. Ha az automatikus felhasználó specifikációja a tevékenység hatóköréhez van konfigurálva, a Batch szolgáltatás csak ehhez a tevékenységhez hoz létre automatikus felhasználói fiókot.

Az automatikus felhasználói specifikáció négy lehetséges konfigurációval rendelkezik, amelyek mindegyike egy egyedi automatikus felhasználói fióknak felel meg:

  • Nem rendszergazdai hozzáférés tevékenységhatókörrel
  • Rendszergazdai (emelt szintű) hozzáférés tevékenységhatókörrel
  • Nem rendszergazdai hozzáférés az erőforráskészlet hatókörében
  • Rendszergazdai hozzáférés készlet szintű hozzáféréssel

Feljegyzés

Az emelt rendszergazdai hozzáféréssel rendelkező automatikus felhasználói fiókok közvetlen írási hozzáféréssel rendelkeznek a feladatot végrehajtó számítási csomópont összes többi feladatkönyvtárához. Érdemes lehet a feladatokat a sikeres végrehajtáshoz szükséges minimális jogosultsággal futtatni.

Feladat futtatása emelt szintű hozzáféréssel rendelkező automatikus felhasználóként

A rendszergazdai jogosultságok automatikus felhasználói specifikációját konfigurálhatja, ha emelt szintű hozzáféréssel rendelkező feladatot kell futtatnia. Előfordulhat például, hogy egy indítási feladatnak emelt szintű hozzáférésre van szüksége a szoftver csomópontra való telepítéséhez.

Feljegyzés

Csak akkor használjon emelt szintű hozzáférést, ha szükséges. Az emelt szintű rendszergazdai hozzáférés használatának tipikus használati esete egy olyan indítási feladat, amely szoftvereket kell telepítenie a számítási csomópontra, mielőtt más tevékenységek ütemezhetők. A következő feladatokhoz a telepített szoftvert jogosultságszint-emelés nélküli feladatfelhasználóként kell használnia.

Az alábbi kódrészletek bemutatják az automatikus felhasználói specifikáció konfigurálását. Az példák a kiemelési szintet Admin, és a hatókört Task állítják be.

Batch .NET

task.UserIdentity = new UserIdentity()
{
    AutoUser = 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 = models.UserIdentity(
    auto_user=models.AutoUserSpecification(
        elevation_level=models.ElevationLevel.ADMIN,
        scope=models.AutoUserScope.TASK))
task = models.BatchTaskCreateOptions(
    id='task_1',
    command_line='cmd /c "echo hello world"',
    user_identity=user)
batch_client.create_task(job_id=jobid, task=task)

Feladat futtatása automatikus felhasználóval, pool hatáskörrel

Amikor egy csomópont kiépítésre kerül, két készletszintű automatikus felhasználói fiókra kerül sor a készlet minden csomópontján, egy emelt szintű hozzáféréssel, egy pedig emelt szintű hozzáférés nélkül. Ha az automatikus felhasználó hatókörét egy adott feladathoz pool hatókörre állítja, a feladat a két pool-szintű automatikus felhasználói fiók valamelyike alatt fut.

Amikor megadja az automatikus felhasználó készlettartományát, a rendszergazdai hozzáféréssel futtatott összes feladat ugyanabban a készletszintű automatikus felhasználói fiókban fut. Hasonlóképpen, a rendszergazdai engedélyek nélkül futó feladatok is egyetlen készletszintű automatikus felhasználói fiókban futnak.

Az ugyanazon az automatikus felhasználói fiókon való futtatás előnye, hogy a feladatok egyszerűen megoszthatják az adatokat az ugyanazon a csomóponton futó más feladatokkal. A felhasználói fiókok újrafelhasználásának teljesítménybeli előnyei is vannak.

A feladatok közötti titkos kódok megosztása olyan forgatókönyv, amelyben a feladatok futtatása a két készletszintű automatikus felhasználói fiók egyikében hasznos. Tegyük fel például, hogy egy kezdő tevékenységnek titkos kulcsot kell kiépítenie a csomópontra, amelyet más tevékenységek használhatnak. Használhatja a Windows Data Protection API-t (DPAPI), de rendszergazdai jogosultságokat igényel. Ehelyett felhasználói szinten is megvédheti a titkos kulcsokat. Az ugyanazon a felhasználói fiókon futó feladatok emelt szintű hozzáférés nélkül férhetnek hozzá a titkos kódhoz.

Egy másik forgatókönyv, amikor automatikus felhasználói fiók alatt szeretne feladatokat futtatni készlet szintjén, az egy üzenetátadási felület (MPI) fájlmegosztása. Az MPI-fájlmegosztás akkor hasznos, ha az MPI-feladat csomópontjainak ugyanazon a fájladatokon kell dolgozniuk. A fő csomópont létrehoz egy fájlmegosztást, amelyhez a gyermekcsomópontok hozzáférhetnek, ha ugyanazon az automatikus felhasználói fiókon futnak.

Az alábbi kódrészlet beállítja az automatikus felhasználó hatókörét egy tevékenység hatókörének készletre a Batch .NET-ben. A jogosultságszint nincs megadva, ezért a tevékenység a standard készletszintű automatikus felhasználói fiók alatt fut.

task.UserIdentity = new UserIdentity()
{
    AutoUser = new AutoUserSpecification()
    {
        Scope = AutoUserScope.Pool
    }
};

Elnevezett felhasználói fiókok

Elnevezett felhasználói fiókokat definiálhat készlet létrehozásakor. Egy elnevezett felhasználói fióknak van egy ön által megadott neve és jelszava. Megadhatja egy elnevezett felhasználói fiók emelési szintjét. Linux-csomópontok esetén SSH titkos kulcsot is megadhat.

A névvel ellátott felhasználói fiók a készlet összes csomópontján megtalálható, és az ezeken a csomópontokon futó összes feladat számára elérhető. A készlethez tetszőleges számú elnevezett felhasználót definiálhat. Tevékenység vagy feladatgyűjtemény hozzáadásakor megadhatja, hogy a tevékenység a készletben definiált nevesített felhasználói fiókok egyikében fusson.

A névvel ellátott felhasználói fiókok akkor hasznosak, ha egy feladat összes feladatát ugyanabban a felhasználói fiókban szeretné futtatni, de el szeretné különíteni őket a más feladatokban egyidejűleg futó feladatoktól. Létrehozhat például egy elnevezett felhasználót minden feladathoz, és futtathatja az egyes feladatok feladatait az adott elnevezett felhasználói fiók alatt. Ezután minden munka megoszthat egy titkot a saját feladataival, de más munkákban futó feladatokkal nem.

Elnevezett felhasználói fiók használatával is futtathat olyan feladatot, amely engedélyeket állít be külső erőforrásokon, például fájlmegosztásokon. Egy elnevezett felhasználói fiókkal szabályozhatja a felhasználói identitást, és ezzel a felhasználói identitással állíthat be engedélyeket.

Az elnevezett felhasználói fiókok jelszó nélküli SSH-t tesznek lehetővé a Linux-csomópontok között. Egy elnevezett felhasználói fiókot többpéldányos feladatok futtatásához szükséges Linux-csomópontokkal is használhat. A készlet minden csomópontja futtathat feladatokat a teljes készletre vonatkozó felhasználói fiók alatt. A többpéldányos tevékenységekről további információt a Többpéldányos feladatok használata MPI-alkalmazások futtatásához című témakörben talál.

Elnevezett felhasználói fiókok létrehozása

Ha elnevezett felhasználói fiókokat szeretne létrehozni a Batchben, adjon hozzá felhasználói fiókok gyűjteményét a készlethez. Az alábbi kódrészletek bemutatják, hogyan hozhat létre elnevezett felhasználói fiókokat .NET-ben, Java-ban és Pythonban. Ezek a kódrészletek bemutatják, hogyan hozhat létre rendszergazdai és nem rendszergazdai nevű fiókokat egy készleten.

Batch .NET példa (Windows)

Console.WriteLine("Creating pool [{0}]...", poolId);

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = "standard_d2s_v3",
    DeploymentConfiguration = new BatchDeploymentConfiguration()
    {
        VmConfiguration = new BatchVmConfiguration(
            imageReference: new BatchImageReference()
            {
                Publisher = "MicrosoftWindowsServer",
                Offer = "WindowsServer",
                Sku = "2022-datacenter-core",
                Version = "latest"
            },
            nodeAgentSkuId: "batch.node.windows amd64")
    },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
    },
    UserAccounts =
    {
        new BatchUserAccount("adminUser", "A1bC2d") { ElevationLevel = BatchUserAccountElevationLevel.Admin },
        new BatchUserAccount("nonAdminUser", "A1bC2d") { ElevationLevel = BatchUserAccountElevationLevel.NonAdmin },
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, poolId, poolData);

Batch .NET - példa (Linux)

// Obtain a collection of all available node agent SKUs.
List<BatchSupportedImage> images = new List<BatchSupportedImage>();
await foreach (BatchSupportedImage img in batchClient.GetSupportedImagesAsync())
{
    images.Add(img);
}

// Define a delegate specifying properties of the VM image to use.
bool IsUbuntu2404(Azure.Compute.Batch.BatchVmImageReference imageRef) =>
    imageRef.Publisher == "Canonical" &&
    imageRef.Offer == "ubuntu-24_04-lts" &&
    imageRef.Sku.Contains("server");

// Pick the first supported image that matches.
BatchSupportedImage ubuntuImage = null;
foreach (var img in images)
{
    if (IsUbuntu2404(img.ImageReference)) { ubuntuImage = img; break; }
}

// Create the BatchVmConfiguration to use to create the pool.
BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: new BatchImageReference()
    {
        Publisher = ubuntuImage.ImageReference.Publisher,
        Offer = ubuntuImage.ImageReference.Offer,
        Sku = ubuntuImage.ImageReference.Sku,
        Version = ubuntuImage.ImageReference.Version
    },
    nodeAgentSkuId: ubuntuImage.NodeAgentSkuId);

Console.WriteLine("Creating pool [{0}]...", poolId);

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = "Standard_d2s_v3",
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
    },
    UserAccounts =
    {
        new BatchUserAccount("adminUser", "A1bC2d")
        {
            ElevationLevel = BatchUserAccountElevationLevel.Admin,
            LinuxUserConfiguration = new BatchLinuxUserConfiguration()
            {
                Uid = 12345,
                Gid = 98765,
                SshPrivateKey = Guid.NewGuid().ToString()
            }
        },
        new BatchUserAccount("nonAdminUser", "A1bC2d")
        {
            ElevationLevel = BatchUserAccountElevationLevel.NonAdmin,
            LinuxUserConfiguration = new BatchLinuxUserConfiguration()
            {
                Uid = 45678,
                Gid = 98765,
                SshPrivateKey = Guid.NewGuid().ToString()
            }
        },
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, poolId, poolData);

Java-batch példa

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

Kötet Python példa

users = [
    models.UserAccount(
        name='pool-admin',
        password='A1bC2d',
        elevation_level=models.ElevationLevel.ADMIN),
    models.UserAccount(
        name='pool-nonadmin',
        password='A1bC2d',
        elevation_level=models.ElevationLevel.NON_ADMIN),
]
pool = models.BatchPoolCreateOptions(
    id=pool_id,
    user_accounts=users,
    virtual_machine_configuration=models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        node_agent_sku_id=sku_to_use),
    vm_size=vm_size,
    target_dedicated_nodes=vm_count)
batch_client.create_pool(pool=pool)

Feladat futtatása emelt szintű hozzáféréssel rendelkező elnevezett felhasználói fiók alatt

Ha rendszergazdai jogú felhasználóként szeretne futtatni egy feladatot, állítsa be a feladat UserIdentity tulajdonságát egy olyan elnevezett felhasználói fiókra, amely ElevationLevel tulajdonsággal lett létrehozva Admin.

Ez a kódrészlet azt határozza meg, hogy a feladat nevesített felhasználói fiók alatt fusson. Ez a névvel ellátott felhasználói fiók a készlet létrehozásakor lett definiálva a készleten. Ebben az esetben a névvel ellátott felhasználói fiók rendszergazdai engedélyekkel lett létrehozva:

BatchTaskCreateOptions task = new BatchTaskCreateOptions("1", "cmd.exe /c echo 1")
{
    UserIdentity = new UserIdentity() { Username = AdminUserAccountName }
};

A kód frissítése a Batch legújabb ügyfélkódtárára

A Batch szolgáltatás 2017-01-01.4.0-s verziója kompatibilitástörő változást vezetett be, a korábbi verziókban elérhető runElevated tulajdonságot pedig a userIdentity tulajdonságra cserélte. Az alábbi táblázatok egyszerű leképezést biztosítanak, amellyel frissítheti a kódot az ügyfélkódtárak korábbi verzióiból.

Batch .NET

Ha a kód... Frissítse a...-ra.
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 nincs megadva Nincs szükség frissítésre

Batch Java

Ha a kód... Frissítse erre: ...
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 nincs megadva Nincs szükség frissítésre

Batch Python

Ha a kód... Frissítse a...-ra.
run_elevated=True user_identity=userhol
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=userhol
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated nincs megadva Nincs szükség frissítésre

Következő lépések