Назад | Перейти на главную страницу

Использование iptables без прав root

При запуске следующего сценария от имени пользователя 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