Bagaimana saya bisa berhenti menulis kata sandi ke file log?

22

Saya sedang menyiapkan server MySQL dan ingin dapat mengatur mysql-rootkata sandi selama instalasi.

Dengan bantuan internet saya datang dengan solusi ini:

- name: Set MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
  apt: pkg=mysql-server state=latest

mysql_root_pwdadalah variabel yang dimuat dari Ansible Vault. Ini berjalan dengan baik, tetapi sekarang di server ada banyak baris di log:

Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None

Bagaimana saya bisa menghentikan Ansible dari menulis kata sandi teks yang jelas ke file log?

klausa
sumber

Jawaban:

28

Untuk mencegah tugas dengan informasi rahasia tidak dicatat, dalam syslog atau lainnya, setel no_log: true pada tugas:

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true

Menjalankan tugas masih akan dicatat, tetapi dengan sedikit detail. Juga, modul yang digunakan harus mendukung no_log, jadi uji modul khusus.

Lihat FAQ yang Mungkin untuk rincian lebih lanjut. Itu dapat diterapkan ke seluruh buku pedoman, namun hasilnya menjadi sedikit buruk dengan "disensor!" pesan.

Bill Carlson
sumber
2
Di antara hal-hal lain itulah yang dikatakan jawaban ini serverfault.com/a/682823/9517
user9517 mendukung GoFundMonica
9

Perilaku yang diamati tampaknya menjadi bug dalam modul debconf. Saya mengajukan laporan bug .

Pengguna bcoca di github menunjukkan bahwa seseorang dapat menggunakan no_log: truearahan dalam tugas, yang mengatur kata sandi, untuk mencegah pencatatan. Ini adalah solusi, yang berfungsi untuk saya sampai bug diperbaiki.

klausa
sumber
Saya mendapatkan kesalahan ketika saya menggunakan arahan itu .. Tahu apa yang saya lakukan salah? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh
2
Ternyata saya punya versi lama yang memungkinkan! Untuk memperbaiki (di ubuntu): sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh
Masalah yang sama untuk saya, tetapi saya tidak bisa membuat n_log: benar berfungsi seperti yang diharapkan. Versi Ansible saya adalah 1.7.2. Apa milik anda ?
jmcollin92
@ jmcollin92 Saat ini saya menggunakan 2.1. Ada panduan di sini tentang cara menginstal versi terbaru dari sumber. Saya menggunakannya karena masih mungkin matang.
klausa
2

Saya menyelesaikannya dengan memutakhirkan versi Ansible ke 1.6.1

sudo pip install ansible==1.6.1
0x3bfc
sumber
2

Sesuai dokumen Ansible :

log_path

Jika ada dan dikonfigurasikan ansible.cfg, Ansible akan mencatat informasi tentang eksekusi di lokasi yang ditentukan. Pastikan pengguna yang menjalankan Ansible memiliki izin pada logfile:

log_path=/var/log/ansible.log 

Perilaku ini tidak aktif secara default. Perhatikan bahwa anonim akan, tanpa pengaturan ini, merekam argumen modul yang dipanggil ke syslog dari mesin yang dikelola. Argumen kata sandi dikecualikan.

Kedengarannya seperti pengaturan log_pathpada node kontrol Anda akan menghasilkan tidak memiliki log pada node tujuan.

Droopy4096
sumber
Sebenarnya saya memiliki ansible.cfg di dir lokal saya, tempat saya memanggil ansible, mengatur log_path. Log lokal dibuat baik-baik saja dan diperbarui setelah menjalankan baru (penebangan bekerja). Ini tidak (meskipun dokumen yang Anda tunjukkan menjanjikannya) mencegah host jarak jauh untuk login. Juga pernyataan "Argumen kata sandi dikecualikan" tampaknya tidak 100% benar? Apakah ini bug (atau bahkan dua)?
klausa
2
@claus "argumen kata sandi yang diekskusi" hanya berlaku untuk modul di mana argumen kata sandi eksplisit. Tidak ada cara bagi yang memungkinkan untuk mengetahui argumen mana yang akan menjadi kata sandi dan mana yang tidak dengan perintah umum seperti debconf, shell, raw, dll.
Droopy4096
Silakan gulir ke kanan di buku pedoman awal saya. Dikatakan vtype='password'. Itu harus cukup eksplisit IMHO? Saya berasumsi bahwa pesan log juga dibuat oleh modul debconf.
klausa
Ini salah. Dokumentasi harus lebih akurat mengatakan "Perhatikan bahwa anonim akan, terlepas dari pengaturan ini , merekam argumen modul yang dipanggil ke syslog mesin yang dikelola."
augurar
2

Ada cara yang lebih baik daripada hanya no_log: Benar

- name: write in string variables login and password
  set_fact:
    temp_user: "{{ USER_VAR }}"
    temp_pass: "{{ PASSWORD_VAR }}"


- name: Your operation with password in output
  shell: '/opt/hello.sh'
  ignore_errors: True
  no_log: True
  register: myregister

- debug:
    msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stderr != ""

- debug:
    msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stdout != ""

- fail:
    msg: "error shell /opt/hello.sh"
  when: myregister.stderr != ""

Seperti yang Anda lihat, Anda perlu menambahkan:

ignore_errors: true
no_log: true

Dan kemudian buat output dari hasil perintah dengan regex_replace, di mana:

USER_VAR - variabel masuk

PASSWORD_VAR - variabel kata sandi

Dengan pendekatan ini, Anda tidak hanya akan menyembunyikan kata sandi dan login, tetapi juga mendapatkan output dari operasi Anda

TheDESTROS
sumber
1

Ini merupakan tambahan untuk jawaban TheDESTROS dari utas ini:

  1. tulis templat, yang membungkus perintah dengan rahasia:

wrapper-script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. Aktifkan skrip pembungkus dan hapus sekaligus:
- name: create template
  template:
    src: wrapper-script.sh.j2
    dest: /tmp/wrapper-script.sh
    mode: 0700
  no_log: True
- name: invoke command with secret and remove it
  shell: /tmp/wrapper-script.sh; rm -f /tmp/wrapper-script.sh

Anda memerlukan sedikit kode lebih sedikit dan dapat tetap menjalankan perintah di log Anda. Hanya ada satu peringatan, jika rahasia ada di perintah stdout. Jika Anda ingin menghindari templat eksternal, copymodul dengan parameter contentmungkin membantu menulis skrip pembungkus kecil dengan cepat.

Christian Kaiser
sumber
1

The no_log: truependekatan adalah untuk digunakan sebagai lalu-resor jika upaya lain gagal karena akan membuat pelaksanaan tugas benar-benar buram dan Anda akan memiliki petunjuk ketika gagal.

Praktik keamanan merekomendasikan pemberian kredensial dari stdin atau ketika tidak memungkinkan menggunakan file kredensial (atau bahkan yang dapat dieksekusi).

Berikut adalah contoh tentang cara melakukan login podman yang aman dengan menghindari memaparkan kata sandi:

- name: secured login
  become: true
  command: >
    podman login --username={{ user }} --password-stdin ...
  args:
    stdin: "{{ secret }}"
  register: result

Dengan ini, rahasianya tidak akan diekspos, resulttetapi Anda masih dapat melihat output dari perintah.

Sebagian besar alat yang membutuhkan login memang menerapkan salah satu pendekatan yang lebih aman yang disebutkan. Menggunakan kredensial pada kode CLI seperti memiliki 123456kata sandi bank Anda.

Sorin
sumber