Ansible에서 사용자 비밀번호를 변경하여 SSM 파라미터 저장소에 비밀번호 저장

실현하고 싶은 것



Ansible을 사용하여 대상 서버의 사용자 비밀번호를 변경합니다.
변경된 비밀번호는 AWS Systems Manager의 한 기능인 파라미터 스토어에 저장하고 싶습니다.
파라미터 스토어는 무료이며 리전당 최대 10000개의 파라미터를 관리할 수 있습니다.

지난번 에 이어, Docker + Ansible 환경에서 다음을 실현합니다.
① 랜덤 패스워드 생성
② 사용자의 비밀번호 변경
③SSM 파라미터 스토어에 비밀번호 저장

설정



Docker와 Ansible의 세밀한 설정은 이전 기사와 동일하므로 생략합니다.
변경하는 것은 main.yml입니다.

먼저 15자의 무작위 암호를 생성합니다.
그런 다음 생성된 암호를 표시합니다.
생성된 암호를 대상 사용자로 설정합니다.
마지막으로 AWS CLI 명령을 사용하여 파라미터 스토어에 비밀번호를 저장합니다.

ssm put-parameter의 보충 설명입니다.
· 비밀번호와 연결하는 이름을 --name으로 지정. 또한 "/"를 사용하여 계층 구조 설정
· type에 SecureString을 지정하고 기본 AWS KMS Key를 사용하여 파라미터 암호화
(기본 AWS 관리형 키의 경우 Key ID를 지정하지 않음)
· region 지정 (.aws/config에 지역을 설정해도 명시 적으로 지정하지 않으면 오류가 발생함)

main.yml
- hosts: targets
  become: yes
  gather_facts: no
  tasks:
    ##################################################
    # Generate new password
    ##################################################
    - name: Generate new password
      shell: cat /dev/urandom | base64 | fold -w 15 | head -n1
      register: random_password

    ##################################################
    # Display the output
    ##################################################
    - name: Output
      debug:
        msg: Password -> [ {{random_password.stdout_lines[0]}} ]

    ##################################################
    # Change password of the user
    ##################################################
    - name: Change password
      user:
        name: test-user
        password: "{{ random_password.stdout_lines[0] | password_hash('sha512') }}"

    ##################################################
    # Add the password to Parameter Store
    ##################################################
    - name: Put password
      delegate_to: localhost
      shell: >
        aws ssm put-parameter
        --name "/Passwords/test-user"
        --type "SecureString"
        --value {{random_password.stdout_lines[0]}}
        --region ap-northeast-1

IAM 정책



EC2에서 Systems Manager로 매개 변수를 구성할 수 있도록 최소한 이하의 정책을 EC2에 설정한 IAM 역할에 제공해야 합니다.
· ssm : PutParameter

실행 결과



이제 Ansible Playbook을 실행합니다.
ansible-playbook -i ./inventory ./main.yml

PLAY [targets]****************************************************************************************************
TASK [Generate new password] *************************************************************************************
changed: [10.0.1.100]

TASK [Output] ****************************************************************************************************
ok: [10.0.1.100] => {
    "msg": "Password -> [ LAnjvZ5d/CdrFEE ]"
}

TASK [Change password] *******************************************************************************************
changed: [10.0.1.100]

TASK [Put password] **********************************************************************************************
changed: [10.0.1.100]

PLAY RECAP *******************************************************************************************************
10.0.1.100                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

변경된 비밀번호로 서버에 로그인



무사히 변경 후의 패스워드로 SSH 접속을 할 수 있었습니다.

하나의 참고 사항으로, Ansible 명령으로 암호를 변경할 때 password_hash('sha512')
hash화하지 않으면 암호가 변경되어도 SSH로 로그인할 수 없습니다.

다음과 같이 경고가 표시됩니다.

[WARNING]: The input password appears not to have been hashed. The 'password'
argument must be encrypted for this module to work properly.

AWS Management Console에서 결과 확인



매개 변수 저장소를 확인합니다.
계층이 설정되어 있습니다만, 수가 많아지면 보기 어려워질 것 같습니다.

test-user의 비밀번호를 확인합니다.
암호화했기 때문에, 값의 곳에 있는 「표시」를 클릭하면 평문으로 보이게 됩니다.

좋은 웹페이지 즐겨찾기