Cómo Configurar Login con Office 365 (Microsoft Entra ID) en Authentik

Como ya vimos en la anterior entrada es bastante sencillo instalar un sistema SSO como authentik en nuestra infraestructura. De todas formas, crear un login centralizado no es más que una manera de tener que recordar menos contraseñas, pero el objetivo final es no tener que recordar más que unas pocas para poder acceder a todos los servicios, ¿qué hacemos si ya tenemos cuenta en alguno de los servicios más populares como office 365 o google? Lo suyo sería poder hacer login con estas credenciales en cualquier servicio, sea online o sea auto hospedado. Por suerte, authentik puede hacer uso de estos servicios externos de autenticación de manera «relativamente» sencilla. En este post os voy a explicar paso a paso (que sobre todo la parte a realizar con office es un poco liosa) cómo integrar el login de office 365 con authentik y así poder usarlo para acceder a nuestras aplicaciones (eso ya lo explicaremos en próximos posts).

Para poder realizar este tutorial debes tener:

  • Servidor authentik instalado y configurado (con acceso como administrador)
  • Cuenta de administrador office365 de tu organización
  • Un poco de paciencia (esto nunca viene mal)

Paso 1: registrar una aplicación de microsoft entra

Entramos como administrador en portal.office.com

Pedimos que nos muestre todas las opciones (estos de MS suelen ocultarnos cosas)

Seleccionamos la opción Identidad (nos llevará a entra)

Seleccionamos la opción Registro de aplicaciones

Y seleccionamos Nuevo registro

Y rellenamos los datos básicos (yo voy a llamar authentik a la nueva aplicación)

Hemos elegido que solo se pueda entrar con cuentas de nuestra organización, que será lo normal, aunque si queremos que cualquiera que tenga una cuenta de office365 pueda hacer logn tendremos que escoger una de las otras opciones. Atento a la ui de redirección, en principio tendrá el formato https://<direccion-de-tu-authentik>/source/oauth/callback/<nombre-de-fuente> Si no lo configuras ahora lo podrás hacer después cuando termines la configuración en authentik.

Anotamos los datos que vamos a necesitar de la aplicación y creamos un nuevo secreto:

Es muy importante que copiemos el valor del secreto que lo vamos a necesitar luego

El valor del secreto no se va a poder copiar en otro momento, mejor que lo guardes ahora.

Con esto hemos terminado (en principio) con la configuración necesaria en el portal de office. Lo que hemos hecho, básicamente, es configurar los endpoints de oauth2 que podemos consultar en la opción.

Paso 2: crear un nuevo login social

Las siguientes acciones las haremos como administrador en nuestro servidor authentik

El primer paso es crear un inicio de sesión federado

del tipo azure AD

Ahora deberemos introducir todos los datos que hemos guardado al crear la aplicación en entra:

Los endpoint serán como estos (revisar los que vimos en la pantalla del portal de office):

Cambiaremos la URL del perfil a https://graph.microsoft.com/oidc/userinfo

Y damos a terminar por ahora. Esto nos configura el método para entrar usando las credenciales de Microsoft, pero todavía nos falta un par de cosas para que sea útil del todo.

Paso 3: mapeo de atributos

Ahora necesitamos hacer la equivalencia entre los atributos que vienen de office con los que nosotros vamos a utilizar en nuestro directorio, para eso crearemos una política de expresión:

La llamamos (por ejemplo) azure-ad-mapping y ponemos este contenido:

# save existing prompt data
current_prompt_data = context.get('prompt_data', {})
# make sure we are used in an oauth flow
if 'oauth_userinfo' not in context:
  ak_logger.warning(f"Missing expected oauth_userinfo in context. Context{context}")
  return False
oauth_data = context['oauth_userinfo']
# map fields directly to user left hand are the field names provided by
# the microsoft graph api on the right the user field names as used by authentik
required_fields_map = {
  'name': 'username',
  'email': 'email',
  'given_name': 'name'
}
missing_fields = set(required_fields_map.keys()) - set(oauth_data.keys())
if missing_fields:
  ak_logger.warning(f"Missing expected fields. Missing fields {missing_fields}.")
  return False
for oauth_field, user_field in required_fields_map.items():
  current_prompt_data[user_field] = oauth_data[oauth_field]
# Define fields that should be mapped as extra user attributes
attributes_map = {
  'name': 'upn',
  'sub': 'sn',
  'name': 'name'
}
missing_attributes = set(attributes_map.keys()) - set(oauth_data.keys())
if missing_attributes:
  ak_logger.warning(f"Missing attributes: {missing_attributes}.")
  return False
# again make sure not to overwrite existing data
current_attributes = current_prompt_data.get('attributes', {})
for oauth_field, user_field in attributes_map.items():
  current_attributes[user_field] = oauth_data[oauth_field]
current_prompt_data['attributes'] = current_attributes
context['prompt_data'] = current_prompt_data
return True

Paso 4: configurar el flujo de alistamiento

Queremos que cualquiera que tenga cuenta en el dominio office pueda entrar a nuestras aplicaciones, por lo que necesitamos registrar los usuarios nuevos cuando entran por primera vez, para ello vamos a crear uun flujo nuevo.

Le ponemos un nombre

Y una vez creado, editarlo, ir a la sección d Vinculaciones de Políticas / Grupos / Usuarios y ahí a Bind existing policy

Y ahí ligar defaultsource-enrollment-if-sso

Ir ahora a vinculos de etapa -> Bind Existing stage

Añadir default-source-enrollment-write (orden 0) y default-source-enrollment-login (orden 10)

Desplegar luego la etapa con orden cero y añadir una política existente azur-ad-mapping que creamos antes:

Por último editarmos la fuente que creamos al principio (Directory -> Federation ..) y le añadimos en la configuración de flujo el flujo de inscrpción a azure-ad-enrollment (o el nombre que le hayamos puesto)

Paso 5: hacer que se vea en el login

Pues ya solo nos faltaría hacer que aparezca una opción para hacer login con este proveedor, esto se hace editando el flujo default-authentication-flow

Y editas la etapa

Y añades desde las fuentes disponibles a Fuentes seleccionadas

Ahora cuando entres en tu authentik ya te aparecerá la opción nueva para acceder. La primera vez que accedas debes aprobar unos permisos especiales a Microsoft:

Ha sido un proceso un poco largo, pero ahora ya tenéis centralizada la información de seguridad y cualquier aplicación que pueda conectarse a authentik podrá usar los usuarios de nuestro dominio… Ahora queda que lo probéis vosotros.

Monta una conexión de respaldo en opnsense

Esta semana pasada he sufrido la experiencia traumática de tener que mudarme de oficina… El casero ha dicho que no renueva el contrato y no me ha quedado más remedio que mudarme (con 14 años de trastos a mis espaldas) a otra oficina diferente… Y, aunque no soy muy tiquismiquis hay una cosa que siempre necesito… Internet.

Tengo contratado masmovil desde hace muchos años, 1Gb de fibra y una IP fija, cosas que me vienen muy bien para el tipo de cosas que tengo que hacer, y quiero seguir manteniendo estas cosas (y el número de teléfono que viene asociado a la conexión), así que indiqué a Masmovil el día del traslado y me confirmaron que ese mismo día pasaría por la nueva oficina un instalador a realizar el paso de mi conexión a esa nueva oficina.

Ahora bien, resulta que la dirección estaba mal registrada o que habían separado en oficinas lo que antes era solo un edificio o que-se-yo, el caso es que solo daba servicio movistar y el primer instalador me dijo que solicitaban el cambio y que ya me avisarían cuando estuviese la cosa. Al día siguiente me vino otro instalador que me dejó todo correctamente instalado perjurando que el instalador anterior podía haberlo hecho el otro día sin problemas (en fin…) al cabo de unos minutos ya tenía otra vez mi IP fija y mi casi-1g con los que he estado funcionando hasta ayer.

Ayer los vecinos llamaron a su instalador de movistar porque no tenían conexión y resulta que lo que pasaba es que ellos estaban (vete tu a saber porqué) enchufados a la roseta que estaba en mi oficina y, claro, al cambiarla yo el cable que iba a su router ya no estaba conectado (ni la conexión activa)… El caso es que el instalador se encabronó con el tema de tener que tirar ellos el cable otra vez (ya me dirás qué tendrían que hacer si no había fibra que llegase a esa oficina) y no se lo que hizo que me dejó a mi sin conexión (y estoy seguro que algo podría haber hecho para mantenerla). El caso es que llevo desde ayer a medio día sin conexión a internet. Puse la incidencia, me dijeron que era cosa de fuera y que ya lo arreglarían (hace más de 28 horas de eso)… Y como yo tengo que trabajar pues no me ha quedado más remedio que usar un router 4G que tenía por aquí y contratar una SIM con gigas para poder tener algo de internet mientras tanto.

Como la wifi solo la puedo usar desde móviles y portátiles y yo quería usar mi torre (y tener conectividad en general) me puse a ver si era sencillo poner esa conexión como fallback en el router opnsense que monté con un ordenador chino (bastante bueno y con dos puertos SFP+ que me permiten llegar a 10Gb)… Y si, después de penar un poco (porque hay cosas que no están bien pulidas del todo) conseguí hacerlo funcionar. Estos son los pasos que di:

1.- Enchufar el router 4G a la salida ethernet que tenía libre mi ordenador-router (os pongo la foto de uno parecido)

En eth0 estaba el router de masmovil configurando este como DMZ para poder recibir el tráfico entrante y en eth1 la nueva conexión.

En SPF0 tenía conectado el router del resto de mi red.

2.- En opnsense doy de alta el interfaz nuevo (en este caso por dhcp)

3.- En System > gateways > configuration creo un gateway nuevo, le digo que active la monitorización del gateway y le pongo la IP de un servidor dns fiable (como 8.8.4.4) y le pongo como IP la IP del router 4G (192.168.0.1 en mi caso).

4.- El gateway existente lo modifico para habilitar el monitoreo y añado como IP la 8.8.8.8 (puede ser cualquiera mientras sea diferente de la anterior)

5.- En system > settings > general añado estos dos DNS como DNS Servers y les asocio a cada uno el gateway correspondiente y activo la opción «Allow default gateway switching»

6.- En System > gateway > group creo un grupo nuevo, le pongo un nombre y hago que el interfaz de la WAN principal sea Tier1 y de la secundaria Tier2, ponemos Trigger Level a «Packet Loss or high latency» y una descripción adecuada (yo también puse Pool Options a Round Robin, pero eso no es tan importante)

7.- En Firewall > rules > LAN (o como llaméis a vuestro interfaz de red local) modificamos la configuración de la regla genérica que permite todo para indicar que el gateway será el nuevo grupo que acabamos de crear

8.- Por último, y esto lo he descubierto después de mucho tiempo, la generación automática de reglas NAT > Outbound no es perfecta y tuve que añadir una regla para que permitiese todo el tráfico desde la WAN2 indicando que su dirección de NAT sería la de WAN2

Y, en principio, esto es todo… Haced vuestras pruebas de ping, mtr y demás y veréis que cuando está caída la conexión principal saldréis a internet por la secundaria… Espero que masmovil me lo arregle pronto que los GB de la tarjeta sim ya se me están gastando. Grrr.

Banco Sabadell ¿Empresas?

Día 17 de noviembre, una carta llega a mi buzón, en ella el Banco Sabadell me indica que tiene la obligación legal de comprobar que mi empresa justifique su actividad profesional y su capacidad económica. Le acompaña una lista de documentos que, a su parecer, justificaría estos aspectos… Al final pone un párrafo interesante:

La documentación podrá ser remitida a través de la web del Banco Sabadell, desde su área de cliente de banca digital. Acceda a la web de Banco Sabadell con su usuario y contraseña, desde su ordenador personal. Pulse sobre su nombre, el enlace está en la sección Perfil>Documentación digital>Documentos compartidos

Bueno, pues uno que es obediente hace lo que le dicen.

Nada, no hay forma de subir ningún documento allí… En fin, qué se puede esperar de un banco en el que no funcionan las transferencias desde el navegador porque «patata» y tienes que usar la versión vieja que si que funciona… Venga, llamemos a ver que me dicen al teléfono que acompaña la notificación.

Primera llamada: selecciona una opción (ninguna adecuada), me pasan con un operador, me pregunta mis datos, le cuento el problema… le paso

Segundo operador: le paso con un robot para que meta la contraseña… ¡como si darle la contraseña a un robot fuese más seguro…! Fallo1, acierto al 2… Le vuelvo a comentar el problema… le paso

Tercer operador: ¿me oye?¿me oye? deben tener algún problema con los auriculares o algo… Obviamente, ya con la paciencia mermada, me piden de nuevo que les cuente lo que me pasa (ya soy un experto resumidor…) y, oh sorpresa! me dice que esa operación la tengo que hacer desde la web de particulares… what!?

Pero es que esto es una cuenta de empresa, la notificación viene a nombre de la empresa y yo no tengo cuenta particular en el Sabadell… Respuesta: a mamarla… Que te pases por una oficina y pierdas media mañana para darles unos papeles (que solo tengo en digital) ¿qué les doy un usb? ¿grabo un dvd? ¿lo imprimo todo para que luego ellos lo escaneen de nuevo? Pero que coj****

A ver, que ya sabéis que a mi los bancos me caen mal TODOS, pero es que un banco de este tamaño no tenga una forma «buena» de que las empresas puedan subir documentos que según ellos son obligatorios pues, bueno, como poco produce estupor y vergüenza a partes iguales. ¿También le piden a Juan Roig que se abra una cuenta personal para subir papeles de Mercadona? ¿Se lo piden a quien sea el administrador de la empresa?… Bueno, supongo que a esos ya les visitarán en persona o les permitirán que se lo manden por mail, que la pela es la pela.

Volveremos a hablar de esto cuando me bloqueen la cuenta por no aportar los papeles, grrrrrrr.

Ser empresario también es tener que tratar con malnacidos

Como se diría en twitter, acompañemé a conocer esta triste historia…

Luis Carballo Rua con nuestro portatil

Llevo 19 años siendo empresario y he contratado unas cuantas decenas de personas. Antes era más sencillo dar con alguien competente, pero ahora con tanto bootcam y con tanto FP con esteroides es más complicado saber si un trabajador sabe lo que dice que sabe o no. Antes tener un título significaba un mínimo, ahora tienes que bucear para encontrar si la persona en cuestión sabe lo que es el http o le han dicho que eso es magia de Angular. En fin, que se te pueden colar inútiles sin comerlo ni beberlo.

Uno de esos casos me pasó recientemente, una persona respondió a un anuncio de trabajo que pusimos en LinkedIn. La plaza que pedíamos de desarrollador front la terminamos ocupando con otra persona, pero me pareció interesante el cv que nos pasó, lleno de dibujos hechos por él mismo.

El caso es que en la siguiente plaza para full stack se volvió a presentar, decidimos entrevistarle y, quitando que hablaba muy deprisa, nos dijo que si a todo lo que le preguntamos, no parecía perdido en ningún área de los que preguntamos y su CV era molón, así que le hicimos una oferta a los dos días… Oferta que rechazó porque dijo que ya estaba trabajando en otra empresa que le llamó después de nosotros… En fin, cosas que pasan, a seguir entrevistando.

Esta vez el proceso se hizo un poco más largo y a eso de las dos semanas me contacta de nuevo diciendo que las condiciones de la nueva empresa no le interesan y que si le mantengo la oferta. Yo, que soy un hombre de palabra, le digo que le mantengo exactamente la misma oferta que le hice… Y, dicho y hecho, le preparamos el contrato y quedamos ya para que empiece a trabajar en remoto, básicamente, aunque esperábamos que al menos el primer día se quedase en la oficina para que le explicásemos las cosas.

Primer día: quedamos a las 9:30 porque yo tenía reuniones antes… Espero, se hacen las 10, las 11.., le mando un whatsapp, no me contesta, a las 12 ya le llamo por teléfono y me dice que está en Alcorcón, pero llevando su madre al médico, que luego se pasa por aquí (no me parece lo mejor para el primer día y, además, sin avisar), en fin, que a las 13 se pasa por la oficina, firma el contrato, le enseño a entrar en el portatil y en su cuenta de correo; y… Se va. ¡¡!! Que si, que es un trabajo remoto, pero leche, no solo llegas 4 horas tarde sino que ni siquiera te quedas a que te expliquemos nuestra forma de trabajar…

La primera semana de trabajo se perdió intentando que arrancase solo en ubuntu el portatil y que no usase windows (windows=kk), le compramos hasta una docking station para que pudiese enchufar sus dos monitores (y se lo tuvimos que mandar a casa, que él pasar por l oficina ya le daba pereza), la segunda semana ya empieza a hacer algo productivo pero sin hacer puto caso de lo que le decimos. Nos llena el código de librerías que luego tenemos que borrar y nos quita más tiempo del que ahorramos. En la cuarta semana le ponemos a hacer algo para despliegue inmediato (tampoco era muy complicado, pero dediqué yo más horas que él) y nos dice que se va a vivir a la costa que, total, es remoto y no nos vamos a enterar… Y el pavo se va de mudanza el mismo día que pasamos a producción grrrrr. Obviamente la cosa peta y tengo que arreglarlo yo solo.

Lo primero que hace nada más llegar a su destino es pedirme un anticipo (estábamos a día 7 de mes), cosa que me extraña pero que procedemos a hacer sin ningún problema. A partir de ese momento su rendimiento fue cero. La lista de problemas (en orden cronológico):

  • Que el proveedor de internet que tenía no le permitía usar el puerto del ssh y no podía subir nada al servidor
  • Que los que han venido a repararlo no tenían idea y ha terminado tirando el router por la ventana
  • Que me he quedado dormido (excusa para no aparecer por el daily) y el movil estaba descargado
  • Que se me acaban los datos del móvil
  • Que me van a poner la fibra (ese día desapareció tras el daily y apareció después de haber terminado la jornada diciendo que se había dejado el movil en casa mientras le instalaban la fibra)
  • Que me he cargado el móvil (caída fortuita al suelo, dice)
  • Que sigue sin fibra y tiene que hacer el daily desde un bar
  • Que el del bar ha abierto más tarde hoy y no he podido hacer el daily

Y mientras el trabajo que tenía asignado ahí pudriéndose y teniendo que hacerlo entre sus compañeros y yo…

Llegados a este punto decido que es suficiente y que, obviamente, no ha superado el periodo de prueba. Se lo comunico y le indico que empaquete el portatil, la mochila y la docking station y que alguien pasará a recogerla.

Y ahora salta la sorpresa en las gaunas… Esta persona decide que va a quedarse con el material de la empresa, material que vale más que lo que él ha generado para la empresa. Esto no solo está tipificado como una apropiación indebida sino que dado el valor de lo apropiado puede ponerle en un grave aprieto. Mi empresa, como no puede ser de otra manera, le ha pagado finiquito y liquidación (muchas tentaciones de quedarnos con ese dinero en compensación, pero mi abogado me recomendó pagarlo de todas formas) y este desalmado malnacido no ha dado señales de vida.

Ya es duro mantener y gestionar una empresa como para tener que lidiar con gentuza de esta calaña. No solo ha perjudicado a sus compañeros sino que te deja una mala leche que terminas pagando con el primero que pasa… En fin, solo espero que el karma haga su trabajo. Si alguien quiere contratar a un full-stack developer, que me pregunte a quien no contratar nunca.

Saber estar… O cómo los comerciales tienen que tolerar el fracaso

Me acaba de entrar una llamada al teléfono de la empresa, es un comercial de una consultora energética cabreado como una mona porque he aceptado la contra-oferta de Iberdrola cuando ya había firmado con otro proveedor que él trabajaba anteriormente.

Me ha hecho gracia, la verdad, ver que hay gente todavía que no sabe qué es esto del trabajo comercial, que unas veces se gana y otras se pierde, que por muy bueno y simpático que sea el potencial cliente al final son los números y la estrategia de cada uno la que dicta si te contrata o no.

Tengo que reconocerle que a mi también me ha pasado lo de cabrearme cuando un cliente, después de tener todo apalabrado, se iba con otro proveedor por cualquier motivo. A hechos consumados no sirve de nada llamar al cliente para echarle en cara lo poco serio que es o decirle (literal) que van a pagar justos por pecadores porque a partir de ahora van a cobrar por su servicio (no solicitado, por cierto).

En fin, supongo que ya ha dado por hecho que nunca nos vamos a cruzar otra vez y que le merece más la pena desahogarse ante la pérdida económica quemando puentes que algún día pueda necesitar. Porque, digámonos sin tapujos, que un comercial me engañe es lo normal y lo esperado, pero que lo haga un cliente es algo más raro. Un cliente se gana día a día y se pierde solo una vez si se hacen cosas como esas.

¿Tenía oportunidad de venderme otra cosa aprovechando la «culpabilidad» de haberle dejado con la miel en los labios y su comisión por cobrar… Pues si, pero ya es completamente imposible. Ni lo puedo recomendar a nadie (no quiero que me echen en cara que le mando empresas que terminan por abroncar al cliente) y no voy a contratar nada que huela siquiera a la empresa que le mandó a visitarme.

A mi edad ya no estoy por aprender nuevos trucos, el cliente no siempre tiene la razón, pero siempre hay que respetarle, yo respeto a los míos y entiendo sus razones cuando contratan con otros o cuando no contratan conmigo. Eso no les convierte en malas personas ni les amenazo con perjudicar a mis futuros clientes. Le deseo que haya disfrutado de su momento de desahogo y, por mi parte, nada más que esperar que no trate igual a todos sus clientes o terminará con una cartera muy pequeña de ellos.

Yo no soy contrario a hacer una post-mortem con el cliente, así se aprende qué se ha hecho mal, que se podría mejorar y revisar así la forma de presentar los proyectos la próxima vez. En este caso debería haber aprendido a advertir (como si lo hacen con la telefonía) a los clientes de que iban a recibir una contraoferta y darles el argumentario para declinarla. Si no ha aprendido eso, bueno, peor para él porque parece ser que las energéticas se han decidido a empezar a contratacar… Y eso es algo a tener en cuenta.