Créer votre serveur de logs

Monter votre serveur de logs pour avoir un dashboard utile et agréable.

Créer votre serveur de logs

Bonjour,

Ca fait un (très) long moment que c’était dans ma todo list mais je ne savais pas trop par quel bout le prendre : je veux être capable de récupérer les logs qui viennent de mon pfsense pour pouvoir effectuer une analyse rapide (et aussi avoir quelque chose de plus visuel que les logs actuels de pfsense). La solution est trouvée depuis le départ en ce qui concerne les logiciels à utiliser : grafana pour la partie graphique, influxdb pour la base de données et telegraf pour l’envoi des données. Mais comment mettre tout ça en oeuvre ? J’ai une solution équivalente en place pour mon serveur web (dockprom, solution tout en un) mais qui est sur la même VM que le site. L’inconvénient c’est que quand le site est planté en général Dockprom aussi. Donc ça a une utilité limitée (mais ça fait des graphs sympas, faut le reconnaître !). Dans ce cas, pourquoi ne pas créer un serveur de logs indépendant ou je pourrais envoyer ce que je veux dessus. Ca me parait être la bonne idée, alors allons-y !

Etape 1: Créer votre machine virtuelle. Pour ma part j’utilise Proxmox et j’ai sélectionné les paramètres suivants: Hard drive 24Go / 512-1024 RAM / Network : LAN / 1 socket 8 cores

Etape 2: On installe Ubuntu sur la machine virtuelle. Je suis toujours en 16.04. Au niveau des packages absolument aucun excepté les utilitaires. Surtout pas de serveur LAMP ou alors vous allez avoir des problèmes avec la gestion des ports et docker.

Etape3 : On va s’occuper le mettre les élements nécessaires en place pour le fonctionnement de votre VM. On commence par la mise à jour de Ubuntu après l’installation:

sudo apt-get update && sudo apt-get upgrade -y

Après les mises à jour, on met en place une IP statique pour votre serveur:

sudo nano /etc/network/interfaces

On modifie le fichier en choisissant l’IP, le netmask, gateway et le DNS.

# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). 
source /etc/network/interfaces.d/* 
# The loopback network interface auto lo iface lo inet loopack 
# The primary network interface 
auto ens18 
iface ens18 inet static
        address 192.168.1.101 
        netmask 255.255.255.0 
        gateway 192.168.1.1 
        dns-nameservers 192.168.1.1

On enregistre le fichier et on reboot:

sudo reboot
On vérifie l'ip après le reboot:
ifconfig

Pour pouvoir accéder à votre VM via SSH et utiliser un logiciel comme MobaXterm voici les commandes à effectuer:

sudo apt install openssh-server
sudo systemctl status ssh

Pour la gestion des mises à jour de Ubuntu, j’aime bien le faire via Webmin plutôt que via SSH quand tout tourne:

sudo apt update
sudo apt install software-properties-common apt-transport-https wget
wget -q http://www.webmin.com/jcameron-key.asc -O- | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://download.webmin.com/download/repository sarge contrib"
sudo apt-get update
sudo apt-get install webmin

Vous avez maintenant accès à Webmin sur http://192.168.1.101:10000

Pour les sauvegardes des containers dockers, j’aime bien passer via Windows (j’ai un logiciel en tache de fond qui s’occupe de ça). Pour ça il faut mettre en place un partage SAMBA du répertoire qui va accueillir les containers:

sudo apt-get install samba
smbpasswd -a votrepseudo
sudo nano /etc/samba/smb.conf

On va à la fin du fichier de conf et on ajoute les lignes suivantes:

[votrepartage]
   path = /home/votrepseudo
   available = yes
   valid users = votrepseudo
   read only = no
   browseable = yes
   public = yes
   writable = yes

On redémarre maintenant le service:

sudo service smbd restart

Hop la, il suffit ensuite de connecter votre lecteur réseau sur windows pour accéder au partage.

Etape 4 : On va maintenant installer Docker & Docker-compose.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
apt-cache policy docker-ce
sudo apt-get install -y docker-ce
sudo systemctl status docker

On va maintenant enlever le sudo pour les commandes de Docker:

sudo usermod -aG docker ${USER}
su - ${USER}
id -nG

On installe maintenant Docker-compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

Etape 5 : Bon voila, tout est en place, on va commencer à rentrer dans le dur en installant votre reverse proxy ainsi que Portainer pour un management facile de vos containers. En ce qui concerne le reverse proxy, j’utilise Traefik dans sa nouvelle version (2.0 au moment ou j’écris ces lignes). Le reverse Proxy n’est pas obligatoire mais si vous souhaitez par la suite mettre en place une frontpage pour centraliser votre logs ça sera plus facilement réalisable. Pareil si vous souhaitez y accéder depuis l’extérieur avec la mise en place d’un certificat SSL/TLS.

On va commencer par créer deux networks:

docker network create routers
docker network create services

On va créer le répertoire dans lequel on va installer ces containers.

cd ~
mkdir traefik
cd traefik
nano docker-compose.yml

Ci-dessous le contenu du fichier Docker-compose:

# On va maintenant installer le reverse proxy Traefik / management avec Portainer / mises à jour auto avec watchtower
version: "3.3"
services:
  # Test avec la version 2.0 de Traefik
  # https://hub.docker.com/_/traefik
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    networks:
      - routers
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      #- "--entrypoints.websecure.address=:443"
      #- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      #- "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      #- "--certificatesresolvers.mytlschallenge.acme.email=postmaster@mydomain.com"
      #- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      #- "./letsencrypt:/letsencrypt"
    labels:
      - "traefik.http.routers.router0.rule=Host(`localhost`) && PathPrefix(`/test`)"
      - "traefik.enable=true"
      
  # Pour gérer les containers on souhaite utiliser une interface graphique donc Portainer.
  # Installer Portainer / Interface graphique docker
  # https://hub.docker.com/r/portainer/portainer
  portainer:
    image: portainer/portainer:latest
    container_name: portainer
    restart: unless-stopped
    networks:
       - services
    ports:
      - "9000:9000"
    labels:
       - "traefik.enable=true"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - ./data:/data
      
  # Watchtower detects if any linked containers have a new image available, automatically updating & restarting them if needed.
  watchtower:
    # https://hub.docker.com/r/centurylink/watchtower/
    image: v2tec/watchtower:latest
    # https://github.com/v2tec/watchtower#options
    # This schedule applies updates (if available) at midnight.
    command: --cleanup --schedule "0 0 0 * * *"
    depends_on:
      - traefik
    restart: unless-stopped
    container_name: watchtower
    networks:
      - services
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.enable=true"     
      
networks:
  routers:
    external: true      
  services:
    external: true  

On démarre les containers:

docker-compose up -d

Pour voir le résultat de vos containers il faut aller sur les IPs suivantes:
– Traefik : http://192.168.1.101:8080
– Portainer : http://192.168.1.101:9000
Watchtower va fonctionner en tâche de fond et va mettre les containers à jour si nécessaire à minuit chaque jour.

Etape 6 : On va maintenant installer Grafana, Influxdb & telegraf.

cd ~
sudo mkdir monitoring & cd monitoring
docker volume create grafana
sudo chmod -R a+rwx /home/votrepseudo/monitoring/grafana
nano docker-compose.yml 

Ci-dessous le contenu du fichier Docker-compose:

# Installation Grafana & InfluxDB
version: "3"
services:
  # Visualisation des données
  # https://hub.docker.com/r/grafana/grafana/
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    depends_on:
      - influxdb
    ports:
      - 3000:3000
    networks:
      - services
    volumes:
      - ./grafana:/var/lib/grafana
      - ./grafana/plugins:/var/lib/grafana/plugins
      - ./grafana/datasources:/etc/grafana/datasources
      - ./grafana/dashboards:/etc/grafana/dashboards
    labels:
      - "traefik.enable=true"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
  
  # Database installation
  # https://hub.docker.com/_/influxdb
  influxdb:
    image: influxdb:latest
    container_name: influxdb
    restart: unless-stopped
    ports:
      - 8086:8086
    networks:
      - services
    volumes:
      - ./influxdb:/var/lib/influxdb
    labels:
      - "traefik.enable=true"  
    environment:
      - INFLUXDB_ADMIN_ENABLED=true
      - INFLUXDB_DB=telegraf
      - INFLUXDB_HTTP_AUTH_ENABLED=true
      - INFLUXDB_ADMIN_USER=votrepseudo
      - INFLUXDB_ADMIN_PASSWORD=votremotdepasse
      - INFLUXDB_USER=votrepseudo
      - INFLUXDB_USER_PASSWORD=votremotdepasse
      
  # Collecte des données avec telegraf
  # https://hub.docker.com/_/telegraf
  telegraf:
    image: telegraf:latest
    container_name: telegraf
    restart: unless-stopped
    networks:
      - services
    volumes:
      - ./telegraf:/var/lib/telegraf
      - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
      - /var/run/docker.sock:/var/run/docker.sock
    links:
      - influxdb:influxdb
    labels:
      - "traefik.enable=true"</pre>

networks:
  services:
    external: true

Nous allons maintenant créer le repertoire de telegraf:

mkdir telegraf

Nous créeons maintenant le fichier de configuration de telegraf:

docker run --rm telegraf telegraf config > telegraf/telegraf.conf

On va pouvoir aller maintenant modifier ce fichier:

cd telegraf
nano telegraf.conf

Dans le fichier de configuration il faut modifier les lignes qui concernent:
– hostname
– urls pour accéder à la base de données
– le nom de la database
– création de la database n’est pas nécessaire
– les paramètres d’authentification
– les paramètres de rétention et de collection des données
– les paramètres du plugin de Docker pour pouvoir collecter les données

Voici ce que ça donne (le fichier n’est pas présenté en totalité, juste les parties intéressantes):

[...]
  ## Override default hostname, if empty use os.Hostname()
  hostname = "telegraf"
  ## If set to true, do no set the "host" tag in the telegraf agent.
  omit_hostname = false
[...]
###############################################################################
#                            OUTPUT PLUGINS                                   #
###############################################################################</pre>

# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]
## The full HTTP or UDP URL for your InfluxDB instance.
##
## Multiple URLs can be specified for a single cluster, only ONE of the
## urls will be written to each interval.
# urls = ["unix:///var/run/influxdb.sock"]
# urls = ["udp://127.0.0.1:8089"]
# urls = ["http://127.0.0.1:8086"]
urls = ["http://influxdb:8086"]

## The target database for metrics; will be created as needed.
## For UDP url endpoint database needs to be configured on server side.
database = "telegraf"

## The value of this tag will be used to determine the database. If this
## tag is not set the 'database' option is used as the default.
# database_tag = ""

## If true, the database tag will not be added to the metric.
# exclude_database_tag = false

## If true, no CREATE DATABASE queries will be sent. Set to true when using
## Telegraf with a user without permissions to create databases or when the
## database already exists.
skip_database_creation = true

## Name of existing retention policy to write to. Empty string writes to
## the default retention policy. Only takes effect when using HTTP.
# retention_policy = ""

## Write consistency (clusters only), can be: "any", "one", "quorum", "all".
## Only takes effect when using HTTP.
write_consistency = "any"

## Timeout for HTTP messages.
timeout = "5s"

## HTTP Basic Auth
username = "votrepseudo"
password = "votremotdepasse"

## HTTP User-Agent
user_agent = "votrepseudo"
[...]
[...]

###############################################################################
# INPUT PLUGINS #
###############################################################################

[...]

# # Read metrics about docker containers
[[inputs.docker]]
# ## Docker Endpoint
# ## To use TCP, set endpoint = "tcp://[ip]:[port]"
# ## To use environment variables (ie, docker-machine), set endpoint = "ENV"
endpoint = "unix:///var/run/docker.sock"

[...]

[...]

Si tout va bien, vous avez maintenant un serveur log qui est fonctionnel. Il suffit de lancer les containers du docker-compose:

docker-compose up -d

Etape 7 : configurer rapidement grafana.
Pour accéder à grafana, il faut vous rendre sur http://votreip:3000
Le login/pass c’est celui que vous avez configuré dans le fichier docker-compose mais de base c’est admin/admin.

La première chose à faire est de créer le lien vers votre base de donnée. Pour cela il faut aller dans Configuration / Data source / Add data source.

Une fois les infos remplies, vous allez sur grafana.com et vous copiez le lien du dashboard qui vous intéresse. Par exemple celui la pour monitorer Docker.

Il suffit ensuite d’aller dans Create / Import et de rentrer le lien que vous venez de copier.

Et voila, enjoy votre magnifique Dashboard !

Au final ça fait un énorme pavé mais vous avez je l’espère suffisamment de détails pour réussir à faire votre serveur de logs par vous même.

@+