解決策 1:
もちろん、これは可能です。バイナリ CAP_NET_BIND_SERVICE を指定するだけです。
sudo setcap cap_net_bind_service=ep some-binary
Linux では、root が実行できることは一連の機能に分割されています。 CAP_NET_BIND_SERVICE は、ポート <=1024 にバインドする機能です。
AppArmor、SELinux、または別の Linux セキュリティ モジュール (LSM) を使用して、特定のポートをバインドするためのアクセス権をプログラムに付与することもおそらく可能ですが、これは時間の無駄だと思います。セキュリティは、遠い昔ほどポート番号に基づいていません。
OSX がポート 80 と 443 を非特権ポートに転送するスクリプトは次のとおりです:
echo "
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -
解決策 2:
より低いポート番号からの要求にデーモンが応答するようにする別の方法は、iptables などを使用して、より低い番号のポートを、デーモンがリッスンしているより高い番号のポートにリダイレクトすることです。
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
80 を公開するポートに置き換え、8080 をアプリケーション リスナー ポートに置き換えます。
解決策 3:
それを行う方法はあると思いますが、これが機能するかどうかは 100% 確信が持てません。
アプリケーションがそれを使用するのではなく、ルートを必要とするポートのバインディングであるため、以下の方法は機能する可能性がありますが、最初に sudo アクセスが必要です。
まず、sudo myApp
を使用して root ユーザーとしてプロセスを開始します 、ポートがバインドされると、プロセスの所有者を非特権ユーザーに切り替えることができます。
解決策 4:
bind() システム コールを (LD_PRELOAD ライブラリ経由で) ラップし、特権ポートが要求された場合は、setuid ルート プログラムを生成して、そのコピーを受け取る "authbind" というライブラリをぼんやりと覚えています。
プロジェクトの状況については不明ですが、必要に応じて (再) 実装する方法はかなり簡単です。