주어진 ip : port에서 웹 서버를 시작하기 위해 sudo가 필요한 이유는 무엇입니까?


9

데비안 박스에 파이썬 기반 웹 서버를 설치하고 있습니다.

설정:

  • 데비안 OS는 VM 기반이지만 VirtualBox를 NAT에서 Bridged로 전환했습니다.
  • VM 설정의 IP = 192.168.1.7(내 라우터의 관리 화면 또는 ifconfig).
  • ssh와 HTTP 모두에 대해 라우터의 포트 전달을 성공적으로 설정했습니다.
  • dyndns.com을 사용하여 라우터의 동적 DNS를 성공적으로 설정했습니다.

내가 사용하고있는 특정 Python 웹 서버 (Django, CherryPy, 표준 라이브러리)에 관계없이을 사용하여 웹 서버 @ 192.168.1.7:80을 시작해야합니다 sudo. 그렇지 않으면 포트 액세스 권한이 없다는 오류가 발생합니다. sudoip : port를 지정할 때 사용해야 할 웹 서버 자습서는 없습니다 .

질문 : sudo이 웹 서버를 시작 하기 위해 왜 사용해야 합니까? 내가 사용해서는 안된다는 표시 192.168.1.7입니까? 아니면 구성 파일을 올바르게 설정하지 않았습니까?

답변:


11

루트 권한이있는 프로세스 만 권한있는 포트에서 청취 할 수 있습니다. 이것은 표준 유닉스 보안 규칙입니다.


80에서 sudo를 사용하여 웹 서버를 시작하는 것이 일반적입니까? 아니면 1024보다 큰 포트를 사용하는 다른 전략이 있습니까 (예 : 8000, 8080)?
Begbie00

@ Begbie00 예, 더 높은 포트에서 웹 서버를 실행하는 것이 일반적입니다. 그러나 인터넷에서 공개적으로 액세스 할 수 없거나 사용자에게 루트 권한이없는 컴퓨터에서 실행되는 웹 서버에 주로 사용됩니다. 개발 및 테스트에 사용되는 웹 서버는 거의 독점적으로 비 권한 포트에서 실행됩니다.
Šimon Tóth

2
불행히도이 말은 현대 유닉스 시스템에서는 완전히 사실이 아닙니다. 자세한 내용은 내 대답을 참조하십시오. 그러나 예를 들어 최신 Linux는 용량을 사용하여보다 세분화 된 권한 제어를 허용합니다. 또한 Solaris에는 RBAC라는 세분화 된 보안 시스템이 있습니다. 이러한 메커니즘을 통해 권한있는 포트에 바인딩하는 것과 같은 권한을 특정 사용자 나 프로그램에 할당 할 수 있습니다.
SkyBeam

14

권한이없는 사용자는 권한이있는 포트 (1024 미만의 포트 번호)에 바인딩 할 수없는 표준 동작입니다. 따라서 포트 80에 바인드하려는 응용 프로그램은이 포트에 바인드하기 위해 특권 (일반적으로 루트로 실행 됨)을 실행해야합니다.

일반적인 접근 방식은 권한있는 사용자로 작은 "청취자"프로세스를 실행하여 연결을 수락 한 다음 권한이없는 프로세스를 생성하여 요청을 처리하는 것입니다. 요청 처리에 대한 권한 삭제는 보안상의 이유로 수행됩니다. 누군가 요청을 처리하는 프로세스를 이용할 수있는 경우 일반적으로 침입자는 처리 프로세스와 동일한 권한을 사용하여 명령을 실행할 수 있습니다. 따라서 권한있는 프로세스를 사용하여 전체 요청을 처리하는 것은 좋지 않습니다.

그러나 오늘날 많은 응용 프로그램에서 루트가 아닌 것으로 실행되는 것이 일반적입니다. 그러나 이러한 프로세스는 물론 표준 구성에서 권한있는 포트에 바인딩 할 수 없습니다. 따라서 Tomcat 또는 JBoss와 같은 서버는 8080과 같은 하이 포트에 바인딩하는 데 사용 되었기 때문에 권한이있는 리스너가 필요하지 않습니다.

물론 이러한 프로세스를 인터넷에 노출하면 HTTP 프로토콜을 사용할 때 각 브라우저가 먼저 포트 80에 연결하려고 시도하므로 포트 80에 대한 액세스를 제공 할 수 있습니다. 이를 제공하는 일반적인 해결 방법은 응용 프로그램과 공용 인터넷 사이에 방화벽 또는 포트 변환기를 사용하는 것입니다. 따라서 요청은 포트 80을 요청하는 방화벽에 도달하지만 방화벽은 요청을 포트 8080의 일부 내부 호스트로 전달합니다. 이렇게하면 실제 웹 서버가 포트 80에서 공개적으로 사용 가능한 상태에서 높은 포트에서 작동 할 수 있습니다.

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

때때로이 리디렉션은 단순히 iptablesNAT 규칙을 사용하여 수행됩니다 .

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

이렇게하면 포트 8080에서 수신 대기중인 권한이없는 응용 프로그램을 실행할 수 있으며 포트 80에 대한 모든 수신 요청은 포트 8080으로 리디렉션됩니다.

그러나 최신 Linux 커널을 사용하면 또 다른 가능성이 있습니다. 기능 사용.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

이렇게하면 binary루트가 아닌 사용자로 시작한 경우에도 권한있는 포트에 바인딩 할 수 있습니다. 자세한 내용 man capabilities은 참조하십시오.


기능이 POSIX의 일부입니까 아니면 Linux에만 해당됩니까?
Šimon Tóth

@Let_Me_Be en.wikipedia.org/wiki/Capability-based_security 에서 알 수 있듯이 POSIX는 기능 기반 개념을 정의했지만 Linux에서 구현 된 것과 다릅니다. 따라서 CAP_NET_BIND_SERVICE와 같은 Linux 기능은 Linux에만 해당한다고 생각합니다.
SkyBeam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.