したがって、私のソフトウェアの1つは、小規模なカスタムサーバーを含む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
。呼び出し側(実行者)に関数を認識させる必要があります(関数を念頭に置いてコードを記述する必要があります)。