更新 2017:
[authbind][1] を使用
*免責事項 (2021 年ごとに更新): authbind は LD_PRELOAD を介して機能することに注意してください。これは、プログラムが LIBC を使用する場合にのみ使用されます。これは、プログラムが GO でコンパイルされている場合、または C を回避する他のコンパイラーの場合には当てはまらない (またはそうでない可能性があります)。 go を使用する場合は、保護されたポート範囲のカーネル パラメータを設定します。投稿の下部を参照してください。</EndUpdate>
Authbind は、CAP_NET_BIND_SERVICE やカスタム カーネルよりもはるかに優れています。
- CAP_NET_BIND_SERVICE は、バイナリに信頼を付与しますが、ポートごとのアクセスを制御しません。
- Authbind は、ユーザー/グループに信頼を付与し、ポートごとのアクセスを制御し、IPv4 と IPv6 の両方をサポートします (IPv6 サポートは最近追加されました)。
インストール:apt-get install authbind
関連するポートへのアクセスを構成します (例: すべてのユーザーとグループの 80 と 443)。
sudo touch /etc/authbind/byport/80
sudo touch /etc/authbind/byport/443
sudo chmod 777 /etc/authbind/byport/80
sudo chmod 777 /etc/authbind/byport/443
次の方法でコマンドを実行しますauthbind
(必要に応じて--deep
またはその他の引数を指定します。man ページを参照してください)。
authbind --deep /path/to/binary command line args
e.g.
authbind --deep java -jar SomeServer.jar
カーネルをハックする Joshua の素晴らしい (=あなたが何をしているのかを知らない限り、お勧めしません) 推奨事項のフォローアップとして:
ここに最初に投稿しました。
単純。通常または古いカーネルでは、そうではありません。
他の人が指摘したように、iptables はポートを転送できます。
他の人も指摘しているように、 CAP_NET_BIND_SERVICE も仕事をすることができます。
もちろん、スクリプトからプログラムを起動すると CAP_NET_BIND_SERVICE は失敗します。シェル インタープリターにキャップを設定しない限り、これは無意味です。サービスを root として実行することもできます。
たとえば、Java の場合は、それを適用する必要があります。 JAVA JVMに
sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/lib/jvm/java-8-openjdk/jre/bin/java
明らかに、これはどの Java プログラムもシステム ポートをバインドできることを意味します。
mono/.NET 用の Dito。
また、xinetd が最善のアイデアではないことも確信しています。
しかし、どちらの方法もハックなので、制限を解除して制限を解除してみませんか?
通常のカーネルを実行する必要があるとは誰も言っていないので、独自のカーネルを実行するだけでかまいません。
最新のカーネル (または現在持っているもの) のソースをダウンロードするだけです。その後、次の場所に移動します。
/usr/src/linux-<version_number>/include/net/sock.h:
そこでこの行を探します
/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK 1024
そしてそれをに変更します
#define PROT_SOCK 0
安全でない ssh の状況を避けたい場合は、次のように変更します: #define PROT_SOCK 24
通常、私はあなたが必要とする最も低い設定を使用します。たとえば、http の場合は 79、ポート 25 で SMTP を使用する場合は 24 です。
それだけです。
カーネルをコンパイルしてインストールします。
リブート。
完了 - そのばかげた制限はなくなっており、スクリプトでも機能します。
カーネルをコンパイルする方法は次のとおりです。
https://help.ubuntu.com/community/Kernel/Compile
# You can get the kernel-source via package linux-source, no manual download required
apt-get install linux-source fakeroot
mkdir ~/src
cd ~/src
tar xjvf /usr/src/linux-source-<version>.tar.bz2
cd linux-source-<version>
# Apply the changes to PROT_SOCK define in /include/net/sock.h
# Copy the kernel config file you are currently using
cp -vi /boot/config-`uname -r` .config
# Install ncurses libary, if you want to run menuconfig
apt-get install libncurses5 libncurses5-dev
# Run menuconfig (optional)
make menuconfig
# Define the number of threads you wanna use when compiling (should be <number CPU cores> - 1), e.g. for quad-core
export CONCURRENCY_LEVEL=3
# Now compile the custom kernel
fakeroot make-kpkg --initrd --append-to-version=custom kernel-image kernel-headers
# And wait a long long time
cd ..
簡単に言えば、安全を確保したい場合は iptables を使用し、この制限が二度と気にならないようにしたい場合はカーネルをコンパイルします。
注: 最近では、カーネルの更新は不要になりました。
設定できるようになりました
sysctl net.ipv4.ip_unprivileged_port_start=80
または持続する
sysctl -w net.ipv4.ip_unprivileged_port_start=80.
それでエラーが発生した場合は、nano で /etc/sysctl.conf を編集し、再起動後も持続するようにパラメーターを設定します。
またはprocfs経由
echo 80 | sudo tee /proc/sys/net/ipv4/ip_unprivileged_port_start