1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

como iniciar um programa apos log-in com direitos de root

Discussão em 'Novidades GNU/Linux & *nix World' iniciada por muddymind, 7 de Agosto de 2007. (Respostas: 25; Visualizações: 1749)

  1. muddymind

    muddymind 1st Folding then Sex

    Boas!

    Alguém me sabe dizer como é que faço para abrir automaticamente um programa com privilégios root logo após o log-in de um user guest?

    []
     
  2. c3l5o

    c3l5o I'm cool cuz I Fold

    Desculpa perguntar... Mas que tens tu de correr em modo de root?
     
  3. muddymind

    muddymind 1st Folding then Sex

    pergunta à vontade :) Eu não tenho que correr exactamente como root mas sim com direitos de administrador para aceder a um ficheiro...

    Já resolvi o problema usando o ficheiro /etc/rc.local ;)

    []

    EDIT:Afinal não resultou... não aparece nada quando faço log-in... any ideas?
     
    Última edição: 8 de Agosto de 2007
  4. ShadeX

    ShadeX Power Member

    Isso é tipo matar a cobra cortando o rabo... altamente não eficiente e muito perigoso...

    Se o ficheiro é para ser lido/escrito por utilizadores mudas as perms ao ficheiro, não corres uma app como admin para o poder ler/escrever.

    Se o problema é o ficheiro ter de ser lido/escrito por apenas alguns utilizadores, crias um grupo e dás perms ao ficheiro para apenas esse grupo.
     
  5. muddymind

    muddymind 1st Folding then Sex

    O problema é que não tenho outra alternativa...

    O ficheiro tem de ser preenchido com os dados do utilizador onde estão passwords e afins... não quero que ninguém a não ser o root o possa abrir... e mesmo o ntlmaps so pode ser executado/parado pelo root (por uma questão de segurança) mas este apenas pode ser executado após o utilizador, que é guest, por os seus dados de autenticação...
    Compreendo que seja perigoso dar uma aplicação com direitos de root a um user guest mas também o programa tem uma funcionalidade mt limitada pois apenas pede nome, pass e quando carrega no ok executa o ntlmaps antes de fechar... tão simples como isso...

    bom... mas passando à frente, como é que faço mesmo para executar o programa?

    []
     
  6. Boas,
    se tens mesmo que usar esse programa com permissões de root há um pequeno truque que podes usar com o ficheiro
    /etc/sudoers. Edita o ficheiro com o visudo que verifica a sintaxe. na ultima linha colocas (assumo que o user seja guest)
    guest ALL = NOPASSWD: /usr/bin/ntlmaps

    aqui assumi que o programa se encontra em /usr/bin. para saberes exactamente onde se encontra fazes which ntlmaps.
    O utlizador guest sera capaz apenas de correr este programa como root fazendo "sudo ntlmaps" e não necessitará de password.

    espero que resulte.

    N.

    EDIT: PS: diz-me só se usas kde ou gnome ou ambos?
     
  7. muddymind

    muddymind 1st Folding then Sex

    Obrigado pela sugestão mas realmente não vai dar por essa forma... Os users não são estáticos e pertencem a um AD... quando digo guest, quero dizer um utilizador sem direitos administrativos...

    estou a usar gnome...

    []
     

  8. Não há problema!
    onde estava guest colocas %AD
    AD será o nome do grupo (verificar /etc/group para ver se estão todos os users pretendidos nesse grupo)

    no gnome só tens de encontrar o sitio onde se iniciem programas ao fazer log-in (eu não sei onde é mas vou ver e logo te digo) e colocar aí "sudo ntlmaps".

    até logo
     
  9. muddymind

    muddymind 1st Folding then Sex

    O grupo não tá la :S

    o grupo chama-se domain users... o espaço no nome não dá problemas?
    como faço a verificação da sintaxe do visudo?

    []

    PS- mas tipo... o programa que tou a usar é um .jar... dessa forma teria de dar permissões de admin a tudo o que corresse sobre java...
    Por outro lado, depois o user não consegue substituir o programa por outro e dessa forma fazer tudo o que lhe apetecer?
     
    Última edição: 8 de Agosto de 2007
  10. boas,

    um jar que precisa de permissões de root? estou a achar que algo poderia ser feito de outra maneira.
    para correr o dito .jar será o executável java que terá de ter permissões de root e não o .jar.

    quanto a qq user substituir o programa só o user tiver permissões de escrita nesse ficheiro. mas como é o java, ele não deve ter.

    se puderes explicar o que realmente pretendes pode ser que haja outra maneira de o fazer.

    quanto ao espaço no nome do grupo deverá ter que excrever o nome do grupo entre ' ou entre " não tenho a certeza.
    o visudo verifica a sintaxe. se o ficheiro estiver mal escrito ele não deixa gravar.

    fica bem

    N.
     
  11. muddymind

    muddymind 1st Folding then Sex

    Vou tentar explicar o que pretendo fazer:

    Tenho uma workstation linux que pretendo integrar na rede da empresa onde trabalho. O servidor tem AD, uma proxy ISA e mais umas coisinhas...

    Já consegui configurar a autenticação na AD através do winbind para fazer log-in com users não locais e aquisição automática de TGT kerberos através do pam-krb5 para as politicas de permissões de acesso a locais de rede funcionarem...

    Finalmente apenas me falta tratar da autenticação na ISA... O ideal seria o ISA reconhecer que já estou autenticado na AD e reconhecer o grupo ao qual pertenço para definir as politicas de acesso à net...

    Infelizmente isso não acontece e sempre que tento aceder à net ele dá-me o erro 407 a dizer que o ISA requer autenticação... A única forma de por isto a funcionar com apt's e companhias foi usando o ntlmaps para que esse trata-se da autenticação ntl no ISA desde que redireccione todas as apps para o ntlmaps...
    O ntlmaps tem um ficheiro de configuração que contém, além do endereço do servidor e afins, o username e a pass do utilizador a usar na autenticação... Como podem entrar uma série de utilizadores diferentes nesta workstation, estou a tentar arranjar forma de alterar dinamicamente a informação do ficheiro server.cfg(ficheiro de configuração do ntlmaps) com os dados do utilizador que esteja entrando....
    Eu fiz um programa em java que pede essas informações ao utilizador (podia ter feito em C ou C++ mas eu nunca trabalhei com gtk e por questão de tempo não é viável estar agora a aprender) e gostava de correr o .jar com direitos de administrador para puder alterar o server.cfg e correr o ntlmaps... O server.cfg vai ter de estar vedado por completo à leitura e escrita por parte de um utilizador não administrador devido ao facto de ter lá em ascii a informação de log-in (que constituiria um possível grande problema de segurança)...

    Espero que tenha sido explicito :)

    []

    ps- path's:
    ntlmaps (contem o main.py e o server.cfg): /usr/local/ntlmaps
    proxylauncher(a minha app): /usr/local/proxylauncher
    java: /usr/bin/java
     
  12. boas,

    foste bastante claro!
    a minha sugestão continua com o /etc/sudoers.
    desta vez fazes (o escape \ é por causa do espaço):
    %domain\ users ALL = NOPASSWD: /usr/bin/java -jar /opt/utils/teu_programa.jar

    assim deverá funcionar. neste caso o utilizadores só podem correr aquela linha de comandos exactamente! sem tirar nem por. se os ditos utlizadores não forem root não podem mudar o programa java (e em principio o teu .jar tb deve estar protegido)

    isto tudo tem um senão. se por alguma razão o .jar não funcionar (ou não correr ) o utlizador actual estará a usar a autenticação do utilizador anterior.

    fica bem

    N.
     
  13. muddymind

    muddymind 1st Folding then Sex

    Vou experimentatar :)

    Em relação ao senão, pensei em fazer um logout script para apagar o ficheiro... sei que isso dá para fazer mas ainda não sei como...

    []
     
  14. muddymind

    muddymind 1st Folding then Sex

    Boas!

    Já consegui fazer com que os domain users corressem o jar com sudo mas está a dar-me um erro:

    Código:
    [email protected]:~$ sudo /usr/bin/java -jar /usr/local/proxylauncher/pl.jar 
    Xlib: connection to ":0.0" refused by server
    Xlib: No protocol specified
    
    Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
            at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
            at sun.awt.X11GraphicsEnvironment.access$100(X11GraphicsEnvironment.java:52)
            at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:155)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:169)
            at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
            at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:91)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:169)
            at java.awt.Toolkit$2.run(Toolkit.java:836)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:828)
            at java.awt.Toolkit.getEventQueue(Toolkit.java:1678)
            at java.awt.EventQueue.invokeLater(EventQueue.java:954)
            at proxylauncher.Mainwindow.main(Mainwindow.java:198)
    
    Se fizer isto com um user com direitos de administrador aquilo corre sem problemas...

    E agora? :wscared:
     
  15. Boas,

    Isso é mais fácil de resolver. O erro que te dá é porque o servidor X não permite que se conectem outros clientes a ele.
    de uma maneira muito permissiva fazes (com o user em questão "teste"):
    xhost +
    se isto funcionar é só colocar isto no ficheiro /home/teste/.bashrc
    Isto permite toda a gente conectar-se ao X da máquina. se tiveres a firewall bem configurada isto não deve dar problemas.

    espero que resulte.

    N.
     
  16. muddymind

    muddymind 1st Folding then Sex

    Boas!

    Obrigado pela dica ;)

    Hoje lembrei-me de um método para fazer o que pretendia de uma forma bem mais segura e rápida...

    Alterei o meu programa Java para que mal inicie o ntlmaps, apague o ficheiro server.cfg que já foi lido... Isto como tem um timing inferior a 1 segundo, se o ficheiro for legível num espaço de tempo tão curto não deve fazer mal a ninguém... A grande vantagem deste método é que assim o programa para configurar/executar o ntlmaps já não precisa de ter direitos de root :D

    Mas obrigado na mesma pela tua preciosa ajuda;)

    []

    ps-Já agora... há forma de forçar qualquer processo python abaixo quando se está a fazer log-in? é que se faço login num user e depois vou para outro sem reiniciar, o ntlmaps vai continuar a tar a funcionar...
     
  17. boas,

    ainda bem que encontraste um método mais eficaz! ;-)
    quanto ao processo python é complicado pq podem estar 2 ou 3 utilizadores ligados.

    podes fazer um script bash assim:

    #!/bin/bash
    PID=$(ps aux |grep ntlmaps|grep -v grep |awk '{print $2}')
    for i in $PID ; do kill -9 $i; done

    isto vai matar incondicionalmente todos os processos que tenham ntlmaps como commando.
    podes corre-lo antes de correr outra vez o ntlmaps.

    espero que ajude.

    N.
     
  18. muddymind

    muddymind 1st Folding then Sex

    Boas!

    Eu quero mesmo matar incondicionalmente o ntlmaps... se depois o user quiser ir à net pode smp correr outra vez o proxylauncher para fazer novamente log-in... é que só pode estar a correr 1 de cada vez (pois vai tudo usar a mesma porta...)

    Eu já tinha feito um script parecido a esse mas a questão que se coloca é que quero que isso ocorra SMP que um user termine a sua sessão ou faça switch user. Isto para que quando seja feito o log-in num user diferente puder correr o ntlmaps com as credenciais desse user...

    Como é que posso fazer isso?

    []

    ps-obrigado pela paciência pra me aturar :D
     
  19. não poderás correr isto imediatamente antes do programa em java? e depois do programa em java?
    isto tem a desvantagem de que o utilizador tem que manter o programa java aberto mas creio que não deve haver problema. será como ter a porta aberta para a net ;-)

    exemplo:
    #!/bin/bash
    kill_ntl_script
    java -jar pl.jar
    kill_ntl_script

    ou seja sempre que o programa java estiver a correr o user tem net. se calhar é necessário modificar um pouco o programa java mas não deve dar muito trabalho ;-). até poderia guardar (opcionalmente) a informação desse user na sua home num ficheiro p.e. .ntl_settings!

    cumps

    N.
     
  20. muddymind

    muddymind 1st Folding then Sex

    hum... isso não resulta lá muito bem pois se o user não fechar o programa antes de fazer switch user, o ntlmaps vai continuar a correr :confused:

    Epa... já tou todo confuso :P Não consigo mesmo ver nenhuma maneira de fazer isto...

    []
     

Partilhar esta Página