Ansible'ın şifreleri günlük dosyalarına yazmasını nasıl durdurabilirim?


22

Bir MySQL sunucusu kuruyorum ve Ansible'ın mysql-rootkurulum sırasında şifreyi ayarlamasını istiyorum .

İnternetin yardımıyla bu çözümü buldum:

- 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_pwdAnsible Vault'dan yüklenen bir değişkendir. Bu iyi çalışıyor, ancak şimdi sunucuda günlüğünde birçok satır var:

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

Ansible'ın günlük dosyalarına açık metin şifreleri yazmasını nasıl durdurabilirim?

Yanıtlar:


28

Gizli bilgileri içeren bir görevin günlüğe kaydedilmesini önlemek için, syslog veya başka bir klasörde no_log: true olarak ayarlayın:

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

Görevin yürütülmesi hala günlüğe kaydedilecek, ancak çok az ayrıntı olacak. Ayrıca, kullanılan modül no_log'u desteklemelidir, bu yüzden özel modülleri test edin.

Daha fazla bilgi için Ansible SSS bölümüne bakınız. Tüm oyun kitabına uygulanabilir, ancak çıktı "sansürlü!" mesajlar.


2
Bu cevabın söylediği diğer şeylerin yanı sıra serverfault.com/a/682823/9517
user9517, 25:16

9

Gözlenen davranış, debconf modülünde bir hata gibi görünüyor. Hata bildirimi yaptım .

Github'daki kullanıcı bcoca, no_log: trueyönetmeliği, günlüğe kaydetmeyi önlemek için şifreleri belirleyen görevlerde kullanabileceğini belirtti . Bu, bir hata giderilinceye kadar benim için çalışan bir geçici çözümdür.


Bu yönergeyi kullanırken hata alıyorum .. Yanlış yaptığım bir fikrin var mı? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh

2
Anlaşılan eski bir versiyonum oldu! (Ubuntu) düzeltmek için: sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh

Benim için de aynı sorun ancak n_log yapamıyorum: beklendiği gibi çalışmak doğru. Ansible sürümüm 1.7.2. Seninki nedir ?
jmcollin92

@ jmcollin92 Şu anda 2.1 kullanıyorum. En son sürümün kaynaktan nasıl yükleneceği hakkında bir rehber var . Bunu sorumlu biri olarak hala olgunlaşırken kullanıyorum.
claus

2

Ansible sürümünü 1.6.1'e yükselterek çözdüm

sudo pip install ansible==1.6.1

2

Gereğince yanıtlayıcı 'docs :

log_path

Varsa ve konfigüre edilmişse ansible.cfg, Ansible belirlenmiş konumdaki işlemler hakkında bilgi kaydeder. Ansible'ı çalıştıran kullanıcının, günlük dosyasına izin verdiğinden emin olun:

log_path=/var/log/ansible.log 

Bu davranış varsayılan olarak açık değildir. Ansible'ın bu ayar olmadan yönetilen makinelerin sistem günlüğüne çağrılan modül argümanlarını kaydedeceğini unutmayın. Şifre argümanları hariçtir.

log_pathKontrol düğümünüzde ayar yapmak gibi sesler hedef düğümlerde kayıt olmamasıyla sonuçlanacaktır .


Aslında yerel direktörümde bir ansible.cfg var, burada anser çağırırım, log_path. Yerel kütük, yeni bir işlemden sonra tamam ve güncel olarak oluşturulur (logging çalışır). Bu, (belirttiğiniz doktora söz vermesine rağmen) uzaktaki sunucunun oturum açmasını engellemez. Ayrıca "Parola argümanları hariç tutuldu" ifadesi% 100 doğru değil gibi görünüyor? Bu bir hata mı (hatta iki tane)?
claus

2
"parola bağımsız değişkenleri dışlanmış" ifadesi yalnızca parola bağımsız değişkeninin açık olduğu modüller için geçerlidir. Hangi argümanın parola olacağını ve hangilerinin debconf, shell, raw, vb. Gibi genel komutlarla kullanmayacağını bilmenin bir yolu yoktur
Droopy4096

Lütfen ilk oyun kitabımda sağa kaydırın. Diyor vtype='password'. Bu yeterince açık olmalı IMHO? Günlük iletisinin debconf modülü tarafından da oluşturulduğunu varsayıyorum.
claus

Bu yanlış. Belgeler daha doğru bir şekilde " Bu ayardan bağımsız olarak, yönetilen makinelerin sistem günlüğüne çağrılan modül argümanlarını kaydedeceğini unutmayın."
Ağustos

2

Sadece no_log'dan daha iyi bir yol var: Doğru

- 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 != ""

Gördüğünüz gibi eklemeniz gerekir:

ignore_errors: true
no_log: true

Sonra komut sonucunun çıktısını regex_replace ile yapın, burada:

USER_VAR - giriş değişkeni

PASSWORD_VAR - şifre değişkeni

Bu yaklaşımla, sadece şifreleri ve girişleri gizlemeyecek, aynı zamanda işleminizin çıktısını alacaksınız.


1

Bu, TheDESTROS'un bu konuya verdiği cevaba bir katkıdır:

  1. komutu bir sır ile tamamlayan bir şablon yazın:

sarıcı-script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. Sarmalayıcı komut dosyasını çağırın ve bir kerede kaldırın:
- 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

Biraz daha az koda ihtiyacınız var ve günlüklerinizdeki komutları öğrenebilirsiniz. Komut stdout'ta bir sır varsa, sadece bir mağara vardır. Harici şablondan kaçınmak istiyorsanız copy, parametreli modül contentanında küçük bir sarmalayıcı komut dosyası yazmaya yardımcı olabilir.


1

Bu no_log: trueyaklaşım, diğer girişimler başarısız olursa son çare olarak kullanılacaktır çünkü görev yürütmeyi tamamen opak hale getirecek ve başarısız olduğunda hiçbir ipucunuz olmayacak.

Güvenlik uygulamaları, kimlik bilgilerinin stdin'den veya kimlik bilgisi dosyalarını (hatta yürütülebilir dosyaları) kullanarak mümkün olmadığında verilmesini önerir.

Parolayı ifşa etmekten kaçınarak güvenli bir podman girişi yapmanın bir örneği:

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

Bununla, sır açığa çıkmayacak, resultama yine de komutun çıktısını görebileceksiniz.

Giriş yapılması gereken araçların çoğu, belirtilen daha güvenli yaklaşımlardan birini uygular. CLI'de kimlik bilgilerini kodda kullanmak 123456, banka şifrenizdeki gibidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.