ユーザー_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によって呼び出されます
スクリプトにsetuidビットを設定して、常にrootとして実行されるようにします。
chown root myscript
chmod u+s myscript
ここで行った別のコメントに基づいて、発生している問題は、bashが実行しようとしているスクリプトを見つけられないことです。
$PATH
環境設定で定義されているパスのいずれにもないスクリプトまたはコマンドを実行している場合は、その絶対パスまたは相対パスを指定する必要があります。例えば:
/usr/local/bin
にある場合は、/usr/local/bin/scriptname.sh
を実行する必要があります。/home/username/scriptname.sh
または~/scriptname.sh
を実行する必要があります。./
で次のように呼び出すこともできます:./scriptname.sh
また、使用している環境ファイルに応じて、$PATH
、.bash_profile
、または.bashrc
を変更して、.profile
環境設定をスクリプトへのパスで更新することもできます。
コマンドの前に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
スクリプトが次の場合:
/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 "$@"