Comprensión de las cuentas de servicio
Antecedentes
Una cuenta de servicio es un tipo especial de cuenta de Google destinada a representar a un usuario no humano que necesita autenticarse y estar autorizado para acceder a los datos de las API de Google.
Típicamente, las cuentas de servicio se utilizan en situaciones como:
- Ejecutar cargas de trabajo en máquinas virtuales (VM).
- Ejecutar cargas de trabajo en estaciones de trabajo o centros de datos locales que llaman a las API de Google.
- Ejecución de cargas de trabajo que no están vinculadas al ciclo de vida de un usuario humano.
Tu aplicación asume la identidad de la cuenta de servicio para llamar a las API de Google, de modo que los usuarios no están directamente involucrados.
Gestión de cuentas de servicio
Una vez que decidas que necesitas una cuenta de servicio, puedes hacerte las siguientes preguntas para entender cómo vas a utilizar la cuenta de servicio:
- ¿A qué recursos puede acceder la cuenta de servicio?
- ¿Qué permisos necesita la cuenta de servicio?
- ¿Dónde se ejecutará el código que asume la identidad de la cuenta de servicio, en Google Cloud o en las instalaciones?
Utiliza el siguiente diagrama de flujo para averiguar las respuestas a las preguntas anteriores:
Nota que las cuentas de servicio pueden considerarse tanto una fuente como una identidad.
Cuando se piensa en la cuenta de servicio como una identidad, se puede conceder un rol a una cuenta de servicio, lo que le permite acceder a un recurso (como un proyecto).
Cuando se piensa en una cuenta de servicio como un recurso, se puede conceder roles a otros usuarios para acceder o gestionar esa cuenta de servicio.
Conceder acceso a las cuentas de servicio
Conceder acceso a una cuenta de servicio para acceder a un recurso es similar a conceder acceso a cualquier otra identidad. Por ejemplo, si tienes una aplicación que se ejecuta enCompute Engine y quieres que la aplicación sólo tenga acceso a crear objetos en Cloud Storage. Puede crear una cuenta de servicio para la aplicación y concederle el rol de Creador de objetos de almacenamiento.El siguiente diagrama ilustra este ejemplo:
Aprenda a conceder roles a todos los tipos de miembros, incluidas las cuentas de servicio.
Seguimiento de las cuentas de servicio
Con el tiempo, a medida que crea más y más cuentas de servicio, puede perder la pista de qué cuenta de servicio se utiliza para qué propósito.
El nombre para mostrar de una cuenta de servicio es una buena manera de capturar información adicional sobre la cuenta de servicio, como el propósito de la cuenta de servicio o una persona de contacto para la cuenta. Para las nuevas cuentas de servicio, puede rellenar el nombre para mostrar al crear la cuenta de servicio. Para las cuentas de servicio existentes, utilice el método serviceAccounts.update()
para modificar el nombre para mostrar.
Identificación de las cuentas de servicio no utilizadas
Las cuentas de servicio no utilizadas crean un riesgo de seguridad innecesario, por lo que recomendamos desactivar las cuentas de servicio no utilizadas y eliminarlas cuando esté seguro de que ya no las necesita. Puede utilizar los siguientes métodos para identificar las cuentas de servicio no utilizadas:
- La información sobre las cuentas de servicio le indica qué cuentas de servicio de su proyecto no se han autenticado en los últimos 90 días.
- Las métricas de uso de las cuentas de servicio le permiten comprobar cuándo se utilizó una cuenta de servicio por última vez.
Eliminación y recreación de cuentas de servicio
Es posible eliminar una cuenta de servicio y luego crear una nueva cuenta de servicio con el mismo nombre.
Cuando se elimina una cuenta de servicio, sus vínculos de rol no se eliminan inmediatamente. En su lugar, los enlaces de rol enumeran la cuenta de servicio con el prefijodeleted:
. Para ver un ejemplo, consulte Políticas con miembros eliminados.
Si crea una nueva cuenta de servicio con el mismo nombre que una cuenta de servicio eliminada recientemente, es posible que los antiguos enlaces sigan existiendo; sin embargo, no se aplicarán a la nueva cuenta de servicio aunque ambas cuentas tengan la misma dirección de correo electrónico. Este comportamiento se produce porque las cuentas de servicio reciben un ID único dentro de Identity and Access Management (IAM) en el momento de su creación. Internamente, todas las vinculaciones de funciones se otorgan utilizando estos ID, no la dirección de correo electrónico de la cuenta de servicio. Por lo tanto, las vinculaciones de roles que existían para una cuenta de servicio eliminada no se aplican a una cuenta de servicio nueva que utiliza la misma dirección de correo electrónico.
De manera similar, si adjunta una cuenta de servicio a un recurso, luego elimina la cuenta de servicio y crea una nueva cuenta de servicio con el mismo nombre, la nueva cuenta de servicio no se adjuntará al recurso.
Para evitar este comportamiento inesperado, considere el uso de un nombre nuevo y único para cada cuenta de servicio. Además, si elimina accidentalmente una cuenta de servicio, puede intentar deshacer la eliminación de la cuenta de servicio en lugar de crear una nueva cuenta de servicio.
Si no puede deshacer la eliminación de la cuenta de servicio original y necesita crear una nueva cuenta de servicio con el mismo nombre y los mismos roles, debe otorgar los roles a la nueva cuenta de servicio. Para obtener más detalles, consultePolíticas con miembros eliminados.
Si también necesita que la nueva cuenta de servicio se adjunte a los mismos recursos que la cuenta de servicio original, realice una de las siguientes acciones:
- En el caso de las instancias de Compute Engine, puede cambiar la cuenta de servicio que se adjunta a la instancia para sustituir la cuenta de servicio original por la nueva cuenta de servicio.
- Para todos los demás recursos, debe eliminar el recurso existente y, a continuación, crear un nuevo recurso del mismo tipo y adjuntar la nueva cuenta de servicio.
Permisos para las cuentas de servicio
Esta sección describe los escenarios comunes para los permisos concedidos a las cuentas de servicio, o las cuentas de usuario que tienen los permisos para suplantar las cuentas de servicio:
- Otorgamiento de permisos mínimos a cuentas de servicio
- Permisos de cuentas de servicio para escenarios comunes
Otorgamiento de permisos mínimos a cuentas de servicio
Al igual que con todos los tipos de miembros, sólo debe otorgar a la cuenta de servicio elconjunto mínimo de permisos necesarios para lograr su objetivo. Aprenda a conceder funciones a todos los tipos de miembros, incluidas las cuentas de servicio.
Cuando conceda permisos a los usuarios para acceder a una cuenta de servicio, tenga en cuenta que el usuario puede acceder a todos los recursos para los que la cuenta de servicio tiene permisos. Por lo tanto, es importante configurar los permisos de las cuentas de servicio con cuidado; es decir, ser estricto sobre quién en su equipo puede actuar como (o suplantar) una cuenta de servicio. Tenga especial cuidado cuando permita a los usuarios hacerse pasar por cuentas de servicio con muchos privilegios, como las cuentas de servicio predeterminadas de App Engine y App Engined.
Los usuarios con roles IAM para actualizar las instancias de App Engine y Compute Engine (comoApp Engine Deployer o Compute Instance Admin) pueden efectivamente ejecutar código como las cuentas de servicio utilizadas para ejecutar estas instancias, e indirectamente obtener acceso a todos los recursos para los que las cuentas de servicio tienen acceso. Del mismo modo, el acceso SSH a una instancia de Compute Engine también puede proporcionar la capacidad de ejecutar código como esa instancia.
Permisos de cuentas de servicio para escenarios comunes
Las cuentas de servicio se pueden utilizar en muchos escenarios diferentes, y cada uno de ellos requiere ciertos permisos. Esta sección describe escenarios comunes y quépermisos se requieren.
Adjuntar cuentas de servicio a los recursos
Si desea iniciar un trabajo de larga duración que se autentifica como una cuenta de servicio, necesita adjuntar una cuenta de servicio al recurso que ejecutará el trabajo.
Permisos:
- Permisos para crear el recurso
iam.serviceAccounts.actAs
Para encontrar roles que incluyan estos permisos, busca los permisos en la lista de roles.
Hay diferentes recursos de Google Cloud que pueden ejecutar trabajos de larga duración como cuentas de servicio. Algunos ejemplos de estos recursos incluyen:
- Compute Engine VMs
- App Engine apps
- Cloud Functions
Cuando creas estos recursos, tienes la opción de adjuntar una cuenta de servicio. Esta cuenta de servicio actúa como la identidad del recurso.
Para crear un recurso y adjuntar una cuenta de servicio, necesita permisos para crear ese recurso y permiso para suplantar la cuenta de servicio que adjuntará al recurso. El permiso para suplantar la cuenta de servicio lo proporciona cualquier rol que incluya el permiso iam.serviceAccounts.actAs
.
Después de crear el recurso y adjuntarle una cuenta de servicio, puede iniciar un trabajo de larga duración en el recurso. El trabajo se ejecuta como la cuenta de servicio que se adjunta al recurso y utiliza esa cuenta de servicio para autorizar las solicitudes a las API de Google Cloud.
Para obtener más información sobre cómo adjuntar cuentas de servicio a los recursos, consulteAdjuntar una cuenta de servicio a un recurso.
Suplantar directamente una cuenta de servicio
Permisos:
iam.serviceAccounts.getAccessToken
iam.serviceAccounts.signBlob
iam.serviceAccounts.signJwt
iam.serviceAccounts.implicitDelegation
Roles:
-
roles/iam.serviceAccountTokenCreator
(Creador de tokens de cuentas de servicio)
Una vez concedidos los permisos necesarios, un usuario (o servicio) puede personificar (o afirmar) directamente la identidad de una cuenta de servicio en algunos escenarios comunes.
En primer lugar, el usuario puede obtener credenciales a corto plazo para la cuenta de servicio utilizando el permisoiam.serviceAccounts.getAccessToken
y llamando al métodogenerateAccessToken()
. Usando las credenciales a corto plazo, un usuario puede emitir comandos a Google Cloud y puede acceder a todos los recursos a los que la cuenta de servicio tiene acceso. Por ejemplo, este flujo permite a un usuario utilizar la banderagcloud --impersonate-service-account
para hacerse pasar por la cuenta de servicio sin requerir el uso de una clave de cuenta de servicio externa descargada.
En segundo lugar, el usuario puede obtener artefactos firmados por la clave privada gestionada por Google de la cuenta de servicio utilizando el permiso iam.serviceAccounts.signBlob
y llamando al métodosignBlob()
osignJwt()
. La clave privada gestionada por Google siempre se mantiene en custodia y nunca se expone directamente. signBlob()
permite la firma de cargas útiles arbitrarias (como URLs firmadas por Cloud Storage), mientras que signJwt()
sólo permite la firma de JWTs bien formados.
Por último, el usuario puede suplantar (o afirmar) la cuenta de servicio sin tener que recuperar nunca una credencial para la cuenta de servicio. Este es un caso de uso avanzado, y sólo se admite para el acceso programático utilizando el métodogenerateAccessToken()
. En escenarios con al menos 3 cuentas de servicio, a saber, A, B y C: la cuenta de servicio A puede obtener un token de acceso para la cuenta de servicio C si a la cuenta de servicio A se le concede el permiso iam.serviceAccounts.implicitDelegation
sobre B, y a B se le concede el permiso iam.serviceAccounts.getAccessToken
sobre C.
Generación de tokens de ID de OpenID Connect (OIDC)
Permisos:
iam.serviceAccounts.getOpenIdToken
Roles:
-
roles/iam.serviceAccountTokenCreator
(Creador de tokens de cuenta de servicio)
Un usuario (o servicio) puede generar un token JWT compatible con OpenID Connect (OIDC) firmado por el proveedor de OIDC de Google (accounts.google.com) que representa la identidad de la cuenta del servicio que utiliza el iam.serviceAccounts.getOpenIdToken
permiso.
Estos tokens no son aceptados directamente por la mayoría de las API de Google sin que tu organización despliegue una federación de identidades adicional para conceder acceso aGoogle. Hay algunas excepciones: por ejemplo, Identity-Aware Proxy, que permite el acceso basado en OIDC a las aplicaciones ejecutadas por los usuarios.
Generación de claves privadas externas
Permisos:
iam.serviceAccountKeys.create
Roles:
-
roles/editor
(Editor) -
roles/iam.serviceAccountAdmin
(Administrador de cuentas de servicio)
Un usuario o servicio puede generar material de clave privada externa (RSA) que se puede utilizar para autenticar directamente a Google como la cuenta de servicio. Este material de clave puede utilizarse con las bibliotecas de credenciales por defecto de la aplicación (ADC) o con el comandogcloud auth activate-service-account
. Cualquier persona que obtenga acceso al material de claves tendrá entonces acceso completo a todos los recursos a los que la cuenta de servicio tenga acceso. Este tipo de material de claves privadas debe ser tratado con la mayor preocupación, y debe considerarse menos seguro cuanto más tiempo exista el material. Por lo tanto, la rotación del material de clave privada es fundamental para mantener una seguridad sólida.
Gestión de claves de cuentas de servicio
Hay dos tipos de claves de cuentas de servicio:
-
Las claves gestionadas por Google Cloud. Estas claves son utilizadas por los servicios de Google Cloudservices como App Engine y Compute Engine. No se pueden descargar y se rotan automáticamente y se utilizan para firmar durante un máximo de dos semanas. El proceso de rotación es probabilístico; el uso de la nueva clave aumentará y disminuirá gradualmente a lo largo de la vida de la clave. Se recomienda almacenar en caché el conjunto de claves públicas de una cuenta de servicio durante un máximo de 24 horas para garantizar que siempre se tenga acceso al conjunto de claves actual.
-
Claves gestionadas por el usuario. Estas claves son creadas, descargadas y gestionadas por los usuarios. Una vez que las elimine de la cuenta de servicio, no podrá utilizarlas para autenticarse.
Para las claves gestionadas por el usuario, debe asegurarse de que cuenta con procesos para abordar los requisitos de gestión de claves, como:
- Almacenamiento de claves
- Distribución de claves
- Revocación de claves
- Rotación de claves
- Proteger las claves de usuarios no autorizados
- Recuperación de claves
Cualquiera que tenga acceso a una clave privada válida para una cuenta de servicio podrá acceder a los recursos a través de la cuenta de servicio. Tenga en cuenta que el ciclo de vida del acceso de la clave a la cuenta de servicio (y, por tanto, los datos a los que la cuenta de servicio tiene acceso) es independiente del ciclo de vida del usuario que ha descargado la clave.
Desaconseje siempre a los desarrolladores que comprueben las claves en el código fuente o que las dejen en el directorio de descargas de su estación de trabajo.
Para mejorar la seguridad de las claves, siga la siguiente orientación:
-
Use la API de cuentas de servicio de IAM para rotar automáticamente las claves de sus cuentas de servicio. Puedes rotar una clave creando una nueva clave, cambiando las aplicaciones para que usen la nueva clave y luego eliminando la clave antigua. Utilice los métodos
serviceAccount.keys.create()
yserviceAccount.keys.delete()
juntos para automatizar la rotación. Las claves gestionadas por Google Cloud se rotan aproximadamente una vez a la semana.- Utilice el método
serviceAccount.keys.list()
para auditar las cuentas de servicio y las claves.
- Utilice el método
Uso de cuentas de servicio con Compute Engine
Las instancias de Compute Engine deben ejecutarse como cuentas de servicio para tener acceso a otros recursos de Google Cloud. Para asegurarse de que sus instancias de Compute Engine sean más seguras, tenga en cuenta lo siguiente:
-
Puede crear máquinas virtuales en el mismo proyecto con diferentes cuentas de servicio. Para cambiar la cuenta de servicio de una VM después de su creación, utilice el método
instances.setServiceAccount
. -
Puede otorgar roles IAM a las cuentas de servicio para definir a qué pueden acceder. En muchos casos no necesitarás depender más de los scopes. Esto le da la ventaja de poder modificar los permisos de la cuenta de servicio de unaVM sin tener que volver a crear la instancia.
-
Dado que las instancias dependen de sus cuentas de servicio para tener acceso a los recursos deGoogle Cloud, evite eliminar las cuentas de servicio cuando todavía sean utilizadas por las instancias en ejecución. Si elimina las cuentas de servicio, lasinstancias pueden empezar a fallar en sus operaciones.
Mejores prácticas
-
Especifique quiénes pueden actuar como cuentas de servicio. Los usuarios que sonService Account Userspara una cuenta de servicio pueden acceder indirectamente a todos los recursos a los que la cuenta de servicio tiene acceso. Por lo tanto, tenga cuidado al conceder el rol de usuario de cuenta de servicio a un usuario.
-
Conceda a la cuenta de servicio sólo el conjunto mínimo de permisos necesarios para alcanzar su objetivo. Aprenda a otorgar roles a todos los tipos de miembros, incluidas las cuentas de servicio.
-
Cree cuentas de servicio para cada servicio con sólo los permisos necesarios para ese servicio.
-
Use el nombre para mostrar de una cuenta de servicio para realizar un seguimiento de las cuentas de servicio. Cuando cree una cuenta de servicio, rellene su nombre para mostrar con el propósito de la cuenta de servicio.
-
Defina una convención de nomenclatura para sus cuentas de servicio.
-
Implemente procesos para automatizar la rotación de las claves de las cuentas de servicio gestionadas por el usuario.
-
Aproveche la API de cuentas de servicio de IAM para implementar la rotación de claves.
-
Audite las cuentas de servicio y las claves utilizando el método
serviceAccount.keys.list()
o la página Visor de registros de la consola. -
No elimine las cuentas de servicio que están en uso por instancias en ejecución enApp Engine o Compute Engine a menos que desee que esas aplicaciones pierdan el acceso a la cuenta de servicio.
Pruébalo tú mismo
Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los nuevos clientes también obtienen 300 dólares en créditos gratuitos para ejecutar, probar e implementar cargas de trabajo.
Empieza gratis