Timotej Ravier iz kompanije Red Hat, održavatelj projekata Fedora Silverblue i Fedora Kinoite, predložio je način da se pređe s korištenja alata sudo, koji koristi suid-bit za povećanje privilegija. Umjesto sudo-a, za izvršavanje komandi s root pravima od strane običnog korisnika, predlaže se korištenje alata ssh s lokalnom konekcijom na isti sustav putem UNIX-soketa i provjerom ovlasti temeljenom na SSH ključevima.
Korištenje ssh umjesto sudo-a omogućuje izbjegavanje suid programa u sustavu i organiziranje izvršavanja privilegiranih komandi u host okruženju distribucija koje koriste izolaciju komponenti putem kontejnera, kao što su Fedora Silverblue, Fedora Kinoite, Fedora Sericea i Fedora Onyx. Za ograničavanje pristupa može se dodatno koristiti potvrda ovlasti pomoću USB-tokena (na primjer, Yubikey).
Primjer podešavanja server komponenti OpenSSH za pristup putem lokalnog Unix-soketa (bit će pokrenut zaseban primjerak sshd s vlastitom konfiguracijskom datotekom):
/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
Aktiviramo i pokrećemo systemd jedinicu: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket
Dodajemo svoj SSH ključ u /root/.ssh/authorized_keys
Podešavamo rad SSH klijenta.
Instaliramo alat socat: sudo dnf install socat
Dopunjavamo /.ssh/config, postavljajući socat kao proxy za pristup putem UNIX-soketa: Host host.local User root # Koristimo /run/host/run umjesto /run za rad iz kontejnera ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Putanja do SSH ključa IdentityFile ~/.ssh/keys/localroot # Uključujemo podršku za TTY za interaktivnu ljusku RequestTTY yes # Uklanjamo suvišni izlaz LogLevel QUIET
U trenutnom obliku korisnik adminusername sada može izvršavati komande s root pravima bez unošenja lozinke. Provjeravamo rad: $ ssh host.local [root ~]#
Stvaramo u bash-u alias sudohost za pokretanje „ssh host.local” po analogiji s sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local „cd \”${PWD}\” ; exec \”${SHELL}\” —login” else ssh host.local „cd \”${PWD}\” ; exec \”${@}\”” fi }
Provjeravamo: $ sudohost id uid=0(root) gid=0(root) groups=0(root)
Dodajemo provjeru ovlasti i uključujemo dvostruku autentifikaciju, dopuštajući pristup root-u samo pri umetanju USB-tokena Yubikey.
Provjeravamo koje algoritme podržava postojeći Yubikey: lsusb -v 2>/dev/null | grep -A2 Yubico | grep „bcdDevice” | awk ‘{print $2}’
Ako je ispisana verzija 5.2.3 ili veća, koristimo ed25519-sk za generiranje ključeva, inače — ecdsa-sk: ssh-keygen -t ed25519-sk ili ssh-keygen -t ecdsa-sk
Dodaje javni ključ u /root/.ssh/authorized_keys
Dodajemo vezu tipa ključa u sshd konfiguraciju: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Ograničavamo pristup Unix socketu samo na korisnika kojem je dopušteno podizanje privilegija (u našem primjeru — adminusername). U /etc/systemd/system/sshd-unix.socket dodajemo: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Izvor: opennet.ru
