Skip to main content

Security Validation

TreeOS implements comprehensive security validation for all Docker Compose configurations to ensure containers run safely and don't compromise the host system.

Overview

Before any container is started, TreeOS validates the docker-compose.yml file against strict security rules. This validation happens automatically when:

  • Creating apps from templates
  • Creating custom apps
  • Updating compose configurations
  • Starting containers

Security Rules

1. Privileged Mode

Rule: Containers cannot run with privileged: true

Why: Privileged containers have full access to the host system, including all devices and capabilities. This poses significant security risks.

Example of blocked configuration:

services:
app:
image: nginx
privileged: true # ❌ Not allowed

2. Dangerous Capabilities

Rule: Certain Docker capabilities are not allowed

Blocked capabilities:

  • SYS_ADMIN - Mount filesystems, change hostname, etc.
  • NET_ADMIN - Configure network interfaces
  • SYS_MODULE - Load/unload kernel modules
  • SYS_RAWIO - Raw I/O port operations
  • SYS_PTRACE - Trace processes
  • SYS_BOOT - Reboot the system
  • MAC_ADMIN - MAC configuration
  • MAC_OVERRIDE - Override MAC policies
  • DAC_READ_SEARCH - Bypass file read permission checks
  • SETFCAP - Set file capabilities

Example of blocked configuration:

services:
app:
image: nginx
cap_add:
- SYS_ADMIN # ❌ Not allowed

3. Bind Mount Restrictions

Rule: Host path bind mounts must follow strict patterns

Allowed bind mounts:

  1. Named volumes (recommended):

    volumes:
    - mydata:/data # ✅ Named volume - allowed
  2. Absolute paths within app's mount directory:

    volumes:
    - /opt/ontree/apps/mount/myapp/service/data:/data # ✅ Allowed
  3. Special exception - Shared resources directory (for AI apps):

    volumes:
    - /opt/ontree/shared/ollama:/models # ✅ Allowed for Ollama model sharing
    - ./shared/ollama:/root/.ollama # ✅ Allowed (relative path)

Blocked bind mounts:

services:
app:
image: nginx
volumes:
- /etc:/host-etc # ❌ Not allowed - outside mount directory
- ./data:/data # ❌ Not allowed - relative paths
- ~/data:/data # ❌ Not allowed - home directory access

Bind Mount Directory Structure

When you need to use bind mounts, they must follow this pattern:

/opt/ontree/apps/mount/{app-name}/{service-name}/

For example, if your app is named nextcloud with a service named app:

services:
app:
volumes:
- /opt/ontree/apps/mount/nextcloud/app/data:/var/www/html/data

Best Practices

1. Prefer Named Volumes

Named volumes are the recommended approach for persistent storage:

services:
database:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data # ✅ Best practice

volumes:
postgres_data: # Declare the named volume

2. Use Docker Configs for Configuration Files

Instead of bind-mounting configuration files, use Docker's config feature:

services:
app:
image: myapp
configs:
- source: app_config
target: /etc/app/config.yml

configs:
app_config:
content: |
# Your configuration here
setting: value

3. Environment Variables for Configuration

When possible, use environment variables instead of configuration files:

services:
app:
image: myapp
environment:
- DATABASE_URL=postgres://db/myapp
- REDIS_URL=redis://cache:6379

Validation Errors

When validation fails, you'll see detailed error messages:

Security validation failed for service 'app': bind mount path -
bind mount path './config' is not allowed. Use named volumes instead
(e.g., 'mydata:/path') or absolute paths within
'/opt/ontree/apps/mount/myapp/'

Working with Templates

TreeOS templates are pre-validated to ensure they meet security requirements. If you modify a template or create custom configurations, ensure they follow these security rules.

Exceptions and Special Cases

AI Model Sharing

The /opt/ontree/shared/ directory structure is specifically allowed for AI applications that need to share resources between containers:

  • /opt/ontree/shared/ollama - For Ollama model storage
  • Future: /opt/ontree/shared/<provider> - For other inference providers

This prevents duplicating multi-gigabyte model files across containers.

Development Mode

Security validation is always enforced, even in development mode. This ensures your applications are production-ready from the start.

Troubleshooting

"Bind mount path not allowed" Error

Problem: Your compose file uses relative paths or paths outside the allowed directory.

Solution:

  1. Convert to named volumes (recommended)
  2. Or use absolute paths within /opt/ontree/apps/mount/{app-name}/

"Dangerous capability" Error

Problem: Your container requests privileged capabilities.

Solution:

  1. Remove the capability from cap_add
  2. Find alternative approaches that don't require privileged access
  3. Use specific, less dangerous capabilities if needed

"Privileged mode not allowed" Error

Problem: Your container has privileged: true.

Solution:

  1. Remove the privileged flag
  2. Use specific capabilities instead (if allowed)
  3. Redesign your application to work without privileged access

Security Philosophy

TreeOS follows the principle of least privilege. Containers should only have access to what they absolutely need. This approach:

  • Prevents container escapes
  • Limits damage from compromised containers
  • Ensures multi-tenant safety
  • Maintains system stability

By enforcing these rules, TreeOS ensures your applications run securely without compromising the host system or other applications.