Administración y análisis de registros de flujo de grupo de seguridad de red con Network Watcher y Grafana

Precaución

En este artículo se hace referencia a CentOS, una distribución de Linux que está cerca de su estado Final de ciclo vida (EOL). Tenga en cuenta su uso y planeación en consecuencia. Para más información, consulte la Guía de fin de ciclo de vida de CentOS.

Los registros de flujo de grupo de seguridad de red (NSG) proporcionan información que se puede usar para comprender el tráfico IP de entrada y salida en interfaces de red. Estos registros de flujo muestran los flujos de entrada y salida en función de cada regla de NSG, la NIC a la que se aplica el flujo, información de 5-tupla sobre el flujo (IP de origen y de destino, puerto de origen y de destino, protocolo) y si se permitió o denegó el tráfico.

Puede tener varios grupos de seguridad de red en la red con el registro de flujo habilitado. Con esta cantidad de datos de registro resulta complicado analizar y obtener información de los registros. En este artículo se proporciona una solución para administrar de forma centralizada estos registros de flujo de grupos de seguridad de red mediante Grafana, una herramienta de creación de gráficos de código abierto, Elasticsearch, un motor de análisis y búsqueda distribuida, y Logstash, que es una canalización de procesamiento de datos en el servidor de código abierto.

Escenario

Los registros de flujo de grupo de seguridad de red se habilitan mediante Network Watcher y se almacenan en el almacenamiento de blobs de Azure. Se usa un complemento de Logstash para conectar y procesar registros de flujo del almacenamiento de blobs y enviarlos a Elasticsearch. Cuando los registros de flujo se almacenan en Elasticsearch, se pueden analizar y visualizar en paneles personalizados de Grafana.

Grafana de Network Watcher de grupo de seguridad de red

Pasos de instalación

Habilitación de los registros de flujo de grupo de seguridad de red

En este escenario, debe tener el registro de flujo de grupo de seguridad de red habilitado en al menos un grupo de seguridad de red de su cuenta. Para ver instrucciones para habilitar los registros de flujo de grupo de seguridad de red, consulte el artículo siguiente Introducción a los registros de flujo de grupos de seguridad de red con Azure Network Watcher.

Consideraciones sobre la configuración

En este ejemplo, Grafana, ElasticSearch y Logstash están configurados en un servidor Ubuntu LTS implementado en Azure. Esta configuración mínima se utiliza para ejecutar los tres componentes, que se ejecutan en la misma máquina virtual. Esta configuración solo debe usarse para pruebas y las cargas de trabajo no críticas. Logstash, Elasticsearch y Grafana se han diseñado para escalar de forma independiente a través de varias instancias. Para obtener más información, consulte la documentación de cada uno de estos componentes.

Instalación de Logstash

Se puede utilizar Logstash para aplanar los registros de flujo con formato JSON a un nivel de tupla de flujo.

Las siguientes instrucciones se usan para instalar Logstash en Ubuntu. Para obtener instrucciones sobre cómo instalar este paquete en RHEL/CentOS, consulte el artículo Instalación desde repositorios de paquetes - yum.

  1. Para instalar Logstash, ejecute los siguientes comandos:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Configure Logstash para analizar los registros de flujo y enviarlos a Elasticsearch. Cree un archivo Logstash.conf mediante:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Agregue el siguiente contenido al archivo. Cambie la clave de acceso y nombre de la cuenta de almacenamiento para reflejar los detalles de la cuenta de almacenamiento:

     input {
       azureblob
       {
         storage_account_name => "mystorageaccount"
         storage_access_key => "VGhpcyBpcyBhIGZha2Uga2V5Lg=="
         container => "insights-logs-networksecuritygroupflowevent"
         codec => "json"
         # Refer https://learn.microsoft.com/azure/network-watcher/network-watcher-read-nsg-flow-logs
         # Typical numbers could be 21/9 or 12/2 depends on the nsg log file types
         file_head_bytes => 12
         file_tail_bytes => 2
         # Enable / tweak these settings when event is too big for codec to handle.
         # break_json_down_policy => "with_head_tail"
         # break_json_batch_count => 2
       }
     }
     filter {
       split { field => "[records]" }
       split { field => "[records][properties][flows]"}
       split { field => "[records][properties][flows][flows]"}
       split { field => "[records][properties][flows][flows][flowTuples]"}
    
       mutate {
         split => { "[records][resourceId]" => "/"}
         add_field => { "Subscription" => "%{[records][resourceId][2]}"
           "ResourceGroup" => "%{[records][resourceId][4]}"
           "NetworkSecurityGroup" => "%{[records][resourceId][8]}"
         }
         convert => {"Subscription" => "string"}
         convert => {"ResourceGroup" => "string"}
         convert => {"NetworkSecurityGroup" => "string"}
         split => { "[records][properties][flows][flows][flowTuples]" => "," }
         add_field => {
           "unixtimestamp" => "%{[records][properties][flows][flows][flowTuples][0]}"
           "srcIp" => "%{[records][properties][flows][flows][flowTuples][1]}"
           "destIp" => "%{[records][properties][flows][flows][flowTuples][2]}"
           "srcPort" => "%{[records][properties][flows][flows][flowTuples][3]}"
           "destPort" => "%{[records][properties][flows][flows][flowTuples][4]}"
           "protocol" => "%{[records][properties][flows][flows][flowTuples][5]}"
           "trafficflow" => "%{[records][properties][flows][flows][flowTuples][6]}"
           "traffic" => "%{[records][properties][flows][flows][flowTuples][7]}"
     "flowstate" => "%{[records][properties][flows][flows][flowTuples][8]}"
     "packetsSourceToDest" => "%{[records][properties][flows][flows][flowTuples][9]}"
     "bytesSentSourceToDest" => "%{[records][properties][flows][flows][flowTuples][10]}"
     "packetsDestToSource" => "%{[records][properties][flows][flows][flowTuples][11]}"
     "bytesSentDestToSource" => "%{[records][properties][flows][flows][flowTuples][12]}"
         }
         add_field => {
           "time" => "%{[records][time]}"
           "systemId" => "%{[records][systemId]}"
           "category" => "%{[records][category]}"
           "resourceId" => "%{[records][resourceId]}"
           "operationName" => "%{[records][operationName]}"
           "Version" => "%{[records][properties][Version]}"
           "rule" => "%{[records][properties][flows][rule]}"
           "mac" => "%{[records][properties][flows][flows][mac]}"
         }
         convert => {"unixtimestamp" => "integer"}
         convert => {"srcPort" => "integer"}
         convert => {"destPort" => "integer"}
         add_field => { "message" => "%{Message}" }
       }
    
       date {
         match => ["unixtimestamp" , "UNIX"]
       }
     }
     output {
       stdout { codec => rubydebug }
       elasticsearch {
         hosts => "localhost"
         index => "nsg-flow-logs"
       }
     }
    

El archivo de configuración de Logstash proporcionado consta de tres partes: la entrada, el filtro y la salida. La sección de entrada designa el origen de entrada de los registros que va a procesar Logstash; en este caso, vamos a usar un complemento de entrada "azureblob" (instalado en los pasos siguientes) que permite tener acceso a los archivos JSON del registro de flujo de grupo de seguridad de red almacenados en el almacenamiento de blobs.

La sección Filtro aplana, después, cada archivo de registro de flujo para que cada tupla flujo individual y sus propiedades asociadas se convierta en un evento de Logstash independiente.

Por último, la sección de salida desvía cada evento de Logstash al servidor de Elasticsearch. Puede modificar el archivo de configuración de Logstash para que se adapte a sus necesidades específicas.

Instalación del complemento de entrada de Logstash para Azure Blob Storage

Este complemento de Logstash le permite acceder directamente a los registros de flujo desde su cuenta de almacenamiento de blob designada. Para instalar este complemento, desde el directorio de instalación predeterminado de Logstash (en este caso /usr/share/logstash/bin), ejecute el comando:

sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-azureblob

Para más información acerca de este complemento, consulte el complemento de entrada de Logstash para Azure Storage Blob.

Instalación de Elasticsearch

Puede utilizar el script siguiente para instalar Elasticsearch. Para obtener información sobre cómo instalar Elasticsearch, consulte Elastic Stack.

sudo apt-get install apt-transport-https openjdk-8-jre-headless uuid-runtime pwgen -y
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://packages.elastic.co/elasticsearch/5.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-5.x.list
sudo apt-get update && apt-get install elasticsearch
sudo sed -i s/#cluster.name:.*/cluster.name:\ grafana/ /etc/elasticsearch/elasticsearch.yml
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

Instalación de Grafana

Para instalar y ejecutar Grafana, ejecute los siguientes comandos:

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.5.1_amd64.deb
sudo apt-get install -y adduser libfontconfig
sudo dpkg -i grafana_4.5.1_amd64.deb
sudo service grafana-server start

Para obtener información de instalación adicionales, consulte Installing on Debian/Ubuntu (Instalación en Debian/Ubuntu).

Adición del servidor de Elasticsearch como origen de datos

A continuación, debe agregar el índice de Elasticsearch que contiene registros de flujo como un origen de datos. Puede agregar un origen de datos mediante la selección de Agregar origen de datos y rellenando el formulario con la información pertinente. Un ejemplo de esta configuración se puede encontrar en la siguiente captura de pantalla:

Agregar origen de datos

Creación de un panel

Ahora que ha configurado correctamente Grafana para leer desde el índice de Elasticsearch que contiene registros de flujo de grupo de seguridad de red, puede crear y personalizar los paneles. Para crear un nuevo panel, seleccione Create your first dashboard (Crear su primer panel). La configuración del grafo de ejemplo siguiente muestra flujos segmentados por la regla de grupo de seguridad de red:

Panel Grafo

La captura de pantalla siguiente muestra un grafo y un gráfico con los principales flujos y su frecuencia. También se muestran flujos por regla de grupo de seguridad de red y flujos por decisión. Grafana es sumamente personalizable, por lo que se aconseja crear paneles para adaptarse a sus necesidades de supervisión específicas. En el ejemplo siguiente se muestra un panel típico:

Captura de pantalla que muestra la configuración del grafo de ejemplo con flujos segmentados por regla de grupo de seguridad de red.

Conclusión

Mediante la integración de Network Watcher con Elasticsearch, ahora tenemos una forma cómoda y centralizada de administrar y ver los registros de flujo de grupo de seguridad de red, así como otros datos. Grafana tiene muchas otras características eficaces de creación de gráficos que pueden usarse también para administrar aún más los registros de flujo y comprender mejor el tráfico de red. Ahora que la instancia de Grafana está configurada y conectada a Azure, no dude en seguir explorando todas las demás funcionalidades que ofrece.

Pasos siguientes