ansible-vault를 사용한 비밀번호 관리

좋은 하루!

요즘 ansible-vault 사용에 대한 학습에서 벗어난 또 다른 게시물이 있습니다.

한동안 KodeKloud 성능 기반 작업을 수행해 왔으며 그 작업 중 하나는 ansible 플레이북을 사용하여 사용자 및 그룹을 생성하는 작업이었습니다. 사용자의 비밀번호는 ansible-vault를 사용하여 관리해야 합니다.

이전에 ansible-vault를 사용해 본 적이 없기 때문에 확실히 재미있는 학습입니다.



다음 작업을 수행하기 위해 ansible 플레이북을 생성합니다.
  • users.yml 파일에 지정된 사용자 및 그룹을 생성합니다.

  • # cat /home/centos/users.yml
    admins:
      - rob
      - tim
    developers:
      - mark
      - john
    


  • "admins"그룹에 속한 사용자의 경우 "/home/"디렉토리에 홈 디렉토리를 만들어야 합니다.
  • "개발자"그룹에 속한 사용자의 경우 홈 디렉토리를 "/var/www"로 설정해야 합니다. 또한 "/var/www/"에 사용자 이름이 있는 홈 디렉토리를 생성해서는 안 됩니다.
  • admins 그룹 사용자의 암호를 "adminpassword"로 설정해야 합니다.
  • 개발자 그룹 사용자의 암호를 "developerpassword"로 설정해야 합니다.
  • 암호를 암호화하려면 "/home/centos/vault/password.txt"에 있는 ansible-vault 비밀 파일을 사용하십시오.

  • 해결책



    작업을 완료하려면 작업을 마지막부터 처음까지 살펴보고 완료해야 합니다.
  • 사용자의 암호는 ansible-vault로 암호화되어야 합니다. 따라서 ansible.cfg 파일이 볼트 암호 파일로 구성되어 있는지 확인해야 합니다.

  • 참고: ansible-vault의 암호는 안전한 위치에 보관해야 합니다. 연습용으로 보여드립니다.

    [centos@localhost vault]$ pwd
    /home/centos/vault
    [centos@localhost vault]$ cat password.txt 
    redhat
    [centos@localhost vault]$ grep vault_password_file /etc/ansible/ansible.cfg 
    vault_password_file = /home/centos/vault/password.txt
    


  • 작업 지점 4 및 5에는 ansible-vault로 암호화해야 하는 두 개의 문자열이 있으며 이 암호화된 암호는 사용자 생성 프로세스 중에 사용됩니다.

  • 이를 위해 ansible-vault 명령을 사용하여 문자열을 암호화합니다. 또한 관리자 사용자 비밀번호의 암호화된 문자열 이름을 "admin_pwd"라는 변수에 지정하고 개발자 사용자 비밀번호의 경우 "developer_pwd"라는 변수에 이름을 지정합니다.

    참고: 여기에서 확인해야 할 중요한 사항은 변수 이름에 하이픈 "-"이 포함되지 않아야 한다는 것입니다. 그렇지 않으면 암호가 사용자에게 작동하지 않습니다. 이것은 작업을 시도하는 동안 내 경험에서 나온 것입니다.

    [centos@localhost ~]$ ansible-vault encrypt_string 'adminpassword' --name 'admin_pwd'
    admin_pwd: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              30323636346564376638376364386335646463626662646535633863663265383563383238363236
              3863623764366533313162346335653736323438656331370a373263643733623766373264613530
              37333537663761383232313564343131663438303966386336663733633332343030633866613737
              3139373661623137650a303936363562383335613437653365323737373430363831633164366334
              3336
    Encryption successful
    [centos@localhost ~]$ ansible-vault encrypt_string 'developerpassword' --name 'developer_pwd'
    developer_pwd: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              61656230636461653861356530346230386461646436636533366665346264366666623264383130
              3539343339626664383731363665306238386434306435620a653139353735366330336466346635
              39623832663063373738306238343433396661373566653232383236613662343437313832326562
              3166616232663137380a343133353439396261323939323365313339663464393266373437303335
              36323633306333386435616639653730396266616334643536643936623465383131
    Encryption successful
    


  • 작업 포인트 3에서 언급한 것처럼 개발자 그룹 아래의 사용자는 홈 디렉토리를 "/var/www"로 설정해야 합니다. 디렉토리가 시스템에 생성되고 적절한 권한이 디렉토리에 적용되는지 확인하십시오.

  • [centos@localhost var]$ pwd
    /var
    [centos@localhost var]$ ls -ld www
    drwxrwxrwx. 2 root root 27 Jul  2 17:53 www
    


    디렉토리에 대한 권한을 관찰하십시오www. 설정되어 있지 않으면 아래 명령을 사용하여 권한을 업데이트하십시오.

    [centos@localhost var]$ sudo chmod 777 www
    


  • 이제 vault_password_file을 구성하고 관리자 및 개발자 그룹 아래의 사용자에 대한 암호를 포함하는 변수를 생성했으며 개발자 사용자를 위한 홈 디렉토리를 생성했으므로 그룹 및 사용자를 생성하는 플레이북 생성 작업을 시작하겠습니다.

  • [centos@localhost ~]$ cat playbook.yml 
    ---
    - hosts: localhost
      vars_files: /home/centos/users.yml
      vars:
        admin_pwd: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              30323636346564376638376364386335646463626662646535633863663265383563383238363236
              3863623764366533313162346335653736323438656331370a373263643733623766373264613530
              37333537663761383232313564343131663438303966386336663733633332343030633866613737
              3139373661623137650a303936363562383335613437653365323737373430363831633164366334
              3336
        developer_pwd: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              61656230636461653861356530346230386461646436636533366665346264366666623264383130
              3539343339626664383731363665306238386434306435620a653139353735366330336466346635
              39623832663063373738306238343433396661373566653232383236613662343437313832326562
              3166616232663137380a343133353439396261323939323365313339663464393266373437303335
              36323633306333386435616639653730396266616334643536643936623465383131
      tasks:
      - name: create group
        group:
          name: "{{ item }}"
          state: present
        loop:
          - admins
          - developers
      - name: create admins users
        user:
          name: "{{ item }}"
          create_home: yes
          groups: admins, wheel
          append: yes
          password: "{{ admin_pwd | string | password_hash('sha512') }}"
        loop: "{{ admins }}"
      - name: create developers users
        user:
          name: "{{ item }}"
          create_home: yes
          home: /var/www
          groups: developers
          append: yes
          password: "{{ developer_pwd | string | password_hash('sha512') }}"
        loop: "{{ developers }}"
    


    • vars_files is pointing to the file users.yml which contains the groups and users information.
    • vars is pointing to the variables which were created using the ansible-vault command
    • tasks list consists of the task first to create the groups given in the users.yml, then create the users using group and user modules of the ansible respectively.
    • create_home=yes -> home directory is supposed to be created in the /home
    • users in the admins group are also supposed to be sudo user, this is why groups: admins, wheels & append: yes have been added into the task. Similarly for users in the developers group, groups: developers
    • password for users in the admins and developers should be set to admin_pwd and developer_pwd variables created during encrypt string step. Password strings are also required to be hashed so as not to expose during the playbook execution or otherwise.
    • both user creation tasks consists of loop where values under the admins and developers list (array) are being used from users.yml

  • 이제 플레이북을 실행할 시간입니다. ansible-playbook 명령을 실행하여 playbook.yml의 변경 사항을 구현합니다.

  • [centos@localhost ~]$ ansible-playbook playbook.yml 
    
    PLAY [localhost] *************************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************************
    ok: [localhost]
    
    TASK [create group] **********************************************************************************************************
    ok: [localhost] => (item=admins)
    ok: [localhost] => (item=developers)
    
    TASK [create admins users] ***************************************************************************************************
    changed: [localhost] => (item=rob)
    changed: [localhost] => (item=tim)
    
    TASK [create developers users] ***********************************************************************************************
    changed: [localhost] => (item=mark)
    changed: [localhost] => (item=john)
    
    PLAY RECAP *******************************************************************************************************************
    localhost                  : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    [centos@localhost ~]$ 
    
    


    참고: 플레이북 실행의 자세한 출력을 보려면 ansible-playbook 명령과 함께 "-vv"옵션을 사용하십시오.
    # ansible-playbook playbook.yml -vv

    참조


  • Ansible user module
  • Ansible group module
  • Ansible vault
  • Ansible variable
  • 좋은 웹페이지 즐겨찾기