私が制御できない理由でTCP "localhost:$ PORT"にバインドされたバイナリがあります。 (Unixソケットバインディングによってこの質問に疑問が生じる可能性があります)。
私が正しく理解した場合、これは、ネットワークシステムが接続できない場合でも、そのシステムの他のユーザー(権限のないデーモンユーザーを含む)がそのポートに接続できることを意味します。
$ meで実行されているバイナリのみがこのポートに接続できるように指定する方法はありますか?設定を指定するためにルートにすることができますが、受信バイナリと接続バイナリの両方が root ではなく $me ユーザーとして実行されます。
答え1
iptablesには一致する拡張機能がありますが、owner
OUTPUTおよびPOSTROUTINGチェーンでのみ使用できます。したがって、次のようにiptables OUTPUTチェーンの先頭に2つのルールを追加できます(rootアクセスが必要)。
iptables -I OUTPUT 1 -o lo -p tcp --dport $PORT -m owner --uid-owner $me -j ACCEPT
iptables -I OUTPUT 2 -o lo -p tcp --dport $PORT -j DROP
- ルール1:パケットがTCPを介してループバックインターフェイスから送信され、宛先ポートが$ PORTでパケット所有者が$ meの場合は、そのパケットを通過させます(そしてこのチェーンの他のルールは処理しないでください)。
- ルール2:パケットがTCPを介してループバックインターフェイスから送信され、宛先ポートが$ PORTであるがルール1と一致しない場合(つまり、$ me以外の人がパケットを所有している場合)、パケットを破棄します。
システムにiptables設定を管理するサービスがある場合(たとえば、ufw
Debian / Ubuntuやfirewalld
RedHat / Fedoraシステムなど)、手動で直接追加するのではなく、これらのiptablesルールを生成するようにサービスを構成できます。
答え2
Nftableリファレンス:https://wiki.nftables.org/wiki-nftables/index.php/Matching_packet_metainformation#Matching_by_socket_UID_.2F_GID
この場合http://127.0.0.1:8000他のユーザーはアクセスできず、rootとしてのみアクセス可能
table inet filter {
# [...]
chain output {
type filter hook output priority filter; policy accept;
oif "lo" tcp dport 8000 meta skuid 0 accept
oif "lo" tcp dport 8000 drop
}
}
以下を使用してこれをテストできます。
# dropped
curl http://127.0.0.1:8000/
# accepted
sudo curl http://127.0.0.1:8000/