Ubah file sudoers dengan templat playbook yang dimungkinkan

8

Saya mencoba membuat file sudoers dengan template yang memungkinkan. File sudoers akan terlihat seperti di bawah ini:

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Apa yang saya kelola sejauh ini adalah di bawah ini:

Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Templatnya terlihat seperti di bawah ini:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}

vars

commands:
  - ls
  - less
  - du

Sejauh yang saya tahu, modul template yang tersedia tidak memiliki apa pun yang akan menjalankan perintah di server jauh dan mencetak hasilnya jika tidak saya berpikir untuk mengubah file template agar terlihat seperti di bawah ini:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}    
{% endfor %}

dan hasilnya akan seperti yang saya inginkan.

Apakah ada metode lain yang dapat membuatnya sederhana?

BTW saya sudah memeriksa posting ini

Err0rr
sumber
Saya hanya akan menempatkan path lengkap dari perintah di vars Anda
jdog
Untuk modifikasi pada sistem saya lebih suka menyertakan skrip dalam bash agar berjalan lebih baik.
Tuhan

Jawaban:

5

TL; DR: CIUMAN. Jangan gunakan lebih sedikit.

Orang sering membuat kesalahan dengan memungkinkan dengan mencoba membuat hal-hal variabel yang tidak perlu. Kecuali ada beberapa tempat di mana Anda menentukan daftar perintah yang dapat diakses oleh dukungan, sangat masuk akal jika Anda memasukkannya ke dalam file pembuatan templat:

templates / etc / sudoers.d / support1

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /bin/cat
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

atau bahkan secara eksplisit karena Anda tidak menggunakan kembali Cmnd_Alias ​​di mana pun

%support1 ALL=(ALL) NOPASSWD: /bin/ls
%support1 ALL=(ALL) NOPASSWD: /bin/cat
%support1 ALL=(ALL) NOPASSWD: /usr/bin/du

Dan tambahkan beberapa tugas seperti:

- name: add templates
  template:
    src: {{ item }}
    dest: /{{ item }}
    owner: root
    group: root
    mode: 0640
  with_items:
    - etc/sudoers.d/support1

Anda hanya akan menggunakan templat alih-alih file karena nanti mungkin ada beberapa variabel untuk ditambahkan ke semua itu atau nama grup mungkin berasal dari variabel jika Anda mendapatkan peran lain yang membuat grup.

Jika Anda perlu menggunakan variabel, hal yang dapat Anda lakukan adalah menggunakan daftar hash seperti ini:

sudoers.support1.commands:
- { alias: "LS", path: "/bin/ls" }
- { alias: "DU", path: "/usr/bin/du" }

Kemudian di templat:

{% for item in sudoers.{{ group }}.commands %}
Cmnd_Alias {{ item.alias }} = {{ item.path }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {{ sudoers.{{ group }}.commands | map(attribute='alias') | join(', ') }}

Tidak aman menggunakan / usr / bin / less

Dalam semua ini Anda tidak melihat banyak hal penting dan itu adalah penggunaan yang kurang sebagai pemirsa. Sayangnya itu adalah lubang keamanan. Anda dapat mengetikkan '! Bash' untuk menjalankan bash. Dan dengan menekan 'v' Anda masuk ke editor berdasarkan variabel VISUAL, EDITOR atau LESSEDIT. Jadi Anda bisa memberi mereka '/ bin / cat' dan mereka selalu bisa menyalurkan kontennya menjadi lebih sedikit. Catatan ini masih lubang keamanan karena beberapa file di unix sangat sengaja dibatasi misalnya:

/etc/shadow
/etc/sudoers
/etc/ssh/ssh_host_rsa_key
$HOME/.ssh/id_rsa
Jiri Klouda
sumber
1
Saya suka bagian kedua. Kita harus menahan diri untuk tidak menggunakan perintah sudo.
Err0rr
1
Tidak ada perbedaan antara mengubah variabel dan mengubah template jika perubahannya dilakukan di satu tempat. Menggunakan variabel membuatnya kurang mudah dibaca. Jika Anda benar-benar perlu menggunakan variabel,
beri
1

pertama

Anda harus merujuk ke Jinja yang menangani spasi / baris baru. template Anda saat ini akan membuat baris baru, Dan saya pikir ini akan membingungkan sudodan gagal validasi sintaksis (IIRC, sintaks yang tepat adalah menambahkan -seperti: -%}pada for loop, tetapi Anda harus "bermain" dan melihat apa yang terjadi). Untuk membuat template Anda bisa melakukannya di workstation Anda, tanpa menjalankannya di mesin target yang sebenarnya.

Juga, saya pikir membuat template dengan 1 perintah di baris instruksi lebih mudah dibaca:

{% for command in commands %}
%{{group}} ALL=(ALL) NOPASSWD: {{command}}
{% endfor %}

Kedua

Saya tidak merekomendasikan untuk mengedit file global yang ada dengan memungkinkan. Alih-alih buat template khusus Anda di bawah /etc/sudoers.d/(seperti yang Anda sebutkan tadi Anda lihat)

Ini adalah cara yang tepat untuk melakukannya, karena:

  • sistem akan memiliki semua default apa adanya.
  • templat Anda akan jauh lebih pendek.
  • jika Anda melakukan kesalahan, Anda akan yakin ke mana harus mencari - di template Anda.

Ketiga

Saya pikir mengeksekusi whichdi dalam sudoersadalah ide orisinal, tetapi seharusnya tidak berhasil.

mvk_il
sumber
1
memang saya mendapat pesan kesalahan sintaksis. Saya akan melihat sintaksnya. Dan tentu saja saya telah membuat file terpisah untuk ini.
Err0rr