如何强制用户在自动安装中首次登录时更改密码?

如何强制用户在自动安装中首次登录时更改密码?

我正在通过网络启动安装 Ubuntu Focal,所有基本功能均正常运行。我使用此模板作为用户数据 yaml 文件,它会创建用户、设置密码并导入我指定的任何 ssh 密钥:

#cloud-config
autoinstall:
  apt:
    geoip: true
    preserve_sources_list: false
    primary:
    - arches: [amd64, i386]
      uri: http://us.archive.ubuntu.com/ubuntu
  identity: {
    hostname: <HOSTNAME>,
    password: <PWHASH>,
    realname: <USER>,
    username: <USER>
  }
  user-data:
    timezone: America/Los_Angeles
  keyboard: {layout: us, toggle: null, variant: ''}
  locale: en_US
  network:
    ethernets:
      mainif:
        match:
          macaddress: <MAC>
        set-name: eth0
      eth0:
        dhcp4: true
    version: 2
  ssh:
    allow-pw: true
    authorized-keys: [ <SSHKEY> ]
    install-server: true
  version: 1

我想让用户在第一次登录时必须更改密码。

我尝试过的事情:

  • 后期命令

    curtin in-target --target=/target --passwd --expire <USER>
    

    这会失败,因为后期命令显然在创建用户之前执行,尽管文档说

    在安装成功完成并安装所有更新和包之后,在系统重新启动之前运行的 Shell 命令。`

    安装程序崩溃了,我在崩溃报告中看到/var/crash/$date.unknown.crash命令失败,退出状态为 1。手动登录,chrooting 到 /target,并尝试该命令确认这一点,说用户“dan”不存在,并且它没有出现在 /etc/passwd 或 /etc/shadow 中:

    chroot /target 的片段,寻找指定用户被创建的任何证据

  • chpasswd: {expire: True}在身份部分中使用

    安装程序崩溃,提示 chpasswd 意外发生。

  • 使用 bootcmd

    这被默默忽略了

  • 使用 late 命令在 /target 中写入 cron

     - /usr/bin/echo "@reboot root /usr/bin/passwd --expire dan && rm /etc/cron.d/update-pass" > /target/etc/cron.d/update-pass
    

    这确实能起到作用,但是看起来超级脆弱,而且极难维护。

自动安装程序是否具有我尚未发现的内置功能?

答案1

编辑:我将保留下面我所分享的内容,但我意识到当您真正想强制用户在第一次登录时更改密码时,我执着于您想要更改用户创建选项。

它似乎cloud-init确实有一个过期密码选项。因此,您仍然可以使用它late-commands来修改文件/target/var/lib/cloud/seed/nocloud-net/user-data

https://cloudinit.readthedocs.io/en/latest/topics/modules.html#set-passwords

默认情况下,系统上所有用户的密码都会过期(这意味着用户下次登录时必须重置密码)

看着来源,该语句似乎仅适用于使用 指定密码的用户chpasswd。将以下配置附加到user-data可能会强制用户在下次登录时更改密码

chpasswd:
    list: |
        <USER>:<PWHASH>

以下是原帖

您必须执行类似使用late-commands调用的操作sed来修改文件/target/var/lib/cloud/seed/nocloud-net/user-data

服务器安装程序,下位性,获取您的autoinstall配置并创建cloud-init首次启动时要使用的配置。但是,下位性只支持实际功能的一部分cloud-init。查看源代码,你可以看到下位性实际上将此设置硬编码为'lock_passwd': False,

https://github.com/canonical/subiquity/blob/a76581cd2b973b55e55c6ac05b5bf47168493140/subiquity/models/subiquity.py#L197

您无法更改用户,late-commands因为该用户尚不存在。该用户在首次启动时由 创建cloud-init

此代码片段未经测试,但autoinstall这样的配置应该可以满足您的要求

late-commands:
    - sed -ie 's/lock.passwd.*/lock_passwd: true,/' /target/var/lib/cloud/seed/nocloud-net/user-data

小细节。取决于下位性版本,user-data文件可能包含lock_passwd或。正则lock-passwd表达式lock.passwd应该匹配 和。初始版本中有一个错误cloud-initlock_passwd20.04发布 -https://github.com/canonical/subiquity/pull/784

相关内容