По документации 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 остаётся только у админов.