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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3255
Зарегистрирован: 20.08.2022

#

Использование SSH поверх UNIX-сокета вместо sudo для избавления от suid-файлов
Дата публикации:Wed, 20 Dec 2023 09:53:59 +0300




Тимоти Равье (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





Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=60317

Жизнь за Нер'зула!

Ответить