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


18

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



1
«обычно не требует привилегий sudoer» неверно.
tedder42

Ответы:


29

Есть два основных подхода:

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

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


3
В Linux вы также можете применить к программе возможность CAP_NET_BIND_SERVICE или использовать iptables для перенаправления системного порта на обычный порт.
Zan Lynx

10
и просто уточнить для OP: причина, по которой работает опция # 1, заключается в том, что когда процессы отбрасывают привилегии, им разрешается сохранять дескрипторы открытых файлов - даже если им не разрешается открывать их во второй раз.
Страж

Там также Authbind .
Борис Паук

5

Поскольку порт 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, вероятно, не сможет запуститься.


В вопросе говорится «привязать к этим портам». Как вы думаете, почему он ошибся?
Бармар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.