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이 작동하는 이유는 프로세스가 권한을 삭제할 때 열린 파일 설명자를 유지할 수 있기 때문입니다-두 번째로 열 수없는 경우에도 열려있는 파일 설명자를 유지할 수 있기 때문입니다.
strugee


5

포트 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가 시작되지 않을 수 있습니다.


문제는 "이 포트에 바인딩"이라고 말합니다. 왜 그가 잘못했다고 생각합니까?
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.