Timothee Ravier van Red Hat, maintainer van de Fedora Silverblue en Fedora Kinoite projecten, heeft een manier voorgesteld om het gebruik van de sudo utility, die de suid-bit voor privilegeverhoging gebruikt, te vermijden. In plaats van sudo voor het uitvoeren van commando's met root-rechten door een gewone gebruiker, wordt voorgesteld om de ssh utility te gebruiken met een lokale verbinding naar hetzelfde systeem via een UNIX-socket en een autorisatiecontrole op basis van SSH-sleutels.
Het gebruik van ssh in plaats van sudo maakt het mogelijk om suid-programma's uit het systeem te verwijderen en het uitvoeren van privileged commando's in de hostomgeving van distributies met containerisolatie van componenten, zoals Fedora Silverblue, Fedora Kinoite, Fedora Sericea en Fedora Onyx, mogelijk te maken. Voor toegangsbeperking kan ook een autorisatiebevestiging via een USB-token (bijvoorbeeld Yubikey) worden gebruikt.
Een voorbeeld van het instellen van servercomponenten van OpenSSH voor toegang via lokale Unix-socket (er wordt een aparte instantie van sshd gestart met zijn eigen configuratiebestand):
/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
We activeren en starten de systemd unit: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket
We voegen onze SSH-sleutel toe aan /root/.ssh/authorized_keys
We configureren de werking van de SSH-client.
We installeren de socat utility: sudo dnf install socat
We voegen / .ssh/config toe, waarin socat als proxy voor toegang via UNIX-socket wordt opgegeven: Host host.local User root # Gebruik /run/host/run in plaats van /run voor werken vanuit containers ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Pad naar de SSH-sleutel IdentityFile ~/ .ssh/keys/localroot # We schakelen TTY-ondersteuning in voor de interactieve shell RequestTTY yes # We verwijderen overtollige uitvoer LogLevel QUIET
In de huidige opzet kan de gebruiker adminusername nu commando's met root-rechten uitvoeren zonder een wachtwoord in te voeren. We controleren de werking: $ ssh host.local [root ~]#
We maken in bash een alias sudohost aan voor het starten van "ssh host.local" als analogie met sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" —login" else ssh host.local "cd \"${PWD}\"; exec \"${@}\"" fi }
We controleren: $ sudohost id uid=0(root) gid=0(root) groups=0(root)
We voegen een autorisatiecontrole toe en schakelen tweefactorauthenticatie in, waardoor toegang tot root alleen mogelijk is bij het inbrengen van de USB-token Yubikey.
We controleren welke algoritmen de huidige Yubikey ondersteunt: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'
Als 5.2.3 of een hogere waarde wordt weergegeven, gebruiken we ed25519-sk bij het genereren van sleutels, anders - ecdsa-sk: ssh-keygen -t ed25519-sk of ssh-keygen -t ecdsa-sk
Voegt de publieke sleutel toe aan /root/.ssh/authorized_keys
We voegen de binding aan het sleuteltype toe aan de sshd-configuratie: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Beperk de toegang tot de Unix-socket alleen tot de gebruiker die privileges kan verhogen (in ons voorbeeld - adminusername). Voeg in /etc/systemd/system/sshd-unix.socket toe: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Bron: opennet.ru
