権限のないユーザーがポート80でWebサーバーを起動できるようにする

権限のないユーザーがポート80でWebサーバーを起動できるようにする

root 以外のユーザーがポート 80 および 443 で Web サーバーを起動できるようにした場合、セキュリティへの影響がわかります。

root以外のユーザーがUbuntu 16とCentOS 7のポート80と443でWebサーバーを呼び出すことができるように、権限の確認を削除したいと思います。

コンピュータにrootアクセス権がありますが、NFS特権の問題を解決するには、別のユーザー名でWebサーバーを実行する必要があります。この代替ユーザー名にはrootアクセス権がありません。

これまで私は以下を見てきました:

  • setcap cap_net_bind_service=ep /path/to/the/executable(実行ファイルはリモートで再コンパイルされ、NFSに保存されるため固定されません。)
  • パスワードのないユーザーをアクティブsudoersにするようにファイルを編集します(まだNFSアクセスに問題があります)。sudoroot

理想的にはsetcapのようなものが欲しいが、ポート、実行可能ファイルの代わりに権限チェックを完全に放棄します。

関連: https://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-on-linux

authbind有望に見えるけどうまくいかないようですGoLang Webサーバーの使用

Ubuntu 16は古すぎて、権限のないポート起動範囲の変更を許可しません。

> sudo sysctl net.ipv4.ip_unprivileged_port_start=80
sysctl: cannot stat /proc/sys/net/ipv4/ip_unprivileged_port_start: No such file or directory

答え1

setcap私はこれがあなたの答えになると思います。ここで本当の質問は次のとおりです。 NFSのWebサーバーがタッチされてsetcapコマンドを実行できる場合、システムはどのように認識しますか?

私の考えでは、建物を建てたいと思います。inotifyまたはsystemd.pathこのWebサーバーを監視します。そのバイナリが置き換えられたら、それを検出してsetcap適切なコマンドをトリガーします。この方法は、Webサーバーがすでにsystemdを介して実行されている場合に特に効果的です。

systemd.path以下は、サーバーがシステムサービスとして実行されていると仮定する例です。webserver.service

# /etc/systemd/system/webcap.path
[Unit]
Description=Watching changes in the webserver binary
# Start monitoring only after the webserver is running.
After=webserver.service

[Path]
# Whenever someone writes to this path (binary is replaced), do something
PathModified=/path/to/webserver
# This is the service you launch when the above condition is met
Unit=webcap.service

[Install]
#Whenever the webserver is started, this monitor will also start
WantedBy=webserver.service
# /etc/systemd/system/webcap.service
[Unit]
Description=Update caps of webserver

[Service]
Type=oneshot
ExecStart=ssetcap cap_net_bind_service=ep /path/to/webserver

答え2

スチュワートが好きですが、回答、パイプライン()に潜在的に中断される可能性がある別の部分を追加するので、最終的にperをsystemd使用するようになりました。capshこの回答。再コンパイルする必要がありました。ソースから環境機能機能(生成されたバイナリをとして保存/sbin/capsh2)を取得するには、これを起動コマンドとして設定できます。

/sbin/capsh2 --keep=1 --user=nonrootuser --inh=cap_net_bind_service --addamb=cap_net_bind_service -- -c /path/to/webserver

このコマンドをrootとして実行すると、Webサーバーが正しく起動し、nonrootuser「ユーザースペース」のポート80と443にバインドできます。

関連情報