Dante на Ubuntu: пользователи для SOCKS без входа по SSH

Dante на Ubuntu: пользователи для SOCKS без входа по SSH

По документации Dante, метод username проверяет логин и пароль клиента SOCKS по системному файлу паролей. То есть под каждого клиента прокси на сервере заводится обычный пользователь Linux. Если ничего не ограничить, с тем же логином и паролем он зайдёт и по SSH. Ниже как завести таких пользователей на Ubuntu, чтобы SOCKS работал, а SSH для них был закрыт.

Dante в Ubuntu: пакет dante-server

Dante это свободный SOCKS-сервер от норвежской Inferno Nettverk. Последняя версия 1.4.4 вышла 15 декабря 2024 года. В Ubuntu он ставится пакетом dante-server: в 24.04 там версия 1.4.3, в 26.04 уже 1.4.4. Демон называется danted, конфиг лежит в /etc/danted.conf.

sudo apt install dante-server

Метод username включается в danted.conf так, это пример из документации:

socksmethod: username

socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: bind connect udpassociate
    log: error
    socksmethod: username
}

Там же важная оговорка: при этом методе пароль передаётся открытым текстом. Поэтому пароли прокси-пользователей не должны совпадать ни с какими другими, а доступ к порту Dante лучше ограничить своими адресами в правилах client pass или в файрволе.

Пользователь без оболочки

Отдельная группа упростит правила дальше. Создаём её и пользователя без домашнего каталога и с оболочкой nologin, потом задаём пароль для SOCKS:

sudo groupadd socks
sudo useradd -M -s /usr/sbin/nologin -G socks proxyuser
sudo passwd proxyuser

Если пользователь уже есть, оболочку меняет usermod с ключом -s, а в группу добавляет -aG:

sudo usermod -s /usr/sbin/nologin proxyuser
sudo usermod -aG socks proxyuser
getent passwd proxyuser

В последнем поле строки из getent должно быть /usr/sbin/nologin. Вместо него можно поставить /bin/false, разница только в том, что nologin вежливо пишет, что вход запрещён.

Почему одной оболочки мало

Оболочка nologin запрещает интерактивный вход, но SSH умеет не только это. Команда вида ssh -N -D 1080 proxyuser@сервер не запускает оболочку вообще, а пробрасывает порты. Пользователь с паролем от SOCKS получит такой же прокси через SSH, мимо правил и логов Dante. Поэтому SSH для этих учёток надо закрыть в самом sshd.

Запрет в sshd: DenyGroups

В Ubuntu, как сказано в документации по OpenSSH, в начале /etc/ssh/sshd_config стоит Include /etc/ssh/sshd_config.d/*.conf, и свои настройки удобнее держать там отдельным файлом. Закрываем SSH всей группе socks:

echo "DenyGroups socks" | sudo tee /etc/ssh/sshd_config.d/10-socks.conf

Можно и поимённо, через DenyUsers proxyuser1 proxyuser2. Обратный вариант, AllowUsers или AllowGroups только для админов, надёжнее, если прокси-учёток много, но тогда легко забыть себя в списке.

Перед перезапуском проверяем синтаксис и только потом применяем:

sudo sshd -t
sudo systemctl restart ssh.service

Текущую сессию не закрывайте, пока в новом окне не зайдёте под своим админом. Проверить, что запрет на месте, можно так: sudo sshd -T | grep -i denygroups покажет итоговую настройку, а попытка ssh proxyuser@сервер должна закончиться отказом.

Что ещё стоит сделать

  • Админам вход только по ключам и PasswordAuthentication no, после того как ключи проверены.
  • Fail2Ban на sshd и на порт Dante против перебора паролей.
  • В danted.conf ограничить, с каких адресов можно подключаться к прокси, а не пускать всех, у кого есть пароль.

В итоге пользователи Dante это обычные системные учётки, и без ограничений они получают ещё и SSH, вплоть до проброса портов. Оболочка nologin плюс DenyGroups в отдельном файле sshd_config.d закрывают эту дыру: SOCKS работает, а SSH остаётся только у админов.

Источники и ссылки


Комментарии загружаются…