deb 패키지의 파일 기능 설정에 실패했습니다.

deb 패키지의 파일 기능 설정에 실패했습니다.

따라서 내 소프트웨어 중 하나는 소규모 사용자 정의 서버가 포함된 deb 패키지를 통해 배포되어야 합니다. 서버는 권한이 있는 포트에서 수신 대기할 수 있어야 합니다. "권한을 올바르게 처리할 수 없기 때문에 비표준 RTSP 포트가 있습니다."와 같은 설명이 클라이언트에게는 끔찍하게 들리기 때문입니다.

좋아, 먼저 이 개념을 테스트해보고 터미널에 다음을 인쇄했습니다.

setcap CAP_NET_BIND_SERVICE=+ep /opt/path/my_binary 

모든 것이 잘 작동하므로 설치 후 스크립트에서도 동일한 명령이 작동해야 하는 것처럼 보입니다 postinst.1.server. 다음과 같이 호출해 보겠습니다.

...
...
printf "something" > /opt/somewhere || exit 15
setcap CAP_NET_BIND_SERVICE=+ep /opt/path/my_binary || exit 16

설치에는 오류가 없었으므로 명령이 작동했을 것입니다. 하지만 권한 부족으로 인해 서버에서 포트를 사용할 수 없었습니다(물론 명령을 수동으로 실행하면 문제가 다시 해결되었습니다).

좋습니다. 대상 서버의 실행 파일이 서비스에 의해 관리되도록 설계되었기 때문에 systemd로 전환하겠습니다. 사용자 정의 시스템 구성은 다음과 같습니다.

[Unit]
Description=Some description
After=network.target
Requires=postgresql.service

[Service]
Type=notify
WorkingDirectory=/opt/some_path
Restart=always
RestartSec=15000ms

User=server_user
Group=server_user

Environment=XAUTHORITY=/tmp/.Xauth
Environment=DISPLAY=:0

ExecStart=/opt/path/server_executable run
TimeoutStartSec=10000ms
WatchdogSec=6666ms
TimeoutStopSec=7000ms

# My new attempt to fix capabilities
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID

[Install]
WantedBy=multi-user.target                             

낙관적인 희망은 하위 프로세스가 server_executable시작된 후 이러한 기능을 상속받는 것이었지만 my_binary행운은 없었습니다.


현재 저는 여전히 설치 후 스크립트에서 필요한 기능을 설정하려고 노력하고 있으며 명령이 수동으로 실행될 때만 작동하는 이유를 전혀 모릅니다.

일부 "디버깅"으로 인해 더욱 이상한 결과가 나왔습니다.

  • 설치 후 스크립트를 작성하면 getcap /opt/ksvd4/ksvd4_portale.exe 2>&1올바른 기능이 인쇄되지만 설치가 끝나면 사라집니다(나중에 수동으로 확인).
  • setter 명령 호출 직후에 -v옵션(검증)을 사용하면 다음과 같은 결과가 발생합니다."좋아요", 능력이 사라지는 것을 증명하십시오.

누구든지 이 트릭을 구현하는 올바른 방법을 알려 주거나 적어도 현재 해결책을 시도하는 데 방해가 되는 숨겨진 문제를 찾아낼 수 있다면 매우 감사하겠습니다.

운영 체제는 Ubuntu 16.04(사용 가능한 경우)입니다.

답변1

완전한 답변은 아니지만 도움이 될 수 있습니다.

실행 파일에 이 기능이 있는 경우 특정 그룹에서만 실행 가능하도록 해야 합니다(임의의 사용자가 포트를 점유하는 것을 방지하기 위해).

새 프로그램을 생성하는 경우 해당 프로그램이 기능을 인식하도록 해야 합니다(함수 시스템 호출을 사용하여 유효한 세트 안팎으로 기능을 이동합니다). 따라서 파일 함수에서 유효한 비트를 설정할 필요가 없습니다.

파일 기능(및 setuid/setgid)은 정적으로 링크된 바이너리에서만 작동합니다.

기능은 새 프로세스( fork)에서는 유지되지만 새 실행 파일/프로그램( )에서는 유지되지 않습니다 exec. 지속성을 위해 주변 함수를 사용할 수 있습니다 exec. 호출자(실행자)가 함수를 인식하도록 해야 합니다(함수를 염두에 두고 코드를 작성해야 합니다).

관련 정보