Bruke SSH over en UNIX-socket i stedet for sudo for å bli kvitt suid-filer

Timothee Ravier fra Red Hat, en vedlikeholder av Fedora Silverblue- og Fedora Kinoite-prosjektene, foreslo en måte å unngå å bruke sudo-verktøyet, som bruker suid-biten til å eskalere privilegier. I stedet for sudo, for en vanlig bruker å utføre kommandoer med rotrettigheter, foreslås det å bruke ssh-verktøyet med lokal tilkobling til samme system via en UNIX-socket og verifisering av tillatelser basert på SSH-nøkler.

Ved å bruke ssh i stedet for sudo kan du bli kvitt suid-programmer på systemet og aktivere utførelse av privilegerte kommandoer i vertsmiljøet for distribusjoner som bruker containerisolasjonskomponenter, som Fedora Silverblue, Fedora Kinoite, Fedora Sericea og Fedora Onyx. For å begrense tilgangen, kan bekreftelse av autoritet ved hjelp av et USB-token (for eksempel Yubikey) brukes i tillegg.

Et eksempel på konfigurering av OpenSSH-serverkomponenter for tilgang via en lokal Unix-socket (en egen sshd-forekomst vil bli lansert med sin egen konfigurasjonsfil):

/etc/systemd/system/sshd-unix.socket: [Enhet] Beskrivelse=OpenSSH Server Unix Socket Documentation=man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock Accept=ja [Installer] WantedBy=sockets.target

/ Etc / systemd / system /[e-postbeskyttet]: [Enhet] Beskrivelse=OpenSSH per-tilkobling 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: # Overlater bare nøkkelautentisering PermitRootLogin prohibit-password PasswordAuthentication no PermitEmptyPasswords no GSSAPIAuthentication no # begrenser tilgangen til utvalgte brukere TillatBrukere root adminusername # Overlater kun bruken av .skeysauthorized/Fithorized_ .ssh /authorized_ keys # enable sftp Subsystem sftp /usr/libexec/openssh/sftp-server

Aktiver og start systemd-enheten: sudo systemctl daemon-reload sudo systemctl enable —nå sshd-unix.socket

Legg til SSH-nøkkelen din i /root/.ssh/authorized_keys

Sette opp SSH-klienten.

Installer socat-verktøyet: sudo dnf installer socat

Vi supplerer /.ssh/config ved å spesifisere socat som en proxy for tilgang via en UNIX-socket: Host host.local Brukerrot # Bruk /run/host/run i stedet for /run for å jobbe fra containere ProxyCommand socat - UNIX-KLIENT: / run/ host/run/sshd.sock # Bane til SSH-nøkkelen IdentityFile ~/.ssh/keys/localroot # Aktiver TTY-støtte for det interaktive skallet RequestTTY ja # Fjern unødvendig utgang LogLevel QUIET

I sin nåværende form vil brukeradminusername nå kunne utføre kommandoer som root uten å skrive inn et passord. Kontrollerer operasjonen: $ ssh host.local [root ~]#

Vi lager et sudohost-alias i bash for å kjøre "ssh host.local", som ligner på sudo: sudohost() { if [[ ${#} -eq 0 ]]; deretter ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \»${@}\»» fi }

Sjekk: $ sudohost id uid=0(root) gid=0(root) groups=0(root)

Vi legger til legitimasjon og aktiverer tofaktorautentisering, og tillater rottilgang kun når et Yubikey USB-token er satt inn.

Vi sjekker hvilke algoritmer som støttes av den eksisterende Yubikey: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Hvis utgangen er 5.2.3 eller høyere, bruk ed25519-sk når du genererer nøkler, ellers bruk ecdsa-sk: ssh-keygen -t ed25519-sk eller ssh-keygen -t ecdsa-sk

Legger til den offentlige nøkkelen til /root/.ssh/authorized_keys

Legg til en nøkkeltypebinding til sshd-konfigurasjonen: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [e-postbeskyttet],[e-postbeskyttet]

Vi begrenser tilgangen til Unix-kontakten til kun brukeren som kan ha forhøyede rettigheter (i vårt eksempel, adminusername). I /etc/systemd/system/sshd-unix.socket legg til: [Socket] ... SocketUser=adminbrukernavn SocketGroup=adminbrukernavn SocketMode=0660

Kilde: opennet.ru

Legg til en kommentar