为 systemd 服务和特定用户分配能力

为 systemd 服务和特定用户分配能力

我正在开发一个基本上有 root 用户的嵌入式系统设备。我有一个 systemd 服务call.service,可以在 root 访问下正常工作。该服务基本上创建一些套接字,然后与网络设备进行交互。

我想向用户启动这项服务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

相关内容