사용자가 1024 미만의 포트를들을 수 있도록 허용


63

사용자 (루트와 다른)가 포트 80에서 수신 대기하는 서버를 실행하도록 허용해야합니다.

이것을 할 수있는 방법이 있습니까?


1
이 질문은 해석에 열려 있습니다. "보안상의 이유로 권한이없는 계정에서 루트 권한으로 실행하려는 새 시스템 서비스를 만들었습니다"(좋은 방법으로 간주 됨)라는 말이 아니라 "사용자가 할 수 있는지 묻습니다." 내 시스템에서 자체 웹 서버를 실행하려면 어떻게 액세스 할 수 있습니까? " (좀 나쁜 연습으로 간주)
Michael Shaw

3
@Ptolemy, 실제 이유는 다음과 같습니다. 내 컴퓨터는 80 포트를 제외한 모든 포트를 차단하는 방화벽 뒤에 있습니다. 서버를 호스팅하고 싶습니다 (권한을 포기하지 않습니다). 따라서 포트 80에서 수신 대기해야하지만 명백한 보안상의 이유로 루트로 실행하는 것을 신뢰하지 마십시오. 당신이 관심이 있다면, 나는 이것을 할 수 있습니다.
peoro

답변:


50

setcap 'cap_net_bind_service=+ep' /path/to/program

이것은 특정 프로세스에서 작동합니다. 그러나 특정 사용자가 1024 이하의 포트에 바인딩 할 수있게하려면 sudoers에 추가해야합니다.

자세한 내용 은이 토론 을 보십시오 .


31

(이러한 방법 중 일부는 다른 답변에서 언급되었습니다. 나는 선호하는 대략적인 순서로 몇 가지 가능한 선택을하고 있습니다.)

낮은 포트를 높은 포트로 리디렉션하고 높은 포트에서 수신 대기 할 수 있습니다.

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

4
내가 다루어야 할 모든 경우에 실행 파일은 java 또는 python을 시작한 스크립트였습니다. 좋은 점에 10 시간을 소비하지 않는 사람으로서 iptables 솔루션은 고통없이 그것을 커버합니다.
srking

iptables 솔루션의 경우 필터 규칙을 추가 -A INPUT -p tcp --dport 1080 -j ACCEPT해야 작동하지 않을 것 같은 필터 규칙을 추가 해야했습니다 ( -j DROP포괄적 기능 도 있습니다 ) 그래서 두 개의 청취 소켓이 남았습니다.
thom_nic

4

짧은 대답은 설계 상으로는 불가능하다는 것입니다.

긴 대답은 오픈 소스 세계에는 많은 사람들이 디자인을 연주하고 다른 방법을 생각해내는 것입니다. 일반적으로 이것이 가능하지 않아야한다는 것이 널리 인정되고 있습니다. 당신이 시도하고 있다는 사실은 아마도 시스템에 또 다른 디자인 결함이 있다는 것을 의미하며 * nix 모범 사례와 보안 영향에 비추어 전체 시스템 아키텍처를 재고해야합니다.

즉, 낮은 포트에 대한 비 루트 액세스 권한을 부여하는 하나의 프로그램은 authbind 입니다. selinuxgrsecurity 는 모두 이러한 미세 조정 인증을위한 프레임 워크를 제공합니다.

마지막으로, 특정 사용자가 루트로 특정 프로그램을 실행하도록하고 실제로 필요한 것은 사용자가 아파치 나 그와 비슷한 것을 다시 시작할 수있게하는 것입니다 sudo.


8
포트 "보안"은 현대 사회에서 실제로 많은 것을 제공하지는 않습니다.
pjc50

3
@ pjc50 : 그렇습니다. 묵시적 신뢰에 관한 것입니다. 포트 번호가 낮 으면 신뢰도가 높습니다. SSH, POP, FTP 및 기타 데몬은 포트가 열릴 때 시스템 레벨 암호 및 기타 자격 증명을 요구합니다. 사용자가 상자에서 낮은 포트를 수신하도록 허용 된 경우 사용되지 않거나 충돌 한 포트에서 가짜 데몬을 시작하고 의심하지 않는 사용자의 암호를 수집 할 수 있습니다. 그런 다음 해당 상자에서 해당 비밀번호를 사용하여 루트를 포함한 다른 계정을 손상시킬 수 있습니다.
Caleb

8
보안이 약한 형태입니다. 무언가에 연결하고 인증서 트랜잭션을 수행하지 않은 경우 MITM 공격과 같은 대화 상대를 모릅니다.
pjc50 2016 년

5
포트에 필요한 것이 있다고 가정합니다. 그러면 "메일 포트 25를 잡을 수 있습니다"그리고 (a) 메일 데몬은 루트 권한으로 시작할 필요가 없으며 (b) 아무도 그것을 빼앗을 수 없습니다.
pjc50

7
리눅스가 초기 단계에있을 때 이것이 "설계 상"일 수도 있지만, 당시와 현재는 거의 이해가되지 않습니다. 보안은 사용자가 할 수있는 것과 할 수없는 것에 관한 것입니다. 예를 들어 루트 사용자 만 포트 80을 사용하도록 허용하면 보안 위험이 매우 높아집니다. 이는 포트 80을 사용해야하지만 루트 액세스 권한이 없어야 하는 사람들에게 루트 액세스 권한을 부여해야하기 때문 입니다. 루트가 아닌 사용자 X가 포트 80을 사용하도록 신뢰하는 경우 OS에서 해당 신뢰를 인코딩 할 수 있어야합니다. 운 좋게도 언급했듯이 authbind와 같이 이것을 허용하는 엉뚱한 해결 방법이 있습니다.
BT

3

당신은 사용할 수 netcat을 또는 xinetd를 또는 iptables를 포트 포워딩, 또는 프런트 엔드 프록시로 아파치를 사용하고 권한이없는 포트에서 프로세스를 실행합니다.


3

Authbind , @Gilles는 이미 언급했지만 조금 확장하고 싶습니다.

편리한 액세스 제어 기능이 있습니다 (설명서 페이지에 자세히 나와 있음) : 포트, 인터페이스 주소, uid, 주소 범위 또는 포트 및 이들의 조합으로 액세스를 필터링 할 수 있습니다.

매우 유용한 매개 변수가 있습니다 --depth.

-깊이 레벨

authbind가 호출 그래프에서 레벨이 깊은 프로그램에 영향을 미칩니다. 기본값은 1입니다.

"깊이 수준"은 스크립트 (또는 프로그램)가 다른 스크립트를 실행할 때 수준을 내립니다. 따라서 --depth 5레벨 1 또는 5에서 5를 의미하는 경우 바인딩 권한이 있지만 레벨 6 이상에서는 그렇지 않습니다. 스크립트가 액세스를 원하지만 사용자가 알거나 모르는 사이에 실행되는 프로그램이 아닌 경우에 유용합니다.


예를 들어, 보안을 위해 javaJava 만 실행 하는 사용자 가 있고 포트 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작업합니다.

자세한 내용은 매뉴얼 페이지를 참조하십시오 .


1

iptables PREROUTING REDIRECT 방법을 시도했지만 전달 된 패킷에도 영향을 미친다는 것을 알았습니다. 즉, 머신이 인터페이스간에 패킷을 전달하는 경우 (예 : 이더넷 네트워크에 연결된 Wi-Fi 액세스 포인트 역할을하는 경우) iptables 규칙은 연결된 클라이언트의 인터넷 연결에 대한 연결을 포착하여 리디렉션합니다. 기계. 그것은 내가 원하는 것이 아닙니다. 기계 자체로 향한 연결 만 리디렉션하고 싶었습니다.

한 가지 가능성은 TCP 포트 전달을 사용하는 것입니다. 예 socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

그러나이 방법의 한 가지 단점은 포트 8080에서 수신 대기하는 응용 프로그램은 들어오는 연결의 소스 주소를 알지 못한다는 것입니다 (예 : 로깅 또는 기타 식별 목적).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.