1. ホーム
  2. linux

[解決済み] Linux で非 root プロセスが "特権" ポートにバインドする方法はありますか?

2022-03-22 08:41:24

質問

私以外のユーザーはいないはずなのに、私の開発用ボックスでこのような制限があるのは非常に迷惑なことです。

私が意識しているのは 標準的な回避策 しかし、どれも私が欲しいものを正確に行うことはできません。

  1. authbind (Debian テスト版である 1.0 は IPv4 のみをサポートしています)
  2. iptablesのREDIRECTターゲットを使って、ローポートをハイポートにリダイレクトします。 (IPv6版ip6tablesでは、quot;nat;テーブルはまだ実装されていません)
  3. sudo (rootで実行するのは避けたい)
  4. SELinux(またはそれに類するもの)。(これは私の開発用ボックスなので、余計な複雑さを持ち込みたくありません)。

何か簡単な sysctl 変数を使って、Linux で非 root プロセスが "privileged" ポート (1024 未満のポート) にバインドできるようにすることはできますか?

EDIT: 場合によっては 能力を使う を実行します。

解決方法は?

なるほど、能力系を指摘してくれた人たちのおかげで CAP_NET_BIND_SERVICE ケーパビリティがあります。最近のカーネルであれば、これを利用して、非 root でサービスを起動しつつ、低いポートをバインドすることは、確かに可能です。簡単に言うと、「できる」ということです。

setcap 'cap_net_bind_service=+ep' /path/to/program

そして、いつでも program が実行されると、それ以降は CAP_NET_BIND_SERVICE 能力を持つ。 setcap は、debian パッケージに含まれる libcap2-bin .

では、注意点です。

  1. 最低でも2.6.24のカーネルが必要です
  2. ファイルがスクリプトの場合、この方法は使えません。(つまり、インタプリタを起動するために #! 行を使用する場合)。この場合、私が理解する限り、インタープリタの実行ファイル自体に能力を適用しなければならず、もちろん、そのインタープリタを使用するすべてのプログラムが能力を持つので、セキュリティ上の悪夢となります。この問題を回避する簡単な方法は見つかりませんでした。
  3. Linux は、すべての program のような昇格した特権を持つ setcap または suid . ですから、もし program は、独自の .../lib/ ポートフォワーディングのような別のオプションを検討する必要があるかもしれません。

リソース

RHEL は v6 で初めてこれを追加した .