

Misschien rollen je ogen omhoog bij de zoveelste blog over zoiets saais als logbeheer met ELK. Maar dat is niet echt de focus van deze blog post. Hier duiken we dieper in het veiligheidsaspect van een ELK stack en helpen we je er zelf een op te zetten.
Chaos in logbestanden
Laten we zeggen dat je een systeemingenieur/persoon bent die betrokken is bij DevOps en al die logs op een heleboel permanente of tijdelijke (cloud) servers hebt staan. En dan heb je nog je collega's: ontwikkelaars, auditors en gewone gebruikers die deze logs moeten lezen of rapporten moeten krijgen. Al deze mensen toegang geven tot deze logs zal waarschijnlijk resulteren in een hel, als het al mogelijk is.
Het wordt nog moeilijker als de servers en hun logs deel uitmaken van een hoog beschikbare omgeving, waar veel servers en veel logs zijn en het nog moeilijker (lees: onmogelijk) is om logs te krijgen van servers die niet meer bestaan als gevolg van een autoscaling 'scale in'-gebeurtenis. De oplossing is om een logbeheersysteem te gebruiken. Zo'n systeem haalt de logs op van al je servers, transformeert en indexeert ze en slaat ze uiteindelijk op, klaar voor analyse en rapportage.
Inleiding tot B+ELK a.k.a Elastic Stack
Een Elastic Stack gebruikt verschillende 'Beats' om de gegevens te verzamelen en naar Logstash te sturen, waar ze worden getransformeerd en vervolgens gepusht en opgeslagen in Elasticsearch. Vervolgens wordt alles gevisualiseerd in Kibana met mooie grafieken en filters, zodat je gemakkelijk kunt vinden wat je nodig hebt.

Beveiligde logins en alles versleuteld
Een Elastic Stack is vrij eenvoudig te installeren metDocker. Als jeRancher gebruikt(voor Docker container orkestratie), kun je al binnen een paar minuten een draaiende Elastic Stack hebben. En het werkt ook echt, geen gekke dingen.
Er wordt echter weinig tot geen aandacht besteed aan veiligheid en beveiliging. Meestal, als je een Elastic Stack in een bedrijf bekijkt, kun je het vinden op een http-adres (dus niet versleuteld), je hoeft niet in te loggen (zelfs gasten van het netwerk die op het serveradres stuiten kunnen een blik werpen op je logfouten) en iedereen kan gewoon de gegevens in Elasticsearch manipuleren (ideaal als je mislukte inlogpogingen wilt verdoezelen)!

Zowel de open source Search Guard beveiligingsplugin als X-Pack van Elastic.co (onlangs omgedoopt tot het minder pakkendeElastic Stack Features) helpen om de Elastic Stack te beveiligen. Een belangrijk verschil is dat voor X-Pack een betaalde licentie nodig is en dat Search Guard open source is voor veel functies en dat je een betaalde licentie kunt krijgen als je LDAP of AD moet integreren en/of de toegang tot specifieke gegevens moet controleren. Als we alleen al naar de kosten kijken, kiezen we ervoor om de open source versie van Search Guard te gebruiken, de 'Community Edition' bij ACA Group.
De hele stack instellen
Als kind speelde ik bijna uitsluitend met Lego (Nintendo en internet bestonden nog niet of waren nog vrij onbekend). Het leuke van LEGO is dat je alle soorten stenen kunt combineren en iets heel nieuws kunt maken. De enige beperking is je verbeelding!
Bij het bouwen van dit ELK-platform heb ik het op ongeveer dezelfde manier bekeken. Ik gebruikte de ELK Stack van Rancher 1.6 (ziehier) en verving alle containers door docker Search-Guard containers voor Elasticsearch, Logstash en Kibana van https://github.com/khezen.

Voor het beheer van ElasticSearch heb ik Cerebro gekozen (Kopf werkt niet met Secure Elastic Stack) en als laatste Curator om oude indexen op te ruimen.
Traefik containers handelen zowel het beveiligde SSL verkeer af op TLS 1.2 en alleen goede Ciphers (ik heb een hekel aanPOODLE) als de load balancing naar de applicaties aan de achterkant. De Traefik containers zijn op hun beurt verbonden met Amazon ALB's voor Kibana en Cerebro. Daarna heb ik een Beats stack toegevoegd met filebeat en metricbeat op alle applicatieservers om logs of andere gegevens te verzamelen. En ook een homebrew log file cleaner om de logs zelf onder controle te houden.
Samengevat:
- Elasticsearch, Kibana, Logstash, Traefik, Curator en Cerebro staan allemaal op Amazon VPC-servers met Rancher.
- Applicaties worden gevoed door Beats containers en leiden hun levenscyclus op VMWare servers met Rancher.
Zo ziet de hele stack eruit. Houd in gedachten dat de Rancher Master server en Rancher Agent 3 NOOIT worden weergegeven (maar ze zijn er zeker!).

Onderdelenlijst
- Amazon ALB voor Kibana en Cerebro
- Amazon NLB voor Logstash
- Amazon EC2 servers m5.large voor master en m5.xlarge voor agents elk met 200 GB SSD voor indexen
- Cerebro
- Curator
- Docker 18.06.x
- ElasticSearch met Search Guard
- Logstash met Search Guard
- Kibana met Search Guard
- NFS of vergelijkbaar om certificaten te delen
- Rancher 1.6
- RHEL 7.6
- Traefik
- VMWare-applicatieservers, allemaal ongeveer m5.xgroot in omvang
- VMWare NSX load balancers
💡 TIP #1: Er is een direct verband tussen de hoeveelheid servers en logs die u aan Elasticsearch toevertrouwt en de schijfopslag die u gebruikt. Hoe meer servers, hoe meer logs, hoe meer schijfruimte u nodig hebt. Als u echter indexen die u niet nodig hebt correct opschoont met Curator en u ervoor zorgt dat uw collega devs en u proberen de logs laag te houden (wat sowieso een goede gewoonte is), dan kan de hoeveelheid schijfruimte die u nodig hebt laag blijven. Bonus: het houdt je ELK ook snel!
💡TIP#2: Houd al je shards voor alle indexen op alle schijven met een regelmatige cron job erin. Het houdt Elasticsearch langer gezond en mogelijk sneller tegen zeer weinig extra kosten.
Rancher-stacks
Op Amazon VPC - Rancher master met 3 Rancher agents
- Elasticsearch stack- met es-client (3x), es-data (3x) en es-master (3x)
- Kibana-stack - met Kibana (1x) en Cerebro (1x)
- Logstash-stack- met Logstash (3x) en Curator (1x)
Op interne VMWare-servers - Rancher-master met 3 Rancher-agenten
- Beats stack- met filebeat (3x) en log file cleaner (3x)
- Applicatiestacks-met je favoriete apps
Certificaten en wachtwoorden
Een Search Guard-script in de khezen Elasticsearch-container maakt certificaten aan bij de eerste run. Dit leek echter niet goed te werken voor mij, omdat deze certificaten geïsoleerd worden aangemaakt voor elke Elasticsearch-container. Dit betekent dus dat je ongeveer negen servers hebt die hun eigen (zelfondertekende) certificaten aanmaken. De certificaten worden 'slechts' gebruikt voor communicatie tussen alle Elastic Stack-componenten, dus zelfondertekende certificaten kunnen geen kwaad. Natuurlijk moeten sommige certificaten hetzelfde zijn voor alle containers van het platform.
U kunt het gebrek aan certificaatuniformiteit oplossen door:
- De certificaten in de docker container te plaatsen, maar dit is nogal onveilig.
- Een script te maken dat slechts één van de containers deze certificaten laat aanmaken (als ze niet aanwezig zijn van de vorige run) en ze te delen via NFS met een container volume mount. Dit is wat ik heb gedaan.
- De certificaten zelf genereren en ze in NFS zetten.
- Je certificaten in Rancher Secrets of Kubernetes Secrets zetten. Dit zal veel werk zijn, aangezien er VEEL certificaten zijn, maar het is de veiligste en minst onderhoud optie.

Als je Rancher en/of Kubernetes gebruikt, dan weet je dat je wachtwoorden kunt opslaan in Rancher Secrets en Kubernetes Secrets. Je kunt ze dan delen met de containers die ze nodig hebben.
Resultaat: een veilig logging platform
Als je alles goed hebt gedaan, zou je moeten eindigen met een Kibana die achter een Amazon ALB zit met certificaten voor https. Je kunt dan inloggen met het gebruikersaccount dat je gedefinieerd hebt. Hier is een voorbeeld van een Kibana dashboard:

Technische details
Hieronder vind je alle technische details voor:
- Amazon AWS logstash NLB
- Kibana Stack - docker-compose.yml
- Logstash Stack - docker-compose.yml
- Elasticsearch Stack - docker-compose.yml
- BEATS stapel - docker-compose.yml
Klik op de links om naar de technische details van elke component te gaan.
Amazon AWS logstash NLB
Load balancer - Listeners

Doelgroepen - Doelen

Doelgroep - Gezondheidscontroles

Kibana stapel - docker-compose.yml
versie: '2' services: nginx-proxy: image: rancher/nginx:v1.9.4-3 volumes_from: - nginx-proxy-conf secrets: - ELK_KIBANA_PWD labels: io.rancher.sidekicks: kibana6,nginx-proxy-conf io.rancher.container.hostname_override: container_name kibana-vip: image: rancher/lb-service-haproxy:v0.7.6 stdin_open: true tty: true ports: - 50080:50080/tcp labels: io.rancher.container.agent.role: environmentAdmin traefik.frontend.rule: Host:platform-kibana.aca-it.be traefik.port: '50080' io.rancher.container.create_agent: 'true' nginx-proxy-conf: image: rancher/nginx-conf:v0.2.0 secrets: - ELK_KIBANA_PWD commando: - -backend=rancher - --prefix=/2015-07-25 labels: io.rancher.container.hostname_override: container_name kibana6: image: repository-x.artifactrepo.aca-it.be/sgelk/sgkibana:1.0.0 omgeving: ELASTICSEARCH_HOST: es-client.es-cluster ELASTICSEARCH_PORT: '9200' ELASTICSEARCH_URL: https://es-client.es-cluster:9200 stdin_open: true network_mode: container:nginx-proxy volumes: - /app/data/elasticsearch/config/searchguard/ssl:/etc/elasticsearch/searchguard/ssl tty: true secrets: - ELK_KIBANA_PWD labels: io.rancher.container.pull_image: altijd io.rancher.container.hostname_override: container_name cerebro: image: repository-x.artifactrepo.aca-it.be/sgelk/sgcerebro:1.4.0 stdin_open: true tty: true environment: ELK_CEREBRO_CLIENT1: 'ELASTICSEARCH CLIENT1 PRD' ELK_CEREBRO_CLIENT2: 'ELASTICSEARCH CLIENT2 PRD' ELK_CEREBRO_CLIENT3: 'ELASTICSEARCH CLIENT3 PRD' ELK_CEREBRO_URL1: https://es-cluster-es-client-1:9200 ELK_CEREBRO_URL2: https://es-cluster-es-client-2:9200 ELK_CEREBRO_URL3: https://es-cluster-es-client-3:9200 SSL_CERT_AUTH: /etc/elasticsearch/searchguard/ssl/ca/root-ca.pem secrets: - ELK_CEREBRO_PWD - ELK_ELASTIC_PWD volumes: - /app/util/cerebro:/opt/cerebro/logs - /app/data/elasticsearch/config/searchguard/ssl:/etc/elasticsearch/searchguard/ssl poorten: - 59000:9000/tcp labels: io.rancher.container.pull_image: altijd traefik.frontend.rule: Host:platform-cerebro.aca-it.be traefik.port: '9000' secrets: ELK_KIBANA_PWD: external: 'true'
Logstash stapel - docker-compose.yml
versie: '2' services: logstash: image: repository-x.artifactrepo.aca-it.be/sgelk/sglogstash:1.8.1 omgeving: ELASTICSEARCH_HOST: es-cluster-es-client-1 ELASTICSEARCH_HOST_THREE: es-cluster-es-client-3 ELASTICSEARCH_HOST_TWO: es-cluster-es-client-2 ELASTICSEARCH_PORT: '9200' HEAP_SIZE: 1g LOGSTASH_FILES: /etc/elasticsearch/searchguard/ssl/platform-logstash.
SSL_CERT: /etc/elasticsearch/searchguard/ssl/platform-logstash.crtfull.pem SSL_CERT_AUTH: /etc/elasticsearch/searchguard/ssl/aca.root-ca.pem SSL_KEY: /etc/elasticsearch/searchguard/ssl/platform-logstash.key.pem stdin_open: true external_links: - es-cluster/es-client:elasticsearch volumes: - /app/data/logstash/data:/var/lib/logstash - /app/data/elasticsearch/config/searchguard/ssl:/etc/elasticsearch/searchguard/ssl - /app/util/logstash/logs:/var/log/logstash tty: true poorten: - 5044:5044/tcp - 5045:5045/tcp geheimen: - ELK_BEATS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.hostname_override: container_name io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' curator: image: repository-x.artifactrepo.aca-it.be/sgelk/sgcurator:1.6.0 omgeving: CURATOR_USER: logstash ELASTICSEARCH_HOST: es-cluster-es-client-1 ELASTICSEARCH_HOST_THREE: es-cluster-es-client-3 ELASTICSEARCH_HOST_TWO: es-cluster-es-client-2 ELASTICSEARCH_PORT: '9200' LOGSTASH_FILES: /etc/elasticsearch/searchguard/ssl/logstash.
SSL_CERT_AUTH: /etc/elasticsearch/searchguard/ssl/ca/root-ca.pem FILTER_ONE: docker- FILTER_TWO: weblogic- FILTER_THREE: metricbeat- FILTER_FOUR: python- FILTER_FIVE: rabbitmq- FILTER_SIX: syslog- FILTER_SEVEN: atlassian- FILTER_EIGHT: placeholder- UNIT_ONE: maanden UNIT_COUNT_ONE: '2' UNIT_TWO: maanden UNIT_COUNT_TWO: '3' UNIT_THREE: dagen UNIT_COUNT_THREE: '14' UNIT_FOUR: dagen UNIT_COUNT_FOUR: '14' UNIT_FIVE: maanden UNIT_COUNT_FIVE: '1' UNIT_SIX: dagen UNIT_COUNT_SIX: '14' UNIT_SEVEN: dagen UNIT_COUNT_SEVEN: '14' stdin_open: true external_links: - es-cluster/es-client:elasticsearch volumes: - /app/data/elasticsearch/config/searchguard/ssl:/etc/elasticsearch/searchguard/ssl - /app/util/curator/logs:/var/log/curator tty: true secrets: - ELK_CURATOR_PWD labels: io.rancher.container.pull_image: always io.rancher.container.hostname_override: container_name secrets: ELK_TS_PWD: external: 'true' ELK_CURATOR_PWD: external: 'true' ELK_LOGSTASH_PWD: external: 'true' ELK_BEATS_PWD: external: 'true'
Elasticsearch stapel - docker-compose.yml
versie: '2' volumes: es-master-volume: driver: local per_container: true es-data-volume: driver: local per_container: true es-client-volume: driver: local per_container: true services: es-data: cap_add: - IPC_LOCK image: repository-x.artifactrepo.aca-it.be/sgelk/sgelasticsearch:1.5.0 omgeving: CLUSTER_NAME: es-cluster HEAP_SIZE: 4096m HOSTS: es-cluster-es-master-1, es-cluster-es-master-2, es-cluster-es-master-3 MINIMUM_MASTER_NODES: '2' NODE_BOSS: es-cluster-es-master-1 NODE_DATA: 'true' NODE_MASTER: 'false' bootstrap.memory_lock: 'true' node.max_local_storage_nodes: '99' ulimits: memlock: hard: -1 soft: -1 nofile: hard: 65536 soft: 65536 volumes_from: - es-data-storage secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD commando: - elasticsearch labels: io.rancher.sidekicks: es-data-storage,es-data-sysctl io.rancher.container.hostname_override: container_name io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' es-client-sysctl: privileged: true image: repository-x.artifactrepo.aca-it.be/platform-infra/alpine-sysctl:0.1-1 environment: SYSCTL_KEY: vm.max_map_count SYSCTL_VALUE: '262144' network_mode: none secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.start_once: 'true' io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' es-data-storage: image: repository-x.artifactrepo.aca-it.be/platform-infra/alpine-volume:0.0.2-3 environment: SERVICE_GID: '1000' SERVICE_UID: '1000' SERVICE_VOLUME: /elasticsearch/data network_mode: none volumes: - es-data-volume:/elasticsearch/data - /app/util/elasticsearch/logs/es-data:/elasticsearch/logs - /app/data/elasticsearch/config/searchguard/ssl:/elasticsearch/config/searchguard/ssl secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.start_once: 'true' io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' es-master-storage: image: repository-x.artifactrepo.aca-it.be/platform-infra/alpine-volume:0.0.2-3 environment: SERVICE_GID: '1000' SERVICE_UID: '1000' SERVICE_VOLUME: /elasticsearch/data network_mode: none volumes: - es-master-volume:/elasticsearch/data - /app/util/elasticsearch/logs/es-master:/elasticsearch/logs - /app/data/elasticsearch/config/searchguard/ssl:/elasticsearch/config/searchguard/ssl secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.start_once: 'true' io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' es-client: cap_add: - IPC_LOCK image: repository-x.artifactrepo.aca-it.be/sgelk/sgelasticsearch:1.5.0 omgeving: CLUSTER_NAME: es-cluster HEAP_SIZE: 1536m HOSTS: es-cluster-es-master-1, es-cluster-es-master-2, es-cluster-es-master-3 MINIMUM_MASTER_NODES: '2' NODE_BOSS: es-cluster-es-master-1 NODE_DATA: 'false' NODE_MASTER: 'false' bootstrap.memory_lock: 'true' node.max_local_storage_nodes: '99' ulimits: memlock: hard: -1 soft: -1 nofile: hard: 65536 soft: 65536 volumes_from: - es-client-storage secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD commando: - elasticsearch labels: io.rancher.sidekicks: es-client-sysctl,es-client-storage io.rancher.container.hostname_override: container_name io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' es-data-sysctl: privileged: true image: repository-x.artifactrepo.aca-it.be/platform-infra/alpine-sysctl:0.1-1 environment: SYSCTL_KEY: vm.max_map_count SYSCTL_VALUE: '262144' network_mode: none secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.start_once: 'true' io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' es-master-sysctl: privileged: true image: repository-x.artifactrepo.aca-it.be/platform-infra/alpine-sysctl:0.1-1 omgeving: SYSCTL_KEY: vm.max_map_count SYSCTL_VALUE: '262144' network_mode: none secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.start_once: 'true' io.rancher.scheduler.global: 'true' es-master: cap_add: - IPC_LOCK image: repository-x.artifactrepo.aca-it.be/sgelk/sgelasticsearch:1.5.0 omgeving: CLUSTER_NAME: es-cluster HEAP_SIZE: 1536m HOSTS: es-cluster-es-master-1, es-cluster-es-master-2, es-cluster-es-master-3 MINIMUM_MASTER_NODES: '2' NODE_BOSS: es-cluster-es-master-1 NODE_DATA: 'false' NODE_MASTER: 'true' bootstrap.memory_lock: 'true' node.max_local_storage_nodes: '99' ulimits: memlock: hard: -1 soft: -1 nofile: hard: 65536 soft: 65536 volumes_from: - es-master-storage secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD commando: - elasticsearch labels: io.rancher.sidekicks: es-master-storage,es-master-sysctl io.rancher.container.hostname_override: container_name io.rancher.container.pull_image: altijd io.rancher.scheduler.global: 'true' es-client-storage: image: repository-x.artifactrepo.aca-it.be/platform-infra/alpine-volume:0.0.2-3 environment: SERVICE_GID: '1000' SERVICE_UID: '1000' SERVICE_VOLUME: /elasticsearch/data network_mode: none volumes: - es-client-volume:/elasticsearch/data - /app/util/elasticsearch/logs/es-client:/elasticsearch/logs - /app/data/elasticsearch/config/searchguard/ssl:/elasticsearch/config/searchguard/ssl secrets: - ELK_BEATS_PWD - ELK_CA_PWD - ELK_ELASTIC_PWD - ELK_KIBANA_PWD - ELK_KS_PWD - ELK_LOGSTASH_PWD - ELK_TS_PWD labels: io.rancher.container.start_once: 'true' io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' secrets: ELK_ELASTIC_PWD: external: 'true' ELK_TS_PWD: external: 'true' ELK_KIBANA_PWD: external: 'true' ELK_LOGSTASH_PWD: external: 'true' ELK_CA_PWD: extern: 'true' ELK_BEATS_PWD: external: 'true' ELK_KS_PWD: external: 'true'
BEATS stapel - docker-compose.yml
versie: '2' services: filebeat-java: image: repository-x.artifactrepo.aca-it.be/sgelk/filebeat:1.4.0 environment: ENVIRONMENT: prd_opcx LOG_PATH: /java-logs/*/* LOG_TYPE: docker LOGSTASH_HOST: platform-logstash.aca-it.be:5044 SSL: 'true' SSL_CERT: /etc/elasticsearch/searchguard/ssl/platform-filebeat.crtfull.pem SSL_CERT_AUTH: /etc/elasticsearch/searchguard/ssl/aca.root-ca.pem SSL_KEY: /etc/elasticsearch/searchguard/ssl/platform-filebeat.key.pem volumes: - /app/util/log/java/:/java-logs/ - /app/data/filebeat/:/data/ - /etc/hostname:/etc/hostname:ro - /app/util/filebeat/ssl:/etc/elasticsearch/searchguard/ssl secrets: - ELK_BEATS_PWD - ELK_LOGSTASH_PWD labels: io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' filebeat-python: image: repository-x.artifactrepo.aca-it.be/sgelk/filebeat:1.4.0 environment: ENVIRONMENT: prd_opcx LOG_PATH: /python-logs/*/* LOG_TYPE: python LOGSTASH_HOST: platform-logstash.aca-it.be:5044 SSL: 'true' SSL_CERT: /etc/elasticsearch/searchguard/ssl/platform-filebeat.crtfull.pem SSL_CERT_AUTH: /etc/elasticsearch/searchguard/ssl/aca.root-ca.pem SSL_KEY: /etc/elasticsearch/searchguard/ssl/platform-filebeat.key.pem volumes: - /app/util/log/python/:/python-logs/ - /app/data/filebeat/:/data/ - /etc/hostname:/etc/hostname:ro - /app/util/filebeat/ssl:/etc/elasticsearch/searchguard/ssl secrets: - ELK_BEATS_PWD - ELK_LOGSTASH_PWD labels: io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' filebeat-rabbitmq: image: repository-x.artifactrepo.aca-it.be/sgelk/filebeat:1.4.0 environment: ENVIRONMENT: prd_opcx LOG_PATH: /rabbitmq-logs/*/rabbitmq*.log LOG_TYPE: rabbitmq LOGSTASH_HOST: platform-logstash.aca-it.be:5044 SSL: 'true' SSL_CERT: /etc/elasticsearch/searchguard/ssl/platform-filebeat.crtfull.pem SSL_CERT_AUTH: /etc/elasticsearch/searchguard/ssl/aca.root-ca.pem SSL_KEY: /etc/elasticsearch/searchguard/ssl/platform-filebeat.key.pem volumes: - /app/util/rabbitmq-logs/:/rabbitmq-logs/ - /app/data/filebeat/:/data/ - /etc/hostname:/etc/hostname:ro - /app/util/filebeat/ssl:/etc/elasticsearch/searchguard/ssl secrets: - ELK_BEATS_PWD - ELK_LOGSTASH_PWD labels: io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' logfilecleaner-java: image: repository-x.artifactrepo.aca-it.be/platform-infra/logfilecleaner:1.0.0 environment: CLEAN_MTIME: 31 CLEAN_DIRECTORY: /java-logs volumes: - /app/util/log/java/:/java-logs/ - /etc/hostname:/etc/hostname:ro labels: io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' logfilecleaner-python: image: repository-x.artifactrepo.aca-it.be/platform-infra/logfilecleaner:1.0.0 omgeving: CLEAN_MTIME: 31 CLEAN_DIRECTORY: /python-logs volumes: - /app/util/log/python/:/python-logs/ - /etc/hostname:/etc/hostname:ro labels: io.rancher.container.pull_image: always io.rancher.scheduler.global: 'true' secrets: ELK_BEATS_PWD: external: 'true' ELK_LOGSTASH_PWD: external: 'true'
What others have also read


CloudBrew is altijd een hoogtepunt op onze kalender geweest, maar de editie van 2025 voelde anders. Misschien lag het aan de timing. Slechts een maand eerder, in november 2025, opende de Azure Belgium Central-regio eindelijk haar deuren. ACA opereert al altijd vanuit het hart van Europa, dus het live gaan van deze grote nationale mijlpaal net voor de conferentie zorgde voor een extra dosis enthousiasme.
Lees verder

Een betere uptime, lagere kosten en vendor lock-in vermijden. Dat zijn drie van de redenen waarom onze klanten kiezen voor een multicloud-strategie. Onze Cloud project manager Roel Van Steenberghe legt uit wat zo’n strategie precies inhoudt en wat de troeven zijn van Google Cloud Platform (GCP).
Lees verder

In de complexe wereld van moderne softwareontwikkeling worden bedrijven geconfronteerd met de uitdaging om verschillende applicaties die door verschillende teams worden ontwikkeld en beheerd, naadloos te integreren. De Service Mesh is van onschatbare waarde bij het overwinnen van deze uitdaging. In dit blogartikel verdiepen we ons in Istio Service Mesh en onderzoeken we waarom investeren in een Service Mesh zoals Istio een slimme zet is." Wat is Service Mesh? Een Service Mesh is een softwarelaag die verantwoordelijk is voor alle communicatie tussen applicaties, in deze context services genoemd. Het introduceert nieuwe functionaliteiten om de interactie tussen services te beheren, zoals monitoring, logging, tracing en verkeerscontrole. Een service mesh werkt onafhankelijk van de code van elke individuele service, waardoor het over netwerkgrenzen heen kan werken en kan samenwerken met verschillende beheersystemen. Dankzij een service mesh kunnen ontwikkelaars zich richten op het bouwen van toepassingsfuncties zonder zich zorgen te maken over de complexiteit van de onderliggende communicatie-infrastructuur. Istio Service Mesh in de praktijk Denk aan het beheren van een groot cluster waarop meerdere applicaties draaien die ontwikkeld en onderhouden worden door verschillende teams, elk met verschillende afhankelijkheden zoals ElasticSearch of Kafka. Na verloop van tijd resulteert dit in een complex ecosysteem van applicaties en containers, overzien door verschillende teams. De omgeving wordt zo ingewikkeld dat het voor beheerders steeds moeilijker wordt om het overzicht te bewaren. Dit leidt tot een reeks pertinente vragen: Hoe ziet de architectuur eruit? Welke applicaties interageren met elkaar? Hoe wordt het verkeer beheerd? Bovendien zijn er specifieke uitdagingen die voor elke afzonderlijke applicatie moeten worden aangepakt: Het afhandelen van aanmeldingsprocessen Implementeren van robuuste beveiligingsmaatregelen Netwerkverkeer beheren dat naar de applicatie wordt geleid ... Een Service Mesh, zoals Istio, biedt een oplossing voor deze uitdagingen. Istio fungeert als een proxy tussen de verschillende applicaties (services) in het cluster, waarbij elk verzoek door een component van Istio gaat. Hoe werkt Istio Service Mesh? Istio introduceert een sidecar proxy voor elke service in het microservices ecosysteem. Deze sidecar proxy beheert al het inkomende en uitgaande verkeer voor de dienst. Daarnaast voegt Istio componenten toe die het inkomende en uitgaande verkeer van het cluster afhandelen. Istio's control plane maakt het mogelijk om beleidsregels te definiëren voor verkeersbeheer, beveiliging en monitoring, die vervolgens worden toegepast op de toegevoegde componenten. Voor een beter begrip van de functionaliteit van Istio Service Mesh, zie ons blogartikel "Istio Service Mesh installeren: A Comprehensive Step-by-Step Guide" , een gedetailleerde, stapsgewijze uitleg over de installatie en het gebruik van Istio. Waarom Istio Service Mesh? Verkeersbeheer: Istio maakt gedetailleerd verkeersbeheer mogelijk, waardoor ontwikkelaars eenvoudig verkeer tussen verschillende versies van hun services kunnen routeren, verdelen en controleren. Beveiliging: Istio biedt een robuuste beveiligingslaag met functies zoals verkeersversleuteling met behulp van eigen certificaten, Role-Based Access Control (RBAC) en mogelijkheden voor het implementeren van authenticatie- en autorisatiebeleid. Waarneembaarheid: Door middel van ingebouwde instrumentatie biedt Istio diepgaande observeerbaarheid met tools voor monitoring, logging en gedistribueerde tracering. Hierdoor kunnen IT-teams de prestaties van services analyseren en snel problemen opsporen. Vereenvoudigde communicatie: Istio neemt de complexiteit van servicecommunicatie weg van applicatieontwikkelaars, zodat zij zich kunnen richten op het bouwen van applicatiefuncties. Is Istio geschikt voor uw opstelling? Hoewel de voordelen duidelijk zijn, is het essentieel om te overwegen of de extra complexiteit van Istio past bij jouw specifieke opstelling. Ten eerste is er een sidecar container nodig voor elke ingezette service, wat kan leiden tot ongewenste geheugen- en CPU overhead. Daarnaast kan het zijn dat je team niet beschikt over de specialistische kennis die nodig is voor Istio. Als je overweegt om Istio Service Mesh te gaan gebruiken, vraag dan begeleiding aan specialisten met expertise. Vraag onze experts gerust om hulp. Meer informatie over Istio Istio Service Mesh is een technologische game-changer voor IT-professionals die streven naar geavanceerde controle, beveiliging en observeerbaarheid in hun microservices-architectuur. Istio vereenvoudigt en beveiligt de communicatie tussen services, waardoor IT-teams zich kunnen richten op het bouwen van betrouwbare en schaalbare applicaties. Snel antwoord nodig op al uw vragen over Istio Service Mesh? Neem contact op met onze experts
Lees verderWant to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!


