Uso de SSH sobre o socket UNIX em vez de sudo para eliminar arquivos suid

Timothee Ravier da Red Hat, mantenedor dos projetos Fedora Silverblue e Fedora Kinoite, propôs uma maneira de evitar o uso da ferramenta sudo, que utiliza o bit suid para elevação de privilégios. Em vez de sudo, para executar comandos com permissões de root como um usuário comum, sugere-se utilizar a ferramenta ssh com uma conexão local ao mesmo sistema através de um socket UNIX e verificação de credenciais baseada em chaves SSH.

O uso de ssh em vez de sudo permite eliminar programas suid no sistema e organizar a execução de comandos privilegiados em ambientes de host de distribuições que utilizam isolamento de componentes por contêineres, como Fedora Silverblue, Fedora Kinoite, Fedora Sericea e Fedora Onyx. Para restringir o acesso, a validação de credenciais pode ser adicionalmente implementada usando um token USB (por exemplo, Yubikey).

Exemplo de configuração dos componentes do servidor OpenSSH para acesso através de um socket Unix local (um exemplo separado de sshd será iniciado com seu próprio arquivo de configuração):

/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

Ativamos e iniciamos a unidade systemd: sudo systemctl daemon-reload sudo systemctl enable --now sshd-unix.socket

Adicionamos nossa chave SSH em /root/.ssh/authorized_keys

Configuramos o funcionamento do cliente SSH.

Instalamos a ferramenta socat: sudo dnf install socat

Adicionamos em /.ssh/config, definindo socat como proxy para acesso através do socket UNIX: Host host.local User root # Usamos /run/host/run em vez de /run para operação a partir de contêineres ProxyCommand socat -- UNIX-CLIENT:/run/host/run/sshd.sock # Caminho para a chave SSH IdentityFile ~/.ssh/keys/localroot # Habilitamos suporte TTY para o shell interativo RequestTTY yes # Removemos a saída excessiva LogLevel QUIET

Com a configuração atual, o usuário adminusername agora poderá executar comandos com permissões de root sem a necessidade de inserir uma senha. Verificamos a operação: $ ssh host.local [root ~]#

Criamos um alias de bash sudohost para executar "ssh host.local" de forma análoga ao sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \"${@}\"" fi }

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

Adicionamos a verificação de credenciais e habilitamos a autenticação de dois fatores, permitindo acesso ao root somente com a inserção do token USB Yubikey.

Verificamos quais algoritmos são suportados pelo Yubikey existente: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Se a versão exibida for 5.2.3 ou superior, usamos ed25519-sk para a geração de chaves; caso contrário, usamos ecdsa-sk: ssh-keygen -t ed25519-sk ou ssh-keygen -t ecdsa-sk

Adiciona a chave pública em \/root\/.ssh\/authorized_keys

Adicionamos a vinculação ao tipo de chave na configuração do sshd: \/etc\/ssh\/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com

Limitamos o acesso ao socket Unix apenas ao usuário que pode elevar privilégios (no nosso exemplo — adminusername). Em \/etc\/systemd\/system\/sshd-unix.socket adicionamos: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster