Usando o ntpd-rs para configurar NTS
Introdução
No meu último post, falei um pouco sobre NTP (Network Time Protocol) e NTS (Network Time Security). Este último, nada mais é do que uma extensão do protocolo NTP rodando sobre TLS (Transport Layer Security) de forma a oferecer mais segurança na atualização do tempo utilizando a Internet, uma vez que o protocolo NTP é bastante antigo e possui várias vulnerabilidades documentadas. Inclusive, citei brevemente algumas delas que estão presentes na RFC-8633, que documenta algumas das melhores práticas na utilização do protocolo NTP.
Nesse post, vamos ver como configurar um cliente NTP para utilizar o NTS na prática.
Implementações com suporte a NTS
Se a sua distribuição usar essa aberração chamada SystemD (não quero entrar nessa polêmica durante esse artigo, mas é mais forte do que eu...) saiba que o systemd-timesyncd
ainda não tem suporte ao NTS (https://github.com/systemd/systemd/issues/9481). Há uma issue aberta desde de 2018 pedindo suporte a esse recurso, mas até agora, nada. É o que acontece quando se tenta fazer tudo ao mesmo tempo...
Outras implementações do NTP como o Chrony, NTPsec e OpenNTPd já tem suporte ao NTS em suas versões mais recentes, se estiver utilizando uma versão mais antiga, cheque o suporte para a sua versão em questão.
O NTPd, a antiga implementação de referência do protocolo, disponibilizada pelo https://ntp.org é considerada problemática, vulnerável e praticamente abandonada. Portanto, não deve ser utilizada, apesar de estar disponível no repositório da maioria das distribuições Linux.
No nosso caso, iremos utilizar o ntpd-rs uma implementação escrita na linguagem RUST, uma linguagem que implementa recursos como memory-safety e thread-safety eliminando alguns dos bugs mais comuns em programação de sistemas, o que a torna ideal para programação de protocolos como o NTP.
O Let's Encrypt, uma entidade certificadora e também, um projeto da Linux Foundation amplamente conhecido por disponibilizar certificados digitais de forma gratuíta, revelou no ano passado que está utilizando o ntpd-rs em seu stack. Você pode dar uma olhada no que eles tem a dizer sobre isso no post que publicaram em seu blog: https://letsencrypt.org/2024/06/24/ntpd-rs-deployment/
Desabilitando o systemd-timesyncd
Se você estiver utilizando o systemd, deve ter instalado o comando timedatectl
, utilizando-o você poderá ver as informações de relativas a saída do comando:
$ timedatectl Fri 14 Mar 2025 02:47:30 PM -03
Local time: Fri 2025-03-14 15:57:03 -03
Universal time: Fri 2025-03-14 18:57:03 UTC
RTC time: Fri 2025-03-14 18:57:03
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Para ter certeza, cheque se o systemd-timesyncd
está em execução rodando systemctl status systemd-timesyncd.service
. Se o resultado for active
, vamos parar o serviço de desabilitá-lo:
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd
Instalação e configuração do ntpd-rs
Como sempre, há diversas formas de instalar o ntpd-rs em seu sistema. Dê sempre preferência aos repositórios oficiais da sua distribuição. No Debian, o ntpd-rs infelizmente só está disponível no repositório da versão testing (trixie), pelo menos por enquanto...
Caso ele não esteja disponível nos repositórios da sua distro, você pode instalar através do código fonte, caso tenha o toolchain do Rust na sua máquina ou através dos pacotes disponibilizados na página do projeto no Github: https://github.com/pendulum-project/ntpd-rs/releases.
A configuração do nptd.br é muito simples: um arquivo TOML e nada de diretrizes obscuras. Por padrão, ele já trás uma configuração segura e funciona apenas como cliente: nada de criar um servidor NTP quando se quer apenas sincronizar a máquina, abrindo assim uma superfície de ataque sem que se tenha conhecimento.
Contudo, a configuração padrão não utiliza NTS. Vamos aprovaitar esse fato e configurar as fontes do NTP.br nele, já que o NTP.br sincroniza com a hora oficial do Brasil. O arquivo de configuração fica na pasta /etc/ntpd-rs/ntp.toml
. Ele já vem comentado com algumas explicações úteis, mas se quiser ir direto ao ponto, use a configuração abaixo:
[observability]
log-level = "info"
observation-path = "/var/run/ntpd-rs/observe"
# Servidores NTS do NTP.br
[[source]]
mode = "nts"
address = "a.st1.ntp.br"
[[source]]
mode = "nts"
address = "b.st1.ntp.br"
[[source]]
mode = "nts"
address = "c.st1.ntp.br"
[[source]]
mode = "nts"
address = "d.st1.ntp.br"
# Caso queira usar tbm o servidor da NETNOD
[[source]]
mode = "nts"
address = "nts.netnod.se"
# Caso queira usar tbm o servidor da Cloudflare
[[source]]
mode = "nts"
address = "time.cloudflare.com"
[synchronization]
single-step-panic-threshold = 1800
startup-step-panic-threshold = { forward="inf", backward = 86400 }
Uma vez configurado, vamos habilitar e iniciar o serviço com sudo systemctl enable --now ntpd-rs.service
. Pronto, o ntpd-rs deve estar rodando normalmente e atualizando o horário correto no seu sistema. Você pode utilizar o utilitário ntp-ctl
incluído na instalação do ntpd-rs para checar se está tudo rodando perfeitamente: ntp-ctl status
.
Caso queira rodar um serviço NTP para prover sincronização de tempo para a sua rede local, inclusive com NTS, o ntpd-rs também pode te ajudar, mas são necessárias mais algumas configurações adicionais. A documentação do projeto é muito boa e detalhada e sugiro a sua leitura adicional em https://docs.ntpd-rs.pendulum-project.org/.
Espero que tenham gostado!