私のサーバーに携帯電話モデムが接続されていて、有線電話が切れたときにそれを使用して通知メールを送信したいと思います。
通常のネットワークアクセスとこの特定のセルラーモデムアクセスをうまく分離するために、ネットワークネームスペースを作成し、ネットワークデバイスをその中にある唯一のデバイスにしました。プログラムが携帯電話モデムを使用できるようにするには、単にip netns exec
。
問題は、すべてのユーザーが名前空間で必要なすべてのプログラムを実行できるようにしたいが、netns exec
root権限が必要であることです。私の解決策は次のとおりです。
/usr/local/sbin/_oob_shim:
#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
/usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"
/etc/sudoers:
ALL ALL=NOPASSWD: /usr/local/sbin/_oob_shim
root権限がない場合、またはrootパスワードを知らない状態でshimを実行する唯一の方法はsudoを介することだと思います。sudoを使用して$ SUDO_UIDと$ SUDO_GIDを正しい値に設定できると思います。
私はかなりの危険にさらされていますか?それとも明白な警告を逃したと言うべきですか?
答え1
sh -c
あなたのコードで見られる唯一のエラーは、直接実行する必要があるユーザーコマンドを不必要に実行していることです。これを実行してもsh -c
役に立ちませんが、ユーザーが元々入力したコマンドへの参照は削除されます。たとえば、次のことを試してみてください。
sudo /usr/local/sbin/_oob_shim ls -l "a b"
a b
名前空間のコンテキストで呼び出されたファイルを一覧表示する必要がありますa
。b
sudo /usr/local/sbin/_oob_shim ls -l "*"
名前がアスタリスクのファイルを一覧表示する必要があります*
が、同じ理由で失敗します。
したがって、次のようにする必要があります。
#!/bin/sh
/bin/ip netns exec oob \
/usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"
スクリプトの起動を簡単にしましょう!
私ができるもう1つのポイントは、この場合、バグはセキュリティバグではなく機能的なバグにすぎませんが、セキュリティに敏感なコードを監査し、シェルを介してタスクを実行するのを見るときは常に疑わしいということです。これはほぼ常に問題だからです。
最後に、ユーザーのセカンダリグループは名前空間に伝播されませんが(uidとプライマリgidのみがインポートされます)、これは大きな問題ではないように見えます。
それ以外は私が見るのは大丈夫です。