Como executar um programa específico com privilégios de root (sistema operacional Ubuntu) quando nenhum usuário sudo faz login no sistema?

3

Como faço para executar um programa específico com privilégios de root (Ubuntu OS) quando nenhum usuário sudo está logado no sistema? O programa precisa de privilégios de root para funcionar corretamente. Um usuário normal não deve ser capaz de encerrar esse processo. Por exemplo, tenho dois usuários, Admin e Client; O programa deve iniciar somente quando o cliente efetuar login no sistema. Ele precisa de privilégios de root e o cliente não deve ser capaz de encerrar este processo.

    
por Alexander 24.04.2010 / 09:50

2 respostas

7

Existem algumas maneiras de fazer isso. O login gráfico do Ubuntu é fornecido pelo GDM (ou KDM, se você estiver usando o Kubuntu). O GDM é iniciado pelo subsistema Upstart.

O processo de inicialização segue estas etapas:

  1. Inicializações do sistema. O Upstart inicia serviços, incluindo o GDM ( / etc / init / gdm ).
  2. O GDM inicia, inicializa o servidor X ( / etc / gdm / Init / * ) e apresenta a janela de login da GUI.
  3. Um usuário faz login.
      A autorização do
    1. PAM acontece ( /etc/pam.d/gdm )
    2. O GDM executa o script PostLogin ( / etc / gdm / PostLogin / * ).
    3. O GDM executa o script PreSession ( / etc / gdm / PreSession / * ).
    4. O GDM executa scripts Xsession e xinit
      ( / etc / gdm / Xsession , /etc/X11/xinit/xinitrc.d/ * , / etc / X11 / Xsession , < em> /etc/X11/Xsession.d / * )
  4. A área de trabalho do usuário é exibida.

Onde executar seu script

Tudo antes de XSession é executado como root. / etc / gdm / Xsession e tudo após ser executado como usuário. Isso deixa você com três opções reais para onde executar seu script.

  1. Modifique os scripts PostLogin ou PreSession do GDM / KDM para executar seu programa. O nome de usuário está disponível nas variáveis de ambiente USER ou USERNAME .

  2. Use o PAM para executar seu script. O PAM definirá o usuário autorizador na variável de ambiente PAM_USER . Adicione isto a /etc/pam.d/gdm para lançar o seu script:

    auth  required  pam_exec.so   /path/to/your/script
    
    • Você pode usar o PAM para corresponder a um usuário específico ( como nesta resposta ), então o script só seria executado para esse usuário e não precisaria corresponder aos próprios usuários. Eu não tenho a expertise do PAM para explicar como fazer isso.

  3. Escrever um script Upstart para executar seu programa. Seu script começaria no login do usuário, então procuramos o sinal desktop-session-start emitido pelo PreSession script.

    Assim, um script Upstart detectaria esse sinal como o acionador de execução:

    # start when GDM's PreSession script runs
    start on desktop-session-start
    

    O sinal de PreSession não passa o nome de usuário, então você precisa ajustar o sinal. Em / etc / gdm / PreSession / Default , encontre a linha initctl e altere-a para isso. Você também pode usar USERNAME no lugar de USER .

    # add USER variable so Upstart script can find it
    initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
    

    Veja as páginas de manual para Upstart e seu iniciando evento para mais detalhes.

Como evitar o usuário administrador

Seu script precisará examinar o usuário / nome de usuário nas variáveis de ambiente obtidas de um desses métodos e usá-lo para determinar se deve ser anulado ou continuar. Os métodos padrão de script de shell funcionarão. Dependendo do local inicial escolhido na lista acima, o nome de usuário pode estar disponível nas variáveis de ambiente USER , USERNAME ou PAM_USER . / p>     

por 24.04.2010 / 13:55
1

Você pode usar setuid para sempre executar o programa como root. Do ponto de vista da segurança, esta é provavelmente uma ideia muito, muito ruim. Se um de seus usuários conseguiu explorar o programa setuid, ele terá acesso root a todo o servidor

    
por 24.04.2010 / 13:55