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

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

4b9b3361

Ответ 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),
}

Пояснения

  • тэг sha здесь, чтобы указать crypt хэш-метод, который мы хотим: 6 - тип хэша для SHA-512

    • $1 $- > MD5
    • $2a $- > Blowfish (не в mainline glibc, добавлен в некоторые дистрибутивы Linux)
    • $5 $- > SHA-256 (начиная с glibc 2.7)
    • $6 $- > SHA-512 (с момента glibc 2.7)

спасибо davey и wiki_crypt

  1. sys.stdout.write is here, чтобы избежать '\n' print

  2. base64.b64encode(os.urandom(16))[:8]):

    • os.urandom(16) создать двоичную строку длиной 16 бит
    • base64.b64encode закодировать эту строку в base64
    • [:8] возьмите первые 8 символов этой строки (поскольку длина кодировки base64 может меняться)
  3. 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 и вставьте