Créer votre serveur de logs
Monter votre serveur de logs pour avoir un dashboard utile et agréable.
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.
@+