[an error occurred while processing this directive]

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

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

Настраиваем серверные компоненты 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
 
20.12.2023 , Источник: https://tim.siosm.fr/blog/2023/12/1...
Ключи: sudo, ssh, unix, socket, suid / Лицензия: CC-BY
Раздел:    Корень / Безопасность / SSH

[an error occurred while processing this directive]

[an error occurred while processing this directive]