Використання 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

/ і т.д. / systemd / system /[захищено електронною поштою]: [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 2 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 [захищено електронною поштою],[захищено електронною поштою]

Обмежуємо доступ до Unix-сокету лише користувача, якому можна підвищувати привілеї (у прикладі — adminusername). У /etc/systemd/system/sshd-unix.socket додаємо: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Джерело: opennet.ru

Додати коментар або відгук