При запуске следующего сценария от имени пользователя ec2-user
, я получаю сообщение об ошибке iptables v1.4.18: не удается инициализировать фильтр таблицы iptables: разрешение запрещено (вы должны быть root)
Script:
#!/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-адрес?
Примечание: этот сценарий обычно вызывается 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 вы используете.
Просто добавьте 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
NB, если Apache работает как пользователь помимо www-data
, вам нужно будет использовать здесь это имя пользователя. Это позволяет пользователю Apache запускать ваш drop.sh
Затем, наконец, оболочку для mod_evasive
:
#!/bin/sh
exec sudo /drop.sh "$@"