diff --git a/templates/_helpers.tpl b/templates/_helpers.tpl index 8e886ba1c1642747b48094582ac116a9a4f25aa4..6d74acc54dfde101d5cc9b5a212ceff12be43f33 100644 --- a/templates/_helpers.tpl +++ b/templates/_helpers.tpl @@ -24,7 +24,7 @@ elasticsearch.{{ default .Release.Namespace .Values.namespaceTag }}.{{ .Values.d Logstash input dns */}} {{- define "logstash.dns" -}} -logstash.{{ .Values.logstash.pipelines_group_name }}.{{ default .Release.Namespace .Values.namespaceTag }}.{{ .Values.domainSuffix }} +logstash.{{ .Values.logstash.beats.pipelines_group_name }}.{{ default .Release.Namespace .Values.namespaceTag }}.{{ .Values.domainSuffix }} {{- end -}} {{/* @@ -37,4 +37,12 @@ Logstash input dns for many ingressRouteTCPs {{- range $index := until $maxRange -}} {{- $urlPrefix}}{{$index }}{{ $concatUrl }}{{if lt $index (sub $maxRange 1) }},{{end}} {{- end -}} +{{- end -}} + + +{{/* +Filebeat input dns +*/}} +{{- define "filebeat.dns" -}} +filebeat.{{ default .Release.Namespace .Values.namespaceTag }}.{{ .Values.domainSuffix }} {{- end -}} \ No newline at end of file diff --git a/templates/elasticsearch.yaml b/templates/elasticsearch.yaml index a3395c1c8f58168e6c0857a69faa9ed7c36058b4..f0be1aa5c14f7ff7f6be2103857103fbf3adcf02 100644 --- a/templates/elasticsearch.yaml +++ b/templates/elasticsearch.yaml @@ -8,14 +8,26 @@ spec: auth: roles: - secretName: logstash-writer-role-secret + - secretName: user-monitoring-role-secret fileRealm: - secretName: logstash-writer-secret + - secretName: user-monitoring-secret nodeSets: {{- range .Values.elasticsearch.nodeSets }} - name: {{ .name }} count: {{ .count}} config: xpack.security.authc.token.enabled: true + http.cors.enabled : true + http.cors.allow-origin : "*" + http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE + http.cors.allow-headers: "kbn-version, Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token" + xpack.security.enabled: true + xpack.security.http.ssl.enabled: true + xpack.security.http.ssl.key: /usr/share/elasticsearch/config/certs/tls.key + xpack.security.http.ssl.certificate: /usr/share/elasticsearch/config/certs/tls.crt + xpack.security.http.ssl.certificate_authorities: [ "/usr/share/elasticsearch/config/certs/ca.crt" ] + xpack.monitoring.collection.enabled: true volumeClaimTemplates: - metadata: name: elasticsearch-data @@ -47,6 +59,9 @@ spec: privileged: true containers: - name: elasticsearch + volumeMounts: + - name: certs + mountPath: /usr/share/elasticsearch/config/certs imagePullPolicy: Always securityContext: #runAsUser: 0 @@ -55,7 +70,7 @@ spec: {{- with .resources }} resources: {{- toYaml . | nindent 12 }} - {{- end }} + {{- end }} env: - name: ELASTICSEARCH_PASSWORD valueFrom: @@ -65,6 +80,10 @@ spec: {{- with $.Values.elasticsearch.env }} {{- toYaml . | nindent 10 }} {{- end }} + volumes: + - name: certs + secret: + secretName: {{ $.Release.Name }}-elasticsearch-http-cert-secret-internal {{- end }} http: tls: @@ -123,6 +142,103 @@ stringData: - names: [ '*' ] privileges: ["read","write","create","create_index","manage","manage_ilm"] --- - - - +apiVersion: v1 +kind: Secret +metadata: + name: user-monitoring-secret +type: kubernetes.io/basic-auth +data: + username: {{ "monitoring_user" | b64enc }} + {{- if .Release.IsInstall }} + password: {{ randAlphaNum 20 | b64enc }} + {{ else }} + password: {{ index (lookup "v1" "Secret" .Release.Namespace "user-monitoring-secret").data "password" }} + {{ end }} + roles: {{ "user-monitoring-role" | b64enc }} +--- +kind: Secret +apiVersion: v1 +metadata: + name: user-monitoring-role-secret +stringData: + roles.yml: |- + user-monitoring-role: + cluster: + - monitor + - manage_index_templates + - manage_ingest_pipelines + - manage_ilm + - read_ilm + - manage + - cluster:admin/xpack/watcher/watch/put + - cluster:admin/xpack/watcher/watch/delete + indices: + - names: + - .monitoring-* + privileges: + - all + - names: + - .ds-* + privileges: + - all + - names: + - metricbeat-* + privileges: + - manage + - read + - create_doc + - view_index_metadata + - create_index + - names: + - filebeat-* + privileges: + - manage + - read + - create_doc + - view_index_metadata + - create_index + applications: [] +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: selfsigned-ca +spec: + selfSigned: {} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: internal-ca +spec: + isCA: true + commonName: internal-ca + secretName: internal-ca + issuerRef: + name: selfsigned-ca + kind: ClusterIssuer +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: internal-issuer +spec: + ca: + secretName: internal-ca +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: elasticsearch-certificate +spec: + secretName: {{ .Release.Name }}-elasticsearch-http-cert-secret-internal + duration: {{ .Values.elasticsearch.cert.duration }} + renewBefore: {{ .Values.elasticsearch.cert.renewBefore }} + commonName: {{ template "elasticsearch.dns" . }} + dnsNames: + - {{ template "elasticsearch.dns" . }} + - {{ .Release.Name }}-elasticsearch-es-http.{{ .Release.Namespace }} + - {{ .Release.Name }}-elasticsearch-es-http.{{ .Release.Namespace }}.svc + issuerRef: + name: internal-issuer + kind: Issuer diff --git a/templates/filebeat.yaml b/templates/filebeat.yaml index b4245309311dafa6fbbce88795bc733254da8bdb..b444a5d1a29d0fca0f2fb9642c1548ada53454da 100644 --- a/templates/filebeat.yaml +++ b/templates/filebeat.yaml @@ -10,7 +10,6 @@ spec: type: filebeat elasticsearchRef: name: {{ .Release.Name }}-elasticsearch - #clusterName: {{ .Release.Name }}-elasticsearch daemonSet: podTemplate: metadata: @@ -18,11 +17,11 @@ spec: stack-namespace: {{ .Release.Namespace }} spec: securityContext: - runAsUser: 0 # Running as root user - fsGroup: 1000 # Filebeat user ID + runAsUser: 0 + fsGroup: 1000 containers: - name: filebeat - command: ['sh', '-c',' exec /usr/share/filebeat/logs/example.sh & exec /usr/share/filebeat/filebeat -e -c /usr/share/filebeat/filebeat.yml'] + command: ['sh', '-c', 'exec /usr/share/filebeat/logs/example.sh & exec /usr/share/filebeat/filebeat -e -c /usr/share/filebeat/filebeat.yml'] volumeMounts: - mountPath: /usr/share/filebeat/filebeat.yml subPath: filebeat.yml @@ -30,6 +29,25 @@ spec: - mountPath: /usr/share/filebeat/logs/example.sh subPath: example.sh name: example-script + - mountPath: /usr/share/filebeat/certs + name: filebeat-certs + - mountPath: /usr/share/filebeat/es-certs # used for monitoring + name: es-certs + env: + - name: ELASTIC_ELASTICSEARCH_ES_HOSTS + value: 'https://elastic-elasticsearch-es-http.{{ .Release.Namespace }}.svc:9200' + - name: LOGSTASH_HOSTS + value: 'logstash-{{ .Values.logstash.beats.pipelines_group_name }}-ls-api.{{ .Release.Namespace }}:5044' + - name: MONITORING_USER + valueFrom: + secretKeyRef: + name: user-monitoring-secret + key: username + - name: MONITORING_PASSWORD + valueFrom: + secretKeyRef: + name: user-monitoring-secret + key: password volumes: - name: config secret: @@ -39,6 +57,12 @@ spec: configMap: name: filebeat-example-script defaultMode: 0777 + - name: filebeat-certs + secret: + secretName: filebeat-certs-secret + - name: es-certs # used for monitoring + secret: + secretName: elastic-elasticsearch-http-cert-secret-internal --- apiVersion: v1 kind: Secret @@ -90,4 +114,18 @@ data: echo "2022-04-01 $((RANDOM % 3 + 9)):$((RANDOM % 60)):$((RANDOM % 60)).000 | $count | $status | $data" >> /usr/share/filebeat/logs/example.log count=$((count + 1)) done ---- \ No newline at end of file +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: filebeat-certificate +spec: + secretName: filebeat-certs-secret + duration: {{ .Values.filebeat.cert.duration }} + renewBefore: {{ .Values.filebeat.cert.renewBefore }} + commonName: {{ template "filebeat.dns" . }} + dnsNames: + - "{{ template "filebeat.dns" . }}" + issuerRef: + name: internal-issuer + kind: Issuer \ No newline at end of file diff --git a/templates/kibana.yaml b/templates/kibana.yaml index f3a9a3bcc08c8dc6f4321db711657df6a0302ffd..53948d99b5b2c443183ae1a22650f2aa1970087a 100644 --- a/templates/kibana.yaml +++ b/templates/kibana.yaml @@ -8,8 +8,12 @@ spec: count: {{ .Values.kibana.count }} image: {{ .Values.kibana.image }}:{{ default .Values.elasticVersion .Values.kibana.imageTag }} config: + server.ssl.enabled: true + server.ssl.certificate: /usr/share/kibana/config/certs/tls.crt + server.ssl.key: /usr/share/kibana/config/certs/tls.key + elasticsearch.ssl.certificateAuthorities: /usr/share/kibana/config/certs/ca.crt elasticsearch.requestTimeout: 120000 - elasticsearch.ssl.verificationMode: none + elasticsearch.ssl.verificationMode: full server.publicBaseUrl: "{{ template "kibana.dns.fullPath" . }}" {{- if and (.Values.kibana.ingressSubpath) (ne "/" .Values.kibana.ingressSubpath) }} server.basePath: {{ .Values.kibana.ingressSubpath }} @@ -39,24 +43,23 @@ spec: {{- end }} volumeMounts: - mountPath: /usr/share/kibana/config/elasticsearch-secrets-certs - name: secrets-certs + name: secrets-certs + - name: es-certs + mountPath: /usr/share/kibana/config/certs readinessProbe: httpGet: scheme: HTTPS path: {{- with .Values.kibana.ingressSubpath }} {{ . }} {{- end }} port: 5601 - env: - - name: NODE_EXTRA_CA_CERTS - value: /usr/share/kibana/config/elasticsearch-secrets-certs/ca.crt - {{- with .Values.kibana.env }} - {{- toYaml . | nindent 10 }} - {{- end }} volumes: - name: secrets-certs projected: sources: - secret: - name: elastic-kibana-cert-secret + name: {{ .Release.Name }}-kibana-cert-secret + - name: es-certs + secret: + secretName: elastic-elasticsearch-http-cert-secret-internal http: tls: certificate: diff --git a/templates/logstash_beats.yaml b/templates/logstash_beats.yaml index ff650212de719686b1d18f53e20b443e47639e09..1422171884fa737793f4568b58c4aed420ba9f3a 100644 --- a/templates/logstash_beats.yaml +++ b/templates/logstash_beats.yaml @@ -34,10 +34,12 @@ spec: selector: statefulset.kubernetes.io/pod-name: logstash-beats-ls-{{$index}} {{- end}} - config: - {{- with .Values.logstash.config }} - {{- toYaml . | nindent 4 }} - {{- end }} + config: + xpack.monitoring.enabled: true + xpack.monitoring.elasticsearch.hosts: ["${ELASTIC_ELASTICSEARCH_ES_HOSTS}"] + xpack.monitoring.elasticsearch.username: "${MONITORING_USER}" + xpack.monitoring.elasticsearch.password: "${MONITORING_PASSWORD}" + xpack.monitoring.elasticsearch.ssl.certificate_authority: /usr/share/logstash/config/certs/ca.crt podTemplate: metadata: labels: @@ -55,6 +57,10 @@ spec: mountPath: /app/elastic/logstash/config/pipelines/{{- .name -}}.config subPath: {{ .name -}}.config {{- end }} + - name: es-certs + mountPath: /usr/share/logstash/config/certs + - mountPath: /usr/share/logstash/certs-logstash + name: certs-logstash env: - name: LOGSTASH_USER valueFrom: @@ -65,9 +71,23 @@ spec: valueFrom: secretKeyRef: name: logstash-writer-secret - key: password + key: password + - name: MONITORING_USER + valueFrom: + secretKeyRef: + name: user-monitoring-secret + key: username + - name: MONITORING_PASSWORD + valueFrom: + secretKeyRef: + name: user-monitoring-secret + key: password - name: ELASTIC_ELASTICSEARCH_ES_HOSTS value: 'https://elastic-elasticsearch-es-http.{{ .Release.Namespace }}.svc:9200' + - name: ELASTICSEARCH_SSL_CERTIFICATE_VERIFICATION + value: "true" + - name: ELASTICSEARCH_SSL_CA_PATH + value: "/usr/share/logstash/config/certs/ca.crt" volumes: {{- range .Values.logstash.beats.pipelines }} - name: pipeline-config-{{- .name }} @@ -75,6 +95,12 @@ spec: name: logstash-{{- $.Values.logstash.beats.pipelines_group_name -}}-{{- .name -}}-config defaultMode: 511 {{- end }} + - name: es-certs + secret: + secretName: elastic-elasticsearch-http-cert-secret-internal + - name: certs-logstash + secret: + secretName: logstash-secret-{{ .Values.logstash.beats.pipelines_group_name }} pipelinesRef: secretName: logstash-{{ .Values.logstash.beats.pipelines_group_name }}-pipelines-yml --- @@ -98,3 +124,63 @@ data: {{ tpl .output $ | nindent 6 }} --- {{- end }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: logstash-api-{{ .Values.logstash.beats.pipelines_group_name }} + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "true" + nginx.ingress.kubernetes.io/proxy-body-size: 50m + external-dns.alpha.kubernetes.io/hostname: "{{ template "logstash.dns" . }},{{- include "logstash.dns.array" . | trim}}" +spec: + ingressClassName: nginx + tls: + - hosts: + - {{ template "logstash.dns" . }} + secretName: logstash-secret-{{ .Values.logstash.beats.pipelines_group_name }} + rules: + - host: {{ template "logstash.dns" . }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: logstash-{{ .Values.logstash.beats.pipelines_group_name }}-ls-api + port: + number: 9600 +--- +{{ $concatUrl := (include "logstash.dns" .) }} +{{ $prefix := (default "l" .Values.logstash.urlPrefix) }} +{{- range $index_i := until (.Values.logstash.count |int ) -}} +{{- printf "\n"}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: tcp-services-{{ $.Values.logstash.pipelines_group_name }}-{{$index_i}} +data: + 5044: "observability/logstash-{{ $.Values.logstash.beats.pipelines_group_name }}-ls-{{$index_i}}:5044" +{{- end }} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: logstash-{{ .Values.logstash.beats.pipelines_group_name }} +spec: + duration: {{ .Values.logstash.cert.duration }} + renewBefore: {{ .Values.logstash.cert.renewBefore }} + commonName: {{ template "logstash.dns" . }} + secretName: logstash-secret-{{ .Values.logstash.beats.pipelines_group_name }} + dnsNames: + - "{{ template "logstash.dns" . }}" +{{- range $index_i := until (.Values.logstash.count |int ) }} + - "{{$prefix}}{{$index_i}}.{{$concatUrl}}" +{{- end }} + - "logstash.{{ .Release.Namespace }}" + - "logstash-{{ .Values.logstash.beats.pipelines_group_name }}-ls-api.{{ .Release.Namespace }}" + issuerRef: + name: internal-issuer + kind: Issuer + privateKey: + encoding: "PKCS8" +--- \ No newline at end of file diff --git a/values/dev/observability-operator/values.yaml b/values/dev/observability-operator/values.yaml index 31e909cb195e956c26df4ab20d57731df4c932b1..a02b93c301e0100a56f7bcdf4845ee645ea99820 100644 --- a/values/dev/observability-operator/values.yaml +++ b/values/dev/observability-operator/values.yaml @@ -5,4 +5,4 @@ createClusterScopedResources: false webhook: enabled: false config: - validateStorageClass: true \ No newline at end of file + validateStorageClass: false \ No newline at end of file diff --git a/values/dev/observability/values.yaml b/values/dev/observability/values.yaml index 5513fb28b8e3ea32a29473abba07c48af70b7bb8..d4feb65243c2bd27aac293a3d403c1d4374a2247 100644 --- a/values/dev/observability/values.yaml +++ b/values/dev/observability/values.yaml @@ -114,6 +114,9 @@ logstash: memory: 4Gi limits: memory: 4Gi + cert: + duration: 2160h0m0s # 90d + renewBefore: 360h0m0s # 15d pipelines_yml_config: |- - pipeline.id: main path.config: "/app/elastic/logstash/config/pipelines/*.config" @@ -131,6 +134,11 @@ logstash: input { beats { port => 5044 + ssl => true + ssl_certificate_authorities => ["/usr/share/logstash/certs-logstash/ca.crt"] + ssl_certificate => "/usr/share/logstash/certs-logstash/tls.crt" + ssl_key => "/usr/share/logstash/certs-logstash/tls.key" + ssl_verify_mode => "force_peer" } } filter: |- @@ -146,8 +154,9 @@ logstash: hosts => [ "${ELASTIC_ELASTICSEARCH_ES_HOSTS}" ] user => "${LOGSTASH_USER}" password => "${LOGSTASH_PASSWORD}" - ssl => true - ssl_certificate_verification => false + ssl_enabled => "true" + ssl_verification_mode => "full" + ssl_certificate_authorities => "/usr/share/logstash/config/certs/ca.crt" data_stream => "true" data_stream_type => "logs" data_stream_dataset => "filebeat" @@ -178,8 +187,9 @@ logstash: index => "%{[@metadata][beat]}-%{[@metadata][version]}" user => "${LOGSTASH_USER}" password => "${LOGSTASH_PASSWORD}" - ssl => true - ssl_certificate_verification => false + ssl_enabled => "true" + ssl_verification_mode => "full" + ssl_certificate_authorities => "${ELASTIC_ELASTICSEARCH_ES_SSL_CERTIFICATE_AUTHORITY}" } stdout { codec => rubydebug @@ -196,7 +206,9 @@ filebeat: # Number of messages per minute. Provide negative number to generate messages without time limit. messagesPerMinute: 30 - + cert: + duration: 2160h0m0s # 90d + renewBefore: 360h0m0s # 15d # Filebeat configuration file - input input: | filebeat.inputs: @@ -219,7 +231,15 @@ filebeat: name: "test" output: | output.logstash: - hosts: ["logstash-beats-ls-beats-0.observability.svc:5044"] - - - + hosts: ["${LOGSTASH_HOSTS}"] + ssl.enabled: true + ssl.certificate_authorities: ["/usr/share/filebeat/es-certs/ca.crt"] + ssl.verification_mode: full + ssl.certificate: "/usr/share/filebeat/certs/tls.crt" + ssl.key: "/usr/share/filebeat/certs/tls.key" + monitoring.enabled: "true" + monitoring.elasticsearch: + hosts: ["${ELASTIC_ELASTICSEARCH_ES_HOSTS}"] + ssl.certificate_authorities: ["/usr/share/filebeat/es-certs/ca.crt"] + username: "${MONITORING_USER}" + password: "${MONITORING_PASSWORD}" \ No newline at end of file