Eu preciso apontar dispositivos para sincronizar seus relógios com meu servidor CentOS-7 rodando dentro do LXC. No servidor estou tentando usar ntpd
do ntp
pacote, mas aberto para outros produtos. Esta pergunta é sobre a configuração do ntpd
ou equivalente no servidor.
Até agora eu tentei isso em/etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server 127.127.1.1 iburst
fudge 127.127.1.1 stratum 8
disable monitor
Há DOIS problema aqui.
ntpd
termina após o logcap_set_proc() failed to drop root privileges: Operation not permitted
ntpd
está tentando ajustar a hora local. Ele falha, mas tenta. Se este fosse o único problema e eu tivesse uma mensagem de erro no log, eu poderia aceitar isso.
A saída completa /var/log/messages
causada pela tentativa de iniciar o ntpd:
systemd: Starting Network Time Service...
ntpd[20154]: ntpd [email protected] Wed Apr 12 21:24:06 UTC 2017 (1)
ntpd[20155]: proto: precision = 0.120 usec
ntpd[20155]: ntp_adjtime() failed: Operation not permitted
systemd: Started Network Time Service.
ntpd[20155]: 0.0.0.0 c01d 0d kern kernel time sync enabled
ntpd[20155]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
ntpd[20155]: Listen and drop on 1 v6wildcard :: UDP 123
ntpd[20155]: Listen normally on 2 lo 127.0.0.1 UDP 123
ntpd[20155]: Listen normally on 3 eth0 hidden:A.B.C.D UDP 123
ntpd[20155]: Listen normally on 4 tun0 hidden:E.F.G.H UDP 123
ntpd[20155]: Listening on routing socket on fd #21 for interface updates
ntpd[20155]: 0.0.0.0 c016 06 restart
ntpd[20155]: ntp_adjtime() failed: Operation not permitted
ntpd[20155]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
ntpd[20155]: 0.0.0.0 c011 01 freq_not_set
ntpd[20155]: cap_set_proc() failed to drop root privileges: Operation not permitted
systemd: ntpd.service: main process exited, code=exited, status=255/n/a
systemd: Unit ntpd.service entered failed state.
systemd: ntpd.service failed.
Conforme discutido nos comentários, o chrony recebeu recentemente uma nova opção
-x
para não tentar alterar o relógio do sistema, tornando-o especialmente adequado para operações de contêiner. Infelizmente, a primeira versão (3.2) a receber esta opção não era completa e ainda solicita a capacidade do Linux, então ainda falha.Traçando chronyd do pacote chrony versão 3.2-2.el7 em um contêiner CentOS7 LXC (com host não CentOS) com opção
-x
, na verdade, a correção do bug não está aqui:[...]
Portanto, se você pudesse impedir que o binário não modificável chronyd solicitasse um recurso proibido, ele seria executado (é sobre isso que trata a correção de bug 3.3). Boas notícias, é possível com um
LD_PRELOAD
/dlsym()
wrapper.Compile em outro sistema Linux em outro lugar (a compilação foi realmente feita no host Debian 9 e não deu nenhum problema para executar no contêiner CentOS7 como está) este código chamado
capsetwrapper.c
, com definições de estruturas encontradas lá, por exemplo (isso não t mudar do kernel 3.10 também).usando esta maneira específica (para tornar uma biblioteca adequada para
LD_PRELOAD
uso):E está funcionando como visto aqui:
verificando seus recursos durante a execução:
mostra 0x400 que é o restante
1<<CAP_NET_BIND_SERVICE
como visto acima.Para integrar isso no sistema:
coloque a
libcapsetwrapper.so
embalagem como/usr/local/lib/libcapsetwrapper.so
com
systemctl edit chronyd
, substitua aCAP_SYS_TIME
verificação e o executável começa com isso:Desculpe, não consegui reutilizar o
$OPTIONS
parâmetro (que está vazio e deve estar recebendo a-x
opção, carregada de/etc/sysconfig/chronyd
), mas com mais conhecimento do systemd deve ser possível.Resultado de trabalho:
O que não foi testado é se o ambiente SELinux padrão (não disponível aqui) permite a operação de pré-carregamento ou se algo mais deve ser feito
/usr/local/lib/libcapsetwrapper.so
(certifique-se de usarrestorecon
nele).Desde a versão 7.7.1908 , o CentOS tem a
chrony
versão 3.4 que suporta o-x
sinalizador corretamente e pode ser executado em LXC, com pequenos ajustes de configuração./usr/lib/systemd/system/chronyd.service
tem oConditionCapability=CAP_SYS_TIME
que não deveria estar lá quando executado com o-x
LXC, então remova-o adicionando este drop in file/etc/systemd/system/chronyd.service.d/lxc.conf
Edite
/etc/sysconfig/chronyd
e adicione-x
paraOPTIONS
terminar comOPTIONS="-x"
Altere
/etc/chrony.conf
para NÃO sincronizar com nenhum servidor NTP, mas para servir a hora do relógio local. Remova/desative todas as outrasserver
entradas e adicione:Revise a
allow
diretiva para atender às suas necessidades, poisallow all
, como no exemplo, pode não ser adequado para você.Deve ser isso.
Eu encontrei uma maneira de fazê-lo funcionar, mas não estou feliz com minha solução, então ainda estou procurando uma resposta melhor.
Parte 1. Eu impedi
ntpd
de tentar remover privilégios de root.Nele
/usr/lib/systemd/system/ntpd.service
tem por padrão:então eu ''removo''
-u ntp:ntp
colocando/etc/systemd/system/ntpd.service.d/local.conf
O que permite
ntpd
continuar rodando como root. Funciona, mas não estou feliz com essa abordagem.Parte 2. A parte da hora local não atualizada
A adição de causas em
/etc/ntp.conf
linha no serviço começa a registrar o erro apenas uma vez, em vez de 3 vezes sem a configuração. Uma vez que não pode alterar o relógio, isso é aceitável. Idealmente, nem tentaria mudar o relógio.disable kernel
ntpd
ntp_adjtime() failed: Operation not permitted