O trabalho de upstart como usuário não privilegiado falha com a permissão negada

3

Estou tentando configurar um Sage Cell Server (um mecanismo matemático de código aberto) rodando como um usuário sem privilégios. Eu criei o usuário sem privilégios sagecell para fazer o trabalho. Ele está instalado corretamente e, se eu o executar normalmente usando

sagecell@primary-server:~/sage/devel/sagecell$ ../../sage web_server.py

então tudo funciona como esperado. Um requisito interessante deste aplicativo (que pode ou não ser relevante) é que ele requer um login ssh sem senha (por exemplo, ssh localhost works). Eu configurei a conta sem privilégios com uma chave ssh para fazer o trabalho.

Agora, em vez de fazer manualmente uma sessão de tela após inicializar o servidor e executá-lo em uma sessão de tela, tentei criar um trabalho inicial com essa configuração:

description "Sage Cell Server Starter"

start on runlevel [2345]
stop on starting rc runlevel=[016]

kill timeout 5

exec su -s /bin/sh -c 'exec "$0" "$@"' sagecell -- /home/sagecell/sage/sage /home/sagecell/sage/devel/sagecell/web_server.py

Isso, no entanto, não funciona. Olhando para /var/log/upstart/sagecell.log, aparece o seguinte erro:

2013-02-20 00:11:09,665 sagecell:INFO starting tornado web server
Traceback (most recent call last):
  File "/home/sagecell/sage/devel/sagecell/web_server.py", line 78, in <module>
    application = SageCellServer()
  File "/home/sagecell/sage/devel/sagecell/web_server.py", line 57, in __init__
    kernel_timeout=kernel_timeout)
  File "/home/sagecell/sage-5.7.rc0/devel/sagecell-main/trusted_kernel_manager.py", line 28, in __init__
    self._sender = sender.AsyncSender() # Manages asynchronous communication
  File "/home/sagecell/sage-5.7.rc0/devel/sagecell-main/sender.py", line 22, in __init__
    self.router.bind(self.filename)
  File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797)
zmq.core.error.ZMQError: Permission denied

EDIT: Deve-se notar que o aplicativo se liga à porta 8080 (e apenas 8080, tanto quanto eu sei). O importante é que ele funciona sem privilégios quando eu o executo, mas não quando o Upstart o executa como o mesmo usuário.

Alguém pode me dizer por que um aplicativo que funciona perfeitamente bem com o usuário sagecell não é executado em um job iniciante executando o script AS sagecell ?

    
por Logan 20.02.2013 / 20:32

3 respostas

1

A condição inicial com apenas o nível de execução especificado:

start on runlevel [2345]

acontece muito cedo no processo de inicialização. Nesse ponto, geralmente não há dispositivo de rede disponível. Além disso, muitos outros serviços ainda não foram iniciados.

Como você pode ver nesta linha de registro:

File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797) zmq.core.error.ZMQError: Permission denied

ele não pode se ligar a um soquete, o que indica que o dispositivo de rede ainda não está ativo.

O que você faria seria ajustar a condição de início para que o serviço seja iniciado mais tarde quando houver infra-estrutura suficiente disponível.
Isso é o que eu usei em uma situação onde eu precisava iniciar um serviço da web com upstart:

start on (runlevel [2345] and local-filesystems and net-device-up IFACE!=lo)

Isso garante que o serviço seja iniciado apenas quando os sistemas de arquivos locais estiverem disponíveis e quando uma conexão de rede for ativada. Aqui também é definido que um dispositivo de loopback local não é suficiente para uma conexão de rede. A estrofe requer que uma interface de rede real esteja ativa, como eth0 .

EDITAR

Em seguida, pode haver um problema de diretório padrão. O Upstart executa os programas iniciados com o diretório padrão definido como /. O aplicativo iniciado com su provavelmente não tem privilégios suficientes para gravar seus arquivos (arquivos de log, etc.)

Tente adicionar a seguinte estrofe:

chdir /home/sagecell/sage/devel/sagecell

Isso altera o diretório padrão para um lugar onde o usuário sagecell tenha permissões de gravação.

    
por 25.02.2013 / 12:21
1

O "servidor web tornado inicial" indica que inicia seu próprio servidor web, em qual porta? Se a porta normal 80, somente o root pode fazer isso. Olhe para link , verifique se Pyhon tem algumas diretrizes para isso. O que a documentação do Sage recomenda? Não é um pacote de franja por qualquer meio, eu diria que eles sugerem algo para uma distribuição mainstream como o Ubuntu (se já não está empacotado para uso, isto é).

    
por 20.02.2013 / 20:44
0

Se você estiver executando a versão inicial ou posterior, você pode usar a sub-rotina setuid em vez de usar su :

setuid sagecell

Em relação ao ambiente, o upstart executa seu trabalho, consulte:

Observe especificamente que mesmo variáveis como $HOME não serão definidas por padrão ao executar uma tarefa do sistema como qualquer usuário. Como alternativa, você pode querer considerar um trabalho do usuário:

Se você quiser usar o GNU Screen, consulte:

por 27.02.2013 / 18:17

Tags