Como mudar o Uid do serviço Squid no FreeBSD?

4

Curiosamente, parece que o Squid não pode iniciar se o usuário squid não for afetado ao UID 100. Ao tentar usar outro PID, o serviço sistematicamente falha ao iniciar com o seguinte erro:

2016/03/10 10:53:13| storeDirWriteCleanLogs: Starting...
2016/03/10 10:53:13|   Finished.  Wrote 0 entries.
2016/03/10 10:53:13|   Took 0.00 seconds (  0.00 entries/sec).
FATAL: Ipc::Mem::Segment::create failed to shm_open(/squid-cf__metadata.shm): (17) File exists

Squid Cache (Version 3.5.15): Terminated abnormally.
CPU Usage: 0.026 seconds = 0.026 user + 0.000 sys
Maximum Resident Size: 48640 KB
Page faults with physical i/o: 0

Veja como eu normalmente procuro alterar um PID de serviço:

  1. vi /etc/group para alterar o GID do serviço:

    Antes:

    squid:*:100:
    

    Depois:

    squid:*:1234:
    
  2. vipw para alterar o UID do serviço:

    Antes:

    squid:*:100:100::0:0:squid caching-proxy pseudo user:/var/squid:/usr/sbin/nologin
    

    Depois:

    squid:*:1234:1234::0:0:squid caching-proxy pseudo user:/var/squid:/usr/sbin/nologin
    
  3. Restaure a propriedade dos arquivos usando os dois comandos a seguir:

    find / -uid 100 -exec chown -v squid {} +
    find / -gid 100 -exec chgrp -v squid {} +
    

Estou instalando o Squid em uma jaula do FreeBSD gerenciada com o ezjail.

Eu pensei sobre o IPC, mas não encontrei nenhum IPC usando ipcs -a quando o Squid está funcionando corretamente.

Eu também tentei, em uma nova cadeia limpa, criar primeiro o usuário squid com um UID personalizado e instalar o pacote squid para garantir que o UID correto seja usado desde o início e nenhum usuário squid com PID 100 existia a qualquer momento, mas o mesmo problema (também concluo a partir disso que esse problema não pode vir de um problema de propriedade). Definindo o UID para 100, o Squid pode inicializar.

Eu tentei vários PID (incluindo os menores como 101), todos eles mostram o mesmo comportamento.

Eu também tentei brincar com o parâmetro squid_user em rc.conf , mas sem sorte: configurá-lo para squid ou root não parece mude qualquer coisa.

Eu tenho outra cadeia no mesmo sistema com um Squid rodando com o PID 100, mas desligá-lo não alterou o problema de forma alguma (em todos os casos eu ficaria muito surpreso com a interferência entre dois jails). / p>     

por WhiteWinterWolf 10.03.2016 / 12:47

1 resposta

3

OK, eu entendi agora. Depois de algumas checagens no fórum do FreeBSD , eu posso agora confirmar que as prisões do FreeBSD agem um pouco como um queijo suíço como objetos SHM estão em causa. De fato, o FreeBSD não fornece nenhum isolamento para os objetos SHM: todas as cadeias podem acessar todos os objetos SHM, em todo o sistema, sem nenhuma maneira de evitá-lo.

O erro mencionado nesta questão é, portanto, bastante lógico:

  • Quando diferentes UID foram usados, o Squid não pôde ser iniciado porque tentou acessar objetos SHM pertencentes a um usuário diferente, por isso a mensagem de erro "create falhou em shm_open (/squid-cf__metadata.shm): ( 17) Arquivo existe ",
  • Quando o mesmo UID foi usado em ambas as instalações, o Squid começou com sucesso, mas a situação foi provavelmente ainda pior já que ambas as instâncias lutariam contra o mesmo objeto de memória, reescrevendo os dados e apagando o objeto no desligamento ...

Por causa disso, medidas específicas devem ser tomadas para garantir que cada instância do Squid use nomes diferentes de objetos SHM.

Por padrão, o Squid cria os seguintes objetos SHM em sistemas FreeBSD (o comportamento exato depende do sistema operacional):

/squid-cf__metadata.shm
/squid-cf__queues.shm
/squid-cf__readers.shm

squid oferece o parâmetro -n para permitir atribuir um nome específico à instância. Concretamente este nome irá (entre outras coisas) substituir "squid" nos nomes de objetos SHM acima, assim o nome do objeto SHM se tornará único em todo o sistema.

Portanto, ao configurar uma nova instância do Squid em uma nova cadeia, é necessário editar /etc/rc.conf e adicionar uma entrada como abaixo (substituir "something_unique" por um nome de instância exclusivo em seu host):

squid_flags="-n something_unique"

Isso permite iniciar corretamente os dois servidores Squid, cada um com UIDs diferentes.

Obviamente, embora um pouco fora do escopo aqui, o fato dos objetos SHM do Squid poderem ser acessados livremente de qualquer cadeia pode constituir um problema de segurança e não deve ser ignorado ...

    
por 11.03.2016 / 23:38