Los desarrolladores del repositorio de paquetes Python PyPI han publicado un plan para la transición a la autenticación de dos factores obligatoria para los paquetes que se consideran críticos. Esta consideración se basa en el número de descargas, y el cambio se aplicará a las cuentas de los mantenedores y propietarios de proyectos relacionados con el 1% de los paquetes más descargados en los últimos seis meses. Dado que actualmente el repositorio PyPI incluye más de 350,000 paquetes, la autenticación de dos factores se aplicará a aproximadamente 3,500 paquetes. Se ha preparado una página especial para verificar si una cuenta está en la lista. La fecha exacta para la implementación de la autenticación de dos factores obligatoria aún no se ha determinado, pero se espera que ocurra en los próximos meses.
A diferencia de la transición a la autenticación de dos factores en los proyectos RubyGems, NPM y GitHub, en PyPI se implementará inicialmente un esquema que contempla el uso preferente de un token de hardware con claves de acceso. La alta seguridad en comparación con la generación de contraseñas de un solo uso es la razón recomendada para el uso de tokens y el protocolo WebAuthn (la posibilidad de usar TOTP en lugar de tokens estará disponible como opción).
Los tokens se podrán obtener de forma gratuita: la empresa Google ha patrocinado la iniciativa y ha destinado 4,000 claves Titan al proyecto. Cada mantenedor puede solicitar gratuitamente dos tokens con interfaz USB-C o USB-A. El segundo token se envía como respaldo en caso de fallo o pérdida del principal, para minimizar el riesgo de pérdida de acceso al repositorio y evitar que los desarrolladores tengan que atravesar un complicado proceso de recuperación de acceso.
Desafortunadamente, los tokens solo pueden ser enviados a Austria, Bélgica, Canadá, Francia, Alemania, Italia, Japón, España, Suiza, Reino Unido y Estados Unidos. Los mantenedores de otros países pueden adquirir por su cuenta tokens compatibles con la especificación FIDO U2F, como los tokens Yubikey y Thetis. También se contempla la posibilidad de utilizar aplicaciones de autenticación basadas en contraseñas de un solo uso que soporten el protocolo TOTP, como Authy, Google Authenticator y FreeOTP.
La iniciativa no estuvo exenta de incidentes. El autor del paquete Atomicwrites, que cuenta con 6 millones de descargas al mes y 38 millones en 6 meses, se negó a adoptar la autenticación de dos factores y, para excluir su paquete de la lista de críticos, intentó reiniciar el contador de descargas. Para hacer esto, primero eliminó el paquete y luego subió una nueva versión. Se esperaba que esta manipulación solo reiniciara el contador, pero para sorpresa del desarrollador, también se eliminaron todas las versiones anteriores del repositorio, lo que causó problemas en los proyectos que dependían de la biblioteca, que algunos desarrolladores compararon con el incidente que resultó de la eliminación del paquete left-pad en NPM.
El problema se agravó porque después de la eliminación, el autor de atomicwrites no pudo cargar las versiones antiguas, que solo se pudieron restaurar al día siguiente tras la intervención de los administradores de PyPI. Después de lo sucedido, el autor del paquete decidió dejar de desarrollar atomicwrites y clasificar el paquete como obsoleto. Como razón se menciona que desarrolla el proyecto como un pasatiempo en su tiempo libre y que la aparición de requisitos adicionales que complican el trabajo no justifican el tiempo gastado en el mantenimiento gratuito de un paquete con tanta popularidad. El autor de atomicwrites afirma que preferiría simplemente escribir código por diversión y que la preocupación por la protección adicional contra la captura por parte de actores maliciosos podría asumirse cuando hay una compensación por ello.
La biblioteca atomicwrites contiene alrededor de 200 líneas de código y ofrece funciones para la escritura atómica de archivos. Como alternativa, se pueden usar las llamadas estándar os.replace y os.rename (la operación se reduce a escribir en un archivo con un nombre temporal y renombrar al archivo de destino una vez que esté listo).
Fuente: opennet.ru
