fix(osint-dashboard): fix critical manifest issues found during audit

- Fix PostgreSQL topologySpreadConstraints label selector (cnpg.io/cluster)
- Fix Ingress HTTPRoutes: route API and WS traffic to correct backends
- Fix API NetworkPolicy port mismatch (4000 -> 8000)
- Fix MinIO bucket index syntax (_0 -> 0) in ConfigMap
- Add postgresql.port and postgresql.database to values.yaml
- Add container-level securityContext to API deployment
- Restrict monitoring NetworkPolicy ingress to monitoring namespace
- Enable readOnlyRootFilesystem for MinIO container
- Add activeDeadlineSeconds (3600s) to all 4 CronJobs
This commit is contained in:
sirius0xdev 2026-05-23 04:38:51 +00:00
parent 87c22e71a4
commit 54f2f42710
9 changed files with 35 additions and 10 deletions

View file

@ -14,9 +14,9 @@ data:
NATS_URLS: "nats://{{ include \"osint-dashboard.fullname\" . }}-nats.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.nats.ports.client }}" NATS_URLS: "nats://{{ include \"osint-dashboard.fullname\" . }}-nats.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.nats.ports.client }}"
REDIS_URL: "redis://{{ include \"osint-dashboard.fullname\" . }}-redis.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.redis.ports.redis }}/0" REDIS_URL: "redis://{{ include \"osint-dashboard.fullname\" . }}-redis.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.redis.ports.redis }}/0"
MINIO_ENDPOINT: "{{ include \"osint-dashboard.fullname\" . }}-minio.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.minio.ports.api }}" MINIO_ENDPOINT: "{{ include \"osint-dashboard.fullname\" . }}-minio.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.minio.ports.api }}"
MINIO_BUCKET_VIDEO: "{{ .Values.minio.buckets._0.name | default \"osint-video-clips\" }}" MINIO_BUCKET_VIDEO: "{{ .Values.minio.buckets.0.name | default \"osint-video-clips\" }}"
MINIO_BUCKET_SATELLITE: "{{ .Values.minio.buckets._1.name | default \"osint-satellite-tiles\" }}" MINIO_BUCKET_SATELLITE: "{{ .Values.minio.buckets.1.name | default \"osint-satellite-tiles\" }}"
MINIO_BUCKET_DATA: "{{ .Values.minio.buckets._2.name | default \"osint-data-dumps\" }}" MINIO_BUCKET_DATA: "{{ .Values.minio.buckets.2.name | default \"osint-data-dumps\" }}"
PYTHONPATH: "/app/app" PYTHONPATH: "/app/app"
PYTHONUNBUFFERED: "1" PYTHONUNBUFFERED: "1"
PYTHONDONTWRITEBYTECODE: "1" PYTHONDONTWRITEBYTECODE: "1"

View file

@ -10,6 +10,7 @@ metadata:
spec: spec:
schedule: "*/5 * * * *" schedule: "*/5 * * * *"
concurrencyPolicy: Forbid concurrencyPolicy: Forbid
activeDeadlineSeconds: 3600
successfulJobsHistoryLimit: 3 successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3 failedJobsHistoryLimit: 3
jobTemplate: jobTemplate:
@ -62,6 +63,7 @@ metadata:
spec: spec:
schedule: "*/15 * * * *" schedule: "*/15 * * * *"
concurrencyPolicy: Forbid concurrencyPolicy: Forbid
activeDeadlineSeconds: 3600
successfulJobsHistoryLimit: 3 successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3 failedJobsHistoryLimit: 3
jobTemplate: jobTemplate:
@ -114,6 +116,7 @@ metadata:
spec: spec:
schedule: "0 * * * *" schedule: "0 * * * *"
concurrencyPolicy: Forbid concurrencyPolicy: Forbid
activeDeadlineSeconds: 3600
successfulJobsHistoryLimit: 3 successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3 failedJobsHistoryLimit: 3
jobTemplate: jobTemplate:
@ -166,6 +169,7 @@ metadata:
spec: spec:
schedule: "*/2 * * * *" schedule: "*/2 * * * *"
concurrencyPolicy: Forbid concurrencyPolicy: Forbid
activeDeadlineSeconds: 3600
successfulJobsHistoryLimit: 3 successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3 failedJobsHistoryLimit: 3
jobTemplate: jobTemplate:

View file

@ -53,6 +53,11 @@ spec:
secretKeyRef: secretKeyRef:
name: {{ .Values.postgresql.credentialsSecret }} name: {{ .Values.postgresql.credentialsSecret }}
key: password key: password
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
startupProbe: startupProbe:
httpGet: httpGet:
path: /api/health path: /api/health

View file

@ -19,8 +19,19 @@ spec:
type: PathPrefix type: PathPrefix
value: {{ $rule.path }} value: {{ $rule.path }}
backendRefs: backendRefs:
{{- if eq $host.host "dashboard.siriusdevops.com" }}
- name: dashboard-web - name: dashboard-web
port: 3000 port: 3000
{{- else if eq $host.host "api.siriusdevops.com" }}
- name: {{ include "osint-dashboard.fullname" $ }}-api
port: 8000
{{- else if eq $host.host "ws.siriusdevops.com" }}
- name: {{ include "osint-dashboard.fullname" $ }}-api
port: 8000
{{- else }}
- name: dashboard-web
port: 3000
{{- end }}
weight: 100 weight: 100
{{- end }} {{- end }}
--- ---

View file

@ -69,7 +69,7 @@ spec:
periodSeconds: 10 periodSeconds: 10
securityContext: securityContext:
allowPrivilegeEscalation: false allowPrivilegeEscalation: false
readOnlyRootFilesystem: false readOnlyRootFilesystem: true
capabilities: capabilities:
drop: ["ALL"] drop: ["ALL"]
volumeClaimTemplates: volumeClaimTemplates:

View file

@ -144,7 +144,7 @@ spec:
whenUnsatisfiable: DoNotSchedule whenUnsatisfiable: DoNotSchedule
labelSelector: labelSelector:
matchLabels: matchLabels:
postgresql operator: {{ .Values.postgresql.clusterName }} postgresql.cnpg.io/cluster: {{ .Values.postgresql.clusterName }}
nodesAutoRemediationChecks: nodesAutoRemediationChecks:
livenessProbe: livenessProbe:
initialDelaySeconds: 10 initialDelaySeconds: 10

View file

@ -44,7 +44,7 @@ spec:
app.kubernetes.io/component: api app.kubernetes.io/component: api
ports: ports:
- protocol: TCP - protocol: TCP
port: 4000 port: 8000
# Allow to external APIs (GDelt, satellite providers) # Allow to external APIs (GDelt, satellite providers)
- to: - to:
- ipBlock: - ipBlock:
@ -78,7 +78,7 @@ spec:
app.kubernetes.io/component: web app.kubernetes.io/component: web
ports: ports:
- protocol: TCP - protocol: TCP
port: 4000 port: 8000
# Allow from ingress controller / Gateway API # Allow from ingress controller / Gateway API
- from: - from:
- namespaceSelector: - namespaceSelector:
@ -86,7 +86,7 @@ spec:
kubernetes.io/metadata.name: ingress-nginx kubernetes.io/metadata.name: ingress-nginx
ports: ports:
- protocol: TCP - protocol: TCP
port: 4000 port: 8000
egress: egress:
# Allow DNS # Allow DNS
- to: - to:

View file

@ -16,8 +16,11 @@ spec:
- Ingress - Ingress
- Egress - Egress
ingress: ingress:
# Allow Grafana web access # Allow Grafana web access from monitoring namespace
- from: [] - from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
ports: ports:
- protocol: TCP - protocol: TCP
port: {{ .Values.monitoring.grafana.port }} port: {{ .Values.monitoring.grafana.port }}

View file

@ -31,6 +31,8 @@ postgresql:
imageName: ghcr.io/cloudnative-pg/postgresql:16 imageName: ghcr.io/cloudnative-pg/postgresql:16
# Custom image with PostGIS + TimescaleDB # Custom image with PostGIS + TimescaleDB
# Use CNPG bootstrap to create extensions # Use CNPG bootstrap to create extensions
port: 5432
database: osint
storage: storage:
size: 200Gi size: 200Gi
storageClass: premium-rwo storageClass: premium-rwo