При запуске следующего сценария от имени пользователя 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
Как я могу бежать iptables
как пользователь без полномочий root, чтобы заблокировать IP-адрес?
NB: этот скрипт обычно вызывается 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
, в зависимости от того, какой файл env вы используете.
Если ваш сценарий:
/drop.sh
и выглядит так:
#!/bin/sh
exec /sbin/iptables -I INPUT -s "$1" -j DROP
Затем добавьте строку в свой /etc/sudoers
файл, который выглядит примерно так:
www-data ALL=(root) NOPASSWD: /drop.sh
NB, если Apache работает как пользователь, кроме www-data
здесь вам нужно будет использовать это имя пользователя. Это позволяет пользователю Apache запускать ваш drop.sh
Затем, наконец, обертка для mod_evasive
:
#!/bin/sh
exec sudo /drop.sh "$@"
Просто добавьте 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