diff --git a/.env.sample b/.env.sample index 7407c044..cc0d7d32 100644 --- a/.env.sample +++ b/.env.sample @@ -17,6 +17,10 @@ ELASTIC_MEMORY_SIZE=4G XTM_COMPOSER_ID=8215614c-7139-422e-b825-b20fd2a13a23 COMPOSE_PROJECT_NAME=xtm +# Shared secret used to register the platforms with XTM One. +# All platforms sharing an XTM One instance MUST use the same value. +PLATFORM_REGISTRATION_TOKEN=ChangeMeWithGeneratedRandomString # [MANDATORY] Replace with a long random string (e.g. `openssl rand -hex 32`) + ########################### # OPENCTI # ########################### @@ -24,7 +28,7 @@ COMPOSE_PROJECT_NAME=xtm OPENCTI_HOST=localhost OPENCTI_PORT=8080 OPENCTI_EXTERNAL_SCHEME=http -OPENCTI_ADMIN_EMAIL=admin@opencti.io +OPENCTI_ADMIN_EMAIL=admin@filigran.io OPENCTI_ADMIN_PASSWORD=changeme OPENCTI_ADMIN_TOKEN=ChangeMe_UUIDv4 OPENCTI_HEALTHCHECK_ACCESS_KEY=changeme @@ -48,4 +52,27 @@ CONNECTOR_ANALYSIS_ID=4dffd77c-ec11-4abe-bca7-fd997f79fa36 ########################### CONNECTOR_OPENCTI_ID=dd010812-9027-4726-bf7b-4936979955ae -CONNECTOR_MITRE_ID=8307ea1e-9356-408c-a510-2d7f8b28a0e2 \ No newline at end of file +CONNECTOR_MITRE_ID=8307ea1e-9356-408c-a510-2d7f8b28a0e2 + +########################### +# XTM ONE # +########################### + +XTM_ONE_HOST=localhost +XTM_ONE_PORT=8090 +XTM_ONE_EXTERNAL_SCHEME=http +# Must match the admin email of the connected platform(s) so XTM One's JWT +# email claim resolves to an existing user. +XTM_ONE_ADMIN_EMAIL=admin@filigran.io +XTM_ONE_ADMIN_PASSWORD=changeme +# Long random string (e.g. `openssl rand -hex 32`). Used to sign sessions/tokens. +XTM_ONE_SECRET_KEY=ChangeMeWithGeneratedRandomString +# Credentials for the dedicated pgsql-xtm-one Postgres instance. +XTM_ONE_POSTGRES_USER=xtmone +XTM_ONE_POSTGRES_PASSWORD=ChangeMe +# Optional: bucket name in MinIO (auto-created on first boot) +XTM_ONE_S3_BUCKET=xtm-one-files +# Optional: enterprise license PEM (leave empty in xtm_one mode) +XTM_ONE_ENTERPRISE_LICENSE= +XTM_ONE_LOG_LEVEL=info +XTM_ONE_LOG_FORMAT=json \ No newline at end of file diff --git a/docker-compose.opensearch.yml b/docker-compose.opensearch.yml index 4828f5e7..20b52580 100644 --- a/docker-compose.opensearch.yml +++ b/docker-compose.opensearch.yml @@ -150,6 +150,9 @@ services: - SMTP__PORT=25 - PROVIDERS__LOCAL__STRATEGY=LocalStrategy - APP__HEALTH_ACCESS_KEY=${OPENCTI_HEALTHCHECK_ACCESS_KEY} + # XTM One + - XTM__XTM_ONE_URL=http://xtm-one:4000 + - XTM__XTM_ONE_TOKEN=${PLATFORM_REGISTRATION_TOKEN} ports: - "${OPENCTI_PORT}:8080" depends_on: @@ -329,9 +332,92 @@ services: opencti: condition: service_healthy + ########################### + # XTM ONE # + ########################### + + pgsql-xtm-one: + # Dedicated pgvector-enabled instance for XTM One. + image: pgvector/pgvector:pg17 + environment: + POSTGRES_USER: ${XTM_ONE_POSTGRES_USER} + POSTGRES_PASSWORD: ${XTM_ONE_POSTGRES_PASSWORD} + POSTGRES_DB: xtm_one + volumes: + - pgsqlxtmonedata:/var/lib/postgresql/data + restart: always + healthcheck: + test: [ "CMD", "pg_isready", "-U", "${XTM_ONE_POSTGRES_USER}", "-d", "xtm_one" ] + interval: 10s + timeout: 5s + retries: 5 + + xtm-one: + image: xtmone/platform:latest + environment: + - PLATFORM_MODE=xtm_one + - PLATFORM_REGISTRATION_TOKEN=${PLATFORM_REGISTRATION_TOKEN} + - BASE_URL=${XTM_ONE_EXTERNAL_SCHEME}://${XTM_ONE_HOST}:${XTM_ONE_PORT} + - FRONTEND_URL=${XTM_ONE_EXTERNAL_SCHEME}://${XTM_ONE_HOST}:${XTM_ONE_PORT} + - ADMIN_EMAIL=${XTM_ONE_ADMIN_EMAIL} + - ADMIN_PASSWORD=${XTM_ONE_ADMIN_PASSWORD} + - SECRET_KEY=${XTM_ONE_SECRET_KEY} + - DATABASE_URL=postgresql+asyncpg://${XTM_ONE_POSTGRES_USER}:${XTM_ONE_POSTGRES_PASSWORD}@pgsql-xtm-one:5432/xtm_one + - REDIS_URL=redis://redis:6379 + - S3_ENDPOINT=minio:9000 + - S3_ACCESS_KEY=${MINIO_ROOT_USER} + - S3_SECRET_KEY=${MINIO_ROOT_PASSWORD} + - S3_BUCKET=${XTM_ONE_S3_BUCKET:-xtm-one-files} + - S3_USE_SSL=false + - LOG_LEVEL=${XTM_ONE_LOG_LEVEL:-info} + - LOG_FORMAT=${XTM_ONE_LOG_FORMAT:-json} + - ENTERPRISE_LICENSE=${XTM_ONE_ENTERPRISE_LICENSE:-} + # Internal API endpoint for the OpenCTI integration (Docker hostname) + - OPENCTI_API_URL=http://opencti:8080 + ports: + - "${XTM_ONE_PORT}:4000" + depends_on: + pgsql-xtm-one: + condition: service_healthy + redis: + condition: service_healthy + minio: + condition: service_healthy + restart: always + healthcheck: + test: ["CMD-SHELL", "curl -fsS http://localhost:4000/api/health || exit 1"] + interval: 15s + timeout: 10s + retries: 5 + start_period: 60s + + xtm-one-worker: + image: xtmone/worker:latest + environment: + - PLATFORM_MODE=xtm_one + - PLATFORM_REGISTRATION_TOKEN=${PLATFORM_REGISTRATION_TOKEN} + - ADMIN_EMAIL=${XTM_ONE_ADMIN_EMAIL} + - ADMIN_PASSWORD=${XTM_ONE_ADMIN_PASSWORD} + - SECRET_KEY=${XTM_ONE_SECRET_KEY} + - DATABASE_URL=postgresql+asyncpg://${XTM_ONE_POSTGRES_USER}:${XTM_ONE_POSTGRES_PASSWORD}@pgsql-xtm-one:5432/xtm_one + - REDIS_URL=redis://redis:6379 + - S3_ENDPOINT=minio:9000 + - S3_ACCESS_KEY=${MINIO_ROOT_USER} + - S3_SECRET_KEY=${MINIO_ROOT_PASSWORD} + - S3_BUCKET=${XTM_ONE_S3_BUCKET:-xtm-one-files} + - S3_USE_SSL=false + - LOG_LEVEL=${XTM_ONE_LOG_LEVEL:-info} + - LOG_FORMAT=${XTM_ONE_LOG_FORMAT:-json} + - ENTERPRISE_LICENSE=${XTM_ONE_ENTERPRISE_LICENSE:-} + depends_on: + xtm-one: + condition: service_healthy + restart: always + volumes: esdata: s3data: redisdata: amqpdata: rsakeys: + pgsqlxtmonedata: diff --git a/docker-compose.yml b/docker-compose.yml index 244f4688..41535077 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -149,6 +149,9 @@ services: - SMTP__PORT=25 - PROVIDERS__LOCAL__STRATEGY=LocalStrategy - APP__HEALTH_ACCESS_KEY=${OPENCTI_HEALTHCHECK_ACCESS_KEY} + # XTM One + - XTM__XTM_ONE_URL=http://xtm-one:4000 + - XTM__XTM_ONE_TOKEN=${PLATFORM_REGISTRATION_TOKEN} ports: - "${OPENCTI_PORT}:8080" depends_on: @@ -326,7 +329,89 @@ services: restart: always depends_on: opencti: - condition: service_healthy + condition: service_healthy + + ########################### + # XTM ONE # + ########################### + + pgsql-xtm-one: + # Dedicated pgvector-enabled instance for XTM One. + image: pgvector/pgvector:pg17 + environment: + POSTGRES_USER: ${XTM_ONE_POSTGRES_USER} + POSTGRES_PASSWORD: ${XTM_ONE_POSTGRES_PASSWORD} + POSTGRES_DB: xtm_one + volumes: + - pgsqlxtmonedata:/var/lib/postgresql/data + restart: always + healthcheck: + test: [ "CMD", "pg_isready", "-U", "${XTM_ONE_POSTGRES_USER}", "-d", "xtm_one" ] + interval: 10s + timeout: 5s + retries: 5 + + xtm-one: + image: xtmone/platform:latest + environment: + - PLATFORM_MODE=xtm_one + - PLATFORM_REGISTRATION_TOKEN=${PLATFORM_REGISTRATION_TOKEN} + - BASE_URL=${XTM_ONE_EXTERNAL_SCHEME}://${XTM_ONE_HOST}:${XTM_ONE_PORT} + - FRONTEND_URL=${XTM_ONE_EXTERNAL_SCHEME}://${XTM_ONE_HOST}:${XTM_ONE_PORT} + - ADMIN_EMAIL=${XTM_ONE_ADMIN_EMAIL} + - ADMIN_PASSWORD=${XTM_ONE_ADMIN_PASSWORD} + - SECRET_KEY=${XTM_ONE_SECRET_KEY} + - DATABASE_URL=postgresql+asyncpg://${XTM_ONE_POSTGRES_USER}:${XTM_ONE_POSTGRES_PASSWORD}@pgsql-xtm-one:5432/xtm_one + - REDIS_URL=redis://redis:6379 + - S3_ENDPOINT=minio:9000 + - S3_ACCESS_KEY=${MINIO_ROOT_USER} + - S3_SECRET_KEY=${MINIO_ROOT_PASSWORD} + - S3_BUCKET=${XTM_ONE_S3_BUCKET:-xtm-one-files} + - S3_USE_SSL=false + - LOG_LEVEL=${XTM_ONE_LOG_LEVEL:-info} + - LOG_FORMAT=${XTM_ONE_LOG_FORMAT:-json} + - ENTERPRISE_LICENSE=${XTM_ONE_ENTERPRISE_LICENSE:-} + # Internal API endpoint for the OpenCTI integration (Docker hostname) + - OPENCTI_API_URL=http://opencti:8080 + ports: + - "${XTM_ONE_PORT}:4000" + depends_on: + pgsql-xtm-one: + condition: service_healthy + redis: + condition: service_healthy + minio: + condition: service_healthy + restart: always + healthcheck: + test: ["CMD-SHELL", "curl -fsS http://localhost:4000/api/health || exit 1"] + interval: 15s + timeout: 10s + retries: 5 + start_period: 60s + + xtm-one-worker: + image: xtmone/worker:latest + environment: + - PLATFORM_MODE=xtm_one + - PLATFORM_REGISTRATION_TOKEN=${PLATFORM_REGISTRATION_TOKEN} + - ADMIN_EMAIL=${XTM_ONE_ADMIN_EMAIL} + - ADMIN_PASSWORD=${XTM_ONE_ADMIN_PASSWORD} + - SECRET_KEY=${XTM_ONE_SECRET_KEY} + - DATABASE_URL=postgresql+asyncpg://${XTM_ONE_POSTGRES_USER}:${XTM_ONE_POSTGRES_PASSWORD}@pgsql-xtm-one:5432/xtm_one + - REDIS_URL=redis://redis:6379 + - S3_ENDPOINT=minio:9000 + - S3_ACCESS_KEY=${MINIO_ROOT_USER} + - S3_SECRET_KEY=${MINIO_ROOT_PASSWORD} + - S3_BUCKET=${XTM_ONE_S3_BUCKET:-xtm-one-files} + - S3_USE_SSL=false + - LOG_LEVEL=${XTM_ONE_LOG_LEVEL:-info} + - LOG_FORMAT=${XTM_ONE_LOG_FORMAT:-json} + - ENTERPRISE_LICENSE=${XTM_ONE_ENTERPRISE_LICENSE:-} + depends_on: + xtm-one: + condition: service_healthy + restart: always volumes: esdata: @@ -334,3 +419,4 @@ volumes: redisdata: amqpdata: rsakeys: + pgsqlxtmonedata: