29 Sicherheit in OpenSearch

Die Absicherung Ihrer OpenSearch-Umgebung ist von fundamentaler Bedeutung für den sicheren Betrieb Ihrer Anwendungen. In diesem Kapitel lernen Sie, wie Sie OpenSearch effektiv absichern können. Wir beginnen mit den grundlegenden Konzepten und arbeiten uns zu fortgeschrittenen Sicherheitsmaßnahmen vor.

29.1 Grundlegende Sicherheitskonzepte verstehen

Bevor wir uns mit den technischen Details befassen, ist es wichtig, die grundlegenden Sicherheitskonzepte in OpenSearch zu verstehen. Die Sicherheitsarchitektur basiert auf mehreren Säulen:

  1. Authentifizierung: Wer sind die Benutzer?
  2. Autorisierung: Was dürfen diese Benutzer tun?
  3. Verschlüsselung: Wie werden die Daten geschützt?
  4. Audit-Logging: Wie werden Aktivitäten protokolliert?

Stellen Sie sich diese Säulen wie verschiedene Verteidigungslinien vor, die zusammenarbeiten, um Ihre Daten zu schützen.

29.2 Transport Layer Security (TLS) einrichten

Die erste Verteidigungslinie ist die Verschlüsselung der Kommunikation. Hierfür verwenden wir TLS. Lassen Sie uns Schritt für Schritt durch die Einrichtung gehen:

# config/opensearch.yml
plugins.security.ssl.transport.pemcert_filepath: certs/node.pem
plugins.security.ssl.transport.pemkey_filepath: certs/node-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: certs/root-ca.pem
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: certs/node.pem
plugins.security.ssl.http.pemkey_filepath: certs/node-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: certs/root-ca.pem

Für die Zertifikatserstellung können Sie das mitgelieferte Skript verwenden:

./plugins/opensearch-security/tools/cert-generator.sh

Dieser Befehl erstellt ein komplettes Set von Zertifikaten:

29.3 Benutzer und Rollen verwalten

Die Benutzerverwaltung in OpenSearch folgt dem Prinzip der geringsten Privilegien. Das bedeutet, dass Benutzer nur die Rechte erhalten, die sie für ihre Arbeit benötigen.

29.3.1 Benutzer erstellen

Benutzer können über die REST-API oder über Konfigurationsdateien erstellt werden:

PUT _plugins/_security/api/internalusers/analyst
{
  "password": "secure-password123",
  "attributes": {
    "department": "Analytics"
  },
  "backend_roles": ["analyst_role"]
}

Die Attribute ermöglichen es uns, zusätzliche Metadaten mit dem Benutzer zu verknüpfen, die wir später für die Zugriffskontrolle verwenden können.

29.3.2 Rollen definieren

Rollen definieren die eigentlichen Berechtigungen:

PUT _plugins/_security/api/roles/analyst_role
{
  "cluster_permissions": [
    "cluster:monitor/main",
    "cluster:monitor/health"
  ],
  "index_permissions": [{
    "index_patterns": ["logs-*"],
    "allowed_actions": [
      "read",
      "search"
    ],
    "field_level_security": {
      "grant": ["timestamp", "message", "level"],
      "except": ["sensitive_data"]
    }
  }]
}

Diese Rolle ermöglicht:

29.3.3 Role Mapping

Das Role Mapping verbindet Benutzer mit ihren Rollen:

PUT _plugins/_security/api/rolesmapping/analyst_role
{
  "backend_roles": ["analyst"],
  "hosts": [],
  "users": ["analyst1", "analyst2"]
}

29.4 Multi-Tenancy implementieren

Multi-Tenancy ermöglicht die sichere Trennung von Daten verschiedener Mandanten:

# opensearch_dashboards.yml
opensearch_security.multitenancy.enabled: true
opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"]
opensearch_security.multitenancy.enable_global: true

Ein praktisches Beispiel für die Tenant-Konfiguration:

PUT _plugins/_security/api/roles/company_role
{
  "tenant_permissions": [{
    "tenant_patterns": ["company_${user.attributes.company_id}"],
    "allowed_actions": ["kibana_all_write"]
  }]
}

29.5 Audit Logging einrichten

Audit Logging ist essentiell für die Nachverfolgbarkeit von Aktivitäten:

# config/opensearch.yml
plugins.security.audit.type: internal_opensearch
plugins.security.audit.config.disabled_rest_categories: NONE
plugins.security.audit.config.disabled_transport_categories: NONE
plugins.security.audit.config.routes:
  - route_name: "COMPLIANCE_ROUTE"
    indices: ["audit-*"]
    exclude_sensitive_headers: false

Ein spezielles Mapping für Audit-Logs:

PUT audit-logs-2024
{
  "mappings": {
    "properties": {
      "timestamp": { "type": "date" },
      "actor": {
        "properties": {
          "name": { "type": "keyword" },
          "roles": { "type": "keyword" }
        }
      },
      "action": { "type": "keyword" },
      "indices": { "type": "keyword" },
      "request": { "type": "object", "enabled": false },
      "response": { "type": "object", "enabled": false }
    }
  }
}

29.6 Erweiterte Sicherheitsfunktionen

29.6.1 IP-Filtering

Zugriffskontrolle basierend auf IP-Adressen:

plugins.security.http.ipfilter:
  - name: "Allow internal network"
    type: allow
    networks: ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]

29.6.2 LDAP/Active Directory Integration

Integration mit externen Authentifizierungssystemen:

plugins.security.authc.backends.ldap:
  type: ldap
  order: 1
  config:
    enable_ssl: true
    host: "ldap.example.com"
    port: 636
    bind_dn: "cn=admin,dc=example,dc=com"
    password: "admin-password"
    userbase: "ou=people,dc=example,dc=com"
    usersearch: "(uid={0})"

29.6.3 Custom Authentication

Implementierung eigener Authentifizierungsmechanismen:

public class CustomAuthenticator extends HTTPJwtAuthenticator {
    @Override
    public AuthCredentials extractCredentials(final RestRequest request) {
        // Eigene Authentifizierungslogik implementieren
        String token = request.header("Authorization");
        // Token validieren und Berechtigungen extrahieren
        return new AuthCredentials("user", new String[]{"role1", "role2"});
    }
}

29.7 Security Best Practices

  1. Zertifikatsverwaltung

  2. Passwort-Policies

    PUT _plugins/_security/api/securityconfig
    {
      "password_policy": {
        "minimum_length": 12,
        "require_numbers": true,
        "require_lowercase": true,
        "require_uppercase": true,
        "require_symbols": true
      }
    }
  3. Monitoring und Alerting

    PUT _plugins/_alerting/monitors/security_monitor
    {
      "type": "monitor",
      "name": "Security Events Monitor",
      "enabled": true,
      "schedule": {
        "period": {
          "interval": 5,
          "unit": "MINUTES"
        }
      },
      "inputs": [{
        "search": {
          "indices": ["audit-*"],
          "query": {
            "bool": {
              "must": [{
                "range": {
                  "timestamp": {
                    "gte": "now-5m"
                  }
                }
              }],
              "should": [{
                "term": {
                  "action": "FAILED_LOGIN"
                }
              }]
            }
          }
        }
      }],
      "triggers": [{
        "name": "Security Alert",
        "severity": "High",
        "condition": {
          "script": {
            "source": "ctx.results[0].hits.total.value > 5"
          }
        }
      }]
    }

29.8 Troubleshooting

Hier sind einige häufige Probleme und ihre Lösungen:

  1. TLS-Probleme

    # Zertifikate überprüfen
    openssl x509 -in node.pem -text -noout
    
    # TLS-Verbindung testen
    openssl s_client -connect localhost:9200
  2. Authentifizierungsfehler

    # Benutzerrechte überprüfen
    GET _plugins/_security/api/user/admin
    
    # Rolleneinstellungen anzeigen
    GET _plugins/_security/api/roles/admin_role
  3. Audit-Log-Probleme

    # Audit-Logs überprüfen
    GET audit-*/_search
    {
      "query": {
        "bool": {
          "must": [
            { "term": { "action": "FAILED_LOGIN" }},
            { "range": { "timestamp": { "gte": "now-1h" }}}
          ]
        }
      }
    }

Die Sicherheit Ihrer OpenSearch-Umgebung ist ein kontinuierlicher Prozess, der regelmäßige Überprüfungen und Anpassungen erfordert. Mit den in diesem Kapitel vorgestellten Konzepten und Werkzeugen können Sie eine robuste Sicherheitsarchitektur aufbauen und aufrechterhalten.