Pertanyaan Apakah aman untuk mengedit / etc / sudoers dengan modul "lineinfile" Ansible?


Saya ingin mengubah waktu sesi sudo menurut ini menjawab. Saya dapat mengedit file biasa:

lineinfile:
  path: /etc/sudoers
  regexp: ^Defaults  env_reset
  line: Defaults  env_reset,timestamp_timeout=60

Namun di baris pertama saya /etc/sudoers tertulis: # This file MUST be edited with the 'visudo' command as root. Bagaimana mengatasinya?
P.S.
Terlepas dari kenyataan bahwa jawaban singkatnya adalah ya, orang harus membaca Jawaban Konstantin Suvorov tentang cara yang benar untuk melakukannya lineinfile dan sangat menarik jawaban techraf tentang kemungkinan jebakan dengan cara ini


5
2017-10-12 23:34


asal


Jawaban:


Aman jika Anda menguji sintaksnya dengan benar.

Titik mendorong visudo adalah untuk mencegah seseorang mengunci diri mereka sendiri dari mengelola sistem dengan membuat yang tidak valid /etc/sudoers, baik oleh salah ketik atau thinko.

Saat Anda menggunakan Ansible untuk melakukan pengeditan, Anda dapat menguji kode yang melakukan pengeditan itu untuk melakukan hal yang benar dengan file konfigurasi Anda yang sebenarnya, lingkungan, dan versi dari sudo sebelum Anda meluncurkannya. Dengan demikian, kekhawatiran tentang orang-orang membuat kesalahan ketik atau kesalahan sintaks dengan tangan tidak segera relevan.


5
2017-10-13 00:03



Ada opsi safenet untuk kasus seperti ini: validate.

Perintah validasi dijalankan sebelum menyalin ke tempatnya. Jalur ke file untuk memvalidasi dilewatkan melalui '% s' yang harus ada seperti pada contoh di bawah ini. Perintah dilewatkan dengan aman sehingga fitur shell seperti ekspansi dan pipa tidak akan berfungsi.

Jika Anda melihat bagian contoh lineinfile modul, Anda akan melihat apa yang Anda butuhkan:

# Validate the sudoers file before saving
- lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%ADMIN ALL='
    line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
    validate: '/usr/sbin/visudo -cf %s'

9
2017-10-13 06:00



Sementara jawaban ini mendefinisikan hal dengan benar dan yang ini memberikan mitigasi terhadap potensi masalah, mari kita lihat kode Anda.

Anda meminta Ansible untuk (berpotensi) mengganti baris yang ditentukan dengan cara berikut:

regexp: ^Defaults  env_reset

Ini jelas merupakan praktik yang buruk dan jika diulang untuk parameter selain Defaults di sudoers file, kemungkinan akan menyebabkan masalah kritis.


Umumnya Defaults adalah parameter konfigurasi dan env_reset adalah salah satu nilai yang mungkin.

Anda tidak dapat mengasumsikan bahwa file konfigurasi yang sebenarnya akan selalu berisi ^Defaults env_reset tali.

Jika ada nilai yang berbeda ditetapkan, regexp tidak akan cocok dan Anda akhirnya akan menambahkan baris kedua dimulai dengan Defaults.


Jadi cara yang tepat untuk digunakan lineinfile adalah untuk digunakan regexp argumen untuk mencocokkan hanya parameter konfigurasi, bukan nilainya. Dalam kasus Anda:

regexp: ^Defaults
line: Defaults  env_reset,timestamp_timeout

Potensi perangkap lainnya adalah itu sudoers berisi bagian yang harus ditulis dengan urutan yang benar. Jika file yang Anda modifikasi tidak berisi baris yang ditentukan oleh ekspresi reguler, lineinfile akan menambahkan baris baru ke akhir file, di mana itu mungkin diabaikan, atau menghasilkan kesalahan (tetapi yang harus ditemukan oleh validasi), dan kemungkinan besar menyebabkan kebingungan jika manusia melihat file nanti. Jadi mungkin bijaksana untuk menentukan insertafter atau insertbefore.


4
2017-10-13 00:26



Saya pikir apa yang Anda lewatkan adalah untuk mengedit /etc/sudoers Anda perlu akses sudo. Untuk melakukan ini di Ansible, Anda hanya perlu menambahkan bendera menjadi.

name: Change Sudo Timeout
become: yes
lineinfile:
  path: /etc/sudoers
  regexp: ^Defaults  env_reset
  line: Defaults  env_reset,timestamp_timeout=60

1
2017-10-12 23:37



Daripada langsung mengedit /etc/sudoers Anda dapat menempatkan pengaturan yang Anda inginkan ke dalam /etc/sudoers.d direktori seperti ini:

- name: Change sudo session timeout
  lineinfile:
    dest: /etc/sudoers.d/ssh_session_timeout
    line: 'Defaults  env_reset,timestamp_timeout=60K'
    create: yes
    owner: root 
    group: root 
    mode: "0440"
    state: present
    validate: 'visudo -c -f %s'

0
2017-10-13 06:48