권한이 없는 사용자가 포트 80에서 웹 서버를 시작하도록 허용

권한이 없는 사용자가 포트 80에서 웹 서버를 시작하도록 허용

루트가 아닌 사용자가 포트 80 및 443에서 웹 서버를 시작하도록 허용하면 보안에 미치는 영향을 이해합니다.

루트가 아닌 사용자가 Ubuntu 16 및 CentOS 7의 포트 80 및 443에서 웹 서버를 호출할 수 있도록 권한 확인을 제거하고 싶습니다.

컴퓨터에 루트 액세스 권한이 있지만 NFS 권한 문제를 해결하려면 다른 사용자 이름으로 웹 서버를 실행해야 합니다. 이 대체 사용자 이름에는 루트 액세스 권한이 없습니다.

지금까지 나는 다음을 살펴보았습니다:

  • setcap cap_net_bind_service=ep /path/to/the/executable(실행 파일이 원격으로 다시 컴파일되어 NFS에 저장되므로 고정되지 않습니다.)
  • 비밀번호 없는 사용자를 sudoers활성화하도록 파일을 편집합니다 (여전히 NFS 액세스 문제가 있음).sudoroot

이상적으로는 setcap과 같은 것을 원하지만포트, 실행 파일 대신 권한 검사를 완전히 포기합니다.

관련된: https://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-on-linux

authbind유망해 보이지만작동하지 않는 것 같습니다GoLang 웹 서버 사용

Ubuntu 16은 너무 오래되어 권한이 없는 포트 시작 범위 변경을 허용하지 않습니다.

> sudo sysctl net.ipv4.ip_unprivileged_port_start=80
sysctl: cannot stat /proc/sys/net/ipv4/ip_unprivileged_port_start: No such file or directory

답변1

setcap나는 이것이 당신의 대답이 될 것이라고 생각합니다 . 여기서 진짜 질문은 다음과 같습니다. NFS의 웹 서버가 터치되어 setcap명령을 실행할 수 있을 때 시스템이 어떻게 인식합니까?

내 생각엔 당신이 건물을 짓고 싶어할 것 같아요inotify또는systemd.path이 웹 서버를 모니터링하십시오. 해당 바이너리가 교체되면 이를 감지하고 setcap적절한 명령을 트리거합니다. 이 방법은 웹 서버가 이미 systemd를 통해 실행되고 있는 경우 특히 효과적입니다.

systemd.path다음은 서버가 시스템 서비스로 실행되고 있다고 가정하는 예 입니다.webserver.service

# /etc/systemd/system/webcap.path
[Unit]
Description=Watching changes in the webserver binary
# Start monitoring only after the webserver is running.
After=webserver.service

[Path]
# Whenever someone writes to this path (binary is replaced), do something
PathModified=/path/to/webserver
# This is the service you launch when the above condition is met
Unit=webcap.service

[Install]
#Whenever the webserver is started, this monitor will also start
WantedBy=webserver.service
# /etc/systemd/system/webcap.service
[Unit]
Description=Update caps of webserver

[Service]
Type=oneshot
ExecStart=ssetcap cap_net_bind_service=ep /path/to/webserver

답변2

나는 스튜어트를 좋아하지만답변, 파이프라인( )에 잠재적으로 중단될 수 있는 또 다른 부분을 추가하므로 결국 per를 systemd사용하게 되었습니다.capsh이 답변. 다시 컴파일해야 했어요소스에서환경 기능 기능(생성된 바이너리를 로 저장 /sbin/capsh2)을 얻으려면 이를 시작 명령으로 설정할 수 있습니다.

/sbin/capsh2 --keep=1 --user=nonrootuser --inh=cap_net_bind_service --addamb=cap_net_bind_service -- -c /path/to/webserver

이 명령을 루트로 실행하면 웹 서버가 올바르게 시작되고 nonrootuser"사용자 공간"의 포트 80 및 443에 바인딩할 수 있습니다.

관련 정보