Управление паролем пользователя для Linux в Puppet
Мне нужно создать тестового пользователя с паролем, используя puppet.
Я читал, что Puppet не может управлять паролями пользователей общим кроссплатформенным способом, что очень жаль.
Я делаю это для Red Hat Enterprise Linux Server версии 6.3.
Я делаю следующее:
user { 'test_user':
ensure => present,
password => sha1('hello'),
}
кукольный обновляет пароль пользователя,
но Linux говорит неправильный логин /pwd при попытке войти в систему.
Это работает (я могу войти в систему), если я устанавливаю пароль вручную в Linux с помощью sudo passwd test_user
, а затем смотрю на /etc/shadow
и жестко кодирую это значение в кукольном коде. что-то вроде:
user { 'test_user':
ensure => present,
password => '$1$zi13KdCr$zJvdWm5h552P8b34AjxO11',
}
Я также попытался, добавив $1$
перед sha1('hello')
,
но это также не работает (обратите внимание, $1$
обозначает sha1).
Как изменить первый пример, чтобы он работал (используя открытый текст в файле марионеток)?
П.С.: Мне известно, что я должен использовать LDAP, или sshkeys, или что-то еще, вместо того, чтобы жестко кодировать пароли пользователей в файле puppet. однако, я делаю это только для запуска теста марионеточного бродяги, так что можно жестко закодировать пароль пользователя.
Ответы
Ответ 1
У меня был успех (gist) с ruby String # crypt методом из функции парсера-кукольника.
AFAICS его использует функции crypt libc (см. info crypt
) и принимает те же аргументы $n$[rounds=<m>$]salt
, где n - функция хэширования ($ 6 для SHA-512), а m - количество раундов усиления ключа ( 5000 по умолчанию).
Ответ 2
Пользователи Linux имеют свои пароли, хранящиеся как хэш в файле /etc/shadow. Кукольный передает пароль, указанный в определении типа пользователя, в файле /etc/shadow.
Создайте свой хеш-пароль с помощью команды openssl:
#openssl passwd -1
#Enter your password here
Password:
Verifying - Password:
$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM
Предыдущий пример генерирует этот хеш:
$ 1 $HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/
Добавьте этот хеш-пароль в свой класс, как показано (не забывайте кавычки)
user { 'test_user':
ensure => present,
password => '$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/',
}
Ответ 3
В пакете stdlib puppetlabs реализована аналогичная функция pw_hash
принятого ответа.
Обязательно добавьте библиотеку в свою конфигурацию. Если вы используете библиотекарь, просто добавьте в свой Puppetfile
mod 'puppetlabs-stdlib'
Затем для создания пользователя просто:
user { 'user':
ensure => present,
password => pw_hash('password', 'SHA-512', 'mysalt'),
}
Ответ 4
Функция sha1
в марионетке напрямую не предназначена для записей passwd, как вы выяснили.
Я бы сказал, что настройка хеша, а не пароль - хорошая практика! В любом случае, вы не должны восстанавливать пароль - вы можете его генерировать один раз, или вы можете генерировать марионетку каждый раз - генерация этого хэша однажды должна быть достаточной ИМХО...
Вы можете сгенерировать пароль на Debian/Ubuntu следующим образом:
pwgen -s -1 | mkpasswd -m sha-512 -s
... на CentOS вы можете использовать команду grub-crypt вместо mkpasswd...
Ответ 5
Вы можете использовать generate
, чтобы Puppet создавал хэш для вас:
$password = 'hello'
user { 'test_user':
ensure => 'present',
password => generate('/bin/sh', '-c', "mkpasswd -m sha-512 ${password} | tr -d '\n'"),
}
Ответ 6
Puppet: пользователь с хешированным паролем SHA 512
Я придумал метод, который не нуждается в добавлении, если у вас есть python 2.6. Я тестировал это на puppet 3.6.2
на CentOS 6.4
:
$pass="password"
$shatag="\$6\$"
$cmd="import crypt, base64, os, sys; sys.stdout.write(crypt.crypt('$pass', '$shatag' + base64.b64encode(os.urandom(16))[:8]))"
user { 'boop':
ensure => present,
password => generate ("/usr/bin/python", "-c", $cmd),
}
Пояснения
спасибо davey и wiki_crypt
-
sys.stdout.write is here
, чтобы избежать '\n'
print
-
base64.b64encode(os.urandom(16))[:8])
:
-
os.urandom(16)
создать двоичную строку длиной 16 бит
-
base64.b64encode
закодировать эту строку в base64
-
[:8]
возьмите первые 8 символов этой строки (поскольку длина кодировки base64 может меняться)
-
generate
- это марионеточная функция, которая создает текст, когда на марионетке.
Вы не можете использовать эту функцию, как хотите, потому что она "защищена" ê.é (последнее сообщение предлагают обходной путь к этой защите или-независимо)
HTH
Ответ 7
В моем Vagrantfile я сделал это:
$newuserid = ENV["USERNAME"]
config.vm.provision :puppet do |puppet|
puppet.module_path = "modules"
puppet.manifests_path = "manifests"
puppet.manifest_file = "main.pp"
puppet.facter = {"newuserid" => $newuserid}
puppet.options = "--verbose"
end
И в моем файле main.pp:
user { $newuserid :
ensure => present,
home => "/home/${newuserid}",
managehome => true,
gid => "mygid",
}
exec { 'set password':
command => "/bin/echo \"${newuserid}:${newuserid}\" | /usr/sbin/chpasswd",
require => User [ $newuserid ],
}
Ответ 8
просто создайте зашифрованный пароль из grub-crypt -sha-512 и вставьте