답변:
기본적으로 두 가지 접근 방식이 있습니다.
처음에는 루트로 실행을 시작하고 권한있는 포트에 바인딩 한 다음 권한이없는 사용자에게 드롭 다운하십시오.
inetd 또는 xinetd는 권한을 실행하고 권한이없는 웹 서버로 요청을 전달합니다.
포트 80/443은 시스템 포트이므로 권한이있는 사용자 만 사용할 수 있습니다.
나는 당신이 잘못 생각합니다. 누구나이 포트를 사용할 수 있습니다. 그들에게 바인딩 하는 것은 특권 작업입니다.
여기서의 근거는 일부 사용자 Joe가 악의적 인 웹 서버를 작성할 수 없어서 관리자 권한이없는 호스트를 만들 수 없다는 것입니다. 물론 이것은 매우 약한 모델로, Joe가 자신의 컴퓨터를 네트워크에 올리는 것을 막을 수있는 방법이 없으며 물리적으로 액세스 할 수있는 모든 컴퓨터에 대한 관리 권한을 가질 수 있습니다.
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에 바인딩하려면 루트 여야합니다.
$ 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()
루트 권한을 삭제 하도록 서버 프로그램을 작성하는 것입니다. 이것은 매우 일반적인 솔루션이며 대부분의 데몬에서 볼 수 있습니다. 예를 들어, Apache는 init에서 루트로 시작한 다음 루트 권한을 삭제 www-data
하고 포트 80에 바인드되면 사용자 또는 이와 유사한 역할을합니다. /etc/init.d/apache start
루트가 아닌 것으로 실행 하면 Apache가 시작되지 않을 수 있습니다.