Mejora de la seguridad en la cadena de suministro de software mediante la configuración del grupo de paquetes de Amazon CodeArtifact

A partir de ahora, los administradores de repositorios de paquetes tienen la posibilidad de gestionar la configuración de múltiples paquetes en un solo lugar gracias a la nueva capacidad de configuración de grupo de paquetes de AWS CodeArtifact. Un grupo de paquetes permite definir cómo los desarrolladores internos o externos a través de repositorios ascendentes actualizan los paquetes. Ahora es posible permitir o bloquear a los desarrolladores internos para publicar paquetes, así como permitir o bloquear las actualizaciones ascendentes para un grupo de paquetes.

CodeArtifact es un servicio de repositorio de paquetes completamente administrado que facilita a las organizaciones el almacenamiento y uso compartido seguro de paquetes de software empleados en el desarrollo de aplicaciones. CodeArtifact puede utilizarse con herramientas de compilación y gestores de paquetes populares como NuGet, Maven, Gradle, npm, Yarn, pip, Twine y el Gestor de paquetes Swift.

CodeArtifact admite la importación bajo demanda de paquetes desde repositorios públicos como npmjs.com, maven.org y pypi.org. Esto permite a los desarrolladores de una organización obtener todos sus paquetes desde una única fuente de verdad: su repositorio de CodeArtifact.

Las aplicaciones simples suelen incluir docenas de paquetes, mientras que las aplicaciones empresariales más grandes pueden tener cientos de dependencias. Estos paquetes ayudan a los desarrolladores a agilizar el proceso de desarrollo y prueba al proporcionar código que resuelve desafíos comunes de programación, como acceso a la red, funciones criptográficas o manipulación de formatos de datos. Estos paquetes pueden ser creados por otros equipos de la organización o mantenidos por terceros, como proyectos de código abierto.

Con el fin de minimizar los riesgos de ataques a la cadena de suministro, algunas organizaciones revisan manualmente los paquetes disponibles en los repositorios internos y los desarrolladores autorizados a actualizar estos paquetes. Existen tres formas de actualizar un paquete en un repositorio. Los desarrolladores específicos de la organización pueden enviar actualizaciones de paquetes, lo cual suele ser el caso de los paquetes internos de la organización. También es posible importar paquetes desde repositorios ascendentes. Un repositorio ascendente podría ser otro repositorio de CodeArtifact, que actúa como una fuente de paquetes aprobada para toda la empresa, o repositorios públicos externos que ofrecen paquetes populares de código abierto.

A continuación se muestra un diagrama que ilustra las diferentes formas de exponer un paquete a los desarrolladores.

Repositorio múltiple de CodeArtifact

Al gestionar un repositorio, es crucial definir cómo se pueden descargar y actualizar los paquetes. Permitir la instalación de paquetes o actualizaciones desde repositorios ascendentes externos expone a la organización a ataques de typosquatting o confusión de dependencias, entre otros. Imagina a un actor malintencionado que publica una versión maliciosa de un paquete conocido con un nombre ligeramente diferente. Por ejemplo, en lugar de coffee-script, el paquete malicioso es cofee-script, con una sola “f”. Cuando el repositorio está configurado para permitir la recuperación desde repositorios ascendentes, todo lo que se necesita es un desarrollador distraído trabajando hasta altas horas de la noche para escribir npm install cofee-script en lugar de npm install coffee-script y así inyectar código malicioso en los sistemas.

CodeArtifact establece tres permisos para las tres formas posibles de actualizar un paquete. Los administradores pueden allow o block la instalación y actualizaciones desde comandos internos de publish, desde un repositorio ascendente interno o desde un repositorio ascendente externo.

Hasta el momento, los administradores de repositorios tenían que gestionar estas importantes configuraciones de seguridad paquete por paquete. Con la actualización reciente, los administradores del repositorio pueden configurar estos tres parámetros de seguridad para un grupo de paquetes de una sola vez. Los paquetes se identifican por su tipo, espacio de nombres y nombre. Esta nueva capacidad opera a nivel de dominio, no a nivel de repositorio, lo que permite a los administradores aplicar una regla para un grupo de paquetes en todos los repositorios de su dominio sin tener que mantener la configuración de controles de origen de paquetes en cada repositorio.

Veamos detalladamente cómo funciona.
Imaginemos que administro un repositorio de paquetes interno con CodeArtifact y deseo distribuir solo versiones del SDK de AWS para Python, también conocido como boto3, que han sido examinadas por mi organización.

Accedo a la página de CodeArtifact en la Consola de administración de AWS y creo un repositorio python-aws que ofrecerá paquetes verificados a los desarrolladores internos.

CodeArtifact: crear un repositorio

Esto genera un repositorio provisional adicional al creado inicialmente. Los paquetes externos de pypi se presentarán inicialmente en el repositorio interno pypi-store, donde serán verificados antes de ser transferidos al repositorio python-aws, que es donde mis desarrolladores podrán descargarlos.

CodeArtifact - Crear un repositorio - flujo de paquetesPor defecto, cuando un desarrolladorpip install boto3 es utilizado para autenticarse en CodeArtifact. CodeArtifact descarga paquetes del repositorio público pypi, los organiza en pypi-store y los replica en python-aws.

CodeArtifact - instalación de pipCodeArtifact: lista de paquetes después de una instalación de pip

Si deseas evitar que CodeArtifact obtenga actualizaciones de paquetes del repositorio externo de pypi y solo permitir que python-aws sirva paquetes aprobados desde tu repositorio interno de pypi-store, puedes aplicar esta configuración para un grupo de paquetes específico. Para hacer esto, ingresa a tu dominio y selecciona la pestaña Grupos de paquetes. Luego, haz clic en el botón Crear grupo de paquetes.

Ingresa a la Definición del grupo de paquetes. Esta definición determina qué paquetes serán incluidos en este grupo, identificándolos mediante una combinación de formato de paquete, un espacio de nombres opcional y nombre.

A continuación se presentan algunos ejemplos de patrones que puedes usar para cada una de las combinaciones permitidas:

  • Todos los formatos de paquete: /*
  • Un formato de paquete específico: /npm/*
  • Formato de paquete y prefijo de espacio de nombres: /maven/com.amazon~
  • Formato de paquete y espacio de nombres: /npm/aws-amplify/*
  • Formato de paquete, espacio de nombres y prefijo de nombre: /npm/aws-amplify/ui~
  • Formato, espacio de nombres y nombre del paquete: /maven/org.apache.logging.log4j/log4j-core$

Te recomendamos revisar la documentación para explorar todas las posibilidades.

En este caso, considerando que no existe el concepto de espacio de nombres para los paquetes de Python y deseas que el grupo contenga todos los paquetes cuyos nombres comiencen con boto3 provenientes de pypi, puedes escribir /pypi//boto3~.

CodeArtifact: definición de grupo de paquetes

A continuación, define los parámetros de seguridad para tu grupo de paquetes. Por ejemplo, si no deseas que los desarrolladores de tu organización publiquen actualizaciones ni que CodeArtifact obtenga nuevas versiones de repositorios externos, y únicamente autorizar actualizaciones de paquetes desde tu repositorio interno, puedes configurarlo de la siguiente manera.

Deselecciona todas las casillas de Heredar del grupo principal, elige Bloquear para Publicar y Upstream externo, y deja seleccionado Permitir en aguas arriba internas. Luego, haz clic en Crear grupo de paquetes.

CodeArtifact: configuración de seguridad del grupo de paquetes

Una vez configurado, los desarrolladores no podrán instalar versiones de paquetes diferentes a las aprobadas en el repositorio de python-aws. Si intentas como desarrollador instalar una versión distinta del paquete boto3, recibirás un mensaje de error, ya que la versión más reciente de boto3 no está disponible en el repositorio interno y se aplica una regla de bloqueo para impedir la obtención de paquetes o actualizaciones desde los repositorios externos.

Code ARTifact: la instalación se deniega cuando se utiliza una versión del paquete que aún no está presente en el repositorio

Por otro lado, si tu administrador busca proteger la organización de ataques de sustitución de dependencias y todos los nombres de los paquetes internos de Python comienzan con el nombre de la empresa (mycompany), se puede configurar una regla con el patrón /pypi//mycompany~ con permisos de publicación=permitir, aguas arriba externas=bloquear y aguas arriba internas=bloquear. Con esta configuración, se permite a los desarrolladores internos o al canal de CI/CD publicar esos paquetes, pero CodeArtifact no importará ningún paquete desde pypi.org que comience con mycompany, como mycompany.foo o mycompany.bar, evitando así ataques de sustitución de dependencias para estos paquetes.

Los grupos de paquetes están disponibles en todas las regiones de AWS donde CodeArtifact está disponible, sin coste adicional. Estos grupos te ayudan a controlar de forma más precisa cómo llegan los paquetes y actualizaciones a tus repositorios internos, contribuyendo a prevenir varios ataques en la cadena de suministro, como la tipografía o la confusión de dependencia. Esta es una configuración adicional que puedes incorporar hoy a tus herramientas de infraestructura como código (IaC) para la creación y gestión de tus repositorios en CodeArtifact.

¿Nos apoyarás hoy?

Creemos que todos merecen entender el mundo en el que viven. Este conocimiento ayuda a crear mejores ciudadanos, vecinos, amigos y custodios de nuestro planeta. Producir periodismo explicativo y profundamente investigado requiere recursos. Puedes apoyar esta misión haciendo una donación económica a Gelipsis hoy. ¿Te sumarás a nosotros?

Suscríbete para recibir nuestro boletín:

Recent Articles

Related Stories

DEJA UN COMENTARIO

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí