O
NTP, se corretamente utilizado, é capaz de garantir as propriedades necessárias ao relógio do computador para o bom funcionamento das aplicações. Num primeiro momento isso pode parecer algo muito simples: "consultar o tempo em um servidor" e "ajustar o relógio local" de tempos em tempos. Mas na verdade o NTP faz muito mais do que isso. Diversos componentes do sistema colaboram para:
- Obter, à partir de diversas amostras, informações de tempo de um determinado servidor, como o deslocamento, dispersão e variação.
- Discernir, dentre um conjunto de servidores, quais fornecem o tempo correto e quais estão mentindo.
- Escolher, dentre os servidores que fornecem o tempo correto, qual é a melhor referência.
- Disciplinar o relógio local, descobrindo seus principais parâmetros de funcionamento e ajustando-o de forma contínua e gradual, mesmo na ausência temporária de referências de tempo confiáveis, para que tenha e melhor exatidão possível.
- Garantir a monotonicidade do tempo.
- Identificar, à partir de métodos criptográficos, servidores de tempo conhecidos e confiáveis, evitando possíveis ataques.
- Formar, em conjunto com outros servidores NTP, uma topologia simples, confiável, robusta e escalável para a sincronização de tempo.
Topologia do NTP
Os servidores NTP formam uma topologia hierárquica, dividida em camadas ou estratos (em inglês: strata) numerados de 0 (zero) a 16 (dezesseis). O estrato 0 (stratum 0) na verdade não faz parte da rede de servidores NTP, mas representa a referência primária de tempo, que é geralmente um receptor do Sistema de Posicionamento Global (GPS) ou um relógio atômico. O estrato 16 indica que um determinado servidor está inoperante.
O estrato 0, ou relógio de referência, fornece o tempo correto para o estrato 1, que por sua vez fornece o tempo para o estrato 2 e assim por diante. O NTP é então, simultaneamente, servidor (fornece o tempo) e cliente (consulta o tempo), formando uma topologia em árvore.
Os tipos de associação possíveis
As relações entre os diferentes dispositivos NTP são normalmente chamadas de Associações. Elas podem ser:
- Permanentes: são criadas por uma configuração ou comando e mantidas sempre.
- Priorizáveis (preemptables): são específicas da versão 4 do NTP e criadas por uma configuração ou comando, podem ser desfeitas no caso de haver um servidor melhor, ou depois de um certo tempo.
- Efêmeras ou transitórias: são criadas por solicitação de outro dispositivo NTP e podem ser desfeitas em caso de erro ou depois de um certo tempo.
São possíveis as seguintes associações:
- Cliente - Servidor: (client - server) É uma associação permanente e a forma mais comum de configuração. Um dispositivo faz o papel de cliente, solicitando informações sobre o tempo a um servidor. O cliente tem conhecimento das associações com os servidores e do estado da troca de pacotes. Outro dispositivo faz o papel de servidor, respondendo à solicitação do cliente com informações sobre o tempo. O servidor não armazena informações sobre o diálogo com o cliente ou sobre sua associação com o mesmo.
- Modo simétrico: (symmetric mode) Dois ou mais dispositivos NTP podem ser configurados como pares (peers), de forma que possam tanto buscar o tempo, quanto fornecê-lo, garantindo redundância mútua. Essa configuração faz sentido para dispositivos no mesmo estrato, configurados também como clientes de um ou mais servidores. Caso um dos pares perca a referência de seus servidores, os demais pares podem funcionar como referência de tempo. O modo simétrico pode ser:
- Ativo: O dispositivo A configura o dispositivo B como seu par (criando dessa forma uma associação permanente). Por sua vez, o dispositivo B também configura o dispositivo A como seu par (também cria uma associação permanente).
- Passivo: O dispositivo A configura o dispositivo B como seu par (modo simétrico ativo). Mas o dispositivo B não tem o dispositivo A na sua lista de servidores ou pares. Ainda assim, ao receber um pacote de A, o dispositivo B cria uma associação transitória, de forma a poder fornecer ou receber o tempo de A.
- Broadcast ou Multicast: O NTP pode fazer uso de pacotes do tipo broadcast ou multicast para enviar ou receber informações de tempo. Esse tipo de configuração pode ser vantajosa no caso de redes locais com poucos servidores alimentando uma grande quantidade de clientes.
A Troca de Mensagens e o cálculo do Deslocamento
As mensagens do NTP são baseadas no protocolo UDP. A troca de mensagens entre cliente e servidor permite que o cliente descubra qual seu deslocamento (offset) em relação ao servidor, ou seja, o quanto seu relógio local difere do relógio do servidor.
Permite também calcular o atraso ou tempo de ida e volta (RTT) entre o cliente e o servidor.
O Algoritmo de Filtro de Relógio
Através da troca de mensagens, o NTP consegue as informações de atraso e deslocamento de um servidor. Essa troca de mensagens não é realizada uma única vez. Ela se repete periodicamente, com o período dinamicamente controlado pelo NTP.
É importante notar então, que não há apenas um valor de atraso e um de deslocamento para cada servidor, mas um conjunto deles, provenientes das diversas trocas de mensagem! A partir dessa lista de valores, o Algoritmo de Filtro de Relógio calcula então um valor único de atraso (delay), de deslocamento (offset) e de variação (jitter) para cada servidor para ser usado pelos próximos algoritmos.
O Algoritmo de Seleção dos Relógios
Uma vez que o Algoritmo de Filtro de Relógios tenha calculado os principais parâmetros referentes a cada servidor, é importante descobrir quais deles são confiáveis e quais não. Os servidores que têm algum erro no tempo fornecido são chamados de relógios falsos (falsetickers, na literatura em inglês, a tradução é aproximada). Os servidores que fornecem a hora corretamente são chamados de relógios verdadeiros (truechimmers, em inglês, uma tradução mais literal seria algo como "badaladores verdadeiros").
A Seleção de relógios busca um intervalo de intersecção para os valores de deslocamento de cada servidor, considerados intervalos de confiança. Os servidores cujos deslocamentos ficam fora da intersecção são relógios falsos.
O Algoritmo de Agrupamento
O algoritmo de Agrupamento trabalha com os servidores que são relógios verdadeiros, utilizando técnicas estatísticas, com o objetivo de selecionar os melhores dentre eles.
No processo alguns servidores são descartados, sendo chamados de relógios afastados (outlyers). Os que permanecem são chamados de relógios sobreviventes (survivors), algumas vezes na literatura em inglês utiliza-se candidatos (candidates) no mesmo sentido que sobreviventes, por conta do algoritmo utilizado onde, à princípio, todos os relógios verdadeiros são candidatos, mas apenas alguns sobrevivem.
O melhor dos relógios sobreviventes é considerado como par do sistema (system peer).
O Algoritmo de Combinação de Relógios
Se o algoritmo de Agrupamento encontrar apenas um sobrevivente, ele será o par do sistema e será utilizado como referência para ajustar o relógio local. Se um servidor for configurado como tendo preferência sobre os demais e estiver dentre os sobreviventes, ele será considerado como par do sistema e, mesmo que existam outros sobreviventes, estes serão ignorados. Nesses casos, o algoritmo de Combinação de Relógios não é utilizado.
Para os demais casos o algoritmo de Combinação de Relógios calcula uma média ponderada dos deslocamentos dos relógios, com o objetivo de aumentar a exatidão.
Disciplina do Relógio Local
O processo de disciplina do Relógio Local controla a fase e a freqüência do relógio do sistema. Ele é baseado na combinação de duas filosofias de controle bastante diferentes entre si: Phase Locked Loop (PLL) e Frequency Locked Loop (FLL) (traduções desses termos são incomuns, mas poderiam ser Laço Controlado por Fase e Laço Controlado por Freqüência). Ambas as filosofias implementam controles onde há realimentação, ou seja, onde a informação de saída é usada novamente na entrada.
O NTP disciplina o relógio local de forma contínua, mesmo em períodos onde não é possível consultar servidores de tempo. As características do relógio local são medidas e se tornam conhecidas do NTP, o que torna possível que ele funcione dessa forma. O arquivo indicado pela chave driftfile (geralmente /var/lib/ntp/ntp.drift) na configuração armazena o erro esperado de freqüência para o relógio.
Algumas características importantes desse algoritmo:
- Saltos no tempo são evitados sempre que possível. O tempo é ajustado para mais ou para menos gradualmente, variando-se a freqüência do relógio local.
- Se uma diferença maior do que 128ms for detectada o NTP considera que o tempo está muito errado, e que é necessário um salto para frente ou para trás para corrigí-lo. Contudo isso só é feito se essa diferença maior que 128ms persistir por um período maior que 900s (15min), para evitar que condições de congestionamento grave mas temporário na rede, que podem levar a medições erradas de tempo, causem inadvertidamente esse tipo de salto.
- Se uma diferença maior que 1000s (~16,7min) for detectada o algoritmo aborta a execução, considerando que algo muito errado aconteceu. Se houver diferenças dessa ordem ou maiores elas devem ser corrigidas manualmente antes de se executar o daemon NTP.
Segurança no NTP
Por segurança no contexto da Tecnologia da Informação entende-se basicamente garantir quatro propriedades da informação: integridade, disponibilidade, autenticidade e confidencialidade.
Os algoritmos vistos anteriormente, aliados à correta configuração do sistema, com um número suficiente de fontes de tempo com referências primárias independentes, garantem de forma satisfatória a integridade e disponibilidade do serviço de tempo.
Os algoritmos de criptografia do NTP visam garantir a autenticidade da informação. Ou seja, têm o objetivo de assegurar ao cliente de que o servidor é quem ele diz ser.
A confidencialidade não é considerada um problema no contexto do NTP. Ou seja, a informação de tempo sempre trafega na rede de forma aberta, sem criptografia, mesmo quando uma assinatura cifrada é utilizada para garantir a autenticidade da informação. Isso é dessa forma porque: o tempo é uma informação pública, não há razão para esconder essa informação e trabalhar com a informação de tempo cifrada demandaria tempo tanto do servidor quando do cliente e degradaria o desempenho do sistema, fazendo-o menos exato.
Existem basicamente dois métodos no NTP para realizar a autenticação, chave simétrica (symmetric key) e chave pública (autokey).