저는 기본적으로 루트 사용자가 있는 임베디드 시스템 장치를 개발 중입니다. call.service
루트 액세스로 제대로 작동하는 시스템 서비스가 있습니다 . 서비스는 기본적으로 일부 소켓을 생성한 다음 네트워크 장치와 상호 작용합니다.
UserA
이 서비스를 사용자에게 시작 하고 net_raw
및 같은 기능을 제공하고 싶습니다 net_admin
. 다음 유닛 파일을 작성했습니다.
file: /etc/systemd/system/multi-user.target.wants/call.service
[Unit]
Description=XXX call service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=userA
Group=userA
ExecStart=/opt/call/bin/call eth0 -P -1
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW
ExecStartPre=/bin/mkdir -p /tmp/call
ExecStartPre=/bin/chmod -R 755 /tmp/call
ExecStopPost=/bin/rm -rf /tmp/call
[Install]
WantedBy=multi-user.target
그러나 이 서비스를 시작하면 소켓 생성 중에 "작업이 허용되지 않습니다"라는 오류와 함께 실패합니다.
$ systemctl restart call
Dec 01 17:56:10 xxxx call[26955]: ERROR : CALL [17:56:10:682] socket creation failed: Operation not permitted
오류에 해당하는 src 파일:
//file call.cpp
net_iface_l->sd_general = socket( PF_PACKET, SOCK_DGRAM, 0 );
if( net_iface_l->sd_general == -1 ) {
LOG_ERROR( "socket creation failed: %s", strerror(errno));
return false;
}
사용자가 생성하거나 정의한 함수에 버그가 있으면 누군가 지적할 수 있나요? 여기 사용자 권한에 내가 이해할 수 없는 내용이 누락되어 있을 수 있습니다.
답변1
이 문제를 해결하려면 다음 줄을 사용하십시오.
환경 기능=CAP_NET_ADMIN CAP_NET_RAW