Openrsync - implementação de rsync da equipe do OpenBSD
(github.com/kristapsdz)- openrsync é uma implementação do rsync sob licença BSD (ISC) e atualmente está integrada à base do OpenBSD
- É compatível com versões recentes do rsync, e nos testes foi usado o rsync 3.1.3, mas funciona desde que haja suporte ao protocolo 27
- Como aceita apenas parte dos argumentos de linha de comando do rsync, ao usar openrsync junto com rsync é necessário utilizar flags suportadas por ambos os lados
- O sistema operacional oficialmente suportado é o OpenBSD, mas inclui glue de portabilidade para que possa ser compilado e executado em outros sistemas UNIX
- A documentação padrão está nas páginas de manual; os detalhes do protocolo estão em rsync(5) e rsyncd(5), e a documentação do utilitário está em openrsync(1)
- O projeto foi escrito como parte do rpki-client(1) para OpenBSD, com financiamento de NetNod, IIS.SE, SUNET e 6connect
- A instalação em sistemas UNIX comuns é feita com
./configure,make,make installe não entra em conflito com uma instalação existente do rsync - O algoritmo do rsync é dividido entre sender e receiver; o sender cria a lista de arquivos de origem e os metadados, e ambos os lados ordenam os nomes dos arquivos em ordem alfabética para referenciar os itens com base na posição
- Na sincronização normal de arquivos, se o tamanho do arquivo e a hora de modificação forem iguais, ele é ignorado; se forem diferentes, os dados alterados são reconstruídos usando, para cada bloco de tamanho fixo, um hash rápido de 4 bytes no estilo Adler-32 e um hash lento MD4 de 16 bytes
- O tamanho do bloco, por padrão, é o valor arredondado da raiz quadrada do tamanho total do arquivo; o tamanho mínimo é 700 B e o resultado da raiz quadrada, por um motivo desconhecido, é arredondado para cima até um múltiplo de 8
- A sessão é dividida entre o cliente executado pelo usuário e um processo servidor executado remotamente; o servidor pode ser iniciado sob demanda via ssh(1) ou operar como um daemon de rede persistente
- Diferentemente do generator do rsync, que roda como um processo separado ao lado do receiver, o openrsync combina generator e receiver em um único processo e responde a requisições de leitura e escrita com um loop de eventos
- Em termos de segurança, ele usa pledge(2) do OpenBSD para limitar operações do sistema conforme o modo de execução, e unveil(2) para permitir acesso ao sistema de arquivos apenas dentro do diretório de destino
- No modo servidor, a seed do hash MD4 é gerada com arc4random(3), e não com time(3)
- Pode ser portado para Linux (glibc·musl), FreeBSD, NetBSD, Mac OS X e OmniOS, e o GitHub CI executa testes nas arquiteturas x86_64, aarch64 e s390x, mas a principal limitação da portabilidade é reproduzir recursos de segurança equivalentes ao pledge e ao unveil do OpenBSD
1 comentários
Comentários do Hacker News
A explicação de que, quando o servidor remoto é a origem ou o destino, o cliente cria um filho com
fork(2), inicia o servidoropenrsyncno host remoto viassh(1)e então cliente e servidor se comunicam por um pipesocketpair(2)é meio ambígua sobre como isso funcionaImagino que isso queira dizer que o processo filho bifurcado passa a conexão ao pai por meio do par de sockets, ou conecta a entrada e saída padrão ao “pipe” do par de sockets e depois faz
execdosshMas isso é como dizer que você vai de carro até o aeroporto e então afirmar que vai de carro para a Austrália
Venho usando o
openrsyncaqui e ali desde que foi anunciado, e com o tempo ele claramente melhorou bastante. Estou esperando o momento em que poderei usá-lo totalmenteSó há um ponto em que ele não bate com o Samba
rsyncno meu padrão de uso:openrsync --rsync-path=openrsync -av -e ssh /etc/services example.com:/tmp/servicesO comportamento esperado é criar o arquivo
/tmp/servicesno remoto, mas na prática ele cria/tmp/services/servicesEspelhamento de diretório normal, como
-av -e ssh /path/to/src/ example.com:/path/to/dst/, funciona como no Sambarsyncrsync“normal”. Para sincronizar só o conteúdo, provavelmente seria preciso uma barra final depois deservicesCorreção: na verdade, meu
rsync“normal” também era oopenrsyncdo macOS/tmp/servicesno destinoUma das partes mais confusas do
rsyncé justamente como ele trata diretórios e barras finaisrsyncpor incontáveis anos, entendo o impulso, mas criar o segundoservicesfaz muito mais sentido e é um padrão mais seguroSe existe uma chance de mudar o padrão do
rsyncpara algo menos insano, temos que poupar as futuras gerações dessa confusãoConsiderando o aumento repentino recente de commits de vibe coding na base de código do
rsync, e até regressões causadas por isso, essa é uma notícia muito boarsyncsempre foi sólido, então eu quis ignorar esse tipo de comentário, mas na prática meus scripts de backup quebraram depois do upgradeAs issues mais recentes no GitHub listam muitos bugs introduzidos nos 2 últimos patches, incluindo um commit monstruoso de cerca de 9 mil linhas que provavelmente nem significava muita coisa
LLMs tornam escrever código mais rápido e fácil, mas o importante sempre foi pensar. Não faço ideia de por que estragar um software tão antigo e confiável
Para quem precisa de contexto sobre a motivação desse pacote, este projeto está sendo desenvolvido atualmente como parte de um validador de RPKI
https://medium.com/@jobsnijders/a-proposal-for-a-new-rpki-va...
Também existe a implementação em Go do Michael Stapelberg / time do Gokrazy: https://github.com/gokrazy/rsync
https://github.com/gokrazy/rsync/graphs/contributors
O cerne do trabalho real de portar isso é reproduzir as funcionalidades de segurança oferecidas por
pledge(2)eunveil(2)no OpenBSD. Elas são fatores decisivos do sistemaSem essas funcionalidades, o sistema acaba aceitando dados arbitrários de redes públicas
https://justine.lol/pledge/
No Alpine Linux edge eu não vejo
pledge. Alguém já testou o Pledge no Linux? Estou entendendo errado o risco de usaropenrsyncsempledge, ou esse texto é voltado apenas para usuários de OpenBSD?pledge,unveilnem recursos como o Capsicum. Ele temcgroups, namespaces e um monte de outras coisas que você precisa combinar para fazer algo parecidoEm vez de ser construído como uma funcionalidade de isolamento que fornece o conceito inteiro por meio de certas syscalls e caminhos do kernel, o Linux foi sendo montado com vários sistemas adicionados repetidamente e combinados entre si para compor sandboxing ou restrição de capacidades
Hoje em dia o lado do Linux parece ter recursos novos como Landlock, mas provavelmente de uma forma construída sobre elementos básicos já existentes no Linux, em vez de algo totalmente novo
“Bagunçado” provavelmente quer dizer que está espalhado por toda parte. Há formas demais de trancar o sistema, e para escolher a melhor você precisa se aprofundar bastante em cada subsistema, em contraste com usar só 1 ou 2 syscalls simples
E abaixo está escrito: “Talvez fosse possível com o Capsicum do FreeBSD, mas as facilidades de segurança do Linux são uma bagunça e seria preciso o toque de um especialista para protegê-lo corretamente”
Ou seja, dizer que é portável significa que compila e roda, não que tenha os mesmos recursos de segurança
Seria bom se
pledge/unveilentrassem no upstream do Linux, mas eu não contaria com issoAo contrário da frase “sem essas funcionalidades, o sistema aceita dados arbitrários de redes públicas”,
pledgeeunveilnão mudam se ele aceita ou não dados arbitrários. Elas limitam o que um processo comprometido por uma vulnerabilidade pode fazerA seção
Securityexplica isso corretamente, então não sei de onde veio aquela formulaçãoEsta é a versão usada no macOS 15.0 em diante
Correção: curiosamente, embora ela tenha sido incluída no 15.0, parece que eles guardaram a mudança incompatível que quebrava retrocompatibilidade até o 15.4. https://apple.stackexchange.com/a/479297
Como ele não suporta o protocolo
rsyncrecente, não há suporte a timestamps de 64 bits, então em sistemas de arquivos novos ele não consegue sincronizar os metadados de fatoFico curioso com o nome.
Openrsyncsoa como uma alternativa open source a um programa de código fechadoMas o
Rsyncoriginal também não é GPL? É só no sentido de que ele é “mais aberto” por ter uma licença mais permissiva?open, comoopenssh,openbgpd,openntpdeopensmtpd