Skip to content

Commit 018b6a1

Browse files
committed
Test filebeat -> LS -> ES using fips config
As described in elastic/ingest-dev#5471 this commit adds a test for filebeat sending data through logstash to elasticsearch using fips config.
1 parent 38f2b8b commit 018b6a1

File tree

7 files changed

+89
-15
lines changed

7 files changed

+89
-15
lines changed

x-pack/distributions/internal/observabilitySRE/qa/acceptance/docker/docker-compose.yml

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ services:
1212
- elastic
1313
depends_on:
1414
- elasticsearch
15+
1516
elasticsearch:
1617
image: docker.elastic.co/elasticsearch/elasticsearch-fips:${ELASTICSEARCH_IMAGE_VERSION:-8.19.0-SNAPSHOT}
1718
container_name: fips_test_elasticsearch
@@ -26,20 +27,30 @@ services:
2627
- ELASTIC_PASSWORD=changeme
2728
networks:
2829
- elastic
29-
# Filebeat is not yet used in tests, but this is included to show that including it in the compose network
30-
# will not adversely affect startup time etc for testing interactions between other components.
30+
3131
filebeat:
32+
# The filebeat shipped with the elasticsearch-fips container is built for FIPS support
33+
# There is no stand alone distribution. This uses the shipped version for testing.
3234
image: docker.elastic.co/elasticsearch/elasticsearch-fips:${FILEBEAT_IMAGE_VERSION:-8.19.0-SNAPSHOT}
3335
container_name: fips_test_filebeat
34-
entrypoint: ["filebeat", "-e", "--strict.perms=false", "-c", "/usr/share/filebeat/filebeat.yml"]
36+
working_dir: /usr/share/filebeat
37+
entrypoint: ["/bin/bash", "-c"]
38+
# Start Filebeat with /tmp for data (always writable)
39+
command:
40+
- |
41+
exec /opt/filebeat/filebeat -e \
42+
--strict.perms=false \
43+
-c /usr/share/filebeat/filebeat.yml \
44+
--path.data /tmp/filebeat_data
3545
volumes:
36-
- ./filebeat/config/${FILEBEAT_CONFIG:-filebeat-fips.yml}:/usr/share/filebeat/filebeat.yml
37-
- ./filebeat/data:/data
38-
- ./certs:/usr/share/filebeat/certs
39-
profiles:
40-
- filebeat
46+
- ./filebeat/config/${FILEBEAT_CONFIG:-filebeat-fips.yml}:/usr/share/filebeat/filebeat.yml:ro
47+
- ./filebeat/data:/data/logs:ro
48+
- ./certs:/usr/share/filebeat/certs:ro
4149
networks:
4250
- elastic
51+
depends_on:
52+
- logstash
53+
4354
networks:
4455
elastic:
4556
driver: bridge

x-pack/distributions/internal/observabilitySRE/qa/acceptance/docker/filebeat/config/filebeat-fips.yml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@ filebeat.inputs:
22
- type: log
33
enabled: true
44
paths:
5-
- /test-logs/*.log
5+
- /data/logs/sample_logs.txt
66

77
output.logstash:
88
hosts: ["logstash:5044"]
99
ssl.enabled: true
10-
ssl.certificate: "/usr/share/elasticsearch/config/certs/filebeat.crt"
11-
ssl.key: "/usr/share/elasticsearch/config/certs/filebeat.key"
12-
ssl.certificate_authorities: ["/usr/share/elasticsearch/config/certs/ca.crt"]
10+
ssl.certificate: "/usr/share/filebeat/certs/filebeat.crt"
11+
ssl.key: "/usr/share/filebeat/certs/filebeat.key"
12+
ssl.certificate_authorities: ["/usr/share/filebeat/certs/ca.crt"]
13+
ssl.verification_mode: "certificate"
1314

15+
# Add debugging
16+
logging.level: debug
17+
logging.to_stderr: true
18+
19+
# Keep registry in the anonymous volume to avoid host pollution
20+
path.data: /tmp/filebeat_data

x-pack/distributions/internal/observabilitySRE/qa/acceptance/docker/filebeat/data/sample_logs.json

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TEST-LOG: FIPS filebeat test message
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
input {
2+
beats {
3+
port => 5044
4+
ssl_enabled => true
5+
ssl_certificate => "/usr/share/logstash/config/certs/logstash.crt"
6+
ssl_key => "/usr/share/logstash/config/certs/logstash.key"
7+
ssl_certificate_authorities => ["/usr/share/logstash/config/certs/ca.crt"]
8+
}
9+
}
10+
11+
filter {
12+
mutate {
13+
add_tag => ["filebeat"]
14+
}
15+
}
16+
17+
output {
18+
elasticsearch {
19+
hosts => ["https://elasticsearch:9200"]
20+
user => "elastic"
21+
password => "changeme"
22+
ssl_enabled => true
23+
ssl_certificate_authorities => ["/usr/share/logstash/config/certs/ca.crt"]
24+
index => "filebeat-test-%{+YYYY.MM.dd}"
25+
}
26+
}

x-pack/distributions/internal/observabilitySRE/qa/acceptance/docker/logstash/pipeline/logstash-to-elasticsearch.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ output {
2323
index => "logstash-fips-test-%{+YYYY.MM.dd}"
2424
ssl_supported_protocols => ["TLSv1.2"]
2525
}
26+
27+
stdout {
28+
codec => rubydebug
29+
}
2630
}

x-pack/distributions/internal/observabilitySRE/qa/acceptance/spec/acceptance_tests_spec.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,32 @@ def docker_compose_down(env={}) = docker_compose_invoke("down --volumes", env)
126126
expect(logs).to include("org.bouncycastle")
127127
end
128128
end
129+
130+
context "When running in a FIPS compliant configuration" do
131+
before(:all) do
132+
docker_compose_up({"LOGSTASH_PIPELINE" => "filebeat-to-ls-to-es.conf"})
133+
wait_for_elasticsearch
134+
end
135+
136+
after(:all) do
137+
docker_compose_down
138+
end
139+
140+
it "data flows from Filebeat through Logstash to Elasticsearch" do
141+
# Wait for index to appear, indicating data is flowing
142+
wait_until(timeout: 30, message: "Index filebeat-test not found") do
143+
response = es_request("/_cat/indices?v")
144+
response.code == "200" && response.body.include?("filebeat-test")
145+
end
146+
# Wait until specific data from filebeat/logstash mutate filters are observed
147+
query = { query: { match_all: {} } }.to_json
148+
result = nil
149+
wait_until(timeout: 30, message: "Index filebeat-test not found") do
150+
response = es_request("/filebeat-test-*/_search", query)
151+
result = JSON.parse(response.body)
152+
response.code == "200" && result["hits"]["total"]["value"] > 0
153+
end
154+
expect(result["hits"]["hits"].first["_source"]["tags"]).to include("filebeat")
155+
end
156+
end
129157
end

0 commit comments

Comments
 (0)