Назад | Перейти на главную страницу

Хотя 80 и 443 являются системными портами, как большинство веб-серверов все равно могут к ним подключаться?

Для запуска веб-службы, которая привязывается к порту 80, обычно не требуются привилегии sudoer. Поскольку порты 80/443 являются системными портами, то есть они могут использоваться только привилегированными пользователями, почему эти службы все еще могут связываться с этими портами?

В основном есть два разных подхода:

  1. Изначально запустите работу от имени пользователя root, выполните привязку к привилегированному порту, а затем перейдите к непривилегированному пользователю.

  2. inetd или xinetd запускается с привилегиями и перенаправляет запросы на веб-сервер, работающий без привилегий.

Поскольку порты 80/443 являются системными портами, то есть они могут использоваться только привилегированными пользователями.

Я думаю, вы ошиблись. Кто угодно может использовать эти порты. Привязка для них это привилегированная операция.

Обоснование здесь заключается в том, что какой-то пользователь Джо не должен иметь возможность написать вредоносный веб-сервер, а затем создать какой-то хост, на котором у него нет никаких административных прав. Конечно, это довольно слабая модель, обычно ничто не мешает Джо подключить свой компьютер к сети, и он может иметь права администратора на любой машине, к которой у него есть физический доступ.

Я проведу демонстрацию с netcat.

Как обычный пользователь, я не могу привязаться к порту 80:

$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied

Могу привязаться к порту 8080:

$ nc -l -p 8080

Тем временем в другом терминале я могу подключиться к порту 80 и отправить некоторые данные и увидеть, как они появляются на сервере, который я только что начал:

$ nc 127.0.0.1 8080 <<<"Hello world"

Если я хочу подключиться к порту 80, мне нужно быть root:

$ sudo nc -l -p 80

Или я могу назначить CAP_NET_BIND_SERVICE способность к nc двоичный:

$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80

Другой вариант - написать серверную программу так, чтобы после ее вызова listen() он отбрасывает привилегии root. Это довольно распространенное решение, и вы увидите его с большинством демонов. Apache, например, запускается из init как root, а затем отбрасывает root-привилегии и становится пользователем www-data или что-то подобное, если оно привязано к порту 80. Попробуйте запустить /etc/init.d/apache start как не root, и Apache, вероятно, не запустится.