04.03.2024

Использование SSH поверх UNIX-сокета вместо sudo для избавления от suid-файлов

Тимоти Равье (Timothee Ravier) из компании Red Hat, мэйнтейнер проектов Fedora Silverblue и Fedora Kinoite, предложил способ ухода от применения утилиты sudo, использующей suid-бит для повышения привилегий. Вместо sudo для выполнения обычным пользователем команд с правами root предлагается задействовать утилиту ssh с локальным соединением к той же системе через UNIX-сокет и проверкой полномочий на основе SSH-ключей.

Использование ssh вместо sudo позволяет избавиться от suid-программ в системе и организовать выполнение привилегированных команд в хост-окружении дистрибутивов, использующих контейнерную изоляцию компонентов, таких как Fedora Silverblue, Fedora Kinoite,
Fedora Sericea и Fedora Onyx. Для ограничения доступа дополнительно может быть задействовано подтверждение полномочий при помощи USB-токена (например, Yubikey).

Пример настройки серверных компонентов OpenSSH для доступа через локальный Unix-сокет (будет запускаться отдельный экземпляр sshd со своим файлом конфигурации):

/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

Активируем и запускаем юнит systemd:

 sudo systemctl daemon-reload sudo systemctl enable --now sshd-unix.socket

Добавляем свой SSH-ключ в /root/.ssh/authorized_keys

Настраиваем работу SSH-клиента.

Устанавливаем утилиту socat:

 sudo dnf install socat

Дополняем /.ssh/config, указав socat в качестве прокси для доступа через UNIX-сокет:

 Host host.local User root # Используем /run/host/run вместо /run для работы из контейнеров ProxyCommand socat - UNIX-CLIENT:/run/host/run/sshd.sock # Путь к SSH-ключу IdentityFile ~/.ssh/keys/localroot # Включаем поддержку TTY для интерактивной оболочки RequestTTY yes # Убираем лишний вывод LogLevel QUIET

В текущем виде пользователь adminusername теперь сможет выполнить команды с правами root без ввода пароля. Проверяем работу:

 $ ssh host.local [root ~]#

Создаём в bash псевдоним sudohost для запуска «ssh host.local» по аналогии с sudo:

 sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \"${@}\"" fi }

Проверяем:

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

Добавляем проверку полномочий и включаем двухфакторную аутентификацию, допускающую доступ к root только при вставке USB-токена Yubikey.

Проверяем, какие алгоритмы поддерживает имеющийся Yubikey:

 lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Если выведено 5.2.3 или большее значение, используем ed25519-sk при генерации ключей, иначе — ecdsa-sk:

 ssh-keygen -t ed25519-sk
или ssh-keygen -t ecdsa-sk

Добавляет открытый ключ в /root/.ssh/authorized_keys

Добавляем привязку к типу ключа в конфигурацию sshd:


/etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com

Ограничиваем доступ к Unix-сокету только пользователя, которому можно повышать привилегии (в нашем примере — adminusername). В /etc/systemd/system/sshd-unix.socket добавляем:

 [Socket] ... SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Источник: https://www.opennet.ru/opennews/art.shtml?num=60317 Источник.