nip/docs/platform-detection.md

465 lines
12 KiB
Markdown

# Platform Detection and Isolation Strategy Selection
## Overview
The platform detection module (`src/nip/platform.nim`) provides runtime detection of OS capabilities and automatic selection of appropriate isolation strategies for multi-platform support.
**Core Philosophy:**
- **Detect, don't assume** - Query OS capabilities at runtime
- **Graceful degradation** - Fall back to simpler strategies when advanced features unavailable
- **Platform-native solutions** - Use each OS's native isolation tools
- **No false security** - Be honest about what each strategy provides
## Supported Platforms
| Platform | Isolation Strategy | Requirements | Security Level |
|----------|-------------------|--------------|-----------------|
| **Linux** | User Namespaces | Linux 4.19+ with CONFIG_USER_NS | ⭐⭐⭐⭐⭐ |
| **Linux** | POSIX Fallback | Any Linux | ⭐ (Merkle primary) |
| **FreeBSD** | Jails + nullfs | FreeBSD 11.0+ | ⭐⭐⭐⭐⭐ |
| **FreeBSD** | POSIX Fallback | Any FreeBSD | ⭐ (Merkle primary) |
| **OpenBSD** | Unveil + Pledge | OpenBSD 6.4+ | ⭐⭐⭐⭐ |
| **OpenBSD** | POSIX Fallback | Any OpenBSD | ⭐ (Merkle primary) |
| **macOS** | POSIX Fallback | Any macOS | ⭐ (Merkle primary) |
| **Embedded/IoT** | POSIX Fallback | Any system | ⭐ (Merkle primary) |
## Isolation Strategies
### 1. Linux User Namespaces (Preferred on Linux 4.19+)
**Mechanism:** `unshare -r -m` with read-only bind mount
**What it provides:**
- User-level isolation without root privilege
- Kernel-enforced read-only CAS mount
- Process cannot write even if it owns files
- True architectural isolation
**Security Level:** ⭐⭐⭐⭐⭐ (Kernel-enforced)
**When to use:**
- Linux systems with user namespace support
- Default for Linux 4.19+
- Provides strongest isolation
**Example:**
```bash
# Automatically selected on Linux with namespace support
nip install nginx
# Uses: unshare -r -m with read-only bind mount
```
### 2. FreeBSD Jails + nullfs (Elegant BSD Solution)
**Mechanism:** `jail` with read-only `nullfs` mount
**What it provides:**
- Lightweight container isolation
- Read-only nullfs mounts (BSD equivalent of bind mounts)
- Process confined to jail cannot escape
- Mature, battle-tested technology
**Security Level:** ⭐⭐⭐⭐⭐ (Kernel-enforced, mature)
**When to use:**
- FreeBSD systems (requires root)
- Provides excellent isolation
- More mature than Linux namespaces
**Example:**
```bash
# Automatically selected on FreeBSD with jail support
nip install nginx
# Uses: jail + nullfs read-only mount
```
### 3. OpenBSD Unveil + Pledge (Crypto-Anarchist's Dream)
**Mechanism:** `unveil()` for path-based access control + `pledge()` for capability restrictions
**What it provides:**
- Fine-grained path-based access control
- Capability-based security model
- Prevents privilege escalation
- Excellent for build wrappers
**Limitations:**
- `unveil` is reset on `exec()`
- Best for wrapper processes, not direct execution
- Requires explicit pledge() calls
**Security Level:** ⭐⭐⭐⭐ (Capability-based, but reset on exec)
**When to use:**
- OpenBSD systems
- Build wrappers and orchestration
- Not for direct package execution
**Example:**
```bash
# Automatically selected on OpenBSD with unveil support
nip install nginx
# Uses: unveil + pledge for capability restrictions
```
### 4. POSIX Fallback (chmod + Merkle Verification)
**Mechanism:** `chmod 555` for read-only + Merkle verification
**What it provides:**
- Prevents accidental deletion (UX convenience)
- Merkle verification detects tampering immediately
- Works everywhere
- Simple and reliable
**Limitations:**
- **NOT security against malicious actors**
- Users own their files and can change permissions
- Root can always write
- Relies on user discipline
**Security Level:** ⭐ (UX convenience only, Merkle is primary security)
**When to use:**
- Embedded/IoT systems without advanced features
- Fallback when better strategies unavailable
- Non-root users on systems without namespaces
- Always paired with Merkle verification
**Example:**
```bash
# Automatically selected on systems without advanced isolation
nip install nginx
# Uses: chmod 555 + Merkle verification
# ⚠️ WARNING: Running in user mode without kernel isolation
# CAS is protected by chmod 555 (UX convenience only)
# Real security comes from Merkle verification
```
## Platform Detection
### Automatic Detection
The platform detection happens automatically when nip starts:
```nim
let caps = detectPlatform()
let strategy = selectStrategy(caps)
```
This detects:
- **OS Type:** Linux, FreeBSD, OpenBSD, NetBSD, macOS, Embedded
- **Kernel Version:** For version-specific feature detection
- **Capabilities:** User namespaces, jails, unveil support
- **System Resources:** Memory, CPU count
- **Embedded Devices:** OpenWrt, Raspberry Pi, etc.
### Manual Override
You can override automatic detection via configuration:
```kdl
# nip-config.kdl
nip {
platform {
// Auto-detect platform and select strategy
auto_detect true
// Override auto-detection if needed
// force_strategy "posix" // "linux", "freebsd", "openbsd", "posix"
// Embedded device settings
embedded {
auto_detect true
max_concurrent_downloads 2
max_concurrent_builds 1
max_cache_size "100MB"
}
// Isolation settings
isolation {
// Prefer user mode on Linux (if available)
prefer_user_mode true
// Require root for system mode
require_root_for_system true
// Merkle verification (always enabled)
verify_chunks true
verify_signatures true
}
}
}
```
## Installation Modes
### User Mode (Linux with Namespaces Only)
**Requirements:**
- Linux 4.19+ with user namespace support
- No root privilege required
**Behavior:**
- Installs to `~/.nexus/envs/<env>/Programs/`
- Creates isolated namespace for each operation
- Kernel enforces read-only CAS mount
- Perfect for development and testing
**Example:**
```bash
nip install --user nginx
# Installs to ~/.nexus/envs/home/Programs/Nginx/
# Uses user namespace isolation
```
### System Mode (Root Required)
**Requirements:**
- Root privilege
- Any platform
**Behavior:**
- Installs to `/Programs/`
- System-wide installation
- Creates new system generation
- Requires root access
**Example:**
```bash
sudo nip install nginx
# Installs to /Programs/Nginx/
# Creates new system generation
```
## Embedded Device Support
### Automatic Detection
Embedded devices are detected via multiple indicators:
- OpenWrt release file
- Device tree (ARM devices)
- Memory < 512MB
- CPU count <= 2
- Raspberry Pi detection
### Resource Constraints
When embedded device is detected, nip automatically applies constraints:
```
📱 Embedded device detected
Memory: 256MB
CPUs: 1
Max concurrent downloads: 1
Max concurrent builds: 1
Max cache size: 50MB
Compression enabled: true
Deduplication enabled: true
Parallelization enabled: false
```
### Optimization
For embedded devices:
- Single-threaded builds
- Reduced cache size
- Aggressive compression
- Disabled parallelization on single-core
- Optimized for low memory
## Security Guarantees
### Linux with User Namespaces
```
⭐⭐⭐⭐⭐ Kernel-enforced read-only mount
⭐⭐⭐⭐⭐ Merkle verification (xxh3)
⭐⭐⭐⭐⭐ Signature verification (Ed25519)
```
**Guarantee:** Process cannot modify CAS even if compromised
### FreeBSD with Jails
```
⭐⭐⭐⭐⭐ Kernel-enforced jail isolation
⭐⭐⭐⭐⭐ Read-only nullfs mount
⭐⭐⭐⭐⭐ Merkle verification (xxh3)
⭐⭐⭐⭐⭐ Signature verification (Ed25519)
```
**Guarantee:** Process cannot escape jail or modify CAS
### OpenBSD with Unveil
```
⭐⭐⭐⭐ Capability-based security
⭐⭐⭐⭐⭐ Merkle verification (xxh3)
⭐⭐⭐⭐⭐ Signature verification (Ed25519)
```
**Guarantee:** Process capabilities restricted, tampering detected
### POSIX Fallback
```
⭐ chmod 555 (UX convenience)
⭐⭐⭐⭐⭐ Merkle verification (xxh3) - PRIMARY SECURITY
⭐⭐⭐⭐⭐ Signature verification (Ed25519)
⭐⭐⭐ Audit logging
```
**Guarantee:** Tampering detected immediately via Merkle verification
## Troubleshooting
### "User mode not available on this platform"
**Cause:** You requested user mode on a platform that doesn't support it
**Solution:**
- Use system mode (requires root): `sudo nip install nginx`
- Or use a Linux system with user namespace support (4.19+)
**Check namespace support:**
```bash
cat /proc/sys/user/max_user_namespaces
# Should output a number > 0
```
### "Running in user mode without kernel isolation"
**Cause:** Running on Linux without user namespace support
**Solution:**
- Upgrade kernel to 4.19+
- Or enable CONFIG_USER_NS in kernel config
- Or use system mode with root
**Check kernel version:**
```bash
uname -r
# Should be 4.19 or later
```
### "Embedded device detected"
**Cause:** System detected as embedded/IoT device
**Solution:**
- This is automatic and optimizes for low resources
- No action needed - nip will adjust constraints
- To override: set `embedded.auto_detect false` in config
**Check detection:**
```bash
nip doctor
# Shows platform information and detected constraints
```
## API Reference
### Main Functions
```nim
# Detect platform capabilities
proc detectPlatform*(): PlatformCapabilities
# Select isolation strategy
proc selectStrategy*(caps: PlatformCapabilities): IsolationStrategy
# Select installation mode
proc selectMode*(strategy: IsolationStrategy,
userRequest: Option[InstallMode]): InstallMode
# Check if running as root
proc isRoot*(): bool
# Get embedded device constraints
proc getEmbeddedConstraints*(): EmbeddedConstraints
```
### Information Functions
```nim
# Get human-readable OS type name
proc getOSTypeString*(osType: OSType): string
# Get strategy description
proc getStrategyDescription*(strategy: IsolationStrategy): string
# Get security level (1-5 stars)
proc getSecurityLevel*(strategy: IsolationStrategy): int
# Get detailed strategy information
proc getStrategyInfo*(strategy: IsolationStrategy): string
# Format bytes as human-readable string
proc formatBytes*(bytes: int64): string
# Print platform information
proc printPlatformInfo*(caps: PlatformCapabilities)
# Print embedded device constraints
proc printEmbeddedConstraints*(constraints: EmbeddedConstraints)
```
## Testing
Run platform detection tests:
```bash
nim c -r nip/tests/test_platform.nim
```
Tests cover:
- OS type detection
- Kernel version parsing
- Capability detection
- Strategy selection
- Mode selection
- Embedded device detection
- Byte formatting
## Future Enhancements
### Phase 8A: Linux Namespace Isolation (Post-MVP)
- Implement kernel-enforced read-only CAS mount
- Add namespace lifecycle management
- Integrate with package launchers
### Phase 8B: FreeBSD Jail Support (Post-MVP)
- Implement jail creation and lifecycle
- Add nullfs mount management
- Integrate with package launchers
### Phase 8C: OpenBSD Unveil Support (Post-MVP)
- Implement unveil/pledge integration
- Add build wrapper support
- Integrate with build system
### Phase 8D: Embedded/IoT Support (Post-MVP)
- Optimize for resource-constrained devices
- Add OpenWrt-specific support
- Implement low-memory operation modes
## References
- **Linux Namespaces:** https://man7.org/linux/man-pages/man7/namespaces.7.html
- **FreeBSD Jails:** https://docs.freebsd.org/en/books/handbook/jails/
- **OpenBSD Unveil:** https://man.openbsd.org/unveil.2
- **OpenBSD Pledge:** https://man.openbsd.org/pledge.2
- **Platform Isolation Strategy:** `.kiro/steering/shared/platform-isolation-strategy.md`
---
**Document Version:** 1.0
**Last Updated:** November 20, 2025
**Status:** Implementation Complete (MVP)
**Next Steps:** Phase 8 - Advanced isolation strategies (post-MVP)