Timothee Ravier fra Red Hat, vedligeholder af Fedora Silverblue og Fedora Kinoite projekterne, har foreslået en metode til at undgå brug af sudo, der anvender setuid-bit til at hæve privilegier. I stedet for sudo foreslås det at bruge ssh til at udføre kommandoer som almindelig bruger med root-rettigheder ved at oprette en lokal forbindelse til samme system via en UNIX-socket og verificere legitimationsoplysninger baseret på SSH-nøgler.
Brugen af ssh i stedet for sudo muliggør fjernelse af setuid-programmer i systemet og skaber betingelserne for udførelse af privilegerede kommandoer i værtsmiljøet af distributioner, der bruger containerisering af komponenter, såsom Fedora Silverblue, Fedora Kinoite, Fedora Sericea og Fedora Onyx. For at begrænse adgangen kan godkendelse ved hjælp af en USB-token (f.eks. Yubikey) ekstra anvendes.
Eksempel på konfiguration af OpenSSH-serverkomponenter for adgang via lokal Unix-socket (der startes en separat instans af sshd med sin egen konfigurationsfil):
/etc/systemd/system/sshd-unix.socket: [Unit] Description=OpenSSH Server Unix Socket Documentation=man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock Accept=yes [Install] WantedBy=sockets.target
/etc/systemd/system/sshd-unix@.service: [Unit] Description=OpenSSH per-connection server daemon (Unix socket) Documentation=man:sshd(8) man:sshd_config(5) Wants=sshd-keygen.target After=sshd-keygen.target [Service] ExecStart=-/usr/sbin/sshd -i -f /etc/ssh/sshd_config_unix StandardInput=socket
/etc/ssh/sshd_config_unix: # Оставляет только аутентификацию по ключам PermitRootLogin prohibit-password PasswordAuthentication no PermitEmptyPasswords no GSSAPIAuthentication no # ограничиваем доступ выбранным пользователям AllowUsers root adminusername # Оставляем только использование .ssh/authorized_keys (без .ssh/authorized_keys2 AuthorizedKeysFile .ssh/authorized_keys # включаем sftp Subsystem sftp /usr/libexec/openssh/sftp-server
Aktiverer og starter systemd-enheden: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket
Tilføjer sin SSH-nøgle til /root/.ssh/authorized_keys
Konfigurerer SSH-klientens funktion.
Installerer socat-værktøjet: sudo dnf install socat
Opdaterer /.ssh/config og angiver socat som en proxy for adgang via UNIX-socket: Host host.local User root # Bruger /run/host/run i stedet for /run for at arbejde fra containere ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Sti til SSH-nøglen IdentityFile ~/.ssh/keys/localroot # Aktiverer TTY-support for interaktive shell RequestTTY yes # Fjerner unødvendig output LogLevel QUIET
I sin nuværende form kan brugeren adminusername udføre kommandoer med root-rettigheder uden at indtaste en adgangskode. Tjekker funktionaliteten: $ ssh host.local [root ~]#
Opretter en bash-alias sudohost til at køre "ssh host.local" i lighed med sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \"${@}\"" fi }
Tjekker: $ sudohost id uid=0(root) gid=0(root) groups=0(root)
Tilføjer godkendelseskontrol og aktiverer tofaktorautentificering, der kun tillader adgang til root ved indsættelse af USB-token Yubikey.
Tjekker, hvilke algoritmer den eksisterende Yubikey understøtter: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'
Hvis der vises en værdi på 5.2.3 eller højere, skal vi bruge ed25519-sk til at generere nøgler, ellers ecdsa-sk: ssh-keygen -t ed25519-sk eller ssh-keygen -t ecdsa-sk
Tilsæt den offentlige nøgle til /root/.ssh/authorized_keys
Tilføj bindingen til nøgletype i sshd-konfigurationen: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Begræns adgangen til Unix-socketen til den bruger, der kan opnå forhøjede rettigheder (i vores eksempel - adminusername). I /etc/systemd/system/sshd-unix.socket tilføjer vi: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Kilde: opennet.ru
