Brug af SSH over en UNIX-socket i stedet for sudo for at slippe af med suid-filer

Timothee Ravier fra Red Hat, en vedligeholder af Fedora Silverblue- og Fedora Kinoite-projekterne, foreslog en måde at undgå at bruge sudo-værktøjet, som bruger suid-bitten til at eskalere privilegier. I stedet for sudo, for en normal bruger til at udføre kommandoer med root-rettigheder, foreslås det at bruge ssh-værktøjet med en lokal forbindelse til det samme system via en UNIX-socket og verifikation af tilladelser baseret på SSH-nøgler.

Brug af ssh i stedet for sudo giver dig mulighed for at slippe af med suid-programmer på systemet og aktivere udførelse af privilegerede kommandoer i værtsmiljøet for distributioner, der bruger containerisoleringskomponenter, såsom Fedora Silverblue, Fedora Kinoite, Fedora Sericea og Fedora Onyx. For at begrænse adgangen kan bekræftelse af autoritet ved hjælp af et USB-token (for eksempel Yubikey) desuden bruges.

Et eksempel på konfiguration af OpenSSH-serverkomponenter til adgang via en lokal Unix-socket (en separat sshd-instans vil blive lanceret med sin egen konfigurationsfil):

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

/ Etc / systemd / system /[e-mail beskyttet]: [Enhed] Beskrivelse=OpenSSH per-forbindelse server-dæmon (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: # Efterlader kun nøglegodkendelse PermitRootLogin prohibit-password PasswordAuthentication ingen PermitEmptyPasswords ingen GSSAPIAuthentication no # begrænser adgangen til udvalgte brugere TilladBrugere root adminusername # Efterlader kun brugen af ​​.ssheysauthorized/Fithorized_keysauthorized_keys/ .ssh /authorized_ keys # enable sftp Subsystem sftp /usr/libexec/openssh/sftp-server

Aktiver og start systemd-enheden: sudo systemctl daemon-reload sudo systemctl enable —nu sshd-unix.socket

Tilføj din SSH-nøgle til /root/.ssh/authorized_keys

Opsætning af SSH-klienten.

Installer socat-værktøjet: sudo dnf installer socat

Vi supplerer /.ssh/config ved at angive socat som proxy for adgang via en UNIX-socket: Host host.local Brugerrod # Brug /run/host/run i stedet for /run for at arbejde fra containere ProxyCommand socat - UNIX-KLIENT: / run/ host/run/sshd.sock # Sti til SSH-nøglen IdentityFile ~/.ssh/keys/localroot # Aktiver TTY-understøttelse for den interaktive shell RequestTTY ja # Fjern unødvendigt output LogLevel QUIET

I sin nuværende form vil brugeradminusername nu være i stand til at udføre kommandoer som root uden at indtaste en adgangskode. Kontrol af operationen: $ ssh host.local [root ~]#

Vi opretter et sudohost-alias i bash for at køre "ssh host.local", svarende til sudo: sudohost() { if [[ ${#} -eq 0 ]]; derefter ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" ellers ssh host.local "cd \"${PWD}\"; exec \»${@}\»» fi }

Tjek: $ sudohost id uid=0(rod) gid=0(rod) grupper=0(rod)

Vi tilføjer legitimationsoplysninger og aktiverer to-faktor-godkendelse, hvilket kun tillader root-adgang, når et Yubikey USB-token er indsat.

Vi tjekker, hvilke algoritmer der understøttes af den eksisterende Yubikey: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Hvis outputtet er 5.2.3 eller højere, skal du bruge ed25519-sk, når du genererer nøgler, ellers skal du bruge ecdsa-sk: ssh-keygen -t ed25519-sk eller ssh-keygen -t ecdsa-sk

Tilføjer den offentlige nøgle til /root/.ssh/authorized_keys

Tilføj en nøgletypebinding til sshd-konfigurationen: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [e-mail beskyttet],[e-mail beskyttet]

Vi begrænser adgangen til Unix-socket til kun den bruger, der kan have forhøjede privilegier (i vores eksempel, adminusername). I /etc/systemd/system/sshd-unix.socket tilføj: [Socket] ... SocketUser=adminbrugernavn SocketGroup=adminbrugernavn SocketMode=0660

Kilde: opennet.ru

Tilføj en kommentar