GNU/Linux >> Linux の 問題 >  >> Linux

root アクセスなしで 1024 未満のポートにバインドする

解決策 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" というライブラリをぼんやりと覚えています。

プロジェクトの状況については不明ですが、必要に応じて (再) 実装する方法はかなり簡単です。


Linux
  1. root アクセスなしで zsh をインストールしますか?

  2. root アクセスなしで、参照 BLAS とリンクされている場合は、調整された BLAS で R を実行します

  3. Ansible:パスワードなしの sudo

  1. root 以外のプロセスがポート 80 と 443 にバインドできるようにしますか?

  2. sudo なしで ifconfig を実行する

  3. ルートなしでシリアルポートへの読み取り/書き込み?

  1. sudo / rootなしでループバックファイルをマウントして変更することは可能ですか?

  2. root アクセスを許可せずに、あるユーザーが別のユーザーに su できるようにするにはどうすればよいですか?

  3. パスワードなしで Linux root ユーザー mysql root アクセスを許可する