シェルスクリプトにUIDを設定できません


14

ここで何が起こっているのかを知るのを手伝ってくれる人はいますか?パケット数の追跡を設定するいくつかのルールがあります。ルートとして次のスクリプトを実行すると:

#!/bin/bash
iptables -t mangle -xnvL

期待どおりの出力が得られます。

//snip
233203 199929802 MARK  //blah blah blah
//snip

ただし、Apacheとして実行されるcactiの一部としてこれを実行します。現在、Apacheはiptablesを実行できません。これがスクリプトを持っている理由です。SUIDルートとして設定しました

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

しかし、その後、私はこの出力を取得します:

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

明らかに私のカーネルは正常であり、非ルートとして実行しているという事実は何かを台無しにしていますが、その理由はわかりません。[デモ](http://en.wikipedia.org/wiki/Setuid#Demonstrationで SUIDを再確認し、機能していることを確認しました。

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

私の最終目標は、Apacheとして実行中にiptables -t mangle -xnvLの出力を取得して、cactiを使用してすべてをうまくグラフ化できるようにすることです。

回答:


16

シェルスクリプトにSUIDルートを使用することはできません。実際のプログラムのみがSUIDルートになり、シェルスクリプトは「#!」で始まります。インタプリタはSUIDを実行する必要があり、それは何らかの理由で動作しませんでした

sudoを見てインストールしてください!/ etc / sudoerrsを編集し、次のような行を追加します。

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

その後、ちょうど実行

sudo /usr/local/sbin/iptables_packet_report.sh

あなたのコードから。

その後、パスワードを要求するのではなく、プロセスを自動的に評価する必要があります。

www-dataに手動でsuして手動で実行した場合にもエラーメッセージが表示されると確信しています。


13

クリスチャンが指摘したように、私の問題は、シェルスクリプトでSUIDを実行しようとしていたことです。 ここで説明したように、シェルスクリプトでSUIDを設定することは非常に悪い考えです。

UNIXでのシェルスクリプトの実行には2段階のプロセスが含まれます。カーネルがシェルスクリプトの実行を決定すると、まずシェルインタープリターのSUIDコピーを起動し、次にシェルインタープリターがシェルスクリプトの実行を開始します。これらの2つの操作は2つの別個のステップで実行されるため、最初のステップの後にカーネルを中断し、シェルインタープリターが実行しようとしているファイルを切り替えることができます。このようにして、攻撃者はコンピュータに任意のシェルスクリプトを実行させることができます。

このため、私が使用していたgentooを含む多くの最新のLinuxディストリビューションはSUIDシェルスクリプトを無視します。sudoersファイルを編集して、機能させることができました。


素晴らしい答え!
デイブチェイニー

これがSolaris 10に当てはまるかどうか誰でも知っていますか?
エリックジョンソン

2

クリスチャンのソリューションが最善だと思いますが、本当にしたいのであれば、shcを使用してスクリプトをコンパイルし、コンパイルされたプログラムでsetuid root することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.