• Ansible Vault는 패스워드, 키와 같은 보안에 민감한 파일들을 encryption / decryption 해주는 기능을 가짐(암호화)
  • Ansible-Vault는 변수와 파일을 암호화하여 플레이북이나 role에서 비밀번호. 키와 같은 민감한 콘텐츠를 보호 가능
  • Ansible을 이용할 때 해킹이나, 유출로 인해 서버 정보가 외부로 나갈 수 있음
  • Ansible Vault를 통해 민감한 정보를 평문이 아니라 암호화된 파일로 관리하면 해킹당해도 문제 X
  • SSH 개인 및 공개 키, 암호 및 SSL 인증서도 암호화된 파일로 관리하여 권한 없는 사람이 권한을 얻는 것을 방지
  • Ansible Vault를 이용하면 Ansbile에서 사용하는 모든 구조화된 데이터 파일을 암호화 가능
  • Ansible Vault는 변수 또는 전체 파일 및 YAML 플레이 북을 암호화 → 파일을 암호화하고 복호화 할 때 동일한 암호를 요구

1. Ansible-Vault 설치

  • Ansible을 설치하면 Ansible-vault도 함께 설치됨

  • 암호화 알고리즘 : AES256

    $ ansible-vault -h
    usage: ansible-vault [-h] [--version] [-v]
                         {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
                         ...
    
    encryption/decryption utility for Ansible data files
    
    positional arguments:
      {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
        create              Create new vault encrypted file
        decrypt             Decrypt vault encrypted file
        edit                Edit vault encrypted file
        view                View vault encrypted file
        encrypt             Encrypt YAML file
        encrypt_string      Encrypt a string
        rekey               Re-key a vault encrypted file
    
    optional arguments:
      --version             show program's version number, config file location,
                            configured module search path, module location,
                            executable location and exit
      -h, --help            show this help message and exit
      -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                            connection debugging)
    
    See 'ansible-vault <command> --help' for more information on a specific
    command.



2. 암호화되지 않은 파일을 암호화 (../vars/main.yml 파일 암호화)

  • 기존에 가지고 있는 파일을 암호화함으로 알수 없는 문자로 이루어진 파일 생성 (Plain text → Encrypt text)

  • 암호화할때 AES256 암호화 표준을 사용

  • 암호화된 파일의 key를 1234로 함

  • 실전에서는 보다 복잡하게 생성해야하지만, 해당 key의 비밀번호를 담고있는 암호화 파일을 추가로 생성하여 vault password 입력할때 활용하는 테스트를 위해 단순하게 생성

    # 암호화할 파일의 내용 확인
    $ vi ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"
    
    # ../var/main.yml 파일을 암호화하여 새로운 암호화 파일 생성
    $ ansible-vault encrypt ../vars/main.yml
    New Vault password:
    Confirm New Vault password:
    Encryption successful
    
    # ../vars/main.yml 파일이 암호화되어있음을 확인 가능
    $ cat ../vars/main.yml
    $ANSIBLE_VAULT;1.1;AES256
    33363235653433386533393236363138376133666234623535313431373835323563323230653838
    3036383965373264646262316464306137623333656435370a333162616433653761336332343439
    61323933646137666663616231613539393264363032613137393538343837393838306231383861
    6265323931656562340a316539306433363436613262393633623463626361303339396430386465
    30326638623336386133303136396431336662326639623439653035373363643966633161656666
    65613632353539616365666530313532373530613239373632316532613838643434623962366332
    31333834613237633134316332343437323063386234643063303464393365326133636462356266
    63343662363237633365646535333733623966323735343865656536626664613263353332393263
    31396361303533663463313832333362353732663939616539616131653533383331343064623961
    38303966393434323266643133323635323461653265633338306430323566373236643662356565
    62326336353336613937623738323861333636336234623030376434316564386131363639643739
    38653764376634613636356665383830306230356364323932373734363831333030313730656464
    31383231653330393764323638393034646539646366336438386533323534336631336133333337
    62626434343532636338613339333739396231643934616135363836323961303032626661303737
    62313433343236636134396136633566343165343963663462336531343162383361396536313434
    35333064313739623464



3. 암호화한 ../vars/main.yml 파일이 이상없이 roles에서 적용가능한지 테스트

  • 비밀번호를 변경하는 roles

  • 암호화한 ../vars/main.yml 을 활용하기 위해서는 키가 필요

  • 키를 수동으로 입력하기 위해서는 옵션을 넣어야함(--ask-vault-pass)

  • --ask-vault-pass 옵션이 없는 경우 ansible-vault로 암호화된 파일을 읽을 수 없어서 에러 발생

    # 아래와 같이 일반 암호와 vault 암호를 같이 입력해야함 -> 정상 실행됨으로 실행 내용은 생략
    # Vault password에 들어갈 비밀번호는 "1234"
    $ ansible-playbook change_passwd_role.yml -k --ask-vault-pass
    SSH password:
    Vault password:
    
    PLAY [change passwd Role] *******************************************************************
    [...생략]



4. 암호화된 파일을 복호화 (../vars/main.yml 파일 복호화)

  • 암호화된 파일을 Plain text 파일로 복호화 (Encrypt text → Plain text)

  • 복호화할때 AES256 암호화 표준을 사용

  • 암호화된 파일에 key를 1234로 하여 복호화

    # 암호화된 ../var/main.yml 파일을 복호화하여 기존 파일으로 변경
    $ ansible-vault decrypt ../vars/main.yml
    Vault password:
    Decryption successful
    
    # 암호화된 ../vars/main.yml 파일이 복호화되어있음을 확인 가능
    $ cat ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"



5. 암호화 키 제작 → 암호화할 파일의 키를 암호화

  • 암호화할 파일의 키는 "1234" → 중요한 정보를 암호화할 때 사용할 키

  • 암호화할 파일의 키를 복호화할 키는 "9876" → 암호화한 키의 내용이 복호화되면 암호화된 정보까지 도달할 수 있기에 이 부분도 복잡하게 하는 것이 중요 (테스트이기에 단순하게 적용)

  • 중요한 정보를 암호화할 키를 Plain text로 공유하면 관리에서 문제가 발생할 수 있음 → 암호화된 키로 공유하여 관리 문제 해결

    # vault password는 vault_key 파일의 키 -> 복호화할때 사용
    $ ansible-vault create ../vars/vault_key
    New Vault password:
    Confirm New Vault password:
    
    # 1234로 입력하고 wq!으로 저장하면 ../vars/vault_key 파일 생성
    1234
    
    # ../vars/vault_key 파일의 내용 확인 -> 해당 내용으로 암호화가 필요한 중요 파일을 암호화
    $ cat ../vars/vault_key
    $ANSIBLE_VAULT;1.1;AES256
    61336134633736613130643539316264356339333261623865356261366465623065613436313064
    3263356335363463623362646333366338613764643932300a303635663930653934313931303966
    37316437336635333137336330616264623264393831316537303434376138373463393361373936
    6132636239613263350a363863343233656164343832663965353433393136343465383933656636
    3962



6. 중요 파일을 암호화된 키로 암호화 → 암호화된 키 공유하여 ansible 활용

  • 암호화 키를 공유해도 해당 키의 암호키를 모르기에 문제 X

  • 중요한 파일을 암호화할 때 해당 암호화된 파일 활용 → 이전에 Plain text로 "1234" 입력하는 것과 동일 효과

  • 암호화된 키를 활용하기 위해서는 vault-password-file 옵션 사용

  • 해당 이슈 내용은 ansible 버전 업그레이드로 ansible-vault를 통해서 암호화된 파일은 ansible-vault키로 사용 X → 해결 방법으로는 6.1 부분과 6.2 부분를 보고 괜찮은 부분을 따라서 하면됨

  • ansible-vault로 encrypt한 ../vault_key 파일을 활용하여 ../main.yml 파일을 암호화할 때 문제 발생

    $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key
    
    # 이슈 내용: ansible-vault를 통해서 생성한 암호화 파일을 ansible-vault의 키로 사용할 경우 아래와 같은 에러가 발생함
    [WARNING]: Error in vault password file loading (default): A vault password must be specified to decrypt data
    ERROR! A vault password must be specified to decrypt data

6.1. 생성한 AES256 암호화 파일을 ansible-vault에서 볼트 암호화 파일로 인식하지 못하게 하기

  • vault_key 파일 확인
    $ cat ../vars/vault_key
    $ANSIBLE_VAULT;1.1;AES256
    61336134633736613130643539316264356339333261623865356261366465623065613436313064
    3263356335363463623362646333366338613764643932300a303635663930653934313931303966
    37316437336635333137336330616264623264393831316537303434376138373463393361373936
    6132636239613263350a363863343233656164343832663965353433393136343465383933656636
    3962
  • vault_key 파일 내용 변경 → 출력되는 내용 중에 $(달러 기호)를 삭제
    $ vi ../vars/vault_key
    ANSIBLE_VAULT;1.1;AES256
    61336134633736613130643539316264356339333261623865356261366465623065613436313064
    3263356335363463623362646333366338613764643932300a303635663930653934313931303966
    37316437336635333137336330616264623264393831316537303434376138373463393361373936
    6132636239613263350a363863343233656164343832663965353433393136343465383933656636
    3962
  • vault_key를 평문으로 인식 → ../vars/vault_key 파일을 통해 ../vars/main.yml 파일을 암호화 복호화 테스트

    # 암호화 테스트
    $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key
    Encryption successful
    
    # 암호화가 정상적으로 진행되었는지 확인
    $ cat ../vars/main.yml
    $ANSIBLE_VAULT;1.1;AES256
    63643230343061333339313964343937336632386364663935643736313333336238663932323865
    3730326361663139626232386562653962396263343931310a333161343061376331306530303736
    36663832626133353932383464323539656431373563613563653230623136343963306230623962
    6538353330343666380a396639323235653465356336346135646562616161306333313033336562
    65333766643234633633633532623062393033636233643534336138366465326237333932643333
    30353563343337643031353966366264383264356562316234393331393832656162653933343136
    38646331333238633766393036336431366634643863323234353133643031653033663037356236
    61393162386637326437623164323364666330613636666462366465363764663364666330303566
    36306433366539623433386434616238663063633734656131316434323332623735346335616266
    61303838393239643834343362386331386534343339313265663334323035653665616632363661
    38376433643239323564616162666535393431326533643432396466633034646562396134356437
    39626134346565326533393836653634316536633164616164393436316330323331336239336665
    64383238383930613930653065386631343933633462383966313236666532353334343137333632
    66643462626164616339303064633733303734653735313862653165633762353430313136386463
    33663434306566323161386630376130333865343238613736356332383862323765303634643732
    66383134383439356361
    
    # 복호화 테스트
    $ ansible-vault decrypt ../vars/main.yml --vault-password-file ../vars/vault_key
    Decryption successful
    
    # 복호화가 정상적으로 진행되었는지 확인
    $ cat ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"

6.2. vault가 아닌 openssl을 이용하여 난수로 작성된 vault_key_by_ssl 파일 생성

  • openssl 명령어를 실행하여 vault_key_by_ssl 이라는 암호화된 파일 생성 → vault_key_by_ssl 파일로 main.yml 파일을 암호화하는 키로 활용
    # ../vars/vault_key_by_ssl 파일이름으로 암호화된 파일 생성(ansible-vault를 활용하지 않지만, openssl로 암호화한 key 활용)
    $ openssl rand -base64 2048 > ../vars/vault_key_by_ssl
  • 생성한 vault_key_by_ssl 확인
    # 암호화된 파일 내용 출력
    $ cat ../vars/vault_key_by_ssl
    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
  • 새로 생성한 vault_key_by_ssl 파일을 이용해서 ../vars/main.yml 파일을 암호화

    # 암호화 테스트
    $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key_by_ssl
    Encryption successful
    
    # 암호화된 ../vars/main.yml 파일 내용 확인
    $ cat ../vars/main.yml
    $ANSIBLE_VAULT;1.1;AES256
    33303566376566653234393138636562663863393431646566333262643232383862383439626531
    6433303938363137623762316234666163383238383136320a333238623731333539353065313666
    63633864663763346263663564646561666534343137616139373564363964396131343863363263
    6366663236613735320a333264323761353230306239346663656466663638323961396364323138
    35636665333737643838616161343835363732356536633833646431323465646131393432373863
    35653939326435626464373036633531303466356164656437323039343435613532653531636231
    35356237663464306566663463613939313433333031633736323165663839306266376334636336
    39356537323930656263313037396531663961396162333162613765356265653135336535316366
    39666432363036646364613165346461363830613032323961396563643466663633613635343633
    62396536656562303365346563626338353234303161306432333430303662346166353133353230
    39613636666165626362366637633061396266636561646463363966306135323835666536393765
    34316662396265336365383462643932366532663132616361396238396561663166386532636264
    64626266373266326266363739653633623664353765336136356539323665336265653461666466
    33393462633138346638313866643132346239643061353131326132336134653737646565636262
    35356131343362383532353232346430643237383165353132616133643630373466383761323030
    38333061313761373938
    
    # vault_key_by_ssl 파일을 이용해서 ../vars/main.yml 파일을 복호화
    $ ansible-vault decrypt ../vars/main.yml --vault-password-file ../vars/vault_key_by_ssl
    Decryption successful
    
    # 복호화가 정상적으로 진행되었는지 확인
    $ cat ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"



7. 생성된 암호화 키 파일인 ../vars/vault_key과 ../vars/vault_key_by_ssl를 활용하여 ../vars/main.yml 파일을 암호화 → roles에서 적용가능한지 테스트

  • 암호화된 키 파일을 활용 → 6.1과 6.2 중 하나를 이용하면 됨

  • 암호화된 키 파일을 통해서 ../vars/main.yml 파일 암호화

  • roles를 이용하여 암호화된 파일이 이상 없는 지 확인 필요

  • --vault-password-file 옵션을 사용하여 암호화된 키 피일을 적용 → 암호화된 키를 통해 중요한 데이터가 암호화되어야만 정상 roles 작동

  • --vault-password-file 옵션으로 암호화된 파일을 적용하는 것은 문제 없으나, SSH 접속에는 비밀번호가 필요함으로 SSH password 부분에 적합한 비밀번호 적용 필요

  • 해당 부분도 암호화로 변경하여 자동화 할수 있지만, 해당 파일의 목적이 비밀번호 변경임으로 비밀번호 확인 차원에서 SSH 접속 비밀번호는 수동으로 남겨놓음

    # Vault password에 들어갈 비밀번호를 암호화된 파일을 이용하여 적용 -> --vault-password-file 옵션 활용
    # 정상 실행됨으로 실행 내용은 생략
    # 파일 경로는 직접 확인하여 적용 필요
    $ ansible-playbook change_passwd_role.yml -k --vault-password-file ../vars/vault_key
    SSH password:
    
    PLAY [change passwd Role] *******************************************************************
    [...생략]

※ ansible vault의 참고 사항

1. 암호화된 파일의 패스워드 변경하기

$ ansible-vault rekey ../vars/main.yml

2. 암호화된 파일의 내용 보기

$ ansible-vault view ../vars/main.yml

+ Recent posts