Подтвердить что ты не робот

Как создать пользователя и установить пароль с помощью пароля?

Документация относится к github example, но это немного редки и таинственны.

Он говорит следующее:

# created with:
# crypt.crypt('This is my Password', '$1$SomeSalt')
password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.

но crypt.crypt не отображает то, что показывает пример. Он также использует MD5.

Я пробовал это:

# python
import crypt
crypt.crypt('This is my Password', '$6$somereallyniceandbigrandomsalt$')
>> '$69LxCegsnIwI'

но поле пароля пользователя должно выглядеть примерно так:

password: $6$somereallyniceandbigrandomsalt$UqddPX3r4kH3UL5jq5/ZI.

который включает три разделителя $, разделяющих 6 (что означает его хэш SHA-512), соль и зашифрованный пароль.

Обратите внимание, что python crypt docs ничего не упоминает о формате $N.

Вопросы:

  • Является ли соль, поставляемая в crypt.crypt, заканчиваться конечным $или находится в формате $N $SALT?

  • Документы Python относятся к DES, но как вызывается SHA-512 или MD5, а где документация для этого?

  • Я действительно должен взять вывод crypt.crypt и отключить первые $6 и сделать $N $SALT $CRYPTED? Это то, что необходимо?

4b9b3361

Ответ 1

Пример python, показанный в документации, зависит от того, какая версия crypt работает в используемой вами ОС.

Я создал склеп на OS X, а сервер, на котором я был нацелен, - ubuntu.

Из-за различий, в которых реализация криптографии предлагается ОС, результат отличается и несовместим.

Используйте это вместо:

http://pythonhosted.org/passlib/

Passlib - это библиотека хэширования паролей для Python 2 и 3, которая обеспечивает кросс-платформенные реализации более 30 алгоритмов хэширования паролей, а также рамки для управления существующими хэшами паролей. это предназначенный для использования в широком диапазоне задач, от проверки хеша найденных в /etc/shadow, для обеспечения полнофункционального хэширования паролей для многопользовательское приложение.

>>> # import the hash algorithm
>>> from passlib.hash import sha512_crypt

>>> # generate new salt, and hash a password
>>> hash = sha512_crypt.encrypt("password")
>>> hash

'$ $6 раундов = 656000 $BthPsosdEpqOM7Qd $л/ln9nyEfxM67ea8Bvb79JoW50pGjf6iM87taIvfSmpjasE4/wBG1.60pFS6W992T7Q1q2wikMbxYUvMHD1tT1'

Ответ 2

Это сработало для меня (используя python 2.7.4):

python
>>> import crypt
>>> crypt.crypt('thisismypassword', '[email protected]$')
'[email protected]$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.'

У меня есть vars.yml, который выглядит так:

---
password: [email protected]$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.

и playbook.yml:

---
- hosts: vagrant
  vars_files:
    - vars.yml
  user: vagrant

  tasks:
  - name: create artefactual user
    user: name=artefactual state=present password={{password}} shell=/bin/bash

Я запускаю свою тетрадь с помощью vagrant, vagrant up, а затем с другой консоли могу ssh для вновь созданного vm с использованием артефактного пользователя, созданного с помощью пароля, с паролем thisismypassword.

Я просто скопировал вывод crypt.crypt в переменную переменной, называемую паролем, и использовал ее. Вывод склепа, который вы показываете в своем вопросе, выглядит слишком коротким, я не уверен, почему вы получили это, возможно, другую версию python?

Ответ 3

Это обновлено в Ansible docs. Существует два предпочтительных способа:

Как создать секретные пароли для пользовательского модуля?

Утилита mkpasswd, доступная на большинстве Linux-систем, - отличный вариант:

mkpasswd --method=SHA-512 Если эта утилита не установлена ​​на вашем системы (например, вы используете OS X), тогда вы все равно можете легко генерировать эти пароли с использованием Python. Во-первых, убедитесь, что пароль Passlib хеширующая библиотека.

pip install passlib

Как только библиотека будет готова, значения пароля SHA512 может быть сгенерировано следующим образом:

python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"

Ответ 4

Я использую следующую команду оболочки для установки пароля.

- name: "Set user password: someuser"
  command: 'echo "somepassword"| passwd --stdin "someuser"'
  sudo: yes

Ответ 5

Я взял @felix answer и превратил его в script, который мог бы включить в проект докеров, над которым я работаю. Я знаю, что многие разработчики используют macOS/OSX и что на этой платформе нет mkpasswd, поэтому я сохраняю их в Google.

Я добавил следующие параметры:

  • PROCESS_TIME (boolean)
    • Включает вторую строку вывода с количеством раундов и временем процессора
  • ROUNDS (целое число)
    • Переопределяет значение default_rounds, которое настроено на использование ~ 300 мс в "средней" системе. Вы хотите как минимум 100 мс, но должны быть такими же большими, как вы можете себе позволить.
#!/usr/bin/env python3

# Because OSX doesn't have mkpasswd...

# Based on /questions/308000/how-do-i-create-a-user-and-set-a-password-using-ansible/1500753#1500753
# python3 -c "from passlib.hash import sha512_crypt; print(sha512_crypt.encrypt(input()))" <<< bruno  # NOQA

# Usage:
#
# $ ./mkpasswd.py
# Password:
# $6$rounds=656000$pfFmQISGcjWHOCxW$rBptiSK.tqSPnUiq6KiSHzz6LvvW/x1SjkkWFwxWB9Dt75NLNBs0N3OyGV4K5ejjBs/u.o3jtigvUKbmmwVQP.
#
# $ PROCESS_TIME=1 ./mkpasswd.py
# Password:
# $6$rounds=656000$e0OGrad82DBrUo9T$ldqtOdN54gmXI6nb0D.Y5mm5ih.LIQm/Ep/bkNL76.3hE65FqXA9wyZ.M5YOrv6dSvwhPAktXGJ6LJT0Fgd4x.
# 656000 rounds in 1.008705 seconds of cpu time
#
# $ ROUNDS=1280000 PROCESS_TIME=1 ./mkpasswd.py <<< bruno
# $6$rounds=1280000$QO5FSyw5rQpiY6PI$0zRMJ4RzCbH61XxIdpsUm/79.VZ13Mm9TBN9GvJwt1LI1U5FVzakrLya5VJsXlTou3p5ZeWmo29bIUjubRuc31
# 1280000 rounds in 1.9206560000000001 seconds of cpu time

import os
import sys
import time
from getpass import getpass
from passlib.hash import sha512_crypt

rounds = os.environ.get('ROUNDS')
if not rounds:
    rounds = sha512_crypt.default_rounds

passwd = input() if not sys.stdin.isatty() else getpass()

proc = sha512_crypt.using(rounds=rounds)
start = time.process_time()
out = proc.encrypt(passwd)
end = time.process_time()

print(out)

if os.environ.get('PROCESS_TIME'):
    print('{} rounds in {} seconds of cpu time'.format(rounds, end-start))

Ответ 6

попробуйте это

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"

Ответ 7

Вы можете использовать фильтры jinja2, которые могут обрабатывать генерацию зашифрованных паролей. Ниже приведен рабочий пример создания пользователя linux с предоставленным паролем:

- name: Creating Linux User
  user:
    name: "{{ myuser }}" 
    password: "{{ mypassword | password_hash('sha512') }}"

Надеюсь, это поможет вам и другим.

Ответ 8

Для этого требуется pwgen на целевом хосте:

- name: generate linux user password
  local_action: shell /usr/bin/pwgen 16 1
  register: generated_linux_user_password

Используйте hosts: localhost, set_fact и hostvars, если вам нужна "переменная", доступная по всему миру (факты начинаются только после создания):

{{hostvars['localhost']["new_fact"]}}