Чому для запуску веб-сервера на заданому порту ip: потрібен sudo?


9

Я встановлюю веб-сервер на основі Python у своєму вікні Debian.

Налаштування:

  • ОС Debian заснована на VM, але я переключив VirtualBox з NAT на мости.
  • IP налаштування VM = 192.168.1.7(на екрані адміністратора мого маршрутизатора або ifconfig).
  • Я успішно налаштував переадресацію порту мого маршрутизатора для ssh та HTTP.
  • Я успішно налаштував динамічний dns свого маршрутизатора за допомогою dyndns.com.

Незалежно від конкретного веб-сервера Python, який я використовую (Django, CherryPy, стандартна бібліотека), я повинен запустити веб-сервер @ 192.168.1.7:80, використовуючи sudo. В іншому випадку я отримую помилку про відсутність дозволу на доступ до порту. Жоден із навчальних посібників веб-сервера не згадує про необхідність використання sudoпри визначенні ip: порту.

Питання: чому мені потрібно використовувати sudoдля запуску цих веб-серверів? Це ознака того, що я не повинен користуватися 192.168.1.7? Або що я десь не встановив конфігураційний файл належним чином?

Відповіді:


11

На привілейованих портах можна слухати лише процеси з кореневими дозволами. Це стандартний режим безпеки Unix.


Чи часто запускати веб-сервери за допомогою sudo на 80? Або існує якась інша стратегія використання порту> 1024 (наприклад, 8000, 8080)?
Begbie00

@ Begbie00 Так, звичайно запускати веб-сервери на більш високих портах. Але він використовується в основному для веб-серверів, які не є загальнодоступними в Інтернеті або працюють на машинах, де користувачі не мають кореневих прав. Веб-сервери, що використовуються для розробки та тестування, працюють майже виключно на непривілейованих портах.
Šimon Tóth

2
На жаль, це твердження не в повній мірі відповідає сучасним системам Unix. Докладні відомості див. У моїй відповіді, але сучасний Linux, наприклад, дозволяє дозволити більш точний контроль дозволів за допомогою ОСОБЛИВОСТІ. Також Solaris має дрібнозернисту систему безпеки під назвою RBAC. Ці механізми дозволяють призначити дозволи, як прив'язка до привілейованих портів, певним користувачам або програмам.
SkyBeam

14

Це стандартна поведінка, коли непривілейовані користувачі не мають права прив'язуватися до привілейованих портів (номери портів нижче 1024). Тому програма, яка хотіла б, наприклад, прив'язати до порту 80, повинна мати привілейований (зазвичай це означає запустити як root), щоб прив’язати до цього порту.

Загальний підхід полягає в запуску невеликого "слухацького" процесу з привілейованим користувачем, який приймає з'єднання, а потім породжує непривілейований процес для обробки запиту. Видалення привілеїв для обробки запиту здійснюється з міркувань безпеки. Якщо хтось в змозі використовувати процес, який обробляє запит, він, як правило, дозволяє зловмиснику виконувати команди, використовуючи ті ж привілеї, що і процес обробки. Тому було б погано обробляти весь запит, використовуючи привілейований процес.

Однак для багатьох застосувань в наші дні прийнято працювати як некореневий; але такі процеси, звичайно, не можуть прив'язуватися до привілейованих портів, а потім у стандартній конфігурації. Тож такі сервери, як Tomcat або JBoss, використовувались для прив'язки до високопортових портів, таких як 8080, тому їм не потрібен привілейований слухач.

Звичайно, якщо ви піддаєте такий процес в Інтернеті, ви, ймовірно, надасте доступ через порт 80, оскільки кожен браузер спершу намагатиметься підключитися до порту 80, коли використовується протокол HTTP. Загальною проблемою для цього є використання брандмауера або перекладача портів між додатком та загальнодоступним Інтернетом. Таким чином, запити потрапляють на брандмауер із запитом порту 80, але брандмауер пересилає запит до якогось внутрішнього хоста на порту 8080. Таким чином реальний веб-сервер може працювати на портах високого рівня, публічно доступних на порт 80.

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

Іноді це переспрямування виконується просто за допомогою iptablesправила NAT:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Це дозволяє запускати непривілейовану програму прослуховування через порт 8080, тоді як всі вхідні запити на порт 80 просто переспрямовані на порт 8080.

Однак, використовуючи сучасні ядра Linux, є ще одна можливість: використовувати можливості.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

Це дозволить binaryприв’язати до привілейованих портів навіть тоді, коли запускається від не-root користувача. Дивіться man capabilitiesдокладнішу інформацію.


Чи є можливостями частиною POSIX, або лише Linux?
Šimon Tóth

@Let_Me_Be Як я розумію з en.wikipedia.org/wiki/Capability-based_security POSIX визначив концепцію на основі можливостей, але вона відрізняється від тієї, що була реалізована в Linux. Тому я думаю, що можливості Linux, такі як CAP_NET_BIND_SERVICE, є лише Linux.
SkyBeam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.