Як обмежити зворотні тюнінг-порти SSH?


9

У нас є загальнодоступний сервер, який приймає SSH-з'єднання від декількох клієнтів за брандмауерами.

Кожен з цих клієнтів створює зворотний тунель SSH, використовуючи ssh -Rкоманду зі своїх веб-серверів через порт 80 до нашого загальнодоступного сервера.

Порт призначення (на стороні клієнта) тунелю SSH Reverse становить 80, а вихідний порт (на стороні загального сервера) залежить від користувача. Ми плануємо підтримувати карту адрес портів для кожного користувача.

Наприклад, клієнт A тунелює свій веб-сервер через порт 80 до нашого порту 8000; клієнт B від 80 до 8001; клієнт C від 80 до 8002.

Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver

Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver

Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver

В основному, ми намагаємось зв’язати кожного користувача з портом і не дати їм тунелю до будь-яких інших портів.

Якщо ми використовуємо функцію прямого тунелювання SSH за допомогою ssh -L, ми можемо дозволити, який порт буде тунельований за допомогою permitopen=host:portконфігурації. Однак для зворотного тунелю SSH немає еквівалента.

Чи існує спосіб обмеження портів зворотного тунелювання на користувача?


1
Лише за допомогою загальносистемної політики на зразок SELinux або IPTABLES.
Ендрю Сміт

Відповіді:


6

Оскільки ви розмістили не дозволено напівжирним шрифтом, я вважаю, що ви бажаєте відхилити час роботи на клієнтській стороні SSH, який запобігає прив'язці порту. Отже, у мене був копний вихідний код для вас:

serverloop.c:

/* check permissions */
if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)
#endif
    ) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
} else {
        /* Start listening on the port */
        success = channel_setup_remote_fwd_listener(
            listen_address, listen_port,
            &allocated_listen_port, options.gateway_ports);
}

На жаль, як бачимо, існує не так багато умов, які запобігають переадресації портів убік від стандартних.

Я збирався рекомендувати ту саму пропозицію для використання mod_ownerвсередині iptables, але Джефф побив мене до цього.

Вашим найчистішим рішенням було б просто змінити цей файл (наприклад, ви можете використовувати pw->pw_uiduid користувача, який підключається, і перенести його на правильний порт) та перекомпілювати ваш SSH-сервер, але це залежатиме від того, наскільки вам комфортно з цим .


Це справді добре. Я фактично можу скопіювати той самий синтаксис із параметра -L (тунелювання) і змусити його працювати. Дякую.
Utku Zihnioglu

3

Моя пропозиція використовує для цього SELinux. Вам доведеться налаштувати профілі користувачів, які дозволяють відкрити порти. В sshdпроцесі розгалужується і падає до привілеїв користувача перед відкриттям порту вперед, так що все , стосовно до процесів користувача будуть виконані sshd. Майте на увазі, що вам потрібно буде обмежитися всіма користувачами, оскільки один раз вони могли використовувати netcatдля пересилання іншого порту. Я спробую пізніше розібрати належний синтаксис (або будь-який інший користувач може редагувати його для мене).

Можна також спробувати скористатися iptables.

iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT

Однак це не завадить їм відкрити порт і заборонити іншому користувачеві.


Дякую за чудову відповідь. Я спробую конфігурацію профілів SELinux / User. Це звучить як рішення мого питання.
Utku Zihnioglu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.