AWS CodeArtifact
Servicio de gestión de artefactos completamente administrado que proporciona repositorios de paquetes para npm, Maven, PyPI y NuGet
Descripción general
AWS CodeArtifact es un servicio que proporciona repositorios de paquetes de software de forma completamente administrada. Compatible con los principales gestores de paquetes como npm, Maven, PyPI, NuGet, Swift y Cargo, permite el almacenamiento en caché de paquetes desde registros públicos y la gestión centralizada de paquetes privados internos. Con control de acceso granular mediante políticas IAM, uso compartido entre cuentas y garantía de inmutabilidad de versiones de paquetes, contribuye al fortalecimiento de la seguridad de la cadena de suministro.
Diseño jerárquico de dominios y repositorios
La estructura de recursos de CodeArtifact se compone de 2 niveles jerárquicos: dominios y repositorios. El dominio define el límite de gestión de paquetes para toda la organización, y dentro del mismo dominio se realiza automáticamente la deduplicación de paquetes entre repositorios, optimizando los costos de almacenamiento. Los repositorios se crean por equipo, proyecto o entorno, cada uno con políticas de acceso independientes. En la práctica, es común separar un repositorio para bibliotecas internas compartidas, uno para el equipo de producto y otro para caché de paquetes públicos. Para la encriptación a nivel de dominio se puede especificar una clave administrada por el cliente de AWS KMS, encriptando todos los activos de paquetes almacenados. El uso compartido entre cuentas se controla mediante políticas de dominio, permitiendo que múltiples cuentas dentro de Organizations accedan a los repositorios del mismo dominio para mantener la consistencia de paquetes en toda la organización.
Conexiones upstream y caché de paquetes
Las conexiones upstream de CodeArtifact son un mecanismo que almacena automáticamente en caché los paquetes de registros públicos (npmjs.com, PyPI, Maven Central, NuGet Gallery, etc.). Cuando un desarrollador solicita un paquete, primero se busca en el repositorio local, si no se encuentra se recorren los repositorios upstream en orden, y finalmente se obtiene del registro público y se almacena en caché. Una vez almacenado en caché, el paquete se mantiene localmente, sin verse afectado por fallos del registro público o latencia de red. Este mecanismo también es efectivo como defensa contra ataques a la cadena de suministro. Al configurar el control de origen de paquetes, se puede restringir la incorporación automática de nuevos paquetes desde registros públicos, previniendo ataques de confusión de dependencias (Dependency Confusion). Incluso si se publica un paquete público con el mismo nombre que uno interno, el control de origen prioriza la versión interna. La gestión de estados de versiones de paquetes (Published, Unlisted, Archived, Disposed) también permite restringir gradualmente el uso de versiones obsoletas.
Integración de autenticación con pipelines CI/CD
La autenticación de CodeArtifact funciona mediante la emisión de tokens de autenticación temporales. Se obtiene un token válido por hasta 12 horas con el comando aws codeartifact get-authorization-token y se configura como credencial de autenticación para gestores de paquetes como npm, pip o Maven. En la integración con CodeBuild, el patrón estándar es otorgar permisos de acceso a CodeArtifact al rol IAM del proyecto de build y obtener el token en la fase pre_build del buildspec.yml para configurar el gestor de paquetes. Desde servicios CI externos como GitHub Actions o GitLab CI, se asume un rol IAM mediante federación OIDC para obtener el token. Para npm se configura la URL del registro y el token en el archivo .npmrc, y para pip se especifica la URL del repositorio con la opción --index-url. Separando los permisos de publicación (publish) y obtención (read) de paquetes mediante políticas IAM, se puede prevenir la publicación no intencionada de paquetes desde pipelines CI. Limitando el acceso a través de VPC endpoints mediante políticas de endpoint del repositorio, también se asegura la seguridad de la ruta de red.