web-dev-qa-db-ja.com

ルート権限なしでiptablesを使用する

ユーザー_ec2-user_として次のスクリプトを実行すると、エラーメッセージiptables v1.4.18: can't initialize iptables table filter: Permission denied (you must be root)が表示されます

スクリプト:

_#!/bin/sh
# Offending IP as detected by mod_evasive
# Add the following firewall rule (block IP)
$IPTABLES -I INPUT -s $IP -j DROP
_

Root以外のユーザーとしてiptablesを実行してIPアドレスをブロックするにはどうすればよいですか?

注意:このスクリプトは通常mod_evasiveによって呼び出されます

3
AlexR

スクリプトにsetuidビットを設定して、常にrootとして実行されるようにします。

chown root myscript
chmod u+s myscript
3
Michael Hampton

ここで行った別のコメントに基づいて、発生している問題は、bashが実行しようとしているスクリプトを見つけられないことです。

$PATH環境設定で定義されているパスのいずれにもないスクリプトまたはコマンドを実行している場合は、その絶対パスまたは相対パスを指定する必要があります。例えば:

  • スクリプトが/usr/local/binにある場合は、/usr/local/bin/scriptname.shを実行する必要があります。
  • スクリプトがホームディレクトリにある場合は、/home/username/scriptname.shまたは~/scriptname.shを実行する必要があります。
  • または、そのディレクトリに移動して、./で次のように呼び出すこともできます:./scriptname.sh

また、使用している環境ファイルに応じて、$PATH.bash_profile、または.bashrcを変更して、.profile環境設定をスクリプトへのパスで更新することもできます。

1
Gene

コマンドの前にSudoを追加するだけです:

#!/bin/sh
# Offending IP as detected by mod_evasive
# Add the following firewall rule (block IP)
Sudo $IPTABLES -I INPUT -s $IP -j DROP
0
MohyedeenN

スクリプトが次の場合:

/drop.sh

次のようになります:

#!/bin/sh
exec /sbin/iptables -I INPUT -s "$1" -j DROP

次に、/etc/sudoersファイルに次のような行を追加します。

www-data ALL=(root) NOPASSWD: /drop.sh

注意:Apacheがwww-data以外のユーザーとして実行されている場合は、ここでそのユーザー名を使用する必要があります。これにより、Apacheユーザーはdrop.shを実行できます

最後に、mod_evasiveのラッパー:

#!/bin/sh
exec Sudo /drop.sh "$@"
0
geocar