如何配置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
相关产品推荐
相关产品推荐

