Anaconda kickstart 和 rootpw 选项

Anaconda kickstart 和 rootpw 选项

我尝试了几种在 SL 6.5 上生成加密密码的方法,但似乎都不起作用。我在各种 /var/log/anaconda* 文件中没有发现任何错误,但我无法登录,所以显然它不起作用。

我用作模板的原始自动创建文件/root/anaconda-ks.cfg如下所示:

rootpw  --iscrypted $6$...(about 100 characters)
authconfig --enableshadow --passalgo=sha512

接下来我尝试了一下openssl passwd -1,得到了:

rootpw  --iscrypted $1$...(about 30 characters)
authconfig --enableshadow --passalgo=sha512

我意识到这不是 SHA-512,所以我尝试了我发现 Python 单行代码在几个地方重复出现

rootpw  --iscrypted $6...(about 10 characters)
authconfig --enableshadow --passalgo=sha512

什么都不起作用;我无法登录,最终不得不在单用户模式下重置 root 密码。

答案1

确保您的机器上有 shadow 和 passalgo=sha512,将 root 密码设置为您在该机器上想要的任何密码,然后从 /etc/shadow 中获取它并将其放入 kickstart 中。这对于生产用途来说是不可取的。

要以编程方式执行此操作,请使用所选语言的 crypt 库来生成 kickstart 文件:

红宝石:

'password'.crypt('$6$' + (Base64.encode64(6.times.map{ Random.rand(256).chr }.join)).strip)

PHP的:

crypt ('password', '$6$' . base64_encode (openssl_random_pseudo_bytes(6)));

Perl:

crypt ('password', '$6$' . encode_base64 (join '' => map chr (rand (256)), 0..5))

Python:

crypt.crypt('password', '$6$' + base64.b64encode(os.urandom(6)))

强烈建议您每次都使用随机盐,就像我在这里所做的那样,特别是如果您在所有服务器上都使用相同的密码。

编辑Python 3:

crypt.crypt("password", crypt.mksalt())

将对 的调用替换os.random为特定于加密的mksalt

Python 标准库:crypt: crypt.mksalt(): “返回指定方法的随机生成的盐。如果没有给出方法,则使用 methods() 返回的最强方法”

编辑

1) '$6$' 代表 SHA512。您需要将其替换为您选择的加密类型。

2)您也可以将其中任何一个转换成一行程序,以便从 bash 中执行此操作。

编辑(得到完整的答案,感谢米肯32达乌德):

3) BSD crypt 与 GNU crypt 的实现不同,因此它们不兼容。如果您想在 BSD 系统(如 OSX)上使用它,您可以使用 PHP(PHP 版本 > 5.3.0)版本,因为它实现了自己的crypt()功能。

在 Mac 上,另一种方法是使用密码库

python -c 'import getpass; import passlib.hash; h=passlib.hash.sha512_crypt.hash(getpass.getpass()); print(h if (passlib.hash.sha512_crypt.verify(getpass.getpass("Confirm:"), h)) else "")'

或者,使用 glibc 的默认轮数(5000):

python -c 'import getpass; import passlib.hash; h=passlib.hash.sha512_crypt.using(rounds=5000).hash(getpass.getpass()); print(h if (passlib.hash.sha512_crypt.verify(getpass.getpass("Confirm:"), h)) else "")'

答案2

哈希密码的生成方式已记录这里

$ python -c 'import crypt; print(crypt.crypt("My Password", "$6$My salt"))'

它对你不起作用的原因是你使用 Mac 来生成哈希。crypt实现方式与 GNU/Linux 不同。

来自crypt(3)手册页:

   Glibc notes
   The glibc2 version of  this  function  supports  additional  encryption
   algorithms.

   If  salt is a character string starting with the characters "$id$" fol-
   lowed by a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine,  id  identifies  the  encryption
   method  used  and  this  then  determines  how the rest of the password
   string is interpreted.  The following values of id are supported:

          ID  | Method
          ---------------------------------------------------------
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

   So   $5$salt$encrypted   is   an   SHA-256   encoded    password    and
   $6$salt$encrypted is an SHA-512 encoded one.

   "salt" stands for the up to 16 characters following "$id$" in the salt.
   The encrypted part of the password string is the actual computed  pass-
   word.  The size of this string is fixed:

   MD5     | 22 characters
   SHA-256 | 43 characters
   SHA-512 | 86 characters

   The  characters  in  "salt"  and  "encrypted"  are  drawn  from the set
   [a-zA-Z0-9./].  In the MD5 and SHA implementations the  entire  key  is
   significant (instead of only the first 8 bytes in DES).

扩展$id$不存在OSXcrypt

对于 SHA512,您需要在 GNU/Linux 机器中生成哈希。

答案3

新的文档位置,可找到有关为 kickstart 选项生成散列密码的更多信息--iscrypted::

http://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#rootpw

python -c 'import crypt; print(crypt.crypt("My Password", "$6$My Salt"))

这将使用您提供的盐生成密码的 sha512 加密。

答案4

上面的 Python 示例是不完整的:

crypt.crypt('password', '$6$' + base64.b64encode(os.urandom(6)))

一个可行的单行代码如下:

python -c 'import crypt,base64,os; print(crypt.crypt("password", "$6$" + base64.b64encode(os.urandom(6))))'

在 Python 3 下

python -c 'import crypt; print(crypt.crypt("password", crypt.mksalt()))'

相关内容