Как заставить работать аутентификацию по локальному паролю в Fedora CoreOS?

Что я хочу

  1. Я должен иметь возможность войти в систему с помощью пароля как любой пользователь (или другие пользователи) при локальном доступе к машине (либо физический доступ к компьютеру/KVM, либо через консоль гипервизора в случае виртуальной машины).
  2. При доступе к компьютеру через SSH доступ только к открытому ключу должен быть разрешен только для пользователей без полномочий root (rootвход через SSH должен быть отключен).

Определение проблемы

Однако после настройки Fedora CoreOS через Ignition я запускаю машину в VirtualBox (используется только в целях тестирования), однако:

  • при входе в систему через SSH в качестве пользователя без полномочий root я могу сменить пользователя черезsuилиsudo -sбез пароля;
  • при попытке войти локально (через консоль VB) не могу войти;
  • когда я проверяю/etc/shadowдля любого пользователя, для которого я определил хэш пароля, я вижу, что хеш пароля соответствует хэшу из конфигурации Ignition;
  • единственный способ заставить ОС принять мой пароль — это изменить пароль с помощьюpasswdкоманда.

Что я пробовал

Я создал сценарий, который использовал для разработки. Вы видите в этом что-то неправильное? :молиться:

Вот официальная документация FCOS, касающаяся конфигурации аутентификации по паролю.

      #!/usr/bin/env bash

# Dependencies:
# - Docker;
# - VirtualBox;
# - GNU `grep`;
# - GNU `sed`;
# - `coreutils` (for `basename`, `cat`, `chmod`, `dirname`, `mkdir`, `realpath`);
# - `curl`;
# - `iproute` (for `ip` command);
# - `openssh`;
# - `openssh-client`.


# Constants
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'

# Variables
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"

# Make sure the config folder exists
mkdir -p "$root_path"

# Download Fedora CoreOS for VirtualBox
if [ ! -e "$fedora_coreos_image_path" ]; then
  curl -o "$fedora_coreos_image_path" "$fedora_coreos_image_url"
fi

# Hash the passwords
# Note: I have tried generating a password hash using `yescrypt` and without it.
# 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")"

# Generate a new SSH key pair
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

# Create a Butan config
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
      # Allocate at least 8 GiB to the rootfs. See NOTE above about this.
      size_mib: 8192
      resize: true
    - size_mib: 0
      # We assign a descriptive label to the partition. This is important
      # for referring to it in a device-agnostic way in other parts of the
      # configuration.
      label: controlserver
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: controlserver
  filesystems:
    - path: /var/controlserver
      device: /dev/disk/by-partlabel/controlserver
      # We can select the filesystem we'd like.
      format: ext4
      with_mount_unit: true
EOF

# Convert the Butane config to Ignition
docker run -i --rm quay.io/coreos/butane:release --strict < "$bu_path" > "$ign_path"

# Create slim Butane config
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

# Convert the slim Butane config to 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")"

# Create Nginx config
cat << EOF > "$nginx_config"
server {
  listen $nginx_port;
  server_name _;

  location / {
    root /srv;
    # Activate the next line if you want to list files
    autoindex on;
  }
}
EOF

# Create Docker Compose file
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

# Create an Nginx proxy server to host the slim Ignition config
docker compose -f "$compose_path" -p "$docker_project_name" up -d

# Stop the VM
VBoxManage controlvm "$vm_name" poweroff

# Remove the VM
VBoxManage unregistervm "$vm_name" --delete

# Remove the VM from SSH `known_hosts`
sed -i "/^\[localhost\]:$ssh_port/d" ~/.ssh/known_hosts

# Import the image into VirtualBox
VBoxManage import --vsys 0 --vmname "$vm_name" "$fedora_coreos_image_path"

# Set Ignition config as VB variable
VBoxManage guestproperty set "$vm_name" /Ignition/Config "$(cat "$(dirname "$ign_path")/slim_$(basename "$ign_path")")"

# Allow SSH connection to the VM
VBoxManage modifyvm "$vm_name" --natpf1 "guestssh,tcp,,$ssh_port,,22"

# Start the VM
VBoxHeadless -startvm "$vm_name" &> /dev/null & disown

# Connect to the VM via SSH
ssh -p "$ssh_port" -i "$ssh_private_key_path" "$non_root_username@localhost"

0 ответов

Другие вопросы по тегам