Skip to content

Andmed ja saladused

Enne kui räägime saladuste krüpteerimisest, peame rääkima, kuidas Ansible andmeid töötleb ja kuskohast ta neid saab.

Filtrid (Filters)

Ansible kasutab Jinja2 templiitimiskeelt. Selle üks võimsamaid omadusi on filtrid. Need lubavad muutuja väärtust käigupealt muuta. Filtrit tähistab püstkriips |.

Näiteks:

  • {{ "tere" | upper }} -> muutub TERE
  • {{ "minuparool" | password_hash('sha512') }} -> muutub Linuxi paroolihäsiks (nt $6$randomsalt$hash...)

Filtreid saab kasutada kõikjal kus saab kasutada muutujaid.

Lookupid

Kui muutujad (vars) on andmed, mis on Ansible sees juba olemas, siis lookupid on mehhanism andmete toomiseks "välismaailmast" Ansible sisse (kontrolleri masinast).

Süntaks on: lookup('PLUGINI_NIMI', 'ARGUMENDID').

Levinumad lookupid:

  • {{ lookup('file', 'minufail.txt') }} - loeb sisse faili sisu kontrolleri masinast.
  • {{ lookup('env', 'HOME') }} - loeb sisse keskkonnamuutuja väärtuse.
  • {{ lookup('password', ...) }} - genereerib ja salvestab parooli.

Saladuste genereerimine

Nüüd kasutame neid teadmisi, et lahendada klassikaline probleem - kuidas genereerida kasutajale turvaline parool, ilma et peaksime selle ise välja mõtlema?

Juhuslik parool igal korral

Kasutame password lookupi. Selle eripära on see, et ta tahab parooli kuhugi faili salvestada. Kui me anname talle failiteekonnaks /dev/null, siis ta genereerib alati uue, sest /dev/null on Linuxis eriline fail, kuhu miski ei salvestu.

Proovi järgnevat taski:

- name: Genereeri parool
  debug:
    msg: "Genereerisin parooli: {{ lookup('password', '/dev/null length=15 chars=ascii_letters,digits') }}"

Complete

Kasutades järgnevat playbooki, leiuta meetod kuidas genereerida unikaalne parool:

- hosts: all
  user: root

  vars:
    password: "TÄIDA"

  tasks:
    - name: Prindi parool
      debug:
        var: password

    - name: Tee kasutaja parooliga
      user:
        name: kasutaja
        password: "{{ password | password_hash }}"

Verify

Igal käivitamisel peaks olema password muutuja erinev, ja user käsk muutuma.

Püsiv parool (Idempotentsus)

Eelmise lahenduse viga on see, et kui me paneme sellega user mooduli parooli, siis Ansible muudab parooli igal käivitusel. See ei ole idempotentne.

Meil on vaja, et: 1. Esimesel korral genereeritakse juhuslik parool. 2. See salvestatakse kuhugi - siinpuhul Ansible kontrolleri masinas (mitte sihtmasinas!) faili. 3. Järgmisel korral loetakse samast failist sama parool.

Õnneks lookup('password', ...) teeb seda automaatselt, kui anname talle päris failinime.

Complete

Muuda password muutujat nii, et parool salvestuks faili credentials/password.txt.

- hosts: all
  user: root

  vars:
    password: "TÄIDA"

  tasks:
    - name: Prindi parool
      debug:
        var: password

    - name: Tee kasutaja parooliga
      user:
        name: kasutaja
        password: "{{ password | password_hash }}"

Verify

  1. Jooksuta playbooki. Kasutaja peaks loodama (status changed).
  2. Vaata oma projektikausta: kas tekkis fail credentials/password.txt? Vaata selle sisu.
  3. Jooksuta playbooki teist korda. Status peaks olema ok (midagi ei muudetud), sest failist loeti sama parool, mis klappis serveris olevaga.

Ansible Vault - ühe muutuja krüpto

Failides paroolide hoidmine (nagu eelmises punktis) on mugav, aga ebaturvaline, kui see fail satub Giti. Selleks on Ansible Vault – meetod failide või muutujate krüpteerimiseks.

Ühe muutuja krüpteerimine

Complete

Teeme endale muutuja kasutades ansible-vault encrypt_string käsku.

Käsk käivitades küsib kõigepealt parooli, millega see krüpteerida (2x). Peale seda küsitakse, mis andmed ära krüpteerida. See on nüüd muutuja sisu - pane siia midagi mida ära tunned.

Peale seda väljastatakse sulle krüpteeritud kujul muutuja:

!vault |
          $ANSIBLE_VAULT;1.1;AES256
          61386566356438303636653332306137336463613964373238356438373839656332343365363033
          3434393438323661366665386162616635353031353162660a633131333434643263656230383334
          39306663316632643638336266636536616332383365636665613865343431373431376662626330
          6334343461616534300a626332623064663562643561633237383861376637366362303565623733
          3665

Võta see, ja pane endale kuskile muutujate faili, niimoodi:

group_vars/all.yml
muutuja:     !vault |
          $ANSIBLE_VAULT;1.1;AES256
          61386566356438303636653332306137336463613964373238356438373839656332343365363033
          3434393438323661366665386162616635353031353162660a633131333434643263656230383334
          39306663316632643638336266636536616332383365636665613865343431373431376662626330
          6334343461616534300a626332623064663562643561633237383861376637366362303565623733
          3665

Proovi jooksutada playbooki:

- hosts: all
  user: root

  tasks:
    - name: Prindi muutuja
      debug:
        var: <asenda oma muutuja nimega>

Ja pane Ansible käima. Peaksid saama veateate.

Nüüd proovi playbook käima panna --ask-vault-pass võtmega.

Verify

Muutuja väljund peaks olema sama, mis sa ise sisse kirjutasid.

Muutujate faili krüpto

Ansible lubab ka krüpteerida tervet muutujate faili, mis on tihti mõistlikum. Selleks on järgnevad käsud:

ansible-vault create vault/paroolid.yml

ansible-vault view vault/paroolid.yml

ansible-vault edit vault/paroolid.yml

Seejärjel saab neid playbookis:

- name: Demo using vaulted variables
  hosts: all
  vars_files:
    - vault/passwords.yml

  tasks:
    - name: Show vaulted secrets
      debug:
        msg: 
          - "muutuja oli: {{ muutuja }}"

Complete

Tee endale üks krüpteeritud muutujate fail. Seejärel kasuta seda Ansiblega.

Verify

Playbook peaks sulle andma tagasi samad muutujad, mis sa faili ise panid.