Cómo automatizar el refresco de las IPs públicas de Microsoft Azure en un firewall
En varias ocasiones es posible que sea necesario mantener el listado de IPs públicas que Microsoft Azure utiliza para sus servicios. Normalmente suele ser porque necesitas restringir el acceso a ciertos recursos, tanto en la nube como on-prem, y quieres añadir en tu firewall solo aquellas IPs estrictamente necesarias para el acceso. Para ello me he creado un script, que he contenerizado, el cual recupera el archivo de los rangos de IP públicos que utiliza Microsoft Azure, el cual se actualiza semanalmente, y actualiza las reglas de un firewall, en este caso de un Azure Data Lake Gen 1, pero podría ser para cualquier otro firewall o necesidad.
El script
El encargado de hacer todas estas tareas es el siguiente script:
Para ello he necesitado tres componentes principales:
- prips: se trata de una herramienta que me devuelve todas las IPs que están contenidas en un rango CIDR. Lo necesito porque en el JSON que me descargo no vienen todas las IPs sino los rangos, pero el firewall necesita la IP de inicio y la IP de fin. Esta herramienta viene como parte de la distribución Ubuntu, así que ha sido esta la que he utilizado para mi contenedor, por simplicidad.
- Azure CLI: como en este ejemplo voy a actualizar el firewall de un recurso de Microsoft Azure necesito tenerlo instalado para poder hacer esta operación. Si quisiera actualizar otro firewall de otro servicio necesitaría modificar esta parte con las acciones necesarias.
- jq: para recuperar y manipular los JSONs que recibo en los diferentes pasos.
Por todo ello, el Dockerfile que voy a utilizar para dockerizar mi script es el siguiente:
A partir de aquí, puedes tener varias formas de crear y ejecutar este contenedor.
Ejecutar el contenedor en local
Si quieres probar este contenedor en local puedes hacerlo con los siguientes comandos:
Lo primero que debes hacer es configurar las variables, con el id de la suscripción donde está el recurso del cual vamos a modificar el firewall, el grupo de recursos y el nombre del Data Lake Store en este ejemplo.
Para que el contenedor pueda ejecutar la eliminación e insercción de las reglas en el firewall necesitamos crear también un service principal con el que lanzar el comando az login. Una vez que tenemos todo ello podemos generar la imagen en local, a través de docker build, y por último, con docker run, podemos ejecutar el contenedor en local pasándole como variables de entorno los parámetros necesarios para tu entorno.
Ejecutar en Azure Container Instances
Si no tienes Docker instalado en tu local y aún así quieres probar este escenario puedes delegar las tareas en Azure Container Registry y Azure Container Instances.
Como ves, en este caso me creo un grupo de recursos donde genero un Azure Container Registry y lanzo una tarea de build con los elementos que tengo en local. Esto generará la misma imagen que creamos en local pero directamente en este ACR. Una vez que tenemos la misma ya podemos crear un contenedor en Azure Container Instances con el acceso al ACR que acabas de crear y las mismas variables que cuando lo lanzaste en local.
El resultado
Si todo ha ido bien, deberías de tener dadas de alta todas las reglas relativas a las IPs del servicio de Microsoft Azure que necesitas dar acceso en el firewall del servicio:
En este ejemplo solamente estoy añadiendo las IPs para Power BI, pero podrías modificarlo para recuperar del servicio que te interese en tu caso. Por último, todo esto podrías integrarlo como parte de una Logic App que tenga programado que semanalmente haga este proceso.
El código de ejemplo lo tienes en mi GitHub.
¡Saludos!