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