LINUX.ORG.RU
решено ФорумAdmin

Sudoers и Я , мы не дружная семья

 , , ,


0

2

Привет, написал скриптик для развертывания поддоменов , все это работает на apache2/nginx. Не знаю в чем магия, но на работе оно не работало, после правки правил sudoers , делал перенициацию через su - username. Пришел домой , зашел по ssh и оно заработало , но возник ряд других вопросов,( и да , я использую mod_vhost_alias , но при разворачивании битрикса это не прокатывает ). Подомены будут создаваться по скрипту автоматом для разработчиков , поэтому им надо урезать права. собственно вот скрипт create_domain.sh

#!/bin/sh
echo 'please set domain' && read set
        if [ -f "/etc/nginx/sites-available/$set" ]
                then echo 'this domain exists , please specify another domain and press key'
                exit 1
        else
                #nginx domain create
                echo "\n This is domain not exist. Domain was created"
                sudo touch /etc/nginx/sites-available/$set &&
                sudo sed "s/set/$set/g" /var/http/nginx/template_in >  /var/http/nginx/template_out && echo "\n nginxi config domain create loading..." &&
                sudo cat  /var/http/nginx/template_out >  /etc/nginx/sites-available/$set &&
                sudo cat  /var/http/nginx/template_out >>  /etc/nginx/sites-available/apache2_sub &&
                sudo ln -s  /etc/nginx/sites-available/$set  /etc/nginx/sites-enabled/ && echo "\n nginx domain was created"

                #apache2 domain
                sudo touch /etc/apache2/sites-available/$set &&
                sudo sed "s/set/$set/g" /var/http/apache2/template_in > /var/http/apache2/template_out && echo "\n apache2 config domain create loading..." &&
                sudo cat /var/http/apache2/template_out > /etc/apache2/sites-available/$set.conf &&
                sudo ln -s /etc/apache2/sites-available/$set.conf  /etc/apache2/sites-enabled/ && echo "\n apache2 domain was created"

        fi

        if [ -L "/etc/nginx/sites-enabled/$set" ] & [ -L "/etc/apache2/sites-enabled/$set.conf" ]
                then echo "127.0.0.1 $set.dev" >> /etc/hosts
                sudo mkdir -p /var/http/public/$set &&
                sudo mkdir -p /var/log/apache2/dev/"$set"_ap /var/log/nginx/dev/"$set"_ng &&
                sudo service apache2 reload && sudo service nginx reload && sudo service php7.0-fpm reload &&
                echo "\n ngix / apache2 / php-fpm was reloaded \n Congratelations, you was created new domain"
        else echo "\n WARNING WARNING WARNING    \n You didn't create $set.dev in /etc/hosts file"

        fi

Sudoers

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification
#User_Alias     DEVELOP = roma, sveta, pasha, julia
# Cmnd alias specification
#Cmd_Alias TOUCH        = /bin/touch
#Cmd_Alias MKDIR = /bin/mkdir

# User privilege specification              
roma    ALL= NOPASSWD: /usr/sbin/service nginx reload, /usr/sbin/service apache2 reload, /usr/sbin/service php7.0-fpm reload,\
 /bin/cat, /usr/bin/touch, /bin/sed,\
 /var/http/create_domain.sh
root    ALL=(ALL:ALL) ALL
sveta   ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d [/cut]

собственно скрипт не выполняется от рута под обычным пользователем, почему?

sveta@dev-test1:~$ echo '11' >> /etc/hosts
-bash: /etc/hosts: Отказано в доступе

sveta@dev-test1:/var/http$ sed s/127.0.0.1/'__|__'/g /etc/hosts
__|__   localhost   test1.com     

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
__|__ :q.dev
__|__ visit.dev
__|__ bit.dev
__|__ bvc.dev
__|__ gfh.dev
__|__ xzc.dev
__|__ tyy.dev
__|__ mmm.dev
__|__ visit.dev
__|__ fjdfsdfsfds.dev


sveta@dev-test1:/var/http$ sudo sed s/127.0.0.1/'__|__'/g /etc/hosts >> /etc/hosts
-bash: /etc/hosts: Отказано в доступе

sveta@dev-test1:/var/http$ sudo cat ./nginx/template_out >> /etc/nginx/sites-available/test2
-bash: /etc/nginx/sites-available/test2: Отказано в доступе
sveta@dev-test1:/var/http$ sudo ./create_domain.sh
[sudo] пароль для sveta:
please set domain
nesrabotaet

 This is domain not exist. Domain was created

 nginxi config domain create loading...

 nginx domain was created

 apache2 config domain create loading...

 apache2 domain was created

 ngix / apache2 / php-fpm was reloaded
 Congratelations, you was created new domain

Хм, сработало, но почему он обычные команды вне скрипта не может выполнить?

С Ромой тоже сработало ,магия !!!

Ладно тогда, если убрать скрипт из под sudoers и загнать команды под рамки ( у меня ничего не работает :( )

sudoers

# User privilege specification
roma    ALL= NOPASSWD: /usr/sbin/service nginx reload, /usr/sbin/service apache2 reload, /usr/sbin/service php7.0-fpm reload,\
 /usr/bin/touch /etc/nginx/sites-*, /usr/bin/touch /etc/apache2/sites-*,\
 /bin/sed s/set/*/g /var/http/nginx/* > /etc/nginx/sites-*, /bin/sed s/set/*/g /var/http/apache2/* > /etc/apache2/sites-*,\
 /bin/sed * /etc/hosts > /var/http/*,\
 /bin/cat /var/http/nginx/* > /etc/nginx/sites-*,\
 /bin/cat /var/http/apache2/* > /etc/apache2/sites-*, /bin/cat /var/http/nginx/* >> /etc/nginx/sites-av*/apache2_sub

root    ALL=(ALL:ALL) ALL
sveta   ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

не получается

roma@dev-test1:/var/http$ ./create_domain.sh
please set domain
its

 This is domain not exist. Domain was created
[sudo] пароль для roma:
Пользователю roma запрещено выполнять '/bin/sed s/set/its/g /var/http/nginx/template_in' с правами root на dev-test1.
[sudo] пароль для roma:
Пользователю roma запрещено выполнять '/bin/sed s/set/its/g /var/http/apache2/template_in' с правами root на dev-test1.

 WARNING WARNING WARNING
 You didn't create its.dev in /etc/hosts file

Пробовал

/bin/sed 's/set/*/g /var/http/nginx/* > /etc/nginx/sites-*'
 и
/bin/sed "s/set/*/g /var/http/nginx/* > /etc/nginx/sites-*"
 и
/bin/sed `s/set/*/g /var/http/nginx/* > /etc/nginx/sites-*`
и
/bin/sed 's/set/*/g /var/http/nginx/*' > '/etc/nginx/sites-*'
и
/bin/sed "s/set/*/g /var/http/nginx/*" > "/etc/nginx/sites-*"
И
/bin/sed `s/set/*/g /var/http/nginx/*` > `/etc/nginx/sites-*`
 все без толку :(
полюбому его можно как-то в рамки загнать , подскажите где мое упущение и мои ошибки

То, что команда:

sudo sed s/127.0.0.1/'__|__'/g /etc/hosts >> /etc/hosts

не будет работаеть, очевидно. Ведь перенаправление ввода/вывода делает shell (допустим bash) и он пытается его сделать с правами пользователя, а уже потом запустить sudo. Поэтому нужно, либо через sudo запускать sh и давать ему всю строку (включая >>) через опцию ″-c″, либо не использовать перенаправление, а указывать файлы аргументами команды.

А в целом, так не нужно делать, чтобы sed читал из того файла, куда перенаправлен его stdout. Создавайте временный файл и проверяйте код завершения работы sed и перемещайте временный файл на место исходного (поправив его атрибуты).

mky ★★★★★ ()
Ответ на: комментарий от mky

Про перенаправление

я так и делаю, когда запускаю delete_domain.sh :) (про перенаправление)

По поводу sudoers т.е. получается мне придется дать юзеру весь /bin/sh когда буду делать перенаправление? , если да, то можно ли урезать запуском в шелем одной определенной команды что-то типа

/bin/sh -c /bin/sed s/set/*/g /var/http/nginx/* > /etc/nginx/sites-*, ....?

sanekmihailow ()
Ответ на: Про перенаправление от sanekmihailow

Re: Про перенаправление

Я не знаю, что вы там делаете в delete_domain.sh, да и знать особо не хочу, мне хватило, что в create_domain.sh что не строчка, то sudo. Если скрипт должен работать с кучей файлов, то не нужно в каждую строку sudo. Такой скрипт пишется без всяких sudo внутри, а просто запускается весь целиком через sudo (делается запись в sudoers).

Что касается урезания, то в приниципе, sudoers позволяет указать какие аргументы можно задавать командам, том числе и /bin/sh, но, это шатко и лучше на каждое действие (группу действий) писать отдельный скрипт-обёртку и его вызвать через sudo. Тогда можно точно ограничить выполняемые команды и имена перенаправлемых файлов, легко сделать логгирование в отдельный файл. Только в таких скриптах (если пользователь кулхацкер) нужно осторожно подходить к обработке аргрументов.

что-то типа

аргумент опции ″-c″ должен быть в одинарных кавычках, чтобы текущий шелл не пытался с ним ничего сделать, например, обработать символ перенаправления ″>″.

mky ★★★★★ ()

Congratelations, you was created new domain

%D

anonymous ()
Ответ на: Про перенаправление от sanekmihailow

Палю годноту:

echo '127.0.0.1 vk.com' | sudo tee -a /etc/hosts

Вообще весь твой скрипт выглядит так, словно его надо запускать целиком из-под sudo. Очень, знаешь ли, напоминает «админские скрипты на perl», на 90% состоящие из system(«rm bla-bla-bla»).

kawaii_neko ★★★★ ()

Ох, пиши лучше на русском.

Ну и да, проще было бы сделать sudoers на вызов именно этого скрипта, и повесить на него root:root 755, чем дергать судо в каждой второй строчке. Это, кстати, поможет решить проблему

sveta@dev-test1:/var/http$ sudo sed s/127.0.0.1/'__|__'/g /etc/hosts >> /etc/hosts
-bash: /etc/hosts: Отказано в доступе
Потому что через sudo в этой команде ты вызываешь сабшелл и в нем sed, а перенаправление делаешь в родительском шелле.

leave ★★★★★ ()
Последнее исправление: leave (всего исправлений: 1)

Дарю рецепт

#!/bin/sh
test "$EUID" = 0 || exec sudo "$0" "$@"

дальше всё, что хочешь, но уже без суда, и в судоерс прописать только этот скрипт.

DonkeyHot ★★★★★ ()
Ответ на: Дарю рецепт от DonkeyHot

Спасибо всем, на этом думаю тему можно закрыть, все стало понятно и я исправлю скрипт.

PS спасибо за замечания

sanekmihailow ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.