Ponieważ port 80/443 to porty systemowe, co oznacza, że mogą z niego korzystać tylko uprzywilejowani użytkownicy
Myślę, że źle to rozumiesz. Każdy może korzystać z tych portów. Powiązanie z nimi jest operacją uprzywilejowaną.
Uzasadnieniem jest to, że jakiś użytkownik Joe nie powinien mieć możliwości napisania złośliwego serwera WWW, a następnie utworzenia hosta, na którym nie ma żadnych uprawnień administracyjnych. Oczywiście jest to dość słaby model, zwykle nie ma nic, co powstrzymałoby Joe przed podłączeniem własnego komputera do sieci i mógłby mieć uprawnienia administracyjne do każdej maszyny, do której ma fizyczny dostęp.
Zrobię demonstrację z netcat.
Jako zwykły użytkownik nie mogę powiązać z portem 80:
$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied
Mogę powiązać z portem 8080:
$ nc -l -p 8080
Tymczasem w innym terminalu mogę połączyć się z portem 80 i wysłać trochę danych i zobaczyć, jak pojawiają się na końcu serwera, który właśnie uruchomiłem:
$ nc 127.0.0.1 8080 <<<"Hello world"
Jeśli chcę się połączyć z portem 80, muszę być rootem:
$ sudo nc -l -p 80
Lub mogę przypisać CAP_NET_BIND_SERVICE
zdolność do nc
pliku binarnego:
$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80
Inną opcją jest napisanie programu serwera tak, aby po jego wywołaniu listen()
upuścił uprawnienia administratora. Jest to dość powszechne rozwiązanie i zobaczysz je w przypadku większości demonów. Na przykład Apache zaczyna się od init jako root, a następnie upuszcza uprawnienia roota i staje się użytkownikiem www-data
lub czymś podobnym, gdy jest związany z portem 80. Spróbuj uruchomić /etc/init.d/apache start
jako root, a Apache prawdopodobnie się nie uruchomi.