En este documento, se describe cómo puedes usar una herramienta de código abierto para implementar acceso privilegiado justo a tiempo a los proyectos de Google Cloud. El acceso privilegiado a tiempo te permite otorgar acceso temporal a los proyectos a un conjunto limitado de usuarios solo cuando se necesita el acceso.
El documento es para administradores que administran el acceso de los usuarios a los recursos de Google Cloud. Suponemos que estás familiarizado con Google Cloud, Identity and Access Management (IAM) y conceptos relacionados.
Descripción general de la administración de acceso con privilegios justo a tiempo
Cuando sigues el principio de privilegio mínimo, otorgas a los usuarios el acceso suficiente para que puedan realizar las actividades diarias, pero no pueden hacer nada más. Seguir este principio te ayuda a reducir los riesgos. Sin embargo, puede generar inconvenientes para los usuarios cuando necesitan realizar una acción con privilegios, por ejemplo, lidiar con un incidente inesperado. Los ejemplos incluyen la solución de un problema en un sistema de producción o la solución de un problema que involucra datos sensibles.
Una forma de abordar este problema es proporcionar acceso con privilegios justo a tiempo, es decir, proporcionar acceso con privilegios solo cuando sea necesario. Una idea clave de la administración de acceso con privilegios justo a tiempo es distinguir entre el acceso permanente y el acceso apto:
- El acceso permanente se aplica hasta que lo revoques. De acuerdo con el principio del privilegio mínimo, es mejor limitar el acceso permanente y proporcionarlo solo a los pocos usuarios que deben tenerlo.
- El acceso apto no se aplica de inmediato. En su lugar, un usuario al que se le otorgó acceso apto a un proyecto debe activar explícitamente ese acceso antes de que pueda acceder al proyecto. También deben proporcionar una justificación para hacerlo. Después de que se haya activado el acceso del usuario, el acceso se vence automáticamente después de un período corto.
El uso de la administración de acceso con privilegios justo a tiempo puede ayudarte a hacer lo siguiente:
- Reducir el riesgo de que alguien modifique o borre recursos por accidente. Por ejemplo, cuando los usuarios tienen acceso con privilegios solo cuando es necesario, ayuda a evitar que ejecuten secuencias de comandos en otros momentos que afectan de manera involuntaria los recursos que no deberían poder cambiar.
- Crear un registro de auditoría que indique por qué se activaron los privilegios.
- Realizar auditorías y revisiones para analizar la actividad pasada.
Usar el acceso justo a tiempo para implementar el acceso con privilegios
Just-In-Time Access es una aplicación de código abierto diseñada para ejecutarse en App Engine o Cloud Run y te permite implementar acceso privilegiado a los recursos de Google Cloud justo a tiempo. La aplicación permite a los administradores, usuarios y auditores realizar las siguientes tareas:
Los administradores pueden otorgar un rol a un usuario o grupo y agregar la siguiente condición de IAM para que el rol sea apto:
has({}.jitAccessConstraint)
Los usuarios pueden buscar proyectos y roles a los que puedan acceder mediante la aplicación de Just-In-Time Access.
En la siguiente captura de pantalla de la aplicación Just-In-Time Access, se muestra una lista de las roles para las que un usuario es apto en un proyecto:
Luego, pueden activar uno o más roles y proporcionar una justificación para obtener acceso:
Después de que un usuario activa un rol, Just-In-Time Access otorga acceso temporal al usuario al proyecto.
Los auditores pueden usar Cloud Logging para revisar cuándo y por qué los usuarios activaron los roles aptos.
Para proteger la aplicación del acceso no autorizado, solo se puede acceder a Just-In-Time Access a través de Identity-Aware Proxy (IAP). Con IAP, un administrador puede controlar qué usuarios pueden acceder a Just-In-Time Access y qué condiciones adicionales deben cumplir para obtener acceso.
Antes de comenzar
Antes de implementar la aplicación de acceso justo a tiempo, debes decidir para qué parte de la jerarquía de recursos deseas administrar el acceso privilegiado justo a tiempo. Puedes administrar el acceso a los siguientes recursos:
- Un solo proyecto
- Una carpeta que contiene varios proyectos
- Todos los proyectos de tu organización
Para completar la implementación, necesitas lo siguiente:
- Acceso de administrador avanzado a la cuenta de Cloud Identity o Google Workspace que corresponde a la organización de Google Cloud que usas.
- Permiso para modificar la política de IAM del proyecto, la carpeta o la organización que deseas administrar mediante Just-In-Time Access.
- Un segundo usuario de Cloud Identity o Google Workspace que puedas usar para probar el acceso.
También necesitas un proyecto de Google Cloud para implementar la aplicación Just-In-Time Access.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
Implementa Just-In-Time Access
En esta sección, se describe cómo implementar la aplicación Just-In-Time Access en App Engine o Cloud Run.
La implementación de la aplicación Just-In-Time Access en Cloud Run requiere una configuración más compleja que la implementación de la aplicación en App Engine. Por lo tanto, te recomendamos que uses App Engine, a menos que realices implementaciones en una región que no admita App Engine, o si no puedes usar App Engine por otros motivos.
El código para Just-In-Time Access está en un repositorio de GitHub.
En esta sección, se supone que eres administrador.
Configura tu proyecto de Google Cloud
In the Google Cloud console, switch to your project and enable required APIs:
App Engine
Enable the Cloud Asset Inventory, Resource Manager, Identity-Aware Proxy, Container Registry, Cloud Build, Identity and Access Management y Directory APIs.
Cloud Run
Enable the Cloud Asset Inventory, Resource Manager, Identity-Aware Proxy, Container Registry, Cloud Run, Compute Engine, Identity and Access Management y Directory APIs.
Abra Cloud Shell.
Configura una variable de entorno para que contenga tu ID del proyecto:
gcloud config set project PROJECT_ID
Reemplaza PROJECT_ID por el ID de tu proyecto.
Crea una cuenta de servicio para la aplicación Just-In-Time Access:
SERVICE_ACCOUNT=$(gcloud iam service-accounts create jitaccess --display-name "Just-In-Time Access" --format "value(email)")
Para permitir que la aplicación cree tokens con su cuenta de servicio, otórgale el rol Creador de tokens de cuenta de servicio (
roles/iam.serviceAccountTokenCreator
):gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/iam.serviceAccountTokenCreator"
La aplicación usa el permiso para crear tokens a fin de acceder a la API de Directory y, de forma opcional, para controlar los flujos de trabajo de aprobación de varias partes.
Otorga permiso a la aplicación Just-In-Time Access para administrar las vinculaciones de IAM
Ahora otorgas el rol de Administrador de IAM de proyecto a la cuenta de servicio de la aplicación. Este rol permite que la aplicación Just-In-Time Access cree vinculaciones temporales de IAM cuando debe otorgar acceso a tiempo.
Debido a que el rol de Administrador de IAM de proyecto tiene muchos privilegios, debes limitar el acceso a la cuenta de servicio de la aplicación y al proyecto que la contiene.
Usa los siguientes lineamientos:
- Limita la cantidad de usuarios que pueden acceder al proyecto y evita que se otorguen a los usuarios el rol de Propietario o Editor.
- Limita la cantidad de usuarios que pueden actuar como la cuenta de servicio. Los usuarios que deberían poder realizar este uso de identidad incluyen aquellos que tienen el rol Service Account User o Service Account Token Creator.
Para otorgar el rol de Administrador de IAM de proyecto a la cuenta de servicio, haz lo siguiente:
Otorga el rol Administrador de IAM de proyecto (
roles/resourcemanager.projectIamAdmin
) y Visualizador de recurso de Cloud (roles/cloudasset.viewer
) a la parte de tu jerarquía de recursos para la que quieres administrar el acceso con privilegios justo a tiempo para lo siguiente:Proyecto
SCOPE_ID=RESOURCE_PROJECT_ID SCOPE_TYPE=projects gcloud projects add-iam-policy-binding $SCOPE_ID \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/resourcemanager.projectIamAdmin" \ --condition None gcloud projects add-iam-policy-binding $SCOPE_ID \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/cloudasset.viewer" \ --condition None
Reemplaza RESOURCE_PROJECT_ID por el ID del proyecto de Google Cloud para el que deseas administrar el acceso. Este proyecto es diferente del que recibirá la implementación de Just-In-Time Access.
Folder
SCOPE_ID=RESOURCE_FOLDER_ID SCOPE_TYPE=folders gcloud resource-manager folders add-iam-policy-binding $SCOPE_ID \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/resourcemanager.projectIamAdmin" \ --condition None gcloud resource-manager folders add-iam-policy-binding $SCOPE_ID \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/cloudasset.viewer" \ --condition None
Reemplaza RESOURCE_FOLDER_ID por el ID de la carpeta que contiene los proyectos para los que deseas administrar el acceso.
Organización
SCOPE_ID=ORGANIZATION_ID SCOPE_TYPE=organizations gcloud organizations add-iam-policy-binding $SCOPE_ID \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/resourcemanager.projectIamAdmin" \ --condition None gcloud organizations add-iam-policy-binding $SCOPE_ID \ --member "serviceAccount:$SERVICE_ACCOUNT" \ --role "roles/cloudasset.viewer" \ --condition None
Reemplaza ORGANIZATION_ID por el ID de tu organización.
Otorga acceso para permitir que la aplicación resuelva membresías a grupos
La aplicación Just-In-Time Access te permite otorgar acceso apto a un usuario específico o a un grupo completo. Para evaluar las membresías grupales, la aplicación debe tener permiso para leer información de membresía del grupo desde tu cuenta de Cloud Identity o Google Workspace.
A fin de otorgar permiso de acceso a la cuenta de servicio de la aplicación para leer las membresías del grupo, haz lo siguiente:
Abre la Consola del administrador de Google y accede como un usuario administrador avanzado.
Ve a Cuenta > Roles de administrador:
Haz clic en Lector de grupos > Administradores.
Haz clic en Asignar cuentas de servicio.
Ingresa la siguiente dirección de correo electrónico:
jitaccess@PROJECT_ID.iam.gserviceaccount.com
Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.
Haga clic en Agregar.
Haz clic en Asignar rol.
Busca tu ID de cliente de la cuenta de Cloud Identity o Google Workspace
Para evaluar las membresías grupales con la API de Directory, la aplicación Just-In-Time Access necesita tu ID de cliente de la cuenta de Cloud Identity o Google Workspace. Para buscar este ID, haz lo siguiente:
En la Consola del administrador de Google, ve a Cuenta > Configuración de la cuenta:
Copia el ID de cliente de tu cuenta. El ID de cliente comienza con
C
.Necesitarás el ID de cliente en un paso posterior.
Cierra la Consola del administrador.
Implemente la aplicación
Ahora estás listo para implementar la aplicación Just-In-Time Access en App Engine o Cloud Run.
App Engine
Para implementar la aplicación Just-In-Time Access en App Engine, realiza los siguientes pasos.
En Cloud Shell, configura una variable de entorno para que contenga el ID de cliente de tu cuenta de Cloud Identity o Google Workspace:
ACCOUNT_CUSTOMER_ID=CUSTOMER_ID
Reemplaza CUSTOMER_ID con el ID de cliente que buscaste antes.
Crea una aplicación de App Engine:
gcloud app create --region LOCATION
Reemplaza LOCATION por una ubicación de App Engine compatible.
Clona el repositorio de GitHub y cambia a la rama
latest
:git clone https://github.com/GoogleCloudPlatform/jit-access.git cd jit-access/sources git checkout latest
Crea un archivo de configuración para la aplicación Just-In-Time Access:
cat << EOF > app.yaml runtime: java17 instance_class: F2 service_account: $SERVICE_ACCOUNT env_variables: RESOURCE_SCOPE: $SCOPE_TYPE/$SCOPE_ID RESOURCE_CATALOG: AssetInventory RESOURCE_CUSTOMER_ID: $ACCOUNT_CUSTOMER_ID ACTIVATION_TIMEOUT: 60 JUSTIFICATION_HINT: "Bug or case number" JUSTIFICATION_PATTERN: ".*" EOF
En este archivo de configuración, puedes personalizar los valores de las variables. Para obtener una lista de opciones de configuración, consulta la página Opciones de configuración en el repositorio asociado de GitHub.
Implementa la aplicación:
gcloud app deploy --appyaml app.yaml
Toma nota de la
target url
en el resultado. Esta será la URL pública de la aplicación Just-In-Time Access.Si ves el mensaje de error
NOT_FOUND: Unable to retrieve P4SA
, vuelve a ejecutar el comando.
Cloud Run
Para implementar la aplicación Just-In-Time Access en Cloud Run, debes realizar los siguientes pasos.
En Cloud Shell, configura una variable de entorno para que contenga el ID de cliente de tu cuenta de Cloud Identity o Google Workspace:
ACCOUNT_CUSTOMER_ID=CUSTOMER_ID
Reemplaza CUSTOMER_ID con el ID de cliente que buscaste antes.
Selecciona una región para realizar la implementación:
gcloud config set run/region REGION
Reemplaza REGION por una región que admita Cloud Run.
Crea un servicio de backend:
gcloud compute backend-services create jitaccess-backend \ --load-balancing-scheme=EXTERNAL \ --global
Más adelante, usarás este servicio de backend para configurar un IAP y un balanceador de cargas.
Clona el repositorio de GitHub y cambia a la rama
latest
:git clone https://github.com/GoogleCloudPlatform/jit-access.git cd jit-access/sources git checkout latest
Compila la aplicación y envía la imagen del contenedor a Container Registry:
PROJECT_ID=$(gcloud config get-value core/project) docker build -t gcr.io/$PROJECT_ID/jitaccess:latest . docker push gcr.io/$PROJECT_ID/jitaccess:latest
Crea un archivo de configuración para la aplicación Just-In-Time Access:
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format 'value(projectNumber)') REGION=$(gcloud config get-value run/region) IAP_BACKEND_SERVICE_ID=$(gcloud compute backend-services describe jitaccess-backend --global --format 'value(id)') cat << EOF > app.yaml apiVersion: serving.knative.dev/v1 kind: Service metadata: name: jitaccess namespace: $PROJECT_NUMBER labels: cloud.googleapis.com/location: $REGION annotations: run.googleapis.com/ingress: internal-and-cloud-load-balancing spec: template: spec: serviceAccountName: $SERVICE_ACCOUNT containers: - image: gcr.io/$PROJECT_ID/jitaccess:latest env: - name: RESOURCE_SCOPE value: "$SCOPE_TYPE/$SCOPE_ID" - name: RESOURCE_CATALOG value: "AssetInventory" - name: RESOURCE_CUSTOMER_ID value: "$ACCOUNT_CUSTOMER_ID" - name: ACTIVATION_TIMEOUT value: "60" - name: JUSTIFICATION_HINT value: "Bug or case number" - name: JUSTIFICATION_PATTERN value: ".*" - name: IAP_BACKEND_SERVICE_ID value: "$IAP_BACKEND_SERVICE_ID" EOF
En este archivo de configuración, puedes personalizar los valores de las variables. Para obtener una lista de opciones de configuración, consulta la página Opciones de configuración en el repositorio asociado de GitHub.
Implementa la aplicación:
gcloud run services replace app.yaml
Configura un balanceador de cargas
Ahora debes configurar un balanceador de cargas para la aplicación Just-In-Time Access.
App Engine
App Engine configura el balanceador de cargas de forma automática.
Cloud Run
Configura un balanceador de cargas HTTPS para tu servicio de Cloud Run:
Reserva una dirección IP externa estática para el balanceador de cargas.
gcloud compute addresses create jitaccess-ip --global
Crea un certificado SSL administrado para el balanceador de cargas:
gcloud compute ssl-certificates create jitaccess \ --domains PUBLIC_FQDN \ --global
En el ejemplo anterior,
PUBLIC_FQDN
es el nombre de dominio público (FQDN) completamente calificado que deseas usar, por ejemplo,jitaccess.example.com
.Busca la dirección IP del balanceador de cargas:
gcloud compute addresses describe jitaccess-ip \ --global \ --format=value\(address\)
Crea un registro
A
de DNS en tu zona DNS pública que apunte a la dirección IP del balanceador de cargas. El nombre completamente calificado del registro DNS debe coincidir con el nombre que usaste en el certificado SSL.Crea un grupo de extremos de red sin servidores para el servicio de Cloud Run y conéctalo al servicio de backend:
gcloud compute network-endpoint-groups create jitaccess \ --region $(gcloud config get-value run/region) \ --network-endpoint-type=serverless \ --cloud-run-service jitaccess gcloud compute backend-services add-backend jitaccess-backend \ --global \ --network-endpoint-group jitaccess \ --network-endpoint-group-region $(gcloud config get-value run/region)
Crea un frontend para el balanceador de cargas que use la dirección IP externa y reenvíe el tráfico al servicio de backend:
gcloud compute url-maps create jitaccess \ --default-service jitaccess-backend gcloud compute target-https-proxies create jitaccess-proxy \ --ssl-certificates jitaccess \ --url-map jitaccess gcloud compute forwarding-rules create jitaccess-https \ --load-balancing-scheme EXTERNAL \ --address jitaccess-ip \ --target-https-proxy jitaccess-proxy \ --global \ --ports=443
Configura Identity-Aware Proxy
Ahora debes configurar IAP para la aplicación de Just-In-Time Access.
En Cloud Shell, configura una pantalla de consentimiento de OAuth:
gcloud iap oauth-brands create \ --application_title "Just-In-Time Access" \ --support_email=$(gcloud config get core/account)
En la consola de Google Cloud, ve a Seguridad > Identity-Aware Proxy:
Establece IAP como habilitado.
Ahora debes definir qué usuarios pueden acceder a la aplicación Just-In-Time Access. Puedes otorgar acceso a usuarios individuales, grupos o a un dominio completo.
En la consola de Google Cloud, ve a IAM y administración >IAM.
Haz clic en Otorgar acceso y, luego, establece los siguientes valores:
- En la lista de principales, selecciona un usuario, grupo o dominio.
- En la lista de roles, selecciona Usuario de aplicación web protegida con IAP.
El rol de usuario de aplicación web protegida por IAP permite a los usuarios abrir la aplicación Just-In-Time Access, pero el rol aún no les proporciona acceso a ningún recurso adicional.
Haz clic en Guardar.
La vinculación del rol puede tomar unos minutos en aplicarse.
App Engine
Se completó la configuración de IAP.
Cloud Run
Para completar la configuración de IAP, otorga el rol Invocador de Cloud Run (roles/run.invoker
) al agente de servicio que usa IAP:
PROJECT_NUMBER=$(gcloud projects list \ --filter $(gcloud config get-value project) \ --format "value(PROJECT_NUMBER)") gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member "serviceAccount:service-$PROJECT_NUMBER@gcp-sa-iap.iam.gserviceaccount.com" \ --role "roles/run.invoker"
Prueba Just-In-Time Access
Ahora puedes probar el proceso de otorgar acceso apto y el proceso de uso de la aplicación de Just-In-Time Access para activar el acceso apto.
Otorga acceso apto
Para comenzar, otorga acceso apto a un segundo usuario de Cloud Identity o Google Workspace.
- En la consola de Google Cloud, usa la lista de proyectos para seleccionar un proyecto que forme parte de la jerarquía de recursos que administra la aplicación Just-In-Time Access.
- En la página de IAM, haz clic en Otorgar acceso.
- Ingresa la dirección de correo electrónico del segundo usuario de Cloud Identity o Google Workspace y selecciona un rol, como Proyecto > Navegador.
- Haz clic en Agregar condición:
- Ingresa un título como
Eligible for JIT access
. Selecciona Editor de condiciones y, luego, ingresa la siguiente expresión CEL:
has({}.jitAccessConstraint)
Guarde los cambios.
Activa el acceso
Ahora puedes cambiar de usuario y solicitar acceso temporal a un recurso.
- Abre una ventana de incógnito del navegador y navega a la URL de la aplicación Just-In-Time Access que anotaste antes.
- Accede con el usuario al que le otorgaste acceso apto.
- En la aplicación Just-In-Time Access, selecciona un rol y un recurso para el que deseas activar el acceso.
Ingresa una justificación, como
testing
, y haz clic en Solicitar acceso.En la página siguiente, observa que tu acceso se activó de manera temporal.
Analizar los registros
Ahora puedes volver al usuario administrativo y revisar el registro.
En la consola de Google Cloud, ve a Logging > Explorador de registros.
Configura Mostrar consulta como habilitada.
Ingrese la siguiente consulta:
labels.event="api.activateRole"
Haga clic en Run query.
El resultado es similar a este:
{ "textPayload": "User EMAIL activated role 'ROLE' on '//cloudresourcemanager.googleapis.com/projects/PROJECT_ID' for themselves", "severity": "INFO", "labels": { "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID", "event": "api.activateRole", "role": "ROLE", "clone_id": "00c6...", "user": "EMAIL", "justification": "testing", ... }, ... }
Observa que se creó un registro para cada rol que activaste. El registro incluye un conjunto de etiquetas que puedes usar para crear filtros personalizados.
Actualiza Just-In-Time Access
En esta sección, se describe cómo puedes actualizar una implementación existente de Just-In-Time Access para usar una versión más reciente de la aplicación o usar una configuración diferente.
En esta sección, se supone que eres administrador.
En la consola de Google Cloud, cambia a tu proyecto y, luego, abre Cloud Shell.
Configura una variable de entorno para que contenga tu ID del proyecto:
gcloud config set project PROJECT_ID
Reemplaza PROJECT_ID por el ID de tu proyecto.
Clona el repositorio de GitHub y cambia a la rama
latest
:git clone https://github.com/GoogleCloudPlatform/jit-access.git cd jit-access/sources git checkout latest
Descarga el archivo de configuración que usaste antes para implementar la aplicación y guárdalo en un archivo
app.yaml
:App Engine
APPENGINE_VERSION=$(gcloud app versions list --service default --hide-no-traffic --format "value(version.id)") APPENGINE_APPYAML_URL=$(gcloud app versions describe $APPENGINE_VERSION --service default --format "value(deployment.files.'app.yaml'.sourceUrl)") curl -H "Authorization: Bearer $(gcloud auth print-access-token)" $APPENGINE_APPYAML_URL -o app.yaml cat app.yaml
Si descargas el archivo
app.yaml
, puedes descargar tu configuración actual en la consola de Google Cloud.Cloud Run
gcloud config set run/region REGION gcloud run services describe jitaccess --format yaml > app.yaml
Reemplaza
REGION
por la región que contiene la implementación existente de Cloud Run.Si deseas realizar cambios en la configuración, edita el archivo
app.yaml
. Para obtener una lista de opciones de configuración, consulta la página Opciones de configuración en el repositorio asociado de GitHub.Implementa la aplicación:
App Engine
sed -i 's/java11/java17/g' app.yaml gcloud app deploy --appyaml app.yaml
Cloud Run
PROJECT_ID=$(gcloud config get-value core/project) docker build -t gcr.io/$PROJECT_ID/jitaccess:latest . docker push gcr.io/$PROJECT_ID/jitaccess:latest IMAGE=$(docker inspect --format='{{index .RepoDigests 0}}' gcr.io/$PROJECT_ID/jitaccess) sed -i "s|image:.*|image: $IMAGE|g" app.yaml gcloud run services replace app.yaml
¿Qué sigue?
- Configura la aprobación de varias partes.
- Obtén información sobre cómo puedes usar el acceso adaptado al contexto para el acceso seguro a Just-In-Time Access.
- Obtén más información sobre las condiciones de IAM.
- Configura un dominio personalizado para la aplicación Just-In-Time Access.
- Para obtener más información sobre las arquitecturas de referencia, los diagramas y las prácticas recomendadas, explora Cloud Architecture Center.