¿Qué son los secretos y cómo controlarlos en Java?
Los secretos son cadenas de caracteres que no se deben compartir con el mundo exterior: podrían ser contraseñas de base de datos, claves de cifrado privadas, tokens de acceso personal, etc. Para mejorar la seguridad, muchos usuarios también piensan que todo lo que podría ayudar a un atacante se debe considerar un secreto: por ejemplo, la dirección URL de la base de datos de producción se podría considerar un secreto. La base de datos no debe ser accesible públicamente. La razón es que este tipo de información es confidencial por naturaleza y, cuanta menos información esté disponible en el código, mejor.
¿Qué es Confianza cero y Cero secretos?
El concepto de Confianza cero es que no se debe confiar en nadie a ciegas ni debe tener acceso a los recursos de la empresa sin validación y autorización previas.
Este concepto también se aplica a las aplicaciones web: no deben almacenar secretos en su código ni en sus archivos binarios finales. Es lo que se denomina Cero secretos.
Los secretos se deben administrar mediante un sistema externo, con reglas de acceso estrictas y validación, para reducir el riesgo de ataque.
No colocar secretos en repositorios de Git
Aunque el repositorio de Git sea privado, colocar cualquier secreto en el código fuente es un procedimiento no recomendado:
- Cualquier usuario que tenga acceso al repositorio conocerá los datos confidenciales
- Cualquier usuario con acceso al binario de la aplicación puede extraer secretos de él
Además, una vez que se almacena un secreto en un repositorio de Git, los atacantes siempre pueden encontrarlo buscando en el historial del repositorio, donde puede haber quedado olvidado después de que haya pasado mucho tiempo.
Aunque parezca práctico hacerlo, nunca debe almacenar secretos en el repositorio de código fuente. Para evitar este problema, puede usar herramientas automáticas que comprueben periódicamente el repositorio y que envían advertencias si encuentran una contraseña o una dirección URL de base de datos almacenadas por error.
Uso de variables de entorno
La solución más fácil para administrar secretos consiste en usar variables de entorno. Tienen varias ventajas:
- Son fáciles de usar
- Funcionan en todos los sistemas (incluso en sistemas locales)
- Todos los usuarios las conocen y comprenden cómo funcionan
Pero no son lo suficientemente seguras: todos los procesos del sistema pueden leerlas y se exponen fácilmente mediante Java Management Extensions (JMX) en un sistema Java.
Como resultado, las variables de entorno a menudo se ven como un primer paso hacia la Confianza cero: son más seguras que almacenar los secretos directamente en el código fuente, pero carecen de funcionalidades de administración y son de fácil acceso para los atacantes.
Uso de secretos de Kubernetes
Kubernetes tiene el concepto de secrets
, que es otra buena solución. Esos secretos se pueden cargar como un archivo en el sistema de archivos de la aplicación: después, un programa de Java puede leer ese archivo durante el inicio para acceder a esos secretos. Herramientas como Spring Framework incluso tienen compatibilidad estándar con este mecanismo, lo que les permite usar esos secretos de una manera fácil y eficaz.
Este mecanismo es más seguro que las variables de entorno, ya que esos archivos solo los puede leer el proceso que los necesita. También se benefician del amplio ecosistema de Kubernetes y se pueden administrar mediante diversas herramientas de administración, incluidas las proporcionadas por el proveedor de nube.
Aunque los secretos de Kubernetes son una buena solución para Kubernetes, también se limitan a Kubernetes y carecen de funcionalidades de administración avanzadas, en función de las herramientas que se usen para administrar la infraestructura de Kubernetes.
Uso de un almacén de secretos
Un almacén de secretos, como Hashicorp Vault o Azure Key Vault, es un software especializado para administrar secretos. Ofrece un sistema de administración enriquecido para autorizar a los usuarios, girar las claves de seguridad y validar qué aplicación puede acceder a cada secreto.
También proporcionan una API externa, por lo que se pueden usar en cualquier sistema. Por ejemplo, puede usar Azure Key Vault en todos los servicios de Azure, incluidos Virtual Machines, Azure App Services, Azure Kubernetes Services o Azure Spring Apps.
Un almacén de secretos es la solución más segura para administrar secretos, pero es necesario usar una herramienta dedicada.