web-dev-qa-db-ja.com

シェルスクリプトにUIDを設定できない

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

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

私が期待する出力が得られます:

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

ただし、Apacheとして実行されるサボテンの一部としてこれを実行したいと思います。現在、Apacheはiptablesを実行できません。これがスクリプトを作成した理由です。私はそれをSUID rootとして設定しました:

-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を使用してすべてをうまくグラフ化できるようにすることです。

14
Tom Ritter

シェルスクリプトにSUIDルートを使用することはできません。 SUID rootにできるのは実際のプログラムのみで、シェルスクリプトは「#!」で始まります。インタプリタは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して手動で実行した場合にも、エラーメッセージが表示されると確信しています。

16
Christian

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

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

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

13
Tom Ritter

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

2
Kyle Brandt