Menjalankan tugas di bawah akun pengguna di Batch

Catatan

Akun pengguna yang dibahas dalam artikel ini berbeda dari akun pengguna yang digunakan untuk Protokol Desktop Jauh (RDP) atau Secure Shell (SSH), untuk alasan keamanan.

Untuk menyambungkan ke simpul yang menjalankan konfigurasi komputer virtual Linux melalui SSH, lihat Memasang dan mengonfigurasi xrdp untuk menggunakan Desktop Jauh dengan Ubuntu. Untuk menyambungkan ke simpul yang menjalankan Windows melalui RDP, lihat Cara menyambungkan dan masuk ke komputer virtual Azure yang menjalankan Windows.

Untuk menyambungkan ke simpul yang berjalan melalui RDP, lihat Mengaktifkan Sambungan Desktop Jauh untuk Peran di Azure Cloud Services.

Tugas di Azure Batch selalu berjalan di bawah akun pengguna. Secara default, tugas berjalan di bawah akun pengguna standar, tanpa izin administrator. Untuk skenario tertentu, Anda mungkin ingin mengonfigurasi akun pengguna tempat Anda ingin tugas dijalankan. Artikel ini membahas jenis akun pengguna dan cara mengonfigurasinya untuk skenario Anda.

Jenis akun pengguna

Azure Batch menyediakan dua jenis akun pengguna untuk menjalankan tugas:

  • Akun pengguna otomatis. Akun pengguna otomatis adalah akun pengguna bawaan yang dibuat secara otomatis oleh layanan Batch. Secara default, tugas berjalan di bawah akun pengguna otomatis. Anda dapat mengonfigurasi spesifikasi pengguna otomatis untuk tugas yang menunjukkan di akun pengguna otomatis mana tugas harus dijalankan. Spesifikasi pengguna otomatis memungkinkan Anda menentukan tingkat elevasi dan cakupan akun pengguna otomatis yang akan menjalankan tugas.

  • Akun pengguna bernama. Anda dapat menentukan satu atau beberapa akun pengguna bernama untuk kumpulan saat Anda membuat kumpulan. Setiap akun pengguna dibuat pada setiap simpul dari kumpulan. Selain nama akun, Anda menentukan kata sandi akun pengguna, tingkat elevasi, dan, untuk kumpulan Linux, kunci privat SSH. Saat Anda menambahkan tugas, Anda dapat menentukan akun pengguna bernama tempat tugas tersebut harus dijalankan.

Penting

Layanan Batch versi 2017-01-01.4.0 memperkenalkan perubahan mencolok yang mengharuskan Anda memperbarui kode untuk memanggil versi tersebut atau yang lebih baru. Lihat Memperbarui kode Anda ke pustaka klien Batch terbaru untuk panduan cepat untuk memperbarui kode Batch Anda dari versi yang lebih lama.

Akses akun pengguna ke file dan direktori

Akun pengguna otomatis dan akun pengguna bernama memiliki akses baca/tulis ke direktori kerja tugas, direktori bersama, dan direktori tugas multiinstans. Kedua jenis akun memiliki akses baca ke direktori startup dan persiapan pekerjaan.

Jika tugas berjalan di bawah akun yang sama yang digunakan untuk menjalankan tugas mulai, tugas memiliki akses baca-tulis ke direktori tugas mulai. Demikian pula, jika tugas berjalan di bawah akun yang sama yang digunakan untuk menjalankan tugas persiapan pekerjaan, tugas memiliki akses baca-tulis ke direktori tugas persiapan pekerjaan. Jika tugas berjalan di bawah akun yang berbeda dari tugas mulai atau tugas persiapan pekerjaan, maka tugas hanya memiliki akses baca ke direktori masing-masing.

Untuk informasi selengkapnya tentang mengakses file dan direktori dari tugas, lihat File dan direktori.

Akses yang ditinggikan untuk tugas

Tingkat elevasi akun pengguna menunjukkan apakah tugas berjalan dengan akses yang ditinggikan. Akun pengguna otomatis dan akun pengguna bernama dapat berjalan dengan akses yang ditinggikan. Dua opsi untuk tingkat elevasi adalah:

  • NonAdmin: Tugas berjalan sebagai pengguna standar tanpa akses yang ditinggikan. Tingkat elevasi default untuk akun pengguna Batch selalu NonAdmin.
  • Admin: Tugas berjalan sebagai pengguna dengan akses yang ditinggikan dan beroperasi dengan izin Administrator penuh.

Akun pengguna otomatis

Secara default, tugas berjalan di Batch di bawah akun pengguna otomatis, sebagai pengguna standar tanpa akses yang ditinggikan, dan dengan cakupan kumpulan. Cakupan kumpulan berarti bahwa tugas berjalan di bawah akun pengguna otomatis yang tersedia untuk tugas apa pun di kumpulan. Untuk informasi selengkapnya tentang cakupan kumpulan, lihat Menjalankan tugas sebagai pengguna otomatis dengan cakupan kumpulan.

Alternatif untuk cakupan kumpulan adalah cakupan tugas. Ketika spesifikasi pengguna otomatis dikonfigurasi untuk cakupan tugas, layanan Batch membuat akun pengguna otomatis hanya untuk tugas tersebut.

Ada empat konfigurasi yang mungkin untuk spesifikasi pengguna otomatis, yang masing-masing sesuai dengan akun pengguna otomatis yang unik:

  • Akses non-admin dengan cakupan tugas
  • Akses admin (ditinggikan) dengan cakupan tugas
  • Akses non-admin dengan cakupan kumpulan
  • Akses admin dengan cakupan kumpulan

Penting

Tugas yang berjalan di bawah cakupan tugas tidak memiliki akses de facto ke tugas lain pada simpul. Namun, pengguna berbahaya dengan akses ke akun dapat mengatasi pembatasan ini dengan mengirimkan tugas yang berjalan dengan hak istimewa administrator dan mengakses direktori tugas lainnya. Pengguna berbahaya juga dapat menggunakan RDP atau SSH untuk terhubung ke simpul. Penting untuk melindungi akses ke kunci akun Batch Anda untuk mencegah skenario seperti itu. Jika Anda menduga akun Anda mungkin telah disusupi, pastikan untuk meregenerasi kunci Anda.

Menjalankan tugas sebagai pengguna otomatis dengan akses yang ditinggikan

Anda dapat mengonfigurasi spesifikasi pengguna otomatis untuk hak istimewa administrator saat Anda perlu menjalankan tugas dengan akses yang ditinggikan. Misalnya, tugas mulai mungkin memerlukan akses yang ditinggikan untuk memasang perangkat lunak pada simpul.

Catatan

Gunakan akses yang ditinggikan hanya jika diperlukan. Praktik terbaik merekomendasikan pemberian hak istimewa minimum yang diperlukan untuk mencapai hasil yang diinginkan. Misalnya, jika tugas mulai memasang perangkat lunak untuk pengguna saat ini, alih-alih untuk semua pengguna, Anda mungkin dapat menghindari pemberian akses yang ditinggikan ke tugas. Anda dapat mengonfigurasi spesifikasi pengguna otomatis untuk cakupan kumpulan dan akses non-admin untuk semua tugas yang perlu dijalankan di bawah akun yang sama, termasuk tugas mulai.

Cuplikan kode berikut menunjukkan cara mengonfigurasi spesifikasi pengguna otomatis. Contoh mengatur tingkat elevasi ke Admin dan cakupan ke 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)

Menjalankan tugas sebagai pengguna otomatis dengan cakupan kumpulan

Ketika simpul disediakan, dua akun pengguna otomatis di seluruh kumpulan dibuat di setiap simpul dalam kumpulan, satu dengan akses yang ditinggikan, dan satu tanpa akses yang ditinggikan. Mengatur cakupan pengguna otomatis ke cakupan kumpulan untuk tugas tertentu menjalankan tugas di bawah salah satu dari dua akun pengguna otomatis di seluruh kumpulan ini.

Saat Anda menentukan cakupan kumpulan untuk pengguna otomatis, semua tugas yang berjalan dengan akses administrator berjalan di bawah akun pengguna otomatis di seluruh kumpulan yang sama. Demikian pula, tugas yang berjalan tanpa izin administrator juga berjalan di bawah satu akun pengguna otomatis seluruh kumpulan.

Catatan

Dua akun pengguna otomatis di seluruh kumpulan adalah akun terpisah. Tugas yang berjalan di bawah akun administratif di seluruh kumpulan tidak bisa berbagi data dengan tugas yang berjalan di bawah akun standar, dan sebaliknya.

Keuntungan untuk berjalan di bawah akun pengguna otomatis yang sama adalah bahwa tugas dapat berbagi data dengan tugas lain yang berjalan di simpul yang sama.

Berbagi rahasia di antara tugas adalah satu skenario ketika menjalankan tugas di bawah salah satu dari dua akun pengguna otomatis di seluruh kumpulan berguna. Misalnya, tugas mulai perlu memprovisikan rahasia ke simpul yang dapat digunakan tugas lain. Anda bisa menggunakan Windows Data Perlindungan API (DPAPI), tetapi memerlukan hak istimewa administrator. Sebagai gantinya, Anda dapat melindungi rahasia di tingkat pengguna. Tugas yang berjalan di bawah akun pengguna yang sama dapat mengakses rahasia tanpa akses yang ditinggikan.

Skenario lain tempat Anda mungkin ingin menjalankan tugas di bawah akun pengguna otomatis dengan cakupan kumpulan adalah berbagi file Message Passing Interface (MPI). Berbagi file MPI berguna ketika simpul dalam tugas MPI perlu mengerjakan data file yang sama. Simpul kepala membuat berbagi file yang dapat diakses oleh node anak jika dijalankan di bawah akun pengguna otomatis yang sama.

Cuplikan kode berikut mengatur cakupan pengguna otomatis ke cakupan kumpulan untuk tugas di Batch .NET. Tingkat elevasi dihilangkan, sehingga tugas berjalan di bawah akun pengguna otomatis di seluruh kumpulan standar.

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

Akun pengguna bernama

Anda dapat menentukan akun pengguna bernama saat Anda membuat kumpulan. Akun pengguna bernama memiliki nama dan kata sandi yang Anda sediakan. Anda dapat menentukan tingkat elevasi untuk akun pengguna bernama. Untuk simpul Linux, Anda juga dapat menyediakan kunci privat SSH.

Akun pengguna bernama ada di semua simpul di kumpulan dan tersedia untuk semua tugas yang berjalan pada simpul tersebut. Anda dapat menentukan jumlah pengguna bernama untuk sebuah kumpulan. Saat Anda menambahkan tugas atau koleksi tugas, Anda bisa menentukan bahwa tugas berjalan di bawah salah satu akun pengguna bernama yang ditentukan pada kumpulan.

Akun pengguna bernama berguna saat Anda ingin menjalankan semua tugas dalam pekerjaan di bawah akun pengguna yang sama, tetapi mengisolasinya dari tugas yang berjalan di pekerjaan lain secara bersamaan. Misalnya, Anda dapat membuat pengguna bernama untuk setiap pekerjaan, dan menjalankan setiap tugas pekerjaan di bawah akun pengguna bernama tersebut. Setiap pekerjaan kemudian dapat berbagi rahasia dengan tugasnya sendiri, tetapi tidak dengan tugas yang berjalan di pekerjaan lain.

Anda juga bisa menggunakan akun pengguna bernama untuk menjalankan tugas yang menetapkan izin pada sumber daya eksternal seperti berbagi file. Dengan akun pengguna bernama, Anda mengontrol identitas pengguna dan bisa menggunakan identitas pengguna tersebut untuk mengatur izin.

Akun pengguna bernama mengaktifkan SSH tanpa kata sandi antara simpul Linux. Anda dapat menggunakan akun pengguna bernama dengan simpul Linux yang perlu menjalankan tugas multiinstans. Setiap simpul dalam kumpulan dapat menjalankan tugas di bawah akun pengguna yang ditentukan di seluruh kumpulan. Untuk informasi lebih lanjut mengenai tugas multi instans, lihat Menggunakan tugas multi instans untuk menjalankan aplikasi MPI.

Membuat akun pengguna bernama

Untuk membuat akun pengguna bernama di Batch, tambahkan koleksi akun pengguna ke kumpulan. Cuplikan kode berikut menunjukkan cara membuat akun pengguna bernama di .NET, Java, dan Python. Cuplikan kode ini menunjukkan cara membuat akun bernama admin dan non-admin di kumpulan.

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

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

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

Contoh Batch Python

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)

Menjalankan tugas di bawah akun pengguna bernama dengan akses yang ditinggikan

Untuk menjalankan tugas sebagai pengguna yang ditinggikan, atur properti UserIdentity tugas ke akun pengguna bernama yang dibuat dengan properti ElevationLevel-nya yang diatur ke Admin.

Cuplikan kode ini menentukan bahwa tugas harus dijalankan di bawah akun pengguna bernama. Akun pengguna bernama ini ditentukan di kumpulan saat kumpulan dibuat. Dalam hal ini, akun pengguna bernama dibuat dengan izin admin:

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

Memperbarui kode Anda ke pustaka klien Batch terbaru

Layanan Batch versi 2017-01-01.4.0 memperkenalkan perubahan mencolok, menggantikan properti runElevated yang tersedia di versi sebelumnya dengan properti userIdentity. Tabel berikut ini menyediakan pemetaan sederhana yang bisa Anda gunakan untuk memperbarui kode dari versi pustaka klien yang lebih lama.

Batch .NET

Jika kode Anda menggunakan... Perbarui ke....
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 tidak ditentukan Tidak perlu pembaruan

Batch Java

Jika kode Anda menggunakan... Perbarui ke....
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 tidak ditentukan Tidak perlu pembaruan

Batch Python

Jika kode Anda menggunakan... Perbarui ke....
run_elevated=True user_identity=user, di mana
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False user_identity=user, di mana
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated tidak ditentukan Tidak perlu pembaruan

Langkah berikutnya