Не удалось войти в систему с помощью скрытого сводного пароля [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

71
задан raphael_turtle 10 October 2013 в 11:07
поделиться

12 ответов

Если вы прочтете руководство Ansible для модуля user , оно направит вас в Ansible-examples 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 или текстовая строка имеет ваш пароль как есть, обычный текст, это означает, что ваш хэш пароля, записанный в теневом файле shadow , неверен. Это означает, что когда вы пытаетесь аутентифицироваться с помощью пароля, его хэш никогда не будет соответствовать.

Кроме того, см. Раздел «Часто задаваемые вопросы» относительно некоторых нюансов параметра пароля и правильного его использования.

76
ответ дан Mxx 17 August 2018 в 14:07
поделиться
  • 1
    Спасибо за совет. Я просто хотел указать, что документация модуля пользователя, связанная выше, рекомендует использовать openssl passwd -salt <salt> -1 <plaintext> для генерации хэша пароля, а не однострочный Python, который у вас выше. У меня возникли проблемы с получением корректного вывода из Python, возможно, из-за моей собственной некомпетентности, и команда openssl работала лучше. – Brendan Wood 12 December 2013 в 23:17
  • 2
    Как синхронизировать соль для использования с ОС? – Breedly 30 September 2016 в 00:25
  • 3
    @Breedly: нет необходимости - соль всегда хранится как часть пароля ($ 1 $ thesalt $ thepasswordhash), что означает, что она переносится между ОС с использованием той же функции хэша – Benjamin Dale 18 November 2016 в 20:44
  • 4
    Использование этой команды python для генерации хэша не сработало для меня. Но я нашел хэш в /etc/shadow после установки пароля вручную, используя passwd <user>. – dokaspar 12 April 2018 в 12:01

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

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"
9
ответ дан Artem Feofanov 17 August 2018 в 14:07
поделиться
  • 1
    Мне нравится это решение, учитывая, что он позволяет вводить пароль при запуске скрипта. Хорошее решение для сценария начальной загрузки, который нельзя запускать каждый раз. Для Ubuntu я использовал «sha512_crypt», хотя. – Gunnar 25 July 2015 в 21:56

Это простой способ:

---
- 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
3
ответ дан bbaassssiiee 17 August 2018 в 14:07
поделиться

Определение задачи для пользовательского модуля должно отличаться в последней версии Ansible.

tasks:
  - user: name=test password={{ password }} state=present
2
ответ дан Christian Berendt 17 August 2018 в 14:07
поделиться

Как создать зашифрованный пароль для перехода к password var в задачу Ansible 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: 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

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

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
1
ответ дан Community 17 August 2018 в 14:07
поделиться
  • 1
    Разве это не генерирует хешированный пароль md5? Разве это небезопасно? – Mark 30 October 2014 в 16:46
  • 2
    @Mark, см. Обновленный ответ – Dmitriy 8 December 2014 в 09:52

Ответ Mxx правильный, но метод python crypt.crypt() небезопасен, когда задействованы разные операционные системы (связанные с алгоритмом хеширования 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
ответ дан Joel B 17 August 2018 в 14:07
поделиться

Вот как это сработало для меня

- 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
ответ дан Joshua 17 August 2018 в 14:07
поделиться

Я хочу предложить еще одно решение:

- 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 для этого. Однако это может быть недостатком безопасности, если кто-то случайно заходит в систему, прежде чем вы это сделаете.

32
ответ дан madhead 17 August 2018 в 14:07
поделиться
  • 1
    Я не мог заставить другое решение работать для меня. Но вы отвечаете просто и сработали. Я бы хотел дать вам 5 яиц, если бы мог. – leesei 28 April 2016 в 10:12
  • 2
    Я не хочу, чтобы мой пароль был жестко закодирован таким образом :( Можно ли вытащить его из скрытого хранилища и ввести его здесь? Вложение, подобное "{{ '{{vaulted_password}}' | password_hash('sha512') }}", похоже, не работает ... – dokaspar 12 April 2018 в 12:11
  • 3
    Пробовали ли вы {{ vaulted_password | password_hash('sha512') }}, где vaulted_password является ключом к значению в хранилище? – madhead 12 April 2018 в 17:08

Цель роли в этом ответе - генерировать случайный пароль для new_user_name и немедленно истек пароль. Имя new_user_name необходимо для изменения пароля при первом входе в систему.

create_user.yml:

---
# create_user playbook

- hosts: your_host_group
  become: True
  user: ansible

  roles:
    - create_user

role / create_user / tasks / 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"
2
ответ дан McKelvin 17 August 2018 в 14:07
поделиться

Вы можете использовать скрытое хранилище для использования секретных ключей в проигрывателе. Определите свой пароль в yml.

ex. pass: secret или

user:
  pass: secret
  name: fake

зашифровать ваш файл секретов с помощью:

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

ansible запросит пароль для его шифрования. (я объясню, как использовать этот проход)

И тогда вы можете использовать свои переменные там, где хотите.

Использование ключа Vault:

через передающий аргумент при запуске 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}}
2
ответ дан pmoksuz 17 August 2018 в 14:07
поделиться
  • 1
    Я пробовал именно это, и он не работает. Полагаю, это потому, что password={{user.pass}} будет расширяться, чтобы включить фактический пароль, в то время как он может ожидать хэш. – texnic 5 October 2017 в 22:05

Если вы хотите выполнить это как команду 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
}
105
ответ дан slm 17 August 2018 в 14:07
поделиться
  • 1
    Отлично, спасибо. – mbarthelemy 11 May 2015 в 19:32
  • 2
    Это правильный ответ. Проголосовать! Благодаря! – dudeman 2 September 2015 в 16:49
  • 3
    Чтобы избежать того, что элемент всегда «изменен», вы можете добавить секретную соль », как второй параметр password_hash. – Michael Wyraz 23 September 2015 в 09:27
  • 4
    Согласно предложению MichaelWyraz: добавление второй соли " param исключает "измененный". Вы можете установить это через переменную, например. password={{upassword|password_hash('sha512', upassword_salt)}}. Это позволяет поместить соль в хранилище переменных переменных , как вы, вероятно, с upassword тоже, сохраняя оба из tasks.yml. – user85461 14 February 2016 в 23:35
  • 5
    Я бы также применил проверку состояния @ bbaassssiiee и добавил update_password: on_create в пользовательский модуль к этому ответу, чтобы предотвратить истечение срока действия паролей для уже созданных пользователей. – madhead 24 April 2016 в 14:34
  • 6
    спасибо mate, я специально искал версию adhoc и имел ту же самую проблему с цитатой, о которой вы упоминали – alexakarpov 31 May 2018 в 20:58
  • 7
    Только одно решение работает для меня с паролем хранилища. Большое спасибо. – Denis Savenko 3 July 2018 в 20:45
  • 8
    по крайней мере, недавние дистрибутивы на основе Debian, похоже, не поддерживают длинный вариант GNU & quot; - stdin & quot; для двоичного кода passwd. – XXL 15 August 2018 в 15:52

Объединив несколько решений сверху, я создал книгу, которая автоматически генерирует правильные хэши паролей на основе паролей открытого текста, хранящихся в зашифрованном локальном файле с сохраненным хранилищем:

---
- 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 ", чтобы расшифровать ваш файл хранилища (см. справку-хранилище для информации о том, как управлять зашифрованным хранилищем).

2
ответ дан Steve Midgley 17 August 2018 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: