Overview
En esta guía, puedes aprender cómo realizar la autenticación en MongoDB usando los mecanismos de autenticación disponibles en la MongoDB Enterprise Edition. Los mecanismos de autenticación son procesos mediante los cuales el driver y el servidor confirman la identidad de un cliente para garantizar la seguridad antes de conectarse.
Puedes usar los siguientes mecanismos de autenticación con la versión más reciente de MongoDB Enterprise Edition:
Para autenticar con otro mecanismo, consulte la Página de fundamentos de Mecanismos de Autenticación. Para aprender más sobre cómo establecer una conexión con tu clúster de MongoDB, consulta la Guía de conexión.
Puedes especificar tu mecanismo de autenticación y credenciales al conectarte a MongoDB a través de los siguientes métodos:
Usando una URI de cadena de conexión. Para obtener más información sobre el uso de una URI de cadena de conexión para la autenticación de empresa, consulte la entrada del manual del servidor sobre URIs de cadena de conexión.
Especificar credenciales y un mecanismo de autenticación en el
Credentialtipo.
Autenticarse en GSSAPI/Kerberos
El mecanismo de autenticación de la API de Servicios de Seguridad Genéricos (GSSAPI) permite al usuario autenticarse en un servicio Kerberos utilizando el principal del usuario.
Debe utilizar la gssapi etiqueta de compilación y especificar soporte cgo durante la compilación para usar la autenticación Kerberos. El soporte para cgo está habilitado por defecto a menos que hayas configurado previamente variables de entorno para realizar la compilación cruzada a una plataforma diferente. Para usar la etiqueta de compilación gssapi, compila tu código con el siguiente comando:
go build -tags gssapi
Ejemplo
Este ejemplo especifica el mecanismo de autenticación utilizando los siguientes marcadores de posición:
Kerberos principal: Tu principal de Kerberos. Un nombre de usuario de muestra esmyuser@KERBEROS.EXAMPLE.COM.password: La contraseña del usuario Kerberos. También se puede almacenar la contraseña en un archivokeytabpara evitar exponerla en el código.connection uri: Su URI de cadena de conexión.
El siguiente código muestra cómo puedes definir una estructura Credential para autenticarte en Kerberos y crear un cliente con tus preferencias de autenticación:
credential := options.Credential{ AuthMechanism: "GSSAPI", Username: "<Kerberos principal>", Password: "<password>", PasswordSet: true, } uri := "<connection uri>" clientOpts := options.Client().ApplyURI(uri).SetAuth(credential) client, err := mongo.Connect(context.TODO(), clientOpts)
No necesitas definir una contraseña o el campo PasswordSet en tu estructura de Credential si almacenas claves de autenticación en archivos keytab. Puedes inicializar una caché de credenciales para autenticar el principal de Kerberos utilizando el binario kinit. Para obtener más información sobre el binario kinit, consulta la documentación de Oracle.
El siguiente comando muestra cómo se puede invocar una caché de credenciales para un nombre de usuario de ejemplo:
kinit myuser@KERBEROS.EXAMPLE.COM
También puede autenticarse utilizando un URI de cadena de conexión, especificando su URL codificado Kerberos principal, la contraseña y hostname, la dirección de red del servidor MongoDB:
uri := "mongodb://<Kerberos principal>:<password>@<hostname>/?authMechanism=GSSAPI"
Configura campos personalizados SERVICE_NAME y SERVICE_REALM
Puedes especificar propiedades adicionales para tu mecanismo de autenticación usando el campo AuthMechanismProperties en la estructura Credential. El nombre de servicio por defecto para Kerberos es "mongodb". El siguiente código muestra cómo puedes establecer valores personalizados para los campos SERVICE_NAME y SERVICE_REALM al definir una estructura Credential:
credential := options.Credential{ AuthMechanism: "GSSAPI", Username: "<Kerberos principal>", Password: "<password>", AuthMechanismProperties: map[string]string{ "SERVICE_REALM": "<Kerberos service realm>", "SERVICE_NAME": "<service name>", }, }
Para obtener propiedades adicionales, consulta la entrada del manual del servidor sobre propiedades de autenticación.
Autentíquese en LDAP (PLAIN)
Puedes autenticarte en un servidor LDAP (Protocolo Ligero de Acceso a Directorios) utilizando tu nombre de usuario y contraseña del servidor de directorios.
Advertencia
Este mecanismo de autenticación envía la contraseña al servidor en texto claro, por lo que solo debes utilizar este mecanismo con conexiones TLS.
Ejemplo
Este ejemplo especifica el mecanismo de autenticación utilizando los siguientes marcadores de posición:
LDAP username: Tu nombre de usuario LDAPpassword: Tu contraseña LDAPconnection uriUri de tu cadena de conexión
El siguiente código muestra cómo se puede definir una estructura Credential para autenticarse en LDAP y crear un cliente con sus preferencias de autenticación:
credential := options.Credential{ AuthMechanism: "PLAIN", Username: "<LDAP username>", Password: "<password>", } uri := "<connection uri>" clientOpts := options.Client().ApplyURI(uri).SetAuth(credential) client, err := mongo.Connect(context.TODO(), clientOpts)
Como alternativa, puede autenticarse usando un URI de cadena de conexión, especificando su nombre de usuario LDAP, contraseña y hostname, la dirección de red de su servidor MongoDB:
uri := "mongodb://<LDAP username>:<password>@<hostname>/?authMechanism=PLAIN"
Nota
El método se refiere a PLAIN en lugar de LDAP ya que se autentica utilizando el capa simple de autenticación y seguridad PLAIN (SASL, por sus siglas en inglés) definida en RFC-4616.
MONGODB-OIDC
Importante
El mecanismo de autenticación MONGODB-OIDC requiere MongoDB Server v7.0 o posterior funcionando en una plataforma Linux.
El driver Go soporta la autenticación OpenID Connect (OIDC) para identidades de cargas de trabajo. Una identidad de carga de trabajo es una identidad que asignas a una carga de trabajo de software, como una aplicación, servicio, script o contenedor, para autenticar y acceder a otros servicios y recursos.
Las siguientes secciones describen cómo utilizar el mecanismo de autenticación MONGODB-OIDC para autenticar diferentes plataformas.
Para obtener más información sobre el mecanismo de autenticación MONGODB-OIDC, consulte Autenticación OpenID Connect y Parámetros del servidor MongoDB en el manual del MongoDB Server.
Azure IMDS
Si tu aplicación se ejecuta en una VM de Azure, o utiliza Azure Instancia Metadatos Service (IMDS) de otro modo, puedes autenticarte en MongoDB utilizando la funcionalidad incorporada con Azure del driver de Go.
Puedes configurar OIDC para Azure IMDS de las siguientes maneras:
Creando una estructura
Credentialy pasándola al métodoSetAuth()al crear un clienteEstableciendo parámetros en su cadena de conexión
Nota
Si los valores de los campos de la estructura AuthMechanismProperties incluyen una coma, debes crear una instancia de Credential para establecer tus opciones de autenticación.
Primero, crea un mapa para almacenar las propiedades de tu mecanismo de autenticación, tal como se muestra en el siguiente ejemplo. Reemplaza el marcador de posición <audience> con el valor del parámetro audience configurado en tu implementación de MongoDB.
props := map[string]string{ "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>", }
Luego, configure los siguientes campos de la estructura Credential:
Username: Si está utilizando una identidad administrada de Azure, configure esto con el ID de cliente de la identidad administrada.AuthMechanism: Establecer en"MONGODB-OIDC".AuthMechanismProperties: Se establece en el mapapropsque creaste anteriormente.
El siguiente ejemplo de código muestra cómo establecer estas opciones al crear un Client:
uri := "mongodb://<hostname>:<port>" props := map[string]string{ "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>", } opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ Username: "<Azure client ID or application ID>", AuthMechanism: "MONGODB-OIDC", AuthMechanismProperties: props, }, ) client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) }
Incluya las siguientes opciones de conexión en su cadena de conexión:
username: Si está utilizando una identidad administrada de Azure, configure esto con el ID de cliente de la identidad administrada.authMechanism: Establecer enMONGODB-OIDC.authMechanismProperties: Configurar enENVIRONMENT:azure,TOKEN_RESOURCE:<audience>. Reemplace el marcador de posición<audience>con el valor del parámetroaudienceconfigurado en su implementación de MongoDB.
El siguiente ejemplo de código muestra cómo configurar estas opciones en su cadena de conexión:
uri := "mongodb://<hostname>:<port>/?" + "username=<Azure client ID or application ID>" + "&authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>" client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) if err != nil { panic(err) }
Tip
Si su aplicación se está ejecutando en una VM de Azure y sólo una identidad administrada está asociada a la VM, puede omitir la opción de conexión username.
GCP IMDS
Si su aplicación se ejecuta en una VM de Google Compute Engine, o utiliza el Servicio de metadatos de instancia de GCP, puede autenticarse a MongoDB utilizando el soporte de funcionalidad incorporada de GCP del driver Go.
Puedes configurar OIDC para GCP IMDS de las siguientes formas:
Creando una estructura
Credentialy pasándola al métodoSetAuth()al crear un clienteEstableciendo parámetros en su cadena de conexión
Nota
Si los valores de los campos de la estructura AuthMechanismProperties incluyen una coma, debes crear una instancia de Credential para establecer tus opciones de autenticación.
Primero, crea un mapa para almacenar las propiedades de tu mecanismo de autenticación, tal como se muestra en el siguiente ejemplo. Reemplaza el marcador de posición <audience> con el valor del parámetro audience configurado en tu implementación de MongoDB.
props := map[string]string{ "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>", }
Luego, configure los siguientes campos de la estructura Credential:
AuthMechanism: Establecer en"MONGODB-OIDC".AuthMechanismProperties: Se establece en el mapapropsque creaste anteriormente.
El siguiente ejemplo de código muestra cómo establecer estas opciones al crear un Client:
uri := "mongodb://<hostname>:<port>" props := map[string]string{ "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>", } opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", AuthMechanismProperties: props, }, ) client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) }
Incluya las siguientes opciones de conexión en su cadena de conexión:
authMechanism: Establecer enMONGODB-OIDC.authMechanismProperties: Configurar enENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>. Reemplace el marcador de posición<audience>con el valor del parámetroaudienceconfigurado en su implementación de MongoDB.
El siguiente ejemplo de código muestra cómo configurar estas opciones en su cadena de conexión:
uri := "mongodb://<hostname>:<port>/?" + "&authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>" client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) if err != nil { panic(err) }
Función de retorno personalizado
El driver de Go no ofrece soporte de funcionalidad incorporada para todas las plataformas, incluido el Servicio de Kubernetes Elástico (EKS) de AWS. Para autenticarse en plataformas no compatibles, debe definir una función de retorno personalizada para usar OIDC para la autenticación. En el driver, puedes definir una función options.OIDCCallback y establecerla como el valor del campo struct OIDCMachineCallback en tu struct Credential.
El siguiente ejemplo define una función de retorno personalizada para un clúster de EKS con un proveedor OIDC de IAM configurado. El token de acceso se lee desde una ruta establecida en la variable de entorno AWS_WEB_IDENTITY_TOKEN_FILE:
eksCallback := func(_ context.Context, _ *options.OIDCArgs) (*options.OIDCCredential, error) { accessToken, err := os.ReadFile( os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")) if err != nil { return nil, err } return &options.OIDCCredential{ AccessToken: string(accessToken), }, nil }
Luego, puedes crear una estructura Credential que use la función de retorno de EKS que definiste:
uri := "mongodb://<hostname>:<port>" opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", OIDCMachineCallback: eksCallback, }, ) client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) }
Otros entornos de Azure
Si tu aplicación se ejecuta en Azure Functions, App Service Environment (ASE) o Azure Kubernetes Service (AKS), puedes usar el módulo azidentity para obtener credenciales de autenticación.
Primero, instala el módulo azidentity ejecutando el siguiente comando:
go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
Su función OIDCCallback debe retornar una instancia OIDCCredential que use el AccessToken generado a partir del paquete azidentity. Consulte la sección anterior de función de retorno personalizada para ver un ejemplo que implementa una función de retorno personalizada para recuperar un token de acceso y luego crear un Credential.
GCP GKE
Si tu aplicación se ejecuta en un clúster de GCP Google Kubernetes Engine (GKE) con una cuenta de servicio configurada, puedes leer el token de OIDC desde la ubicación estándar del archivo de token de la cuenta de servicio.
En primer lugar, define la función OIDCCallback. Esta función lee el token OIDC y devuelve una instancia de OIDCCredential.
El siguiente ejemplo define una función de retorno llamada gkeCallback. La función recupera un token OIDC de un archivo en la ubicación estándar del archivo de token de la cuenta de servicio:
gkeCallback := func(_ context.Context, _ *options.OIDCArgs) (*options.OIDCCredential, error) { accessToken, err := os.ReadFile( "/var/run/secrets/kubernetes.io/serviceaccount/token") if err != nil { return nil, err } return &options.OIDCCredential{ AccessToken: string(accessToken), }, nil }
Luego, puedes crear un Credential struct que utilice la función de retorno de GKE que has definido:
uri := "mongodb://<hostname>:<port>" opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", OIDCMachineCallback: gkeCallback, }, ) client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) }
Información Adicional
Para aprender más sobre los conceptos de esta guía, consulte la siguiente documentación:
Documentación de la API
credenciales type
Método SetAuth()
Tipo OIDCCredential
Función OIDCCallback