View on GitHub

guoxiaod.github.io

Anders' Pages

SaltStack 2018-08-05

SALT.STATES.USER

添加账号

# user.sls -- begin 
{%
set users = [
  {
    'login': 'anders', 'uid': 1000, 'gid': 100, 'sudo': True,
    'password': '$6$xxxxxxxx$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  },
  {
    'login': 'anders2', 'uid': 1000, 'gid': 100, 'sudo': True,
    'password': '$6$xxxxxxxx$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  }
]
%}

{% for user in users %}
{{ user.login }}:
  user.present:
    - shell: /bin/bash
    - password: {{ user.password }}
    - gid: {{ user.gid }}
    - uid: {{ user.uid }}
    - createhome: True
{% if user.sudo %}
    - groups:
      - wheel
{% endif %}
{% endfor %}
# user.sls -- end 

上面提到的 password 并不是密码明文,而是密码明文使用特定算法处理的哈希串,可以使用如下的脚本来生成:

## Python 代码
## 使用交互式的方式生成 password 
$ python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'
## 直接在脚本中指定明文密码, 生成 password
$ python -c 'import crypt,getpass;pw="12345678";print(crypt.crypt(pw))'
## PHP 代码
$ php -r 'echo crypt("yourpassword", "$6$" . base64_encode(random_bytes(6)) . "$");'

SALT.STATES.SSH_KNOWN_HOSTS

确保指定的域名在 给定的 user 的 known_hosts 文件中

anders.just-a-example.com:
  ssh_known_hosts:
    - present
    - user: root
    - enc: ecdsa
    - fingerprint: 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx'
    - fingerprint_hash_type: sha256

上面提到的 fingerprint 为 给定的域名(anders.just-a-example.com 指向的服务器的 fingerprint, fingerprint_hash_type 设定 fingerprint 的类型, fingerprint_hash_type 支持:

  1. md5
  2. sha256 (推荐使用 sha256)

可以通过如下的方式来获取到对应的 fingerprint

# 如果选择 md5, 使用如下命令获取
# (命令中的 -t 参数 需要和 ssh_known_hosts 中的 enc 参数一致)
$ ssh-keyscan -t ecdsa anders.just-a-example.com 2>/dev/null \
    | ssh-keygen -E md5 -lf /dev/stdin \
    | awk '{print $2;}' | sed -e 's/MD5://;'

# 如果选择 sha256, 使用如下命令获取
# 目前 salt 仅仅支持 这种 xx:xx:xx 格式的 fingerprint
# 所以需要将 sha256 的 base64 格式转换成 xx:xx:xx 的格式
# 可以参考: https://github.com/saltstack/salt/issues/41653
$ ssh-keyscan -t ecdsa anders.just-a-example.com 2>/dev/null \
    | ssh-keygen -E sha256 -lf /dev/stdin \
    | awk '/SHA256/ { split($2, a, ":"); print a[2]}' \
    | base64 -d 2>/dev/null  \
    | hexdump -e '/1 "%02x:"' \
    | sed -e 's/:$/\n/' 

参考文档

  1. https://docs.saltstack.com/en/latest/ref/states/all/salt.states.ssh_known_hosts.html
  2. https://docs.saltstack.com/en/latest/ref/states/all/salt.states.user.html
  3. http://www.cnblogs.com/f-ck-need-u/p/6089869.html
  4. https://github.com/saltstack/salt/issues/41653
  5. https://www.sanfoundry.com/10-practical-hexdump-command-usage-examples-in-linux/