GNU/Linux >> Znalost Linux >  >> Linux

Zacházení s tajemstvími ve vašich knihách Ansible

Konečně se to stalo. S Ansible jste šli all-in. Přečetli jste všechny skvělé články, viděli případy použití a těšíte se, že můžete začít budovat opakovatelnou infrastrukturu a spravovat svou konfiguraci jako kód. Je tu jen jeden problém:Máte konfigurační soubor nebo úkol, který vyžaduje heslo nebo jinou kritickou informaci. Víte, že byste heslo neměli ukládat do souborů ve formátu prostého textu, takže si nejste úplně jisti, kam by mělo jít.

Nebojte se, tento článek vás provede různými možnostmi zpracování citlivých informací ve vašich příručkách. Ať už hledáte jednoduchá řešení, jako je výzva k zadání hesla administrátora, nebo složitější možnosti, jako je integrace se stávajícím prostředím pro správu tajemství, Ansible vám pomůže.

[ Také by se vám mohlo líbit: Demystifikace Ansible pro správce systému Linux ]

Výzvy

Pokud právě začínáte svou cestu Ansible a spouštíte všechny své příručky ručně, pak je použití interaktivní výzvy přímo v příručce snadným řešením. Výzva způsobí, že Ansible požádá uživatele o požadované proměnné a uloží je při každém spuštění playbooku. Zvažte následující příručku, která zajišťuje existenci klíče API v konfiguračním souboru:

---

- hosts: all
  gather_facts: false
  vars_prompt:
    - name: api_key
      prompt: Enter the API key
  tasks:
    - name: Ensure API key is present in config file
      ansible.builtin.lineinfile:
        path: /etc/app/configuration.ini
        line: "API_KEY={{ api_key }}"

Když spustím tuto příručku, Ansible mě vyzve na příkazovém řádku pomocí zprávy v parametru prompt:

# ansible-playbook -i inventory.ini main.yml
Enter the API key:

Vstup poskytnutý na příkazovém řádku bude uložen v api_key proměnnou, kterou pak lze ve hře použít jako jakoukoli běžnou proměnnou.

Zatímco proměnné výzvy lze snadno implementovat, přerostete je, pokud investujete do používání Ansible pro úplnou správu konfigurace. Jak vaše správa konfigurace dospěje, začnete spouštět playbooky neinteraktivně a před terminálem nebude nikdo, kdo by zadával hesla. To je místo, kde přichází Ansible Vault.

Ansible Vault

Jednou z mých osobních oblíbených funkcí Ansible je Ansible Vault, který poskytuje možnosti nativního šifrování obsahu. Ansible Vault dokáže šifrovat a dešifrovat libovolné proměnné a soubory, což znamená, že jej můžete použít k ochraně souborů proměnných, které obsahují tajemství, nebo dokonce k šifrování celých citlivých konfiguračních souborů. Ansible Vaults má mnoho pokročilých funkcí, ale tento článek se zaměří na základy.

Standardní soubory YAML obsahující tajemství ve formátu prostého textu lze snadno zašifrovat pomocí ansible-vault encrypt příkaz:

# Plaintext YAML file
$ cat secrets_file.enc
api_key: SuperSecretPassword

# Encrypt the file with ansible-vault
$ ansible-vault encrypt secrets_file.enc
New Vault password:
Confirm New Vault password:
Encryption successful

# Confirm that the file now contains encrypted content
$ cat secrets_file.enc
$ANSIBLE_VAULT;1.1;AES256
38396162626134393935663839666463306231653861336630613938303662633538633836656465
3637353766613339663032363538626430316135623665340a653961303730353962386134393162
62343936366265353935346336643865643833353737613962643539373230616239346133653464
6435353361373263640a376632613336366430663761363339333737386637383961363833303830
34336535623736313031313162353831666139343662653665366134633832646661

Když spustím svůj playbook, mohu předat soubor zašifrovaných proměnných a říct Ansible, aby mě požádal o heslo. Ansible dešifruje soubor a použije proměnné, které jsem definoval, stejně jako bych předal soubor s běžnými proměnnými:

$ cat main.yml
---

- hosts: all
  gather_facts: false
  tasks:
    - name: Ensure API key is present in config file
      ansible.builtin.lineinfile:
        path: /etc/app/configuration.ini
        line: "API_KEY={{ api_key }}"


$ ansible-playbook -i inventory.ini -e @secrets_file.enc --ask-vault-pass main.yml
Vault password:

PLAY [all] ***********************************************************************************

TASK [Ensure API key is present in config file] **********************************************
changed: [localhost]

PLAY RECAP ***********************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

$ cat /etc/app/configuration.ini
API_KEY=SuperSecretPassword

Dříve jsem popsal, proč používat vars_prompt není ideální v automatizovaném prostředí, protože vyžaduje manuální zásah uživatele. V čem je tedy Ansible Vault jiný? Ansible Vault vám umožňuje zadat soubor hesel, který obsahuje dešifrovací heslo pro Vault:

$ cat password_file 
password

$ ansible-playbook -i inventory.ini -e @secrets_file.enc --vault-password-file password_file main.yml

PLAY [all] ***********************************************************************************

TASK [Ensure API key is present in config file] **********************************************
changed: [localhost]

PLAY RECAP ***********************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

Ujistěte se, že jste nastavili příslušná oprávnění pro soubor s dešifrovacími hesly, aby k němu měl přístup pouze uživatel spouštějící playbook. Případně zvažte použití skriptu pro přístup k heslu za běhu z externího systému pro ukládání hesel.

Nyní, když je můj variabilní soubor zašifrován, potřebuji způsob, jak jej upravit. Existují dva způsoby, jak upravit šifrovaný Ansible Vault. Soubor můžete buď upravit na místě, nebo jej můžete plně dešifrovat, upravit a poté znovu zašifrovat. Oba způsoby jsou uvedeny níže.

# The edit command will launch a text editor, such as vim
$ ansible-vault edit secrets_file.enc 
Vault password: 

# The decrypt command will fully decrypt the file, allowing you to manipulate it how you see fit.
$ ansible-vault decrypt secrets_file.enc 
Vault password: 
Decryption successful

# Notice that the file has been decrypted
$ cat secrets_file.enc 
api_key: SuperSecretPassword

# Don't forget to re-encrypt the file when you're done!
$ ansible-vault encrypt secrets_file.enc 
New Vault password: 
Confirm New Vault password: 
Encryption successful
$ cat secrets_file.enc 
$ANSIBLE_VAULT;1.1;AES256
33373832393864613335393836616538373639353538306462366464303939303838316337336662
6235303936636465366363643761383462356335336239640a356161653166643134663762323136
34616431303434646338343265666135666263633162383662323164396266616638313936303863
3337626365313666630a326465663239653731613637303437666164346531636361653837326166
34396232623138616364393130303036653564643435636639316264636531336161

Použití Ansible Vault pro tajemství je jednou z mých oblíbených metod ukládání citlivých dat. Výhodou tohoto přístupu je, že můžete ve skutečnosti ukládat svá citlivá data pod kontrolu zdroje, bok po boku s běžnými učebnicemi. Vzhledem k tomu, že tyto soubory jsou šifrované, je v tomto přístupu malé riziko, pokud zvolíte silné heslo. Jako u každého sdíleného tajemství je dobré šifrovací heslo často střídat. Ansible také nabízí několik pokročilých funkcí pro Vaulty, jako je možnost mít různá hesla pro různé Vaulty. Nezapomeňte si přečíst dokumentaci, kde najdete skvělé způsoby, jak zabezpečit svá tajemství pomocí nativních funkcí Ansible.

Použití stávajícího správce hesel

Předchozí dva přístupy jsou čistě Ansible přístupy k řešení správy tajemství. Mnoho organizací však již nástroje má, jako je HashiCorp Vault nebo Thycotic Secret Server. Komunita Ansible napsala řadu vlastních modulů pro interakci s těmito typy systémů.

Následující příručka používá vyhledávání k získání tajemství z HashiCorp Vault a poté toto tajemství použije v úkolu:


---

- hosts: all
  gather_facts: false
  tasks:
    - name: Ensure API key is present in config file
      ansible.builtin.lineinfile:
        path: /etc/app/configuration.ini
        line: "API_KEY={{ lookup('hashi_vault', 'secret=config-secrets/data/app/api-key:data token=s.FOmpGEHjzSdxGixLNi0AkdA7 url=http://localhost:8201')['key'] }}"

Na Ansible Galaxy můžete najít celou řadu pluginů pro různé nástroje pro správu tajných informací. Stejně jako u každého komunitně podporovaného projektu je dobré provést audit kódu, abyste pochopili, jak nakládá s vašimi daty a tajemstvími. Možná budete chtít napsat svůj vlastní.

Použití vyhledávacího pluginu nebo modulu je vhodné pro organizace, které již mají zavedený vyspělý nástroj pro správu tajemství a jednoduše chtějí, aby Ansible využíval tajemství z tohoto stávajícího systému. Zjevným kompromisem je menší jednoduchost:Spouštění Playbooku je nyní závislé na dostupnosti externího systému a spoléhat se na modul podporovaný komunitou (nebo psát svůj vlastní) může být časově náročné.

Poznámka k protokolování

Je důležité si uvědomit, že šifrování dat v klidu (např. v Ansible Vault nebo externím tajném systému) neznamená, že data jsou chráněna před náhodným výstupem do souboru protokolu Ansible. Pokud modul, který voláte, zaznamená váš tajný klíč během svých normálních operací nebo když dojde k chybě, může být tento tajný klíč odhalen ve vašich protokolových souborech. Ať už tyto protokoly ukládáte v centrálním systému nebo jednoduše používáte výchozí standardní výstupní zobrazení, je důležité chránit svá tajemství před náhodným odhalením.

Níže uvedený výstup pochází ze stejné příručky Ansible, kterou jsem používal pro tento tutoriál. Zvýšil jsem však úroveň ladění Ansible pomocí -vvv . Všimněte si, že moje tajemství (API_KEY=SuperSecretPassword ) je přímo vystaven ve výstupu ladění. Tento úryvek jsem trochu vyčistil, takže se nebojte, pokud to zkusíte a váš výstup bude vypadat trochu jinak.

TASK [Ensure API key is present in config file] ***********************************************************************************************************************************************
fatal: [localhost]: FAILED! => changed=false 
  ansible_facts:
    discovered_interpreter_python: /usr/bin/python
  invocation:
    module_args:
      attributes: null
      backrefs: false
      backup: false
      content: null
      create: false
      delimiter: null
      directory_mode: null
      firstmatch: false
      follow: false
      force: null
      group: null
      insertafter: null
      insertbefore: null
      line: API_KEY=SuperSecretPassword
      mode: null
      owner: null
      path: /etc/app/configuration.ini
      regexp: null
      remote_src: null
      selevel: null
      serole: null
      setype: null
      seuser: null
      src: null
      state: present
      unsafe_writes: null
      validate: null
  msg: Destination /etc/app/configuration.ini does not exist !
  rc: 257

To rozhodně není ideální:Moje tajemství je přímo tam, na očích. Naštěstí Ansible poskytuje parametr no_log pro úlohy, které chrání citlivá data:

---

- hosts: all
  gather_facts: false
  tasks:
    - name: Ensure API key is present in config file
      ansible.builtin.lineinfile:
        path: /etc/app/configuration.ini
        line: "API_KEY={{ api_key }}"
      no_log: True

Přidáním tohoto parametru k úloze, která interaguje s citlivými daty, se potlačí výstup neúspěšné úlohy a zachová se důvěrnost mého tajemství:

TASK [Ensure API key is present in config file] ***********************************************************************************************************************************************
fatal: [localhost]: FAILED! => changed=false 
  censored: 'the output has been hidden due to the fact that ''no_log: true'' was specified for this result'

Je dobré použít no_log na jakýkoli úkol, který interaguje s citlivými daty. Měli byste si také být vědomi jeho omezení:Pokud je zapnuté ladění Ansible, nezabrání protokolování.

[ Hledáte více o automatizaci systému? Začněte s The Automated Enterprise, bezplatnou knihou od Red Hat. ] 

Poslední myšlenky

Správná správa tajemství je běžnou ranou výzvou, které čelí mnoho správců systémů při práci na zavádění automatizace. V tomto článku jsem popsal a předvedl tři různé metody, které můžete použít k ochraně citlivých dat při používání Ansible ve vašem prostředí. Tento článek pouze poškrábal povrch možností, takže si nezapomeňte prohlédnout dokumentaci, kterou jsem v této diskusi odkazoval. Bezpečnost je práce každého. Svou roli jako správce systému můžete splnit tím, že zajistíte, že zacházíte se soukromými daty s takovou citlivostí, jakou si ve svých automatizačních kanálech zaslouží.


Linux
  1. Ansible Guide:Správa souborů pomocí Ansible

  2. Osm způsobů, jak chránit přístup SSH ve vašem systému

  3. 6 dovedností pro odstraňování problémů pro Ansible playbooky

  1. Nakonfigurujte si svého démona Chrony pomocí příručky Ansible

  2. Jak upravit soubor Hosts ve Windows 10

  3. Převedení vašeho webu do režimu offline

  1. Jak vytvořit soubor v Ansible

  2. Jak vytvořit pem pro váš stávající SSL

  3. Možnost odkomentování řádku v souboru