如何在Ubuntu 20.04上使用Cloud-init设置自定义密码?

10
最近,我通过将我的配置文件挂载在镜像中使得Cloud-Init工作正常。这很好,也能够提示我如果配置文件出现问题。但是,它没有告诉我为什么我无法登录。
尝试过的方法是使用"echo possible | mkpasswd -m sha-512 -s"创建自己的密码,并复制快速入门页面上的示例:https://wiki.ubuntu.com/FoundationsTeam/AutomatedServerInstalls/QuickStart。但是,这些都不起作用。我还尝试设置自定义用户名,但并没有改变任何内容。默认的 "ubuntu: ubuntu" 也无法使用。Ubuntu和空白也一样无效。
我所使用的是: https://releases.ubuntu.com/20.04/ubuntu-20.04-live-server-amd64.iso https://wiki.ubuntu.com/FoundationsTeam/AutomatedServerInstalls/QuickStart
# echo possible | mkpasswd -m sha-512 -s                                    
$6$nqZiIASVBA.iF$9nubU0ImWVrv4XhtEq9XhSh9UYNFQ7yC9Lf7A.uheSlJ3cgI5d9ltkUwRq.X8lAwoQuLAMem6v.gJNGYwk5XA0

以下配置及其提供的密码或上述内容:
#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: ubuntu-server
    password: "$6$exDY1mhS4KUYCE/2$zmn9ToZwTKLhCw.b4/b.ZRTIZM30JZ4QrOQ2aOXJ8yk96xpcCof0kxKwuX1kqLG/ygbJ1f8wxED22bTL4F46P0"
    username: ubuntu

我还尝试过设置用户块,像这样: https://gist.github.com/leogallego/a614c61457ed22cb1d960b32de4a1b01#file-ubuntu-cloud-virtualbox-sh-L46-L56 我的要求是:
  • 更好的文档说明所需哈希类型。
  • 可工作的用户数据配置。
6个回答

7

我终于找到了一个可用的配置,可以创建一个可用的账户;

users:
  - default
  - name: kim
    passwd: "$6$kW4vfBM9kGgq4hr$TFtHW7.3jOECR9UCBuw9NrdSMJETzSVoNQGcVv2y.RqRUzWDEtYhYRkGvIpB6ml1fh/fZEVIgKbSXI9L1B6xF."
    shell: /bin/bash
    lock-passwd: false
    ssh_pwauth: True
    chpasswd: { expire: False }
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    ssh_authorized_keys:
     - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCbJ7oF5RXUj6R1ewF15X2i6RieWFmVUkOyT0DwzgfI8fRl5mMMSRlDRYQi3NznwcWDAxLApF82FomNv8vk1V2SXDGGs8XpOvtgAPpR3JUKJGmxoiES7rxa7bq/JSmpGprsnlCocTJnOfDz6Gz2Ge4+D84EZHOW7ejbkWDBdXOYYRMIlRSoXBkb0017G/OIvPNdwZRYLzLJYjGGL08GX+/Da+lrbz8/FaewXwb/BfjRYESOG+aJNTCOQfgzNsFGJ6EslsMc1bDtCq2pvWUenlUo/2BEAICiJxmXZkAjDrIYcyTzHLE14+UfCiC6pbMEdXF2ndUARr0HcNpvJz8K0Mg4CfjRpxaopfPfHp/lMR36ys0r4bT3q9iU4ClnUAeWxbCK7pUN+D/6TVrIKLOLuuIph81sb5+jW23ycg0fjQ/2/ttKQvTzHwomN6B6T/KgXVt367Iq+uzN02wtk282pJOIIqVi3PSHVcJl1I+bFAzeEdmJP29d/wnp0ZyuNYDp0P8= miesl@mies-pc

autoinstall:
    version: 1
    identity:
        hostname: yamanouchi-node-1
        username: ubuntu
        password: "$6$exDY1mhS4KUYCE/2$zmn9ToZwTKLhCw.b4/b.ZRTIZM30JZ4QrOQ2aOXJ8yk96xpcCof0kxKwuX1kqLG/ygbJ1f8wxED22bTL4F46P0"
    refresh-installer:
        update: yes

它创建了一个用户名为 kim,密码为possible 的用户。我不确定是否需要刷新安装程序(我认为不需要)。它使用ssh密码和无密码root非常不安全,但是至少可以由您自己进行配置。
ubuntu 账户仍然无法使用。我不知道原因。

2
你的示例中多余的“ssh-rsa”字符串导致了ssh密钥认证无法工作。将其删除后,我能够使用密钥认证登录。 - mike
谢谢!记录一下,如果将此“users”部分放在“autoinstall/user-data”下面也是可以工作的。 - bviktor
在20.04中,用户数据或用户:对我来说根本不起作用,有什么想法吗? - Wang
看起来对所有账户而言,lock_passwd(密码锁定)的设置默认为 true(锁定)。如果您想要使用 ubuntu 用户登录,则需要定义 lock_passwd: false(不锁定密码)。另外请注意:在当前版本的 cloud-init 中,lock-passwd 已改为 lock_passwd。请参阅用户和组文档 - Jürgen Hörmann

4

我没有足够的声望来发表评论,但正如此处所述,并且我可以通过我的测试确认,要为现有用户设置密码,您必须使用hashed_passwd,而不是简单地使用passwd

示例:

#cloud-config
users:
  - name: root
    lock_passwd: false
    hashed_passwd: <output from mkpasswd --method=SHA-512 --rounds=4096>
    ssh_authorized_keys:
      - ssh-rsa <key>

3
如果您通过cloud-init添加任何用户,则默认的ubuntu用户根本不会被创建。您会注意到/home/ubuntu/目录不存在。
为了创建我的cloud-init,以允许SSH身份验证,并设置密码,以便我可以使用sudo,我已经成功地使用了以下步骤:
使用mkpasswd创建密码哈希:
$ mkpasswd -m sha-512
Password:  <enter your password here>
$6$nq4v1BtHB8bg$Oc2TouXN1KZu7F406ELRUATiwXwyhC4YhkeSRD2z/I.a8tTnOokDeXt3K4mY8tHgW6n0l/S8EU0O7wIzo.7iw1

然后,我在我的cloud-init中使用了这个部分:
users:
  - name: brandon
    groups: [ sudo ]
    shell: /bin/bash
    lock_passwd: false
    passwd: "$6$nq4v1BtHB8bg$Oc2TouXN1KZu7F406ELRUATiwXwyhC4YhkeSRD2z/I.a8tTnOokDeXt3K4mY8tHgW6n0l/S8EU0O7wIzo.7iw1"
    ssh-authorized-keys:
    - ssh-ed25519 AAAAC3NzaC1lZDI1zzzBBBGGGg3BZFFzTexMPpOZJbSa6OlzycjkPhsh4Qg2tSWZyXZ my-key-name

我更喜欢使用groups: [ sudo ]语法授予组sudo访问权限,这是个人偏好,而不是使用sudo指令。


2

如果您的镜像是:focal-server-cloudimg-amd64.img

rm -f vm_0001-focal-server-cloudimg-amd64.qcow2
qemu-img create -f qcow2 -F qcow2 -b focal-server-cloudimg-amd64.img  vm_0001-focal-server-cloudimg-amd64.qcow2 20G
qemu-img info vm_0001-focal-server-cloudimg-amd64.qcow2
VM_NAME="ubuntu-20-cloud-image"
USERNAME="programster"
PASSWORD="thisok"
echo "#cloud-config
system_info:
  default_user:
    name: $USERNAME
    home: /home/$USERNAME

password: $PASSWORD
chpasswd: { expire: False }
hostname: $VM_NAME

# configure sshd to allow users logging in using password 
# rather than just keys
ssh_pwauth: True
" | sudo tee user-data
cloud-localds ./cidata.iso user-data
qemu-system-x86_64 -m 2048 -smp 4 -hda ./vm_0001-focal-server-cloudimg-amd64.qcow2 \
      -cdrom ./cidata.iso -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5555-:22 -nographic

另一个例子:

rm -f vm_0001-focal-server-cloudimg-amd64.qcow2
qemu-img create -f qcow2 -F qcow2 -b focal-server-cloudimg-amd64.img  vm_0001-focal-server-cloudimg-amd64.qcow2 20G
qemu-img info vm_0001-focal-server-cloudimg-amd64.qcow2
cat >user-data <<'EOF'
#cloud-config
users:
  - default
  - name: jamlee
    homedir: /home/jamlee
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    lock_passwd: false
    shell: /bin/bash
    passwd: $6$yO/Yf/zQbbIXlaHN$cA/i6a6.Cp7cnHl9HEhSPyVLtsitWs3oe/2NARVCKAn54LU2kT92/vqzpeSP3N87SGFkSHGBe7uQxshZXTbL./
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC6/fB4NNy2k+oAHA4Q4pOUCdH997mQq9BtxoOx99MdS+cRKYITVlN1VaLW+beYgTtTYLRdrJhgPBCk9BzriUEXhFO1D6cOslkCxHsQO5M8FPJEU+I/OSRvpU2QYnhYwP9RRKs1XjwdJ2sg924xYLHdfqcRazRFdLGmKnmz8lLrhz0HrBaBIG8Qm58YpfSrkEQ6eAs+1Xf/1VlCTN4sKq2lwLYGFv8GkMOPRndhiEEc5HTZPfGtOp928xJR63WxUoWn2deDGQxU+Z3wGlZ4Ag0SHGM6uZkaRD+LYZHj+m7J979SJ2uqiLC4YCMjoQF5yqUgsu6bzvVh5TesrW2FZ1PrdWjxZGkmS7gv5PJnAdJ4xKLuuG9Bq5QZmWSTPMaKo6Z23HbAbmBj1stUfNbF7apt+GPiGjR4yZk5+tNCQ2n5fRCufNdsFyeBIXnx6MMugbKq2O70F365fyVNR0otleISpmnpnPlfG+n/+rhdf6w5+b0SYaJ3bBYMdXCrTZ8lj68= root@DESKTOP-SBBNAKK
system_info:
    default_user:
      name: ubuntu
      home: /home/ubuntu
password: ubuntu
chpasswd:
    expire: false
hostname: vm-001
ssh_pwauth: yes
EOF
cloud-localds ./cidata.iso user-data
qemu-system-x86_64 -m 2048 -smp 4 -hda ./vm_0001-focal-server-cloudimg-amd64.qcow2 \
      -cdrom ./cidata.iso -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5555-:22 -nographic

1

针对Ubuntu 20.04,我发现如果没有/etc/securetty文件,就无法登录控制台。我这样回答是因为不清楚您是否正在尝试通过控制台访问您的帐户。

runcmd:
    - cp /usr/share/doc/util-linux/examples/securetty /etc/securetty

如果我将/etc/securetty安装为runcmd,那么我就可以使用这些cloud-config用户在系统控制台上登录。否则,身份验证将失败。
我不对决定使用此示例的安全后果做出任何声明。

1

我也遇到了同样的问题。在安装过程中使用shell,我发现没有创建用户,因此重启后我们无法登录。我不知道原因是什么,可能是subiquity中的一个bug或者缺乏如何正确使用它的文档。尽管如此,我还是能够使用我的autoinstall文件中的这个技巧创建一个用户:

  late-commands:
    - useradd -m -R /target -u 1001 ubuntu
    - echo "ubuntu:ubuntu" | chroot /target /usr/sbin/chpasswd
    - usermod -R /target -aG sudo ubuntu

1
看到你的回答让我重新搜索了一下,自从发布这个问题以来,有很多人抱怨cloud-init实现。然而,我找到了另一个人做类似事情的配置(在Vbox中使用20.04),他们的用户部分包括一些我之前没见过的选项。添加一个shell并将lock-passwd设置为false似乎可以解决这个问题。这真是一次奇妙的旅程。 - Mies van der Lippe
@MiesvanderLippe,你是否有你所提到的Vbox配置页面的链接?我看到了你的其他答案 - 你是否找到了“修复”ubuntu帐户的方法? - monkeyhybrid
我在VirtualBox中使用它; https://superuser.com/questions/827977/use-cloud-init-with-virtualbox 但我已经编写了脚本,使用VboxManage命令自动挂载。对于Ubuntu账户不确定。由于没有人回答,我放弃了这个问题,只是自己设置了4个虚拟机。我正在使用Ansible进行其余的管理工作。 - Mies van der Lippe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接