Я использую Puppet для управления паролями пользователей. (Да, я знаю, что LDAP лучше, но мне было сказано выше использовать Puppet.) У меня есть этот класс, который при запуске от имени root меняет пароль bob на «bobs_new_password». В идеале он должен запрашивать новый пароль, когда Боб запускает его, но я смогу добавить эту функцию позже. Когда я запускаю его как root с puppet agent --test
, он говорит, что все идет хорошо, и уведомляет меня о новом хэше, поэтому я знаю, что он был правильно установлен в /etc/shadow
файл. Прямо сейчас я работаю только с тестовыми пользователями на виртуальных машинах, поэтому меня не беспокоит угроза безопасности, связанная с уведомлением о хэше; эта строка, очевидно, будет удалена для рабочей версии кода. На данный момент у меня есть следующее:
class pwdchange ($newpwd = 'bobs_new_password', $targetuser = "bob") {
$temp = inline_template("<%= Digest::MD5.digest(scope.lookupvar('newpwd'))%>")
$hashtypeidentifier = '$1$' #'$1' for MD5, '$6' for sha512.
user {"$targetuser":
ensure => present,
password => "${hashtypeidentifier}${temp}",
}
notify {"${temp}":}
}
Однако, когда я перехожу на ssh в виртуальную машину как bob, ни старый пароль, ни новый пароль не принимаются. Что я делаю не так? Почему он не принимает ни один из паролей и что я могу сделать, чтобы это исправить?
Пароли MD5 в теневом файле имеют формат $1$salt$hash
, Я не вижу соли в вашем коде.
Смотрите также Как сгенерировать пароль, совместимый с / etc / shadow для Ubuntu 10.04?
Также Ruby's crypt()
функция, которая сгенерирует для вас полную строку теневого файла.