You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Fedora CoreOS本地密码认证及SSH访问规则

问题排查:Fedora CoreOS Ignition配置异常

我的需求

  • 本地访问(物理机/KVM或虚拟机控制台)时,所有用户(root及其他用户)可通过密码登录;
  • SSH访问时,仅允许非root用户通过公钥登录,禁用root的SSH登录。

问题描述

通过Ignition配置Fedora CoreOS并在VirtualBox中启动测试后,出现以下问题:

  • 以非root用户SSH登录后,无需密码即可通过su或sudo -s切换用户;
  • 尝试通过VB控制台本地登录失败;
  • 检查/etc/shadow发现用户密码哈希与Ignition配置一致;
  • 仅通过passwd命令修改密码后,系统才接受密码。

已尝试操作

编写了用于测试的开发脚本(如下),参考了Fedora CoreOS官方认证文档,请求排查脚本是否存在问题:

#!/usr/bin/env bash

# 依赖:
# - Docker;
# - VirtualBox;
# - GNU `grep`;
# - GNU `sed`;
# - `coreutils`(用于`basename`, `cat`, `chmod`, `dirname`, `mkdir`, `realpath`);
# - `curl`;
# - `iproute`(用于`ip`命令);
# - `openssh`;
# - `openssh-client`.


# 常量
docker_project_name='fcos_ign_server'
nginx_port=8888
non_root_user_pass='testpassword'
non_root_username='testuser'
root_pass='rootpassword'
ssh_port=3333
vm_name='fcos'

# 变量
root_path="$(realpath "$(dirname "$0")")/$vm_name"
fedora_coreos_image_url='https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/38.20230709.3.0/x86_64/fedora-coreos-38.20230709.3.0-virtualbox.x86_64.ova'
fedora_coreos_image_basename="$(basename "$fedora_coreos_image_url")"
fedora_coreos_image_path="$root_path/$fedora_coreos_image_basename"
bu_path="$root_path/config.bu"
compose_path="$root_path/compose.yml"
host_ip_address="$(ip a show wlp0s20f3 | grep -Po 'inet \K[^/]+')"
ign_path="$root_path/config.ign"
nginx_config="$root_path/nginx.conf"
ssh_private_key_path="$HOME/.ssh/$non_root_username@${vm_name}_$USER@$HOSTNAME"

# 确保配置文件夹存在
mkdir -p "$root_path"

# 下载VirtualBox版Fedora CoreOS镜像
if [ ! -e "$fedora_coreos_image_path" ]; then
  curl -o "$fedora_coreos_image_path" "$fedora_coreos_image_url"
fi

# 生成密码哈希
# 注:我试过用`yescrypt`生成哈希,也试过不用
# root_pass_hash="$(docker run --rm quay.io/coreos/mkpasswd -sm yescrypt <<< "$root_pass")"
# non_root_pass_hash="$(docker run --rm quay.io/coreos/mkpasswd -sm yescrypt <<< "$non_root_user_pass")"
root_pass_hash="$(docker run --rm quay.io/coreos/mkpasswd -s <<< "$root_pass")"
non_root_pass_hash="$(docker run --rm quay.io/coreos/mkpasswd -s <<< "$non_root_user_pass")"

# 生成新SSH密钥对
if [ ! -f "$ssh_private_key_path" ]; then
  ssh-keygen -t ed25519 -a 100 -P '' -f "$ssh_private_key_path"
  chmod 600 "$ssh_private_key_path"
fi

# 创建Butane配置文件
cat << EOF > "$bu_path"
variant: fcos
version: 1.4.0
passwd:
  users:
    - name: $non_root_username
      groups:
        - docker
        - systemd-journal
        - sudo
      password_hash: $non_root_pass_hash
      ssh_authorized_keys:
        - $(cat "${ssh_private_key_path}.pub")
    - name: root
      password_hash: $root_pass_hash
storage:
  disks:
  - device: /dev/disk/by-id/coreos-boot-disk
    wipe_table: false
    partitions:
    - number: 4
      label: root
      # 给根文件系统分配至少8GiB空间,参考上方说明
      size_mib: 8192
      resize: true
    - size_mib: 0
      # 给分区指定描述性标签,这很重要
      # 便于在配置的其他部分以设备无关的方式引用它
      label: controlserver
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: controlserver
  filesystems:
    - path: /var/controlserver
      device: /dev/disk/by-partlabel/controlserver
      # 可以选择想要的文件系统类型
      format: ext4
      with_mount_unit: true
EOF

# 将Butane配置转换为Ignition配置
docker run -i --rm quay.io/coreos/butane:release --strict < "$bu_path" > "$ign_path"

# 创建精简版Butane配置
cat << EOF > "$(dirname "$bu_path")/slim_$(basename "$bu_path")"
variant: fcos
version: 1.4.0
ignition:
  config:
    replace:
      source: http://$host_ip_address:$nginx_port/config.ign
EOF

# 将精简版Butane配置转换为Ignition配置
docker run -i --rm quay.io/coreos/butane:release --strict < "$(dirname "$bu_path")/slim_$(basename "$bu_path")" > "$(dirname "$ign_path")/slim_$(basename "$ign_path")"

# 创建Nginx配置
cat << EOF > "$nginx_config"
server {
  listen $nginx_port;
  server_name _;

  location / {
    root /srv;
    # 取消下一行注释可启用文件列表
    autoindex on;
  }
}
EOF

# 创建Docker Compose文件
cat << EOF > "$compose_path"
version: '3.8'

services:
  server:
    image: nginx:alpine
    restart: always
    ports:
      - 0.0.0.0:$nginx_port:$nginx_port
    volumes:
      - ./config.ign:/srv/config.ign:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
EOF

# 启动Nginx代理服务器托管精简版Ignition配置
docker compose -f "$compose_path" -p "$docker_project_name" up -d

# 停止虚拟机
VBoxManage controlvm "$vm_name" poweroff

# 删除虚拟机
VBoxManage unregistervm "$vm_name" --delete

# 从SSH known_hosts中移除该虚拟机记录
sed -i "/^\[localhost\]:$ssh_port/d" ~/.ssh/known_hosts

# 将镜像导入VirtualBox
VBoxManage import --vsys 0 --vmname "$vm_name" "$fedora_coreos_image_path"

# 设置Ignition配置为VirtualBox属性
VBoxManage guestproperty set "$vm_name" /Ignition/Config "$(cat "$(dirname "$ign_path")/slim_$(basename "$ign_path")")"

# 允许SSH连接到虚拟机
VBoxManage modifyvm "$vm_name" --natpf1 "guestssh,tcp,,$ssh_port,,22"

# 启动虚拟机
VBoxHeadless -startvm "$vm_name" &> /dev/null & disown

# 通过SSH连接到虚拟机
ssh -p "$ssh_port" -i "$ssh_private_key_path" "$non_root_username@localhost"

内容的提问来源于stack exchange,提问作者tukusejssirs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:07:05