Доступ к iptables не для root

Автор Yacudzer, 31 августа 2020, 15:50:32

« назад - далее »

0 Пользователи и 5 гостей просматривают эту тему.

Yacudzer

Всем привет.
Как известно, управлять правилами iptables можно только из-под root.
Однако, есть сервис, который работает из соображений безопасности не из-под root и мне надо дать этому пользователю права на внесение изменений в iptables.
В идеале - лучше если создать группу и всех пользователей кто может управлять iptables добавлять в эту группу.
Кто-то может подсказать как лучше реализовать сию хотелку?

Whowka

#1
В sudoers.d создать файл с правилами для группы,  не?

Yacudzer

Цитата: Whowka от 31 августа 2020, 19:15:25В sudoers.d создать файл с правилами для группы,  не?
Как это будет выглядеть? Насколько я понимаю, надо будет команды выполнять через sudo, а это подразумевает ввод пароля... Скрипт же будет выполняться в автоматическом режиме из под демона. Ввод паролей тут не приемлем.
Еще идеи?

Whowka

#3
Цитата: Yacudzer от 01 сентября 2020, 12:53:30а это подразумевает ввод пароля...
NOPASSWD:/путь к запускаемому, под sudo, файлу/?

Yacudzer

Цитата: Whowka от 01 сентября 2020, 14:03:06NOPASSWD:/путь к запускаемому, под sudo, файлу/?
Да, отлично. Думаю, это подойдет, спасибо.

А я хотел было с битами SUID помудрить - не вышло...

Yacudzer

Whowka, немного не хорошо эта схема работает
OpenVPN работает под юзером openvpn, в passwd определен так:
openvpn:x:1001:1001::/dev/null:/usr/sbin/nologin

Процесс openvpn запускает скрипт на python, который должен выполнить примерно следующее:
sudo nft -aj list chain filter forward

Запускается так:
req = ['sudo', 'nft', '-aj', 'list', 'chain', 'filter', 'forward']
result = subprocess.run(req
                                ,stdout = subprocess.PIPE
                                ,stderr = subprocess.PIPE
                                ,encoding = 'utf8')


Ну и в ответ получаю следующее:

2020-09-09 23:10:33,596 - nftables_wrapper - DEBUG - json_data: '', err='We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

sudo: no tty present and no askpass program specified'


Куда копать?

Whowka

Цитата: Yacudzer от 09 сентября 2020, 23:28:47no tty present and no askpass program specified'
У пользователя недостаточно прав на запуск. Копать man sudoers. (я не знаток, я любитель. У меня мой скрипт запускается через NOPASSWD без запроса пароля :) )

Yacudzer

Цитата: Whowka от 10 сентября 2020, 02:40:38У меня мой скрипт запускается через NOPASSWD без запроса пароля
Ну и у меня так же. Есть группа iptables, в нее включен пользователь openvpn (и я с именем yacudzer):
iptables:x:1002:yacudzer,openvpn
Ну и в sudoers:
#includedir /etc/sudoers.d
Соответственно, в /etc/sudoers.d/iptables:
Cmnd_Alias      IPTABLES = /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore
Cmnd_Alias      TEE = /usr/bin/tee
Cmnd_Alias      NFT = /usr/sbin/nft
%iptables       ALL=(ALL)NOPASSWD:IPTABLES,TEE,NFT


Причем, когда я из под себя (yacudzer) выполняю команду sudo nft бла-бла-бла, то все работает и никакого пароля не запрашивается. Значит, права есть. По крайней мере, мне выдаются. По логике вещей и для openvpn права такие же должны быть.

А другие способы есть запускать nft с правами root из-под openvpn?

Whowka

а  пользователю openvpn позволено  sudo?

Yacudzer

#9
Цитата: Whowka от 10 сентября 2020, 09:39:56а  пользователю openvpn позволено  sudo?
Что значит позволено? В группе sudo его нет, а должен быть?

P.S. Только что проверил - удалил себя из группы sudo - доступ к nft и iptables остался. Все остальное denied...

Whowka

#10
Цитата: Yacudzer от 10 сентября 2020, 09:47:40В группе sudo его нет
ну, у меня в группе sudo никого нет. Я же говорю: тут в man sudoers лезть нужно.
Вот тута есть некоторые примеры на русском.
Мож в Runas_Alias чё прописать нужно, или в User_Alias...  ???

Yacudzer

Whowka, чет мне подсказывает, дело не в sudoers...
Я сейчас навесил на /usr/sbin/nft suid бит, поменял ему группу на openvpn и убрал права всем остальным пользователям. Получилось следующее:
yacudzer@prd-ovpn-03:~$ ls -l /usr/sbin/nft
-rwsr-x--- 1 root iptables 18504 Dec  3  2018 /usr/sbin/nft


Когда я вызываю бинарник - он отрабатывает нормально.

openvpn@prd-ovpn-03:/home/yacudzer$ whoami
openvpn
openvpn@prd-ovpn-03:/home/yacudzer$ /usr/sbin/nft -a list chain filter forward
table ip filter {
        chain forward { # handle 7
                type filter hook forward priority 0; policy accept;
                ct state established accept comment "Early allow established connections" # handle 11
                iif 3 jump OpenVPN comment "OpenVPN tunnel pid 427" # handle 13


Но, когда его вызывает openvpn, то фигня получается. Вылетает по exception. Причем, я внедрил выполнение whoami в скрипт. Вот лог выполнения:
2020-09-10 11:44:30,849 - __main__ - DEBUG - whoami_stdout: openvpn
, whoami_stderr:
2020-09-10 11:44:30,849 - nftables_wrapper - DEBUG - Checking value 'pid 2212' in condition 'comment' for table 'filter' in chain 'forward'
2020-09-10 11:44:30,849 - nftables_wrapper - DEBUG - getNftJsonRules request: ['/usr/sbin/nft', '-aj', 'list', 'chain', 'filter', 'forward']
2020-09-10 11:44:30,850 - nftables_wrapper - DEBUG - getNftJsonRules exception: <class 'PermissionError'>: [Errno 13] Permission denied: '/usr/sbin/nft'


Т.е. с правами полная хрень даже когда я запускаю бинарник напрямую.

Whowka

Цитата: Yacudzer от 10 сентября 2020, 14:10:29чет мне подсказывает, дело не в sudoers...
Возможно, но дальше я пас.  :) Мои познания python заканчиваются, пока что,  на  if-then-elif-else :)