Openrsync - Implementación de rsync del equipo de OpenBSD
(github.com/kristapsdz)- openrsync es una implementación de rsync bajo licencia BSD (ISC), y actualmente está integrada en la base de OpenBSD
- Es compatible con rsync reciente y en las pruebas se usa rsync 3.1.3, pero puede funcionar siempre que haya soporte para el protocolo 27
- Como no acepta todos los argumentos de línea de comandos de rsync sino solo una parte, al usar openrsync y rsync juntos hay que usar banderas compatibles en ambos lados
- El sistema operativo oficialmente soportado es OpenBSD, aunque incluye glue de portabilidad para poder compilarse y ejecutarse en otros sistemas UNIX
- La documentación estándar son las páginas del manual; los detalles del protocolo están en rsync(5) y rsyncd(5), y la documentación de la utilidad está en openrsync(1)
- El proyecto fue escrito como parte de rpki-client(1) para OpenBSD, y recibió financiamiento de NetNod, IIS.SE, SUNET y 6connect
- La instalación en sistemas UNIX comunes se realiza con
./configure,make,make install, y no entra en conflicto con una instalación existente de rsync - El algoritmo de rsync se divide en sender y receiver; el sender crea la lista de archivos fuente y sus metadatos, y ambos lados ordenan los nombres de archivo alfabéticamente para referenciar los elementos por posición
- En la sincronización de archivos normales, si el tamaño del archivo y la hora de modificación coinciden se omite; si no, se reconstruyen los datos cambiados usando un hash rápido tipo Adler-32 de 4 bytes y un hash MD4 lento de 16 bytes por cada bloque de tamaño fijo
- El tamaño de bloque por defecto es el valor redondeado de la raíz cuadrada del tamaño total del archivo, el tamaño mínimo es 700 B, y por una razón desconocida el resultado de la raíz cuadrada se redondea hacia arriba al múltiplo de 8 más cercano
- La sesión se divide entre el cliente que ejecuta el usuario y un proceso servidor que corre de forma remota; el servidor puede ejecutarse bajo demanda con ssh(1) o funcionar como un demonio de red persistente
- A diferencia de rsync, donde el generator funciona como un proceso separado junto al receiver, openrsync combina generator y receiver en un solo proceso y responde a solicitudes de lectura y escritura mediante un bucle de eventos
- En seguridad, usa pledge(2) de OpenBSD para restringir las operaciones del sistema según el modo de ejecución, y unveil(2) para permitir solo el acceso al sistema de archivos bajo el directorio de destino
- En modo servidor, la semilla del hash MD4 no se genera con time(3) sino con arc4random(3)
- Puede portarse a Linux (glibc y musl), FreeBSD, NetBSD, Mac OS X y OmniOS, y el CI de GitHub ejecuta pruebas en arquitecturas x86_64, aarch64 y s390x, pero la principal limitación del port es igualar funciones de seguridad equivalentes a pledge y unveil de OpenBSD
1 comentarios
Comentarios en Hacker News
La explicación de que, si el servidor remoto es el origen o el destino, el cliente crea un hijo con
fork(2), inicia el servidoropenrsyncen el host remoto mediantessh(1), y luego cliente y servidor se comunican por una tuberíasocketpair(2), es ambigua sobre cómo se supone que funcionaSupongo que significa que el hijo creado por fork le pasa la conexión al padre mediante el par de sockets, o que conecta la entrada/salida estándar a la “tubería” del par de sockets y luego hace
execdesshPero esto es como decir que uno va en auto hasta el aeropuerto y entonces va en auto a Australia
He estado usando
openrsyncdesde que se anunció, aquí y allá, y con el tiempo definitivamente ha mejorado. Tengo ganas de que llegue el momento en que pueda usarse por completoPero hay un punto en el que no coincide con Samba
rsyncpara mi patrón de uso:openrsync --rsync-path=openrsync -av -e ssh /etc/services example.com:/tmp/servicesLo que esperaba era que creara el archivo
/tmp/servicesen el remoto, pero en realidad crea/tmp/services/servicesEl mirroring típico de directorios, como
-av -e ssh /path/to/src/ example.com:/path/to/dst/, sí se comporta como Sambarsyncrsync“normal”. Para sincronizar solo el contenido, parece que hace falta una barra diagonal final después deservicesCorrección: en realidad, mi
rsync“normal” también era elopenrsyncde macOS/tmp/servicesUna de las partes más confusas de
rsynces cómo maneja los directorios y la barra finalrsyncha torturado durante incontables años, entiendo ese impulso, pero creo que crear un segundoservicestiene mucho más sentido y es un valor predeterminado más seguroSi hay una oportunidad de cambiar el valor por defecto de
rsyncpara que sea menos demencial, hay que salvar a las futuras generaciones de esta confusiónViendo que últimamente han aumentado de golpe los commits de vibe coding en el código base de
rsync, y hasta han provocado regresiones, esto es una excelente noticiarsyncsiempre había sido sólido, así que quise restarle importancia a ese comentario, pero de hecho mis scripts de backup se rompieron después de actualizarEn los issues recientes de GitHub hay un montón de bugs introducidos en los últimos 2 parches, e incluso un monstruoso commit de unas 9 mil líneas que probablemente no aportó gran cosa
Los LLM hacen que escribir código sea más rápido y fácil, pero lo importante siempre fue pensar. No entiendo por qué arruinar software tan antiguo y confiable como este
Para quien necesite contexto sobre por qué se desarrolló este paquete, este proyecto se está desarrollando actualmente como parte de un validador RPKI
https://medium.com/@jobsnijders/a-proposal-for-a-new-rpki-va...
También hay una implementación en Go de Michael Stapelberg / el equipo de Gokrazy: https://github.com/gokrazy/rsync
https://github.com/gokrazy/rsync/graphs/contributors
La esencia del trabajo real de portabilidad es igualar las funciones de seguridad que ofrecen
pledge(2)yunveil(2)de OpenBSD. Son elementos decisivos para la funcionalidad del sistemaSin esas funciones, el sistema terminaría aceptando datos arbitrarios desde la red pública
https://justine.lol/pledge/
En Alpine Linux edge no parece estar
pledge. ¿Alguien ha probado Pledge en Linux? ¿Estoy entendiendo mal el riesgo de usaropenrsyncsinpledge, o este artículo está pensado solo para usuarios de OpenBSD?pledge,unveilo Capsicum. Tienecgroups, espacios de nombres y un montón de piezas sueltas que hay que combinar para lograr algo parecidoLinux no fue construido tanto como una función integral de aislamiento provista por determinadas llamadas al sistema y rutas del kernel, sino como varios sistemas que se fueron agregando repetidamente y se combinan entre sí para construir sandboxing o restricción de capacidades
Parece que hoy en día Linux también tiene funciones nuevas como Landlock, pero probablemente estén construidas sobre componentes básicos ya existentes de Linux, en lugar de ser algo totalmente nuevo
Decir que es un “desastre” probablemente significa que está disperso por todos lados. Hay demasiadas formas de bloquear cosas, y para elegir la mejor hay que meterse a fondo en cada subsistema, en contraste con usar solo una o dos llamadas al sistema sencillas
Y abajo dice esto: “Parece posible con Capsicum de FreeBSD, pero las instalaciones de seguridad de Linux son un desastre y se necesitaría la mano de un experto para asegurarlo correctamente”
O sea, que sea portable significa que compila y corre, no que tenga las mismas funciones de seguridad
Estaría bien que
pledge/unveilllegaran a Linux upstream, pero no lo esperoA diferencia de la frase “sin estas funciones el sistema acepta datos arbitrarios desde la red pública”,
pledgeyunveilno cambian si acepta o no datos arbitrarios. Lo que hacen es restringir lo que puede hacer un proceso una vez comprometido por una vulnerabilidadEn la sección
Securitysí está explicado correctamente, así que no sé de dónde salió esa formulaciónEsta es la versión que empezó a usarse desde macOS 15.0
Corrección: curiosamente sí la incluyeron en 15.0, pero parece que se guardaron los cambios incompatibles que rompían cosas hasta 15.4. https://apple.stackexchange.com/a/479297
Como no soporta el protocolo
rsyncreciente, no tiene soporte para marcas de tiempo de 64 bits, y por eso en sistemas de archivos nuevos no puede sincronizar realmente los metadatosMe da curiosidad por qué se llama así.
Openrsyncsuena como una alternativa de código abierto a un programa de código cerradoPero
Rsyncoriginal, ¿no era GPL también? ¿Solo significa que es “más abierto” por tener una licencia más permisiva?open, comoopenssh,openbgpd,openntpdyopensmtpd