Chamar sudo dentro de um script que foi chamado com sudo solicita senha mesmo com NOPASSWD

1

Um programa em PHP com o qual estou trabalhando ( LConf ) chama um script usando sudo .

Eu permiti que o usuário apache executasse o script e testei com sudo -u apache /usr/local/LConf/lconf_deploy.sh .

Estou sendo solicitado a fornecer uma senha quando lconf_deploy.sh chama /usr/bin/sudo -u icinga /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v , mas não tenho problemas ao chamar linhas antes ou depois dessa linha.

Depois de ler muito (tanto no stackexchange quanto em outros lugares da internet) sobre o que fazer nessa situação, eu desabilitei requiretty e usei NOPASSWD para tudo que eu possa pensar que afete essa situação.

# cat /etc/sudoers | grep -v "#"
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
apache ALL = NOPASSWD: /usr/local/LConf/lconf_deploy.sh
apache ALL = NOPASSWD: /usr/bin/sudo -u icinga /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v
apache ALL = NOPASSWD: /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v
icinga ALL = NOPASSWD: /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v

É possível alternar o contexto do usuário (ou sei lá) usando sudo , enquanto já " sudoing "?

Se não, como resolvo esse problema? Observe que /usr/local/LConf/LConfExport.pl deve ser executado como o usuário icinga .

Obrigado,

Matt

[atualizado com referência ao comentário do mdpc abaixo]

   User_Alias      LCONF=apache,icinga
   Defaults:LCONF !requiretty
   LCONF ALL=(icinga) NOPASSWD: /usr/local/LConf/LconfExport.pl -o /etc/icinga/lconf -v
   LCONF ALL= NOPASSWD: /usr/local/LConf/lconf_deploy.sh

A execução de sudo -u apache /usr/local/LConf/lconf_deploy.sh. ainda solicita a senha

   # cat  /usr/local/LConf/lconf_deploy.sh
   echo start of script
   /usr/bin/sudo -u icinga /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v
   /etc/init.d/icinga reload
   # sudo -u apache /usr/local/LConf/lconf_deploy.sh
   start of script
   [sudo] password for apache:
   Running configuration check.../etc/init.d/icinga: line 111: /var/icinga/icinga.chk:      Permission denied
   CONFIG ERROR! Reload aborted. See /var/icinga/icinga.chk for details.

Qualquer ajuda é apreciada.

    
por mbrownnyc 15.08.2012 / 16:35

3 respostas

0
   == mbrownnyc [266b4002@gateway] has joined ##linux
   -ChanServ- [##linux] Welcome to ##Linux! Can't speak? Please see http://linuxassist.net/irc on how to register or identify your nick. By joining this channel you agree to abide by the channel rules and guidelines stated on the official ##Linux website http://www.linuxassist.net/rules .
   <loomsen> there are different ways to solve this, but all of them are ugly and        discouraged
   <loomsen> mbrownnyc, you could add apache to the icinga group, make that script ug+x and set a sticky bit
   <nb-ben> mbrownnyc, you should take a look at suEXEC for php

   <koala_man> mbrownnyc: works fine: http://pastebin.com/JhefHzCh
   <koala_man> mbrownnyc: I still think you're just confusing your users
   <koala_man> mbrownnyc: you add permissions for apache to run lconf_deploy as        root, and then test using your icinga user
   <koala_man> to run it as apache

Solução:

   # cat /etc/passwd | grep icinga
   icinga:x:499:500:icinga:/var/icinga:/bin/false
   # cat /etc/passwd | grep apache
   apache:x:48:48:Apache:/var/www:/bin/false

   # grep -v "#" /etc/sudoers
   Defaults    !requiretty
   Defaults   !visiblepw
   Defaults    always_set_home
   Defaults    env_reset
   Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
   Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
   Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
   Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
   Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
   Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
   root    ALL=(ALL)       ALL

   User_Alias      LCONF=apache,icinga
   Defaults:LCONF !requiretty

   LCONF ALL=(apache) NOPASSWD: /usr/local/LConf/lconf_deploy.sh
   LCONF ALL=(icinga) NOPASSWD: /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v

   # cat /usr/local/LConf/lconf_deploy.sh
   #!/bin/bash
   echo start of script
   sudo -u icinga /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v
   /etc/init.d/icinga reload
    
por 16.08.2012 / 16:41
5

Esta linha:

 apache ALL = NOPASSWD: /usr/bin/sudo -u icinga /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v

não funcionará. Invocará o sudo como apache, e isso não está certo.

O que você provavelmente quer é:

  apache ALL=(icinga) NOPASSWD: /usr/local/LConf/LConfExport.pl -o /etc/icinga/lconf -v
    
por 15.08.2012 / 17:19
1

Digite

su - apache

Então

/usr/local/LConf/lconf_deploy.sh

Se o primeiro comando não funcionar, digite:

su - apache -s /bin/bash
    
por 15.08.2012 / 17:03