사용자 (루트와 다른)가 포트 80에서 수신 대기하는 서버를 실행하도록 허용해야합니다.
이것을 할 수있는 방법이 있습니까?
사용자 (루트와 다른)가 포트 80에서 수신 대기하는 서버를 실행하도록 허용해야합니다.
이것을 할 수있는 방법이 있습니까?
답변:
(이러한 방법 중 일부는 다른 답변에서 언급되었습니다. 나는 선호하는 대략적인 순서로 몇 가지 가능한 선택을하고 있습니다.)
낮은 포트를 높은 포트로 리디렉션하고 높은 포트에서 수신 대기 할 수 있습니다.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
권한있는 포트에서 청취를 시작한 후 서버를 루트 및 드롭 권한으로 시작할 수 있습니다. 바람직하게는 직접 코딩하는 대신 작업을 수행하는 랩퍼에서 서버를 시작하십시오. 서버가 연결 당 하나의 인스턴스를 시작하면 시작하십시오 inetd
(또는와 같은 유사한 프로그램 xinetd
). 의 경우 다음 inetd
과 같은 줄을 사용하십시오 /etc/inetd.conf
.
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
서버가 단일 인스턴스에서 수신하는 경우와 같은 프로그램에서 시작하십시오 authbind
. 빈 파일을 작성 /etc/authbind/byport/80
하여 서버를 실행하는 사용자가 실행할 수있게하십시오. 또는을 작성하십시오 /etc/authbind/byuid/1234
(여기서 1234는 서버를 실행하는 UID이며 행 포함) 0.0.0.0/0:80,80
.
서버 실행 파일이 기능을 지원하는 파일 시스템에 저장되어있는 경우, 당신은 그것에게 줄 수있는 능력을 . 기능은 여전히 비교적 새롭고 여전히 약간의 꼬임이 있습니다.cap_net_bind_service
setcap cap_net_bind_service=ep /path/to/server/executable
-A INPUT -p tcp --dport 1080 -j ACCEPT
해야 작동하지 않을 것 같은 필터 규칙을 추가 해야했습니다 ( -j DROP
포괄적 기능 도 있습니다 ) 그래서 두 개의 청취 소켓이 남았습니다.
짧은 대답은 설계 상으로는 불가능하다는 것입니다.
긴 대답은 오픈 소스 세계에는 많은 사람들이 디자인을 연주하고 다른 방법을 생각해내는 것입니다. 일반적으로 이것이 가능하지 않아야한다는 것이 널리 인정되고 있습니다. 당신이 시도하고 있다는 사실은 아마도 시스템에 또 다른 디자인 결함이 있다는 것을 의미하며 * nix 모범 사례와 보안 영향에 비추어 전체 시스템 아키텍처를 재고해야합니다.
즉, 낮은 포트에 대한 비 루트 액세스 권한을 부여하는 하나의 프로그램은 authbind 입니다. selinux 와 grsecurity 는 모두 이러한 미세 조정 인증을위한 프레임 워크를 제공합니다.
마지막으로, 특정 사용자가 루트로 특정 프로그램을 실행하도록하고 실제로 필요한 것은 사용자가 아파치 나 그와 비슷한 것을 다시 시작할 수있게하는 것입니다 sudo
.
당신은 사용할 수 netcat을 또는 xinetd를 또는 iptables를 포트 포워딩, 또는 프런트 엔드 프록시로 아파치를 사용하고 권한이없는 포트에서 프로세스를 실행합니다.
Authbind , @Gilles는 이미 언급했지만 조금 확장하고 싶습니다.
편리한 액세스 제어 기능이 있습니다 (설명서 페이지에 자세히 나와 있음) : 포트, 인터페이스 주소, uid, 주소 범위 또는 포트 및 이들의 조합으로 액세스를 필터링 할 수 있습니다.
매우 유용한 매개 변수가 있습니다 --depth
.
-깊이 레벨
authbind가 호출 그래프에서 레벨이 깊은 프로그램에 영향을 미칩니다. 기본값은 1입니다.
"깊이 수준"은 스크립트 (또는 프로그램)가 다른 스크립트를 실행할 때 수준을 내립니다. 따라서 --depth 5
레벨 1 또는 5에서 5를 의미하는 경우 바인딩 권한이 있지만 레벨 6 이상에서는 그렇지 않습니다. 스크립트가 액세스를 원하지만 사용자가 알거나 모르는 사이에 실행되는 프로그램이 아닌 경우에 유용합니다.
예를 들어, 보안을 위해 java
Java 만 실행 하는 사용자 가 있고 포트 80에 대한 액세스 권한을 부여하려는 사용자 가 있습니다.
echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80
나는을 만든 ../byport/80 file
, 그것을 주어진 java
사용자 그룹 (각 사용자가 자신의 그룹이), 그것은에 의해 실행의 의미 그룹에 의해 그것을 실행 만든 java
사용자. 포트별로 액세스 권한을 부여하는 경우 액세스 권한이있는 사용자가 파일을 실행할 수 있어야합니다.
이것은 평균 Joe에게는 충분할 수 있지만 --depth
매개 변수 를 사용하는 방법을 알고 있기 때문에 가장 작은 깊이를 찾아 사용할 때까지 java
사용자로 authbind --depth [depth] my_web_app's_start_script
시작하여 --depth 1
작업합니다.
iptables PREROUTING REDIRECT 방법을 시도했지만 전달 된 패킷에도 영향을 미친다는 것을 알았습니다. 즉, 머신이 인터페이스간에 패킷을 전달하는 경우 (예 : 이더넷 네트워크에 연결된 Wi-Fi 액세스 포인트 역할을하는 경우) iptables 규칙은 연결된 클라이언트의 인터넷 연결에 대한 연결을 포착하여 리디렉션합니다. 기계. 그것은 내가 원하는 것이 아닙니다. 기계 자체로 향한 연결 만 리디렉션하고 싶었습니다.
한 가지 가능성은 TCP 포트 전달을 사용하는 것입니다. 예 socat
:
socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080
그러나이 방법의 한 가지 단점은 포트 8080에서 수신 대기하는 응용 프로그램은 들어오는 연결의 소스 주소를 알지 못한다는 것입니다 (예 : 로깅 또는 기타 식별 목적).