Problema
Los agentes generados por LLM que interactúan con AWS suelen necesitar leer valores almacenados en AWS Secrets Manager. En entornos donde la confidencialidad es crítica, exponer el texto plano del secreto al modelo representa un riesgo: cualquier salida del agente podría filtrarlo accidentalmente o, peor aún, un atacante podría inducir al modelo a revelar la información.
El patrón problemático es que, por defecto, el agente ejecuta la llamada GetSecretValue, captura el valor y lo inserta en su contexto antes de usarlo. Cuando el agente genera código o comandos que incluyen la variable, el secreto viaja dentro del prompt y queda registrado en logs de depuración, auditorías de modelo o incluso en la salida del propio agente.
El objetivo es impedir que el texto plano del secreto llegue al modelo, manteniendo la capacidad del agente de usar la credencial para operaciones autorizadas (por ejemplo, autenticarse contra un servicio externo). La solución debe ser reutilizable en cualquier proyecto que emplee Agent Toolkit for AWS y no depender de un caso concreto.
Causa
-
Ausencia de filtro en tiempo de ejecución
La arquitectura original del toolkit ejecuta herramientas (CLI, SDK, scripts) sin inspección previa. Cuando el agente construye un comando que incluyeaws secretsmanager get-secret-value …, el valor se resuelve en la propia máquina del agente y luego se inserta en la cadena de texto que alimenta al modelo. -
Instalación incompleta del plugin
El secret‑safety skill y su hook forman parte del pluginaws-core. Si el agente se inicializa medianteaws configure agent-toolkit, solo se descargan habilidades genéricas del catálogo; el plugin que contiene la protección no se carga automáticamente. Por eso muchos entornos “funcionan” pero siguen exponiendo secretos. -
Hook no persistente entre sesiones
Los hooks (PreToolUse) se registran al iniciar la sesión del agente. Cambiar la configuración del plugin sin reiniciar la sesión deja el hook inactivo, lo que permite que la llamada a la herramienta se ejecute sin la verificación de seguridad. -
Permisos IAM insuficientes o demasiado amplios
El agente necesitasecretsmanager:GetSecretValuepara leer el secreto, pero si la política permite tambiénsecretsmanager:PutSecretValueoDeleteSecret, el agente podría escribir o borrar secretos sin restricción. La protección de lectura no cubre estas acciones.
Solución
La estrategia combina dos capas que ya están disponibles en el toolkit:
- PreToolUse hook – intercepta la solicitud de herramienta antes de que se ejecute. Si la forma del comando coincide con un patrón de lectura de secreto no autorizado, el hook devuelve un mensaje de denegación y sugiere la ruta segura.
- Wrapper
asm-execcon referencias dinámicas – el agente escribe un placeholder ({{resolve:secretsmanager:arn:…}}).asm-execresuelve el placeholder en su propio proceso, entrega el valor solo a la herramienta y nunca lo inserta en el contexto del modelo.
Pasos de implementación
-
Instalar el plugin
aws-coreaws configure agent-toolkit add-plugin aws-core -
Activar el skill y el hook
aws agent-toolkit enable-skill secret-safety aws agent-toolkit enable-hook PreToolUse -
Reiniciar la sesión del agente
La mayoría de los clientes ofrecen un comandorestarto simplemente cierran y vuelven a iniciar la CLI. Sin este paso, los hooks no se cargan. -
Usar la sintaxis de referencia segura
En los prompts o scripts que el agente genere, sustituir cualquier llamada directa aaws secretsmanager get-secret-valuepor:asm-exec --command "aws secretsmanager get-secret-value --secret-id {{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret}}"asm-execintercepta la referencia, llama a Secrets Manager, devuelve el valor al proceso y lo mantiene fuera del contexto del LLM. -
Ajustar políticas IAM
Limitar al agente asecretsmanager:GetSecretValuey, opcionalmente, asecretsmanager:DescribeSecret. Añadir una condiciónStringEqualssobreaws:CalledViaAWSMCPpara que solo los accesos a través del wrapper queden registrados como “legítimos”. -
Validar la lista de patrones permitidos
El hook incluye una lista de “shapes” permitidos (por ejemplo,grep get-secret-value ./src). Si se necesita un nuevo patrón (por ejemplo, una herramienta personalizada), añádalo al archivo de configuración del hook:allowed_patterns: - "grep get-secret-value" - "rg get-secret-value"
Alternativas prácticas
- Wrapper personalizado: Si
asm-execno cubre un caso (por ejemplo, una librería Python que llama directamente al SDK), crear un pequeño script que reciba la referencia, invoqueboto3y devuelva el resultado a través de stdout. Registrar ese script como herramienta en el toolkit y habilitar el mismo hook. - Proxy de Secrets Manager: Configurar un endpoint local que reenvíe la solicitud a Secrets Manager y registre la llamada en CloudTrail. El agente solo ve la URL del proxy, nunca el ARN real. Esta opción es más compleja y solo recomendable cuando se necesita auditoría adicional.
Cuándo aplicar esta solución
- Síntomas: El agente devuelve valores de secretos en la salida del modelo, o los logs de depuración muestran el texto plano del secreto. Los intentos de “grep” sobre archivos de código que contienen la cadena del secreto son aceptados sin restricción.
- Entornos típicos: Pipelines CI/CD que usan agentes LLM para generar scripts, bots de soporte que consultan credenciales, pruebas de integración que automatizan despliegues con valores sensibles.
- No aplica: Cuando el agente nunca necesita leer secretos (por ejemplo, solo realiza operaciones de lectura de recursos que no requieren credenciales) o cuando la arquitectura ya separa completamente la capa de secretos (por ejemplo, usando IAM roles vinculados a la instancia y sin acceso directo a Secrets Manager).
Código
# 1. Añadir plugin que contiene la skill
aws configure agent-toolkit add-plugin aws-core
# 2. Habilitar skill y hook
aws agent-toolkit enable-skill secret-safety
aws agent-toolkit enable-hook PreToolUse
# 3. Reiniciar sesión del agente (ejemplo con CLI)
aws agent-toolkit session restart
# 4. Ejecutar comando seguro con asm-exec
asm-exec --command "aws secretsmanager get-secret-value --secret-id {{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret}}"
# 5. (Opcional) Añadir patrón nuevo al hook
cat <<EOF > ~/.aws/agent-toolkit/hooks/pretooluse.yaml
allowed_patterns:
- "mycustomtool --fetch-secret"
EOF
Verificación
-
Prueba de denegación
Ejecuta un comando que intente leer el secreto sin usarasm-exec:aws secretsmanager get-secret-value --secret-id my-secretEl agente debe responder con un mensaje de denegación que indique usar
asm-exec. -
Prueba de aceptación
Repite la llamada usando la sintaxis segura del paso 4. El valor debe devolverse al proceso, pero no aparecer en la salida del modelo ni en los logs de la sesión del agente. -
Revisar CloudTrail
Busca eventosGetSecretValue. El campoinvokedBydebe seraws-mcp.amazonaws.com. Si aparecen llamadas directas desde la IP de tu máquina, la protección no está activa. -
Validar IAM
En la consola de IAM, revisa la política adjunta al rol del agente. Asegúrate de que solo contengasecretsmanager:GetSecretValuey que la condiciónStringEqualssobreaws:CalledViaAWSMCPesté presente.
Notas adicionales
- Instalación parcial: Si el agente ya estaba corriendo antes de añadir el plugin, la única forma de activar la protección es reiniciar la sesión. No basta con volver a ejecutar
enable-skill. - Documentación implícita: La referencia
{{resolve:secretsmanager:…}}se interpreta únicamente porasm-exec. Otros wrappers no la reconocerán, por lo que la sustitución fallará silenciosamente. - Auditoría: CloudTrail registra la llamada a Secrets Manager, pero no el valor. Si necesitas rastrear quién solicitó el secreto, revisa el campo
userIdentity.sessionContext.sessionIssuer.arndel evento. - Compatibilidad: La skill y el hook están incluidos solo en la versión
aws-coredel plugin. Herramientas de terceros que instalen el toolkit medianteaws configure agent-toolkitno la obtienen automáticamente. - Mantenimiento: Cuando AWS añada nuevos “shapes” de herramienta (por ejemplo, nuevos clientes CLI), revisa la lista de patrones del hook y actualízala para evitar falsos negativos.