programing

Ansible을 사용하여 새 사용자 및 암호 만들기

powerit 2023. 4. 19. 00:30
반응형

Ansible을 사용하여 새 사용자 및 암호 만들기

ubuntu 12.04에서 새로운 사용자를 생성하는 작업이 있습니다.

- name: Add deployment user
    action: user name=deployer password=mypassword

예상대로 완료됩니다만, 그 유저로서 로그인하고, 설정한 패스워드로 sudo를 하려고 하면, 항상 「잘못했다」라고 표시됩니다.내가 뭘 잘못하고 있지?

답변이 늦었을지도 모르지만, 최근 저는 jinja2 필터가 암호화된 비밀번호 생성을 처리하는 기능을 가지고 있다는 것을 알게 되었습니다.의 마마 my에서는main.yml'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE:

- name: Creating user "{{ uusername }}" with admin access
  user: 
    name: {{ uusername }}
    password: {{ upassword | password_hash('sha512') }}
    groups: admin append=yes
  when:  assigned_role  == "yes"

- name: Creating users "{{ uusername }}" without admin access
  user:
    name: {{ uusername }}
    password: {{ upassword | password_hash('sha512') }}
  when:  assigned_role == "no"

- name: Expiring password for user "{{ uusername }}"
  shell: chage -d 0 "{{ uusername }}"

과 "upassword는 "uppassword"로 .--extra-vars여기에 jinja2 필터를 사용하여 패스워드를 암호화하고 있습니다.

이와 관련된 아래의 튜토리얼을 블로그에 추가하였습니다.

모듈에 대한 Ansible의 설명서를 읽으면 파라미터 사용 방법에 대한 자세한 내용은 Ansible-examples github repo로 안내됩니다.

여기서 패스워드가 해시되어 있어야 합니다.

- hosts: all
  user: root
  vars:
    # created with:
    # python -c 'import crypt; print crypt.crypt("This is my Password", "$1$SomeSalt$")'
    password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.

  tasks:
    - user: name=tset password={{password}}

플레이북 또는 응답 가능한 명령줄에 일반 텍스트로 된 암호가 있는 경우, 는 섀도 파일에 기록된 암호 해시가 잘못되었음을 의미합니다.즉, 패스워드를 사용하여 인증을 시도해도 해시는 일치하지 않습니다.

또한 패스워드 파라미터의 차이점 및 올바른 사용방법에 대해서는 Ansible FAQ를 참조하십시오.

또 다른 해결책을 제안하고 싶습니다.

- name: Create madhead user
  user:
    name: madhead
    password: "{{ 'password' | password_hash('sha512') }}"
    shell: /bin/zsh
    update_password: on_create
  register: madhead
- name: Force madhead to change password
  shell: chage -d 0 madhead
  when: madhead.changed

왜 더 좋은가?이미 여기서 언급했듯이 앤서블 플레이는 무의미해야 한다.당신은 그것들을 명령적인 스타일의 일련의 행동이 아니라 원하는 상태, 선언적인 스타일로 생각해야 합니다.그 결과 여러 번 실행할 수 있으며 동일한 서버 상태를 얻을 수 있습니다.

이 모든 것이 좋은 것처럼 들리지만, 약간의 뉘앙스가 있습니다.그 중 하나는 사용자 관리입니다."Desired state(희망 상태)"는 사용자를 생성하는 플레이를 실행할 때마다 해당 상태에 정확히 맞게 업데이트됨을 의미합니다."업데이트"란 그의 비밀번호도 변경된다는 것을 의미합니다.하지만 아마도 그것은 당신이 필요로 하는 것이 아닐 것이다.일반적으로 사용자를 생성하고 암호를 한 번만 설정 및 만료해야 합니다. 이후 재생을 실행하면 암호가 업데이트되지 않습니다.

은 가지고 있다update_password이 문제를 해결하는 모듈 의 Attribute.이 값을 등록된 변수와 함께 사용하면 사용자가 실제로 업데이트되었을 때만 암호를 만료할 수 있습니다.

사용자 셸을 수동으로 변경하면(악마의 관리자가 플레이에서 강제한 셸이 마음에 들지 않는다고 가정하면) 사용자가 갱신되므로 비밀번호가 만료됩니다.

또한 일반 텍스트 초기 암호를 재생에서 쉽게 사용할 수 있습니다.다른 곳에 인코딩하여 해시를 붙여넣을 필요가 없습니다.그것에는 Jinja2 필터를 사용할 수 있습니다.그러나 사용자가 로그인하기 전에 다른 사용자가 로그인하면 보안 결함이 발생할 수 있습니다.

이렇게 해보다

vars_prompt:
 - name: "user_password"    
   prompt: "Enter a password for the user"    
   private: yes    
   encrypt: "md5_crypt" #need to have python-passlib installed in local machine before we can use it    
   confirm: yes    
   salt_size: 7

 - name: "add new user" user: name="{{user_name}}" comment="{{description_user}}" password="{{user_password}}" home="{{home_dir}}" shell="/bin/bash"

Ansible 'user' 모듈은 사용자를 유휴 방식으로 관리합니다.아래 플레이북에서 첫 번째 작업은 사용자에게 state=present를 선언합니다.첫 번째 동작의 'register: newuser'는 두 번째 동작에서 사용자가 새 사용자인지 확인하는 데 도움이 됩니다(newuser.devl=).=참) 또는 기존(newuser.changed==False1번

Ansible 플레이북에는 다음이 있습니다.

tasks:
  - name: create deployment user
    user: 
      name: deployer 
      createhome: yes 
      state: present 
    register: newuser

  - name: generate random password for user only on creation
    shell: /usr/bin/openssl rand -base64 32 | passwd --stdin deployer
    when: newuser.changed

이 답변의 역할은 new_user_name에 대해 랜덤 비밀번호를 생성하고 비밀번호를 즉시 만료하는 것입니다.new_user_name은 첫 번째 로그온 시 비밀번호를 변경하기 위해 필요합니다.

create_user.yml:

---
# create_user playbook

- hosts: your_host_group
  become: True
  user: ansible

  roles:
    - create_user

roles/create_user/main.yml:

---
# Generate random password for new_user_name and the new_user_name
# is required to change his/her password on first logon. 

- name: Generate password for new user
  shell: makepasswd --chars=20
  register: user_password

- name: Generate encrypted password
  shell: mkpasswd --method=SHA-512 {{ user_password.stdout }}
  register: encrypted_user_password

- name: Create user account
  user: name={{ new_user_name }}
        password={{ encrypted_user_password.stdout }}
        state=present
        append=yes
        shell="/bin/bash"
        update_password=always
  when: new_user_name is defined and new_user_name in uids
  register: user_created

- name: Force user to change password
  shell: chage -d 0 {{ new_user_name }}
  when: user_created.changed

- name: User created
  debug: msg="Password for {{ new_user_name }} is {{ user_password.stdout }}"
  when: user_created.changed

새 사용자를 생성하는 경우:

ansible-playbook -i hosts.ini create_user.yml --extra-vars "new_user_name=kelvin"

나는 다음을 포함한 많은 유틸리티들을 시도했다.mkpasswd만, 툴에 때 것 .Python , 、 ,, 、 ,, 、 ,, 、 ,,, 、 ,,, 、 Ansible 。앤서블 넘버 값

ansible all -i localhost, -m debug -a "msg={{ 'yourpasswd' | password_hash('sha512', 'mysecretsalt') }}"

플레이북:

- name: User creation
  user: 
    name: username  
    uid: UID
    group: grpname
    shell: /bin/bash
    comment: "test user"
    password: "$6$mysecretsalt$1SMjoVXjYf.3sJR3a1WUxlDCmdJwC613.SUD4DOf40ASDFASJHASDFCDDDWERWEYbs8G00NHmOg29E0"

내 솔루션은 조회와 비밀번호 생성을 자동으로 사용하는 것입니다.

---
- hosts: 'all'
  remote_user: root
  gather_facts: no
  vars:
    deploy_user: deploy
    deploy_password: "{{ lookup('password', '/tmp/password chars=ascii_letters') }}"

  tasks:
    - name: Create deploy user
      user:
        name: "{{ deploy_user }}"
        password: "{{ deploy_password | password_hash('sha512') }}"

간단한 방법은 다음과 같습니다.

---
- name: Create user
  user: name=user shell=/bin/bash home=/srv/user groups=admin,sudo generate_ssh_key=yes ssh_key_bits=2048
- name: Set password to user
  shell: echo user:plain_text_password | sudo chpasswd
  no_log: True

나는 이렇게 했다.

- hosts: main
  vars:
  # created with:
  #  python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('<password>')"
  # above command requires the PassLib library: sudo pip install passlib
  - password: '$6$rounds=100000$H/83rErWaObIruDw$DEX.DgAuZuuF.wOyCjGHnVqIetVt3qRDnTUvLJHBFKdYr29uVYbfXJeHg.IacaEQ08WaHo9xCsJQgfgZjqGZI0'

tasks:

- user: name=spree password={{password}} groups=sudo,www-data shell=/bin/bash append=yes
  sudo: yes

ansible-vault를 사용하여 플레이북의 비밀키를 사용할 수 있습니다.비밀번호를 yml로 정의합니다.

예: 패스: 비밀 또는

user:
  pass: secret
  name: fake

를 사용하여 비밀 파일을 암호화합니다.

ansible-vault encrypt /path/to/credential.yml

ansible은 암호화하기 위한 비밀번호를 요구합니다.(그 패스의 사용법을 설명하겠습니다)

원하는 곳에 변수를 사용할 수 있습니다.금고 열쇠 없이는 아무도 읽을 수 없다.

볼트 키 사용:

passing 인수를 통해 플레이북을 실행할 수 있습니다.

--ask-vault-pass: secret

또는 패스워드처럼 파일에 저장할 수 있습니다.txt와 어딘가에 숨는다.(CI 사용자에게 편리)

--vault-password-file=/path/to/file.txt

이 경우: 변수 yml을 포함하고 변수를 사용합니다.

- include_vars: /path/credential.yml

  - name: Add deployment user
    action: user name={{user.name}} password={{user.pass}}

ansible을 사용하여 ad-hoc 명령어를 투고합니다.그곳에도 함정이 있기 때문입니다.

먼저 대부분의 Linux 시스템에서 사용할 수 있는mkpasswd 유틸리티를 사용하여 암호화된 비밀번호를 생성합니다.

mkpasswd --method=SHA-512

그런 다음 ansible ad-hock 명령을 실행합니다.

ansible all -m user -a 'name=testuser shell=/bin/bash \
     comment="Test User" password=$6$XXXX' -k -u admin --sudo

단, 다음 사항을 확인합니다.

  1. 명령어는 작은 따옴표로 묶어서 이중으로 묶지 않으면 암호가 작동하지 않습니다.
  2. 를 사용하여 실행한다.--sudo또는 다음과 같은 오류가 발생합니다.useradd: cannot lock /etc/passwd; try again later)

사용자에 대한 임의 암호 생성

먼저 사용자 변수를 정의한 후 다음을 따라야 합니다.

작업:

- name: Generate Passwords
  become: no
  local_action: command pwgen -N 1 8
  with_items: '{{ users }}'
  register: user_passwords

- name: Update User Passwords
  user:
    name: '{{ item.item }}'
    password: "{{ item.stdout | password_hash('sha512')}}"
    update_password: on_create
  with_items: '{{ user_passwords.results }}'

- name: Save Passwords Locally
  become: no
  local_action: copy content={{ item.stdout }} dest=./{{ item.item }}.txt
  with_items: '{{ user_passwords.results }}'

사용자 모듈에 대한 작업 정의는 최신 Ansible 버전에서 달라야 합니다.

tasks:
  - user: name=test password={{ password }} state=present

위의 몇 가지 솔루션을 조합하여 암호화된 로컬 호환 볼트 파일에 저장된 일반 텍스트 암호를 기반으로 올바른 암호 해시를 자동으로 생성하는 플레이북을 만들었습니다.

---
- hosts: [your hosts]
  tasks:
  - include_vars: [path to your encrypted vault file]
  - local_action: "command openssl passwd -salt '{{password_salt}}' -1 '{{password}}'"
    register: password_hash
  - user: >
        name=[your username]
        state=present
        password="{{password_hash.stdout}}"

볼트 파일의 암호를 해독하려면 "--ask-vault-pass" 옵션을 사용하여 이 명령을 실행합니다(암호화된 볼트를 관리하는 방법에 대한 자세한 내용은 ansible-vault 참조).

전달하기 위한 암호화된 비밀번호 작성 방법passwordAnsible로 바꿉니다.user태스크(@Brendan Wood 코멘트):

openssl passwd -salt 'some_plain_salt' -1 'some_plain_pass'

결과는 다음과 같습니다.

$1$some_pla$lmVKJwdV3Baf.o.F0OOy71

의 예user작업:

- name: Create user
  user: name="my_user" password="$1$some_pla$lmVKJwdV3Baf.o.F0OOy71"

UPD: SHA-512를 사용한 암호화는 다음과 같습니다.

파이썬

$ python -c "import crypt, getpass, pwd; print crypt.crypt('password', '\$6\$saltsalt\$')"

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

루비

$ ruby -e 'puts "password".crypt("$6$saltsalt$")'

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

이를 Ansible ad-hoc 명령으로 수행하려면 다음을 수행합니다.

$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
       update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""

위의 명령어 출력:

192.168.1.10 | SUCCESS => {
    "append": false,
    "changed": true,
    "comment": "Joe User",
    "group": 999,
    "home": "/home/joe_user",
    "move_home": false,
    "name": "joe_user",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 999
}

Mxx의 답은 맞지만 Python은crypt.crypt()다른 운영체제가 관련되어 있는 경우(시스템에서 사용되는 glibc 해시 알고리즘과 관련됨) 방법은 안전하지 않습니다.

예를 들어 MacOS에서 해시를 생성하고 Linux에서 플레이북을 실행하면 작동하지 않습니다.이 경우 passlib()를 사용할 수 있습니다.pip install passlib로컬에 인스톨 합니다).

from passlib.hash import md5_crypt
python -c 'import crypt; print md5_crypt.encrypt("This is my Password,salt="SomeSalt")'
'$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.'

두 솔루션 모두 Ubuntu를 제어하는 Mac에서 직접 작동하지 않았습니다.Mxx와 JoelB의 답변을 조합한 최신 Python 3 솔루션은 다음과 같습니다.

pip3 install passlib

python3 -c 'from passlib.hash import md5_crypt; \
      print(md5_crypt.encrypt("This is my Password", salt="SomeSalt"))'

결과는 다음과 같습니다.$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.Mxx의 답변과 같습니다.

MD5 대신 SHA512를 사용하는 것이 좋습니다.

python3 -c 'from passlib.hash import sha512_crypt; \
      print(sha512_crypt.encrypt("This is my Password", salt="SomeSalt"))' 

결과:

$6$rounds=656000$SomeSalt$oYpmnpZahIsvn5FK8g4bFEAMGpEN114Fe6Ko4HvinzFaz5Rq2UXXoJZ9ZQyQoi9zaBo3gBH/FEAov3FHv48

패스워드 인증이 가능한 Linux 계정을 만들 수 있는 앤서블 플레이북을 만들었습니다.

AnsibleLinux AccountCreator 를 참조하십시오.

는 '비밀번호'를 사용하여 됩니다.mkpasswd명령어를 입력합니다.mkpasswd다양한 운영 체제에서 사용할 수 있습니다.

스크립트를 사용하기 위해서 필요한 순서는 다음과 같습니다.

  1. <your_user_name> ★★★★★★★★★★★★★★★★★」<your_password>에 inside inside inside run.sh원하는 사용자 이름과 비밀번호를 입력합니다.

  2. 합니다.inventory할 수 .ansible은 사용자를 생성할 수 없습니다.

  3. 실행합니다../run.sh스크립트를 실행합니다.

파티에 늦은 건 알지만, 다른 해결책이 있어요.디스트로가 없는 경우 편리할 수 있습니다.--stdin패스워드 바이너리로 지정합니다.

- hosts: localhost
  become: True
  tasks:
    - name: Change user password
      shell: "yes '{{ item.pass }}' | passwd {{ item.user }}"
      loop:
       - { pass: 123123, user: foo }
       - { pass: asdf, user: bar }
      loop_control:
        label: "{{ item.user }}"

벨벨의 loop_control는 사용자 이름만 출력합니다.플레이북 전체 또는 사용자 변수(사용할 수 있음vars_files:안심이 되다

변수들이 잔뜩 쌓여있긴 하지만 여기서 작업하기 위한 어떤 대답도 얻을 수 없었습니다.따라서 "vaulted" 비밀번호를 사용하여 다음 오류가 발생한 사용자는 다음과 같습니다.

"msg": "Unexpected templating type error occurred on ({{ jinja template stuff }}): expected string or bytes-like object"

볼트 암호화 변수를 작동하려면 "string"을 통해 "|"을 연결해야 합니다.

- name: Creating user "{{ uusername }}" with admin access
  user: 
    name: {{ uusername }}
    password: "{{ upassword | string | password_hash('sha512', (upassword_salt | string)) }}"
    groups: admin append=yes
  when:  assigned_role  == "yes"

GitHub의 Ansible 솔루션 #24425를 기반으로 합니다.

사고하는 괴물의 대답과 마이클 에이셔의 코멘트를 바탕으로 코드를 작성합니다.

- name: Create user
  hosts: all
  become: true
  tasks:
  
- name: "Creating Users and set password"    
  user:
    name: <username>
    update_password: always
    password:  password_hash('sha512')
    groups: sudo

@madhead의 대답은 완벽하지 않다.

할 수 .changed 는 해결할.을 사용하다

- name: get all existing users info
  getent:
    database: passwd

# ---- @madhead 's answer ----
- name: Create madhead user
  user:
    name: madhead
    password: "{{ 'password' | password_hash('sha512') }}"
    shell: /bin/zsh
    update_password: on_create
  register: madhead
- name: Force madhead to change password
  shell: chage -d 0 madhead
  # origin:
  # when: madhead.changed
  # improved:
  when: 'madhead' not in getent_passwd and madhead.changed

파티에 늦었네요:) 랜덤 패스워드를 사용하여 여러 로컬 사용자를 생성하는 무난한 플레이가 필요했습니다.제가 생각해낸 것은 위에서부터 몇 가지 예를 들어 몇 가지 변화를 조합한 것입니다.

create-user-with-password.yml

---
# create_user playbook

- hosts: all
  become: True
  user: root
  vars:
#Create following user
   users:
    - test24
    - test25
#with group
   group: wheel
  roles:
    - create-user-with-password

/create/create-user-with-password/main.yml

- name: Generate password for new user
  local_action: shell pwgen -s -N 1 20
  register: user_password
  with_items: "{{ users }}"
  run_once: true

- name: Generate encrypted password
  local_action: shell python -c 'import crypt; print(crypt.crypt( "{{ item.stdout }}", crypt.mksalt(crypt.METHOD_SHA512)))'
  register: encrypted_user_password
  with_items: "{{ user_password.results }}"
  run_once: true

- name: Create new user with group
  user:
    name: "{{ item }}"
    groups: "{{ group }}"
    shell: /bin/bash
    append: yes
    createhome: yes
    comment: 'Created with ansible'
  with_items:
    - "{{ users }}"
  register: user_created

- name: Update user Passwords
  user:
    name: '{{ item.0 }}'
    password: '{{ item.1.stdout }}'
  with_together:
    - "{{ users }}"
    - "{{ encrypted_user_password.results }}"
  when: user_created.changed

- name: Force user to change the password at first login
  shell: chage -d 0 "{{ item }}"
  with_items:
    - "{{ users }}"
  when: user_created.changed

- name: Save Passwords Locally
  become: no
  local_action: copy content={{ item.stdout }} dest=./{{ item.item }}.txt
  with_items: "{{ user_password.results }}"
  when: user_created.changed

언급URL : https://stackoverflow.com/questions/19292899/creating-a-new-user-and-password-with-ansible

반응형