システムサービスと特定のユーザーに機能を割り当てる

システムサービスと特定のユーザーに機能を割り当てる

私は基本的にrootユーザーを持つ組み込みシステムデバイスを開発しています。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

関連情報