Ansible - Vault

Ansible - Vault

Ansible Vault
Ansible Vault er et verktøy som brukes til å kryptere sensitive data.
Dette kan være passord, API nøkler eller annen sensitiv informasjon.
Dette er en god praksis for å sikre data.
Vi kan kryptere hele filer eller enkelt variabler.
Vi starter med å kryptere kun passordet som vi bruker til å koble til switchene.
Ved å spesifisere ansible_password: feltet i host eller group_vars filen slipper du å skrive inn passordet hver gang du kjører playbooken.
Det er ikke en god praksis å ha disse passordene i klartekst i filene.

group_vars/switcher eksempel uten kryptert passord

ansible_connection: network_cli
ansible_network_os: ios
ansible_user: autom8
ansible_password: alt
                

Du kan nå kjøre ansible-playbook uten å spesifisere -k og måtte oppgi passord.
Men siden vi ikke ønsker å ha passordet i klartekst i filen så krypterer vi passordet.
Vi krypterer passordet med kommandoen ansible-vault encrypt_string.
ansible-vault encrypt_string "alt" --name "ansible_password"
ansible-vault encrypt_string "alt" --name "ansible_password"
New Vault password: 
Confirm New Vault password:
Encryption successful
ansible_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          34653039363662636561366630633936316231336139646339303964646561653833306334383130
          3961323736336131653830326438333432636262643266660a353265653939323364613831383664
          38346532616238616431613162663364343461323463666137323262303036306232656230323262
          3132323466356132310a373432633231393437346466333639373739643965623761343366333137
          3066
                

Kopier alt etter !vault | og legg det inn i group_vars/switcher filen.
ansible_connection: network_cli
ansible_network_os: ios
ansible_user: autom8
ansible_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          34653039363662636561366630633936316231336139646339303964646561653833306334383130
          3961323736336131653830326438333432636262643266660a353265653939323364613831383664
          38346532616238616431613162663364343461323463666137323262303036306232656230323262
          3132323466356132310a373432633231393437346466333639373739643965623761343366333137
          3066
                 

Når du kjører ansible-playbook så vil ansible si at den ikke har noen secret til å decryptere vault secret med.
ansible-playbook playbook_rolle_collapsed_core.yaml -t vlan 

PLAY [playbook_rolle_collapsed_core] ***************************************************************************************************************************************************************************************************

TASK [collapsed_core : Opprett vlan med jinja2] ****************************************************************************************************************************************************************************************
fatal: [IOS_XE_switch_3]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}
fatal: [IOS_XE_switch_4]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}

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

Legg til --ask-vault-pass for å bli spurt om passordet når du kjører playbook.
ansible-playbook playbook_rolle_collapsed_core.yaml -t vlan --ask-vault-pass
Vault password: 

PLAY [playbook_rolle_collapsed_core] ***************************************************************************************************************************************************************************************************

TASK [collapsed_core : Opprett vlan med jinja2] ****************************************************************************************************************************************************************************************
ok: [IOS_XE_switch_3]
ok: [IOS_XE_switch_4]

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

For å dekryptere passordet så kan du bruke ansible-vault decrypt.
  echo '$ANSIBLE_VAULT;1.1;AES256
34653039363662636561366630633936316231336139646339303964646561653833306334383130
3961323736336131653830326438333432636262643266660a353265653939323364613831383664
38346532616238616431613162663364343461323463666137323262303036306232656230323262
3132323466356132310a373432633231393437346466333639373739643965623761343366333137
3066' |
 ansible-vault decrypt && echo
                      

Du kan kryptetere hele filer med ansible-vault create.
anisble-vault creat hemmelig.yaml

Du kan krypterer eksisterende filer med ansible-vault encrypt.
ansible-vault encrypt hemmelig.yaml

Du kan lese krypterte filer med å bruke ansible-vault view.
ansible-vault view hemmelig.yaml

Du kan redigere krypterte filer med ansible-vault edit.
ansible-vault edit hemmelig.yaml

Når du bruker edit så vil filen bli dekryptert og lagret i en midlertidig fil.
Så med tanke på versjonskontroll så er det en god praksis å heller bruke view hvis du ikke skal endre filen.
Du kan endre passordet til en kryptert fil med ansible-vault rekey.
ansible-vault rekey hemmelig.yaml

Du kan også decrpytere filer og eksportere innholder til ikke kryptert fil med ansible-vault decrypt.
ansible-vault decrypt hemmelig.yaml --output ikke_kryptert.yaml


--vault-passworf-file kan brukes for å spesifisere en fil som inneholder passordet.
Dette kan være nyttig hvis du har mange krypterte filer og ikke ønsker å skrive inn passordet hver gang.
Anbefalingen for å brukee vault password file er at den bør lagres utenfor versjonskontroll prosjektet.
Kun du bør ha rettighter til mappen og vault passord filen.

Du kan spesifisere vault password file med --vault-password-file.
Du kan definere vault_password_file= /home/autom8/vault-passord i ansible.cfg filen.
Eller du kan spesifisere vault password file med export ANSIBLE_VAULT_PASSWORD_FILE=/home/autom8/vault-passord miljøvariabelen.


Best practice for å lagre vault passord er å lagre vault passordet i en fil som heter group_vars/all/vault.
I dette eksempelet så bruker vi collapsed_core rollen.
Lag en mappe som heter collapsed_core under group_vars mappen.
Så lager du en fil som heter vars og en som heter vault.
Legg til nye vlan for å teste i vars filen.
Legg ansible_password: alt i vault filen.
Vi krypter passordet med ansible-vault encrypt etterpå.
tree
.
| ── collapsed_core
|   ├── vars
|   └── vault
                      

collapsed_core vars eksempel
vlan:
  - vlan_id: 307
    vlan_name: vlan307
  - vlan_id: 308
    vlan_name: vlan308
  - vlan_id: 309
    vlan_name: vlan309
                      

collapsed_core vault eksempel
ansible_password: alt
                      

Krypter vault filen ved å bruke ansible-vault encrypt vault
ansible-vault encrypt vault
New Vault password: 
Confirm New Vault password:
Encryption successful
                      


Når du åpner vault filen nå kan du se at innholdet er kryptert.
$ANSIBLE_VAULT;1.1;AES256
39316265333633343664386661366135326565343539346339653930633261336166383839333836
3232396366636166383230656464623534316266323863620a383933303138633139653332336533
63333638353035393734393364313262636331633863613233393631386366326632653531376637
3835353231656336310a393366663133386464373635613231336163636230373861306630643734
65376537326465336135636632343237633139313835333339633131333961626161
                      


I min lab så er IOS_XE_switch_3 og IOS_XE_switch_4 medlem av group_vars for collapsed_core rollen og for swichter.
ansible_password er kryptert med forskjellige passord i disse to filene.
Her brukes ansible_password: med den kryptere string verdien i filer group_vars/switcher og passordet stemmer ikke med det nye
For å komme rundt dette kan du kjøre ansible-vault encrypt_string "alt" --name "ansible_password"
Legg inn den nye krypterte verdien i group_vars/switcher filen.
Eller du kan endre mappe strukturen for switcher og lage en vars og vault fil.
Jeg lar min switch struktur være som den er for å beholde eksempelet.


Nå har vi igen konflikter med ansible_password i group_vars filene.
Kjør playbooken som referer til collapsed_core rollen.
ansible-playbook playbook_rolle_collapsed_core.yaml -t vlan --ask-vault-pass
Vault password: 

PLAY [playbook_rolle_collapsed_core] ***************************************************************************************************************************************************************************************************

TASK [collapsed_core : Opprett vlan med jinja2] ****************************************************************************************************************************************************************************************

changed: [IOS_XE_switch_3]
changed: [IOS_XE_switch_4]

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



Hvis det er bohov for å knytte vault passord opp mot en ID, så er det mulig.
Du øsker kanskje ikke at alle skal ha tilgang til alle passord.
Du kan knytte en ID til vault passordet.
Ekempelne viser hvordan du knytter en ID til en krypter string.
ansible-vault encrypt_string --vault-id cisco@prompt "CiscoPassord" --name "ansible_password"
ansible-vault encrypt_string --vault-id cisco@prompt "CiscoPassord" --name "ansible_password"
New vault password (cisco): 
Confirm new vault password (cisco):
Encryption successful
ansible_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;cisco
          34636136626631633837313732636232303564613638373133646662613664613231393561386565
          3538366562616462623434636638373964323733613335630a376637313636396535633335636432
          61613430643638656433356464353838323337306464303264353435623232326261623131396637
          3266336432363134370a376462376262613965386563316662326362636161653630613131643638
          3338
                      

Legg merke til at brukernavnet cisco er knyttet til passordet $ANSIBLE_VAULT;1.2;AES256;cisco.
For å refere til vault-id når du kjører en playbook så kan du bruke --vault-id cisco@prompt.