การสร้างผู้ใช้และรหัสผ่านใหม่ด้วย Ansible


103

ฉันมีงานที่ตอบได้ซึ่งสร้างผู้ใช้ใหม่บน ubuntu 12.04;

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

มันเสร็จสมบูรณ์ตามที่คาดไว้ แต่เมื่อฉันเข้าสู่ระบบในฐานะผู้ใช้นั้นและพยายาม sudo ด้วยรหัสผ่านฉันตั้งไว้เสมอว่ามันไม่ถูกต้อง ผมทำอะไรผิดหรือเปล่า?


1
คุณเข้าสู่ระบบด้วยรหัสผ่านหรือคีย์ ssh เดียวกันหรือไม่? คุณตรวจสอบไฟล์เงาของคุณเพื่อให้แน่ใจว่าเนื้อหาเป็นไปตามที่คาดไว้หรือไม่? นอกจากนี้คุณpasswordไม่ควรอยู่ในรูปแบบข้อความธรรมดา แต่ควรกำหนดไว้ล่วงหน้า
Mxx

รหัสผ่านของฉันเป็นข้อความธรรมดาฉันจะใช้แบบนั้นไม่ได้หรือ ฉันไม่เข้าใจวิธีเข้ารหัสหรือจำเป็นจริงๆ
raphael_turtle

คำตอบ:


101

ถ้าคุณอ่านเบิ้ลของตนเองสำหรับuserโมดูลก็จะนำคุณไปยังเบิ้ล-ตัวอย่างGitHub repoสำหรับรายละเอียดวิธีการใช้พารามิเตอร์password

คุณจะเห็นว่าต้องแฮชรหัสผ่านของคุณ

- 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}}

หาก playbook หรือบรรทัดคำสั่ง ansible มีรหัสผ่านของคุณเหมือนที่เป็นอยู่ในรูปแบบข้อความธรรมดาหมายความว่าแฮชรหัสผ่านของคุณที่บันทึกไว้ในไฟล์เงาของคุณไม่ถูกต้อง นั่นหมายความว่าเมื่อคุณพยายามพิสูจน์ตัวตนด้วยรหัสผ่านของคุณแฮชจะไม่ตรงกัน

นอกจากนี้โปรดดูคำถามที่พบบ่อยของ Ansible เกี่ยวกับความแตกต่างบางประการของพารามิเตอร์รหัสผ่านและวิธีใช้อย่างถูกต้อง


25
ขอบคุณสำหรับทิป. ฉันแค่อยากจะชี้ให้เห็นว่าเอกสารประกอบโมดูลผู้ใช้ที่เชื่อมโยงด้านบนแนะนำให้ใช้openssl passwd -salt <salt> -1 <plaintext>เพื่อสร้างแฮชรหัสผ่านแทนที่จะเป็น Python one-liner ที่คุณมีข้างต้น ฉันมีปัญหาในการรับเอาต์พุตที่ถูกต้องจาก Python อาจเป็นเพราะความไร้ความสามารถของฉันเองและคำสั่ง openssl ทำงานได้ดีขึ้น
Brendan Wood

6
คุณจะซิงโครไนซ์เกลือเพื่อใช้กับ OS ได้อย่างไร?
พันธุ์

5
@ Breedly: ไม่จำเป็น - เกลือจะถูกเก็บไว้เป็นส่วนหนึ่งของรหัสผ่านเสมอ ($ 1 $ thesalt $ thepasswordhash) ซึ่งหมายความว่าเป็นแบบพกพาระหว่างระบบปฏิบัติการโดยใช้ฟังก์ชันแฮชเดียวกัน
Benjamin Dale

3
การใช้คำสั่ง python เพื่อสร้างแฮชไม่ได้ผลสำหรับฉัน แต่ฉันพบแฮชใน/etc/shadowหลังจากตั้งรหัสผ่านด้วยตนเองโดยใช้passwd <user>.
dokaspar

172

ฉันอาจจะสายเกินไปที่จะตอบกลับ แต่เมื่อเร็ว ๆ นี้ฉันพบว่าตัวกรอง jinja2 มีความสามารถในการจัดการการสร้างรหัสผ่านที่เข้ารหัส ในของmain.ymlฉันฉันกำลังสร้างรหัสผ่านที่เข้ารหัสเป็น:

- 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 }}"

"uusername" และ "upassword" จะถูกส่ง--extra-varsไปยัง playbook และสังเกตว่าฉันใช้ตัวกรอง jinja2 ที่นี่เพื่อเข้ารหัสรหัสผ่านที่ส่ง

ฉันได้เพิ่มบทช่วยสอนด้านล่างที่เกี่ยวข้องกับเรื่องนี้ในบล็อกของฉัน


6
เพื่อหลีกเลี่ยงไม่ให้รายการมีการ "เปลี่ยนแปลง" เสมอคุณสามารถเพิ่ม "salt" ที่เป็นความลับเป็นพารามิเตอร์ที่ 2 ใน password_hash
Michael Wyraz

11
ตามคำแนะนำของ @ MichaelWyraz: การเพิ่ม "เกลือ" พารามิเตอร์ที่ 2 เพื่อหลีกเลี่ยง "การเปลี่ยนแปลง" password={{upassword|password_hash('sha512', upassword_salt)}}คุณสามารถตั้งค่านี้ผ่านทางตัวแปรเช่น นั่นช่วยให้คุณใส่เกลือลงในห้องนิรภัยตัวแปรตามที่คุณคาดupasswordเดาได้เช่นกันโดยไม่ให้ทั้งสองอย่างออกจาก task.yml
user85461

ฉันยังใช้การตรวจสอบสถานะของ @ bbaassssiiee และเพิ่มupdate_password: on_createโมดูลผู้ใช้ในคำตอบนี้เพื่อป้องกันไม่ให้รหัสผ่านหมดอายุสำหรับผู้ใช้ที่สร้างไว้แล้ว
madhead

ขอบคุณสำหรับตัวอย่างที่ดีของคุณสิ่งนี้ทำให้ฉันมาถูกทาง อย่างไรก็ตามฉันต้องทำหลายอย่างมากกว่านี้เพื่อให้มันใช้งานได้บน Mac ที่มีเวอร์ชันที่รองรับ 2.8.2 ครั้งแรกของทั้งหมดใน mac มันเป็นไปไม่ได้ที่จะใช้ฝังศพใต้ถุนโบสถ์ดังนั้นจึงจำเป็นต้องมีการติดตั้งห้องสมุด passlib pip install passlibด้วย จากนั้นเพื่อให้สามารถใช้สตริงที่เข้ารหัสในห้องนิรภัยแบบอินไลน์ฉันต้องฟอร์แมตใหม่ด้วยการเพิ่มดังต่อไปนี้: password: {{ upassword | string | password_hash('sha512') }}. สิ่งนี้หลีกเลี่ยงข้อความแสดงข้อผิดพลาดsecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Michael Aicher

แม้ว่าจะใช้วิธีนี้ในการตั้งรหัสผ่าน: "{{my_password | string | password_hash ('sha512')}}" ฉันจะยังคงได้รับ - [คำเตือน]: รหัสผ่านที่ป้อนดูเหมือนจะไม่ถูกแฮช อาร์กิวเมนต์ "รหัสผ่าน" ต้องเข้ารหัสเพื่อให้โมดูลนี้ทำงานได้อย่างถูกต้อง
openCivilisation

46

ฉันต้องการเสนอวิธีแก้ปัญหาอื่น:

- 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

ทำไมถึงดีกว่า? เช่นเดียวกับที่ได้รับการบันทึกไว้ที่นี่บทละครของ Ansible ควรมีความสำคัญ คุณไม่ควรคิดว่าสิ่งเหล่านี้ไม่ใช่ลำดับของการกระทำในรูปแบบที่จำเป็น แต่เหมือนกับสถานะที่ต้องการคือรูปแบบการประกาศ ด้วยเหตุนี้คุณควรจะสามารถเรียกใช้หลายครั้งและได้รับผลลัพธ์เดียวกันสถานะเซิร์ฟเวอร์เดียวกัน

ทั้งหมดนี้ฟังดูดี แต่มีความแตกต่างบางประการ หนึ่งในนั้นคือการจัดการผู้ใช้ "สถานะที่ต้องการ" หมายความว่าทุกครั้งที่คุณเรียกใช้การเล่นที่สร้างผู้ใช้เขาจะได้รับการอัปเดตให้ตรงกับสถานะนั้นทุกประการ เมื่อ "อัปเดต" ฉันหมายความว่ารหัสผ่านของเขาจะถูกเปลี่ยนไปด้วย แต่ส่วนใหญ่อาจไม่ใช่สิ่งที่คุณต้องการ โดยปกติคุณต้องสร้างผู้ใช้ตั้งค่าและหมดอายุรหัสผ่านของเขาเพียงครั้งเดียวการเล่นต่อไปไม่ควรอัปเดตรหัสผ่านของเขา

โชคดีที่ Ansible มีupdate_passwordแอตทริบิวต์ในuserโมดูลที่ช่วยแก้ปัญหานี้ได้ การผสมสิ่งนี้กับตัวแปรที่ลงทะเบียนคุณยังสามารถทำให้รหัสผ่านของเขาหมดอายุได้ก็ต่อเมื่อมีการอัปเดตผู้ใช้จริง

โปรดทราบว่าหากคุณเปลี่ยนเชลล์ของผู้ใช้ด้วยตนเอง (สมมติว่าคุณไม่ชอบเชลล์ที่ผู้ดูแลระบบชั่วบังคับในการเล่นของเขา) ผู้ใช้จะได้รับการอัปเดตดังนั้นรหัสผ่านของเขาจะหมดอายุ

สังเกตด้วยว่าคุณสามารถใช้รหัสผ่านเริ่มต้นแบบข้อความธรรมดาในบทละครได้อย่างไร ไม่จำเป็นต้องเข้ารหัสที่อื่นและวางแฮชคุณสามารถใช้ตัวกรอง Jinja2ได้ อย่างไรก็ตามนี่อาจเป็นข้อบกพร่องด้านความปลอดภัยหากมีคนเข้าสู่ระบบก่อนที่คุณจะทำครั้งแรก


3
ฉันไม่สามารถหาวิธีแก้ปัญหาอื่นที่ใช้ได้ผลสำหรับฉัน แต่คุณตอบว่าง่ายและได้ผล ฉันอยากจะโหวตให้คุณ 5 โหวตถ้าทำได้
leesei

ฉันไม่ต้องการให้รหัสผ่านของฉันถูกเข้ารหัสแบบนั้น :( เป็นไปได้ไหมที่จะเอามันออกจาก ansible-vault แล้วฉีดที่นี่การทำรัง"{{ '{{vaulted_password}}' | password_hash('sha512') }}"ดูเหมือนจะไม่ได้ผล ...
dokaspar

คุณลอง{{ vaulted_password | password_hash('sha512') }}แล้วvaulted_passwordกุญแจสำคัญของค่าในห้องนิรภัยอยู่ที่ไหน
madhead

update_password: on_createดูเหมือนจะใช้งานไม่ได้ (มีข้อบกพร่องที่เปิดอยู่เกี่ยวกับเรื่องนี้ตั้งแต่ปี 2017) ดังนั้นรหัสผ่านจะเปลี่ยนทุกครั้งที่มีการเปลี่ยนแปลงสถานะของผู้ใช้
Diti

11

เบิ้ล 'ใช้' โมดูลจัดการผู้ใช้ในidempotentวิธี ใน playbook ด้านล่างงานแรกประกาศstate = presentสำหรับผู้ใช้ โปรดทราบว่า ' register: newuser ' ในการดำเนินการแรกช่วยให้การดำเนินการที่สองตรวจสอบว่าผู้ใช้เป็นใหม่ (newuser.changed == True) หรือที่มีอยู่ ( newuser.changed==False) เพื่อสร้างรหัสผ่านเพียงครั้งเดียว

Ansible playbook มี:

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

มีเพียงวิธีเดียวที่ใช้ได้กับฉันด้วยรหัสผ่านห้องนิรภัย ขอบคุณมาก.
Denis Savenko

อย่างน้อยการแจกแจงตาม Debian ล่าสุดดูเหมือนจะไม่รองรับตัวเลือก GNU แบบยาว "--stdin" กับไบนารี passwd
XXL

10

ลองแบบนี้

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"

2
ฉันชอบโซลูชันนี้เนื่องจากอนุญาตให้พิมพ์รหัสผ่านเมื่อสคริปต์ทำงาน ทางออกที่ดีสำหรับสคริปต์ bootstrap ซึ่งไม่ควรเรียกใช้ทุกครั้ง สำหรับ Ubuntu ฉันใช้ "sha512_crypt" แม้ว่า
นาร์

6

วัตถุประสงค์ของบทบาทในคำตอบนี้คือการสร้างรหัสผ่านแบบสุ่มสำหรับ new_user_name และทำให้รหัสผ่านหมดอายุทันที จำเป็นต้องใช้ new_user_name เพื่อเปลี่ยนรหัสผ่านในการเข้าสู่ระบบครั้งแรกของเขา / เธอ

create_user.yml:

---
# create_user playbook

- hosts: your_host_group
  become: True
  user: ansible

  roles:
    - create_user

บทบาท / 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"

3

นี่เป็นวิธีง่ายๆ:

---
- 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

shell: จะทำให้มีการรายงานการเปลี่ยนแปลงเสมอ
bbaassssiiee

@datasmid คุณสามารถเพิ่ม no_log: True option docs.ansible.com/ansible/…
Phill Pafford

3

นี่คือวิธีการทำงานสำหรับฉัน

- 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

3

เพื่อความสมบูรณ์ฉันจะโพสต์คำสั่งเฉพาะกิจโดยใช้ ansible เนื่องจากมีการจับที่นั่นเช่นกัน

ขั้นแรกให้ลองสร้างรหัสผ่านที่เข้ารหัสโดยใช้ยูทิลิตี้ mkpasswd ที่มีอยู่ในระบบ Linux ส่วนใหญ่:

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)

ขอบคุณเพื่อนฉันกำลังมองหารุ่น adhoc โดยเฉพาะและมีปัญหาคำพูดเดียวกันนี้ที่คุณพูดถึง
alexakarpov


2

เมื่อรวมวิธีแก้ปัญหาบางอย่างจากด้านบนฉันได้สร้างเพลย์บุ๊กที่สร้างแฮชรหัสผ่านที่ถูกต้องโดยอัตโนมัติตามรหัสผ่านข้อความธรรมดาที่เก็บไว้ในไฟล์ Ansible vault ที่เข้ารหัสในเครื่อง:

---
- 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 สำหรับข้อมูลเกี่ยวกับวิธีจัดการห้องนิรภัยที่เข้ารหัส)


2

วิธีสร้างรหัสผ่านที่เข้ารหัสเพื่อส่งไปยังpasswordvar ไปยังuserงานAnsible (จากความคิดเห็นของ @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: crypt โดยใช้ SHA-512 ดูที่นี่และที่นี่ :

Python

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

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

Perl

$ 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/

1
นี่ไม่ใช่การสร้างรหัสผ่านที่แฮช md5 ใช่หรือไม่ ไม่ปลอดภัยเหรอ?
มาร์ค

2

คุณสามารถใช้ ansible-vault เพื่อใช้คีย์ลับในเพลย์บุ๊ก กำหนดรหัสผ่านของคุณใน yml

เช่น pass: secret หรือ

user:
  pass: secret
  name: fake

เข้ารหัสไฟล์ความลับของคุณด้วย:

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

ansible จะถามรหัสผ่านสำหรับเข้ารหัส (ฉันจะอธิบายวิธีใช้บัตรนั้น)

จากนั้นคุณสามารถใช้ตัวแปรของคุณได้ตามที่คุณต้องการ ไม่มีใครสามารถอ่านได้โดยไม่ต้องมีกุญแจนิรภัย

การใช้งานคีย์ห้องนิรภัย:

ผ่านอาร์กิวเมนต์เมื่อเรียกใช้ playbook

--ask-vault-pass: secret

หรือคุณสามารถบันทึกลงในไฟล์เช่น password.txt และซ่อนไว้ที่ไหนสักแห่ง (มีประโยชน์สำหรับผู้ใช้ CI)

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

ในกรณีของคุณ: รวม vars yml และใช้ตัวแปรของคุณ

- include_vars: /path/credential.yml

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

ฉันได้ลองตรงนี้แล้วและไม่ได้ผล ฉันเชื่อว่าเป็นเพราะpassword={{user.pass}}จะขยายเพื่อรวมรหัสผ่านจริงในขณะที่ ansible คาดว่าจะมีแฮชที่นั่น
texnic

2

การสร้างรหัสผ่านแบบสุ่มสำหรับผู้ใช้

ก่อนอื่นต้องกำหนดตัวแปรผู้ใช้จากนั้นทำตามด้านล่าง

งาน:

- 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 }}'

1

คำตอบของ Mxx ถูกต้อง แต่คุณใช้crypt.crypt()วิธีpython ไม่ปลอดภัยเมื่อเกี่ยวข้องกับระบบปฏิบัติการที่แตกต่างกัน (เกี่ยวข้องกับอัลกอริทึมแฮช glibc ที่ใช้ในระบบของคุณ)

ตัวอย่างเช่นจะไม่ทำงานหากคุณสร้างแฮชจาก MacOS และเรียกใช้ playbook บน 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.'

1

โซลูชันทั้งสองไม่ทำงานโดยตรงบน Mac ของฉันที่ควบคุม Ubuntu ดังนั้นเพื่อประโยชน์ของผู้อื่นการรวมคำตอบของ 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

ยังดีกว่าใช้ SHA512 แทน MD5:

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

ผลลัพธ์:

$ 6 $ รอบ = 656000 $ SomeSalt $ oYpmnpZahIsvn5FK8g4bDFEAmGpEN114Fe6Ko4HvinzFaz5Rq2UXQxoJZ9ZQyQoi9zaBo3gBH / FEAov3FHv48


1

ฉันได้สร้าง ansible-playbook ที่ให้คุณสร้างบัญชี linux ที่อนุญาตให้ตรวจสอบรหัสผ่าน

ดูCreateLinuxAccountWithAnsible

รหัสผ่านที่แฮชถูกสร้างขึ้นโดยใช้mkpasswdคำสั่ง ฉันได้ให้วิธีการติดตั้งmkpasswdบนระบบปฏิบัติการต่างๆ

นี่คือขั้นตอนที่จำเป็นในการใช้สคริปต์ของฉัน:

  1. แทนที่<your_user_name>และ<your_password>ภายในrun.shด้วยชื่อผู้ใช้และรหัสผ่านที่คุณต้องการ

  2. เปลี่ยนข้อมูลการเชื่อมต่อinventoryเพื่อให้ ansible สามารถเชื่อมต่อกับเครื่องเพื่อสร้างผู้ใช้

  3. เรียกใช้./run.shเพื่อรันสคริปต์


1
ไฟล์ไม่ได้อยู่ใน GitHub อีกต่อไป
Janus

0

หากคุณต้องการทำสิ่งนี้ให้สำเร็จเป็นคำสั่ง 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
}

0

ฉันรู้ว่าฉันไปงานปาร์ตี้สาย แต่มีอีกวิธีหนึ่งที่ฉันใช้ อาจเป็นประโยชน์สำหรับ distros ที่ไม่มี--stdinpasswd binary

- 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 }}"

Label in loop_controlมีหน้าที่พิมพ์ชื่อผู้ใช้เท่านั้น playbook ทั้งหมดหรือตัวแปรผู้ใช้ (คุณสามารถใช้ได้vars_files:) ควรเข้ารหัสด้วย ansible-vault


0

วิธีแก้ปัญหาของฉันใช้การค้นหาและสร้างรหัสผ่านโดยอัตโนมัติ

---
- 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') }}"

0

พยายามใช้โปรแกรมอรรถประโยชน์มากมายเช่น mkpasswd, Python เป็นต้น แต่ดูเหมือนว่าจะมีปัญหาความเข้ากันได้กับ Ansible ในการอ่านค่า HASH ที่สร้างโดยเครื่องมืออื่น ในที่สุดมันก็ทำงานโดย ansible # value เอง

ตอบได้ทั้งหมด -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"

Playbook -

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

-1

ฉันมาสายไปปาร์ตี้กันหมดแล้ว :) ฉันมีความต้องการในการเล่นที่ตอบสนองได้ซึ่งสร้างผู้ใช้ในพื้นที่หลายคนด้วยรหัสผ่านแบบแรนดอม นี่คือสิ่งที่ฉันคิดขึ้นโดยใช้ตัวอย่างจากด้านบนและนำมารวมกับการเปลี่ยนแปลงบางอย่าง

สร้างผู้ใช้ด้วยรหัสผ่าน .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

/roles/create-user-with-password/tasks/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.