User & Permission

User & Permission #

Setiap server produksi membutuhkan konfigurasi user yang konsisten — siapa yang boleh login, dengan metode apa, dan apa yang boleh mereka lakukan setelah login. Mengelola ini secara manual di banyak server adalah resep untuk konfigurasi yang tidak konsisten dan celah keamanan yang tidak disadari. Ansible menyediakan module yang idempoten untuk semua aspek manajemen user — dari pembuatan akun hingga distribusi SSH key dan konfigurasi sudoers.

Membuat dan Mengelola User #

Module user menangani siklus hidup lengkap user sistem:

- name: Buat user untuk deployment
  user:
    name: deployer
    comment: "Deployment automation user"
    shell: /bin/bash
    groups:
      - sudo
      - docker
    append: true          # Tambahkan ke grup tanpa menghapus keanggotaan grup lain
    state: present
    create_home: true

- name: Buat user tanpa akses shell (service account)
  user:
    name: prometheus
    comment: "Prometheus monitoring service"
    shell: /usr/sbin/nologin    # Tidak bisa login interaktif
    system: true                # User sistem (UID < 1000)
    create_home: false
    state: present

- name: Hapus user yang tidak diperlukan lagi
  user:
    name: olduser
    state: absent
    remove: true          # Hapus home directory juga

Mendistribusikan SSH Key #

Setelah user dibuat, distribusikan SSH public key agar bisa login tanpa password:

- name: Tambahkan SSH key untuk user deployer
  authorized_key:
    user: deployer
    key: "{{ lookup('file', 'files/ssh_keys/deployer.pub') }}"
    state: present
    exclusive: false      # Jangan hapus key lain yang sudah ada

- name: Distribusikan SSH key tim dari daftar
  authorized_key:
    user: "{{ item.username }}"
    key: "{{ item.ssh_key }}"
    state: present
  loop: "{{ team_members }}"
  loop_control:
    label: "{{ item.username }}"
# group_vars/all.yml — daftar tim yang bisa akses semua server
team_members:
  - username: alice
    ssh_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... alice@laptop"
  - username: bob
    ssh_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... bob@workstation"

Pola ini sangat berguna saat onboarding anggota tim baru — cukup tambahkan entry ke team_members dan jalankan playbook ke semua server.


Konfigurasi sudoers #

Module community.general.sudoers atau lineinfile bisa digunakan untuk mengatur akses sudo:

# Cara 1: menggunakan template untuk file sudoers terpisah
- name: Deploy konfigurasi sudoers untuk deployer
  template:
    src: deployer-sudoers.j2
    dest: /etc/sudoers.d/deployer
    owner: root
    group: root
    mode: '0440'           # Mode 440 wajib untuk file sudoers
    validate: 'visudo -cf %s'   # Validasi syntax sebelum disimpan
{# templates/deployer-sudoers.j2 #}
# Deployer user — akses terbatas untuk deployment
deployer ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp
deployer ALL=(ALL) NOPASSWD: /bin/systemctl start myapp
deployer ALL=(ALL) NOPASSWD: /bin/systemctl stop myapp
deployer ALL=(ALL) NOPASSWD: /usr/bin/rsync
Selalu gunakan parameter validate: 'visudo -cf %s' saat mendeploy file sudoers. Konfigurasi sudoers yang syntax-nya salah bisa membuat semua user kehilangan akses sudo — termasuk kamu sendiri.

Mengelola Grup #

- name: Pastikan grup yang diperlukan ada
  group:
    name: "{{ item }}"
    state: present
  loop:
    - docker
    - monitoring
    - backup

- name: Buat grup dengan GID tertentu (untuk konsistensi antar server)
  group:
    name: appgroup
    gid: 5000
    state: present

Pola: Setup User Deployment Lengkap #

Menggabungkan semua di atas menjadi satu task list yang lengkap:

# roles/common/tasks/deploy-user.yml
---
- name: Buat grup deployment
  group:
    name: deployers
    state: present

- name: Buat user deployment
  user:
    name: "{{ deploy_user }}"
    groups:
      - deployers
      - docker
    append: true
    shell: /bin/bash
    state: present

- name: Buat direktori .ssh
  file:
    path: "/home/{{ deploy_user }}/.ssh"
    state: directory
    owner: "{{ deploy_user }}"
    group: "{{ deploy_user }}"
    mode: '0700'

- name: Deploy SSH authorized keys
  authorized_key:
    user: "{{ deploy_user }}"
    key: "{{ item }}"
    state: present
  loop: "{{ deploy_user_ssh_keys }}"

- name: Konfigurasi sudoers untuk deployment
  template:
    src: deploy-sudoers.j2
    dest: "/etc/sudoers.d/{{ deploy_user }}"
    mode: '0440'
    validate: 'visudo -cf %s'

Ringkasan #

  • Module user untuk membuat, memodifikasi, dan menghapus user sistem — gunakan shell: /usr/sbin/nologin untuk service account yang tidak perlu login interaktif.
  • Module authorized_key untuk mendistribusikan SSH key — gunakan exclusive: false untuk menghindari penghapusan key yang sudah ada.
  • Kelola SSH key tim sebagai list of dictionaries di group_vars/all.yml — onboarding anggota baru cukup tambahkan entry.
  • Selalu gunakan validate: 'visudo -cf %s' saat mendeploy file sudoers — satu kesalahan syntax bisa mengunci akses sudo.
  • Simpan konfigurasi sudoers di /etc/sudoers.d/ sebagai file terpisah — lebih aman dan mudah di-manage daripada mengedit /etc/sudoers langsung.
  • Gunakan parameter append: true di module user saat menambahkan user ke grup — tanpa ini, Ansible akan menghapus user dari semua grup yang tidak disebutkan.

← Sebelumnya: Versioning   Berikutnya: Package →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact