mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 22:34:56 +00:00
278 lines
6.9 KiB
Markdown
278 lines
6.9 KiB
Markdown
# Security Architecture
|
|
|
|
MetaBuilder implements a comprehensive security model based on 5-level permission hierarchy and strict isolation boundaries.
|
|
|
|
## 🔐 Security Principles
|
|
|
|
1. **Defense in Depth** - Multiple layers of protection
|
|
2. **Least Privilege** - Users get minimum necessary permissions
|
|
3. **Zero Trust** - Verify all requests, trust nothing by default
|
|
4. **Separation of Concerns** - Isolate sensitive operations
|
|
5. **Audit Trail** - Log all sensitive operations
|
|
|
|
## 🎯 Permission Levels
|
|
|
|
```
|
|
Level 5 (SuperGod) → System administrator, full access, database control
|
|
↓
|
|
Level 4 (God) → Power user, system configuration, user management
|
|
↓
|
|
Level 3 (Admin) → Tenant administrator, data and user management
|
|
↓
|
|
Level 2 (User) → Regular user, standard data access per schema
|
|
↓
|
|
Level 1 (Guest) → Read-only access (not implemented)
|
|
```
|
|
|
|
### Permission Inheritance
|
|
|
|
Each level inherits permissions from lower levels:
|
|
|
|
```typescript
|
|
// Example: Can User (Level 2) do something?
|
|
const canDo = userLevel >= requiredLevel;
|
|
|
|
// Admin (3) can do anything User (2) can do, plus more
|
|
```
|
|
|
|
## 🔑 Authentication
|
|
|
|
### Password Hashing
|
|
|
|
All passwords stored as **SHA-512 hashes**:
|
|
|
|
```typescript
|
|
// Never store plaintext!
|
|
const hash = sha512(password);
|
|
```
|
|
|
|
### Credential Verification
|
|
|
|
```typescript
|
|
import { scram } from '@/lib/auth';
|
|
|
|
const verified = scram(password, storedHash);
|
|
```
|
|
|
|
### Session Management
|
|
|
|
- Session tokens generated on login
|
|
- Tokens validated on each request
|
|
- Tokens expire after inactivity
|
|
- Tokens can be revoked immediately
|
|
|
|
### Login Lockout & Backoff
|
|
|
|
- Failed login attempts are tracked per username and rate-limited.
|
|
- After `MB_AUTH_LOCKOUT_MAX_ATTEMPTS` within `MB_AUTH_LOCKOUT_WINDOW_MS`, logins lock for `MB_AUTH_LOCKOUT_MS`.
|
|
- When locked, the API returns `429` with `Retry-After` to guide clients.
|
|
|
|
## 🏢 Multi-Tenant Isolation
|
|
|
|
### Tenant Boundaries
|
|
|
|
```
|
|
Tenant A Tenant B Tenant C
|
|
├─ Users ├─ Users ├─ Users
|
|
├─ Data ├─ Data ├─ Data
|
|
├─ Schemas ├─ Schemas ├─ Schemas
|
|
└─ Scripts └─ Scripts └─ Scripts
|
|
```
|
|
|
|
Each tenant's data is:
|
|
- ✅ Logically isolated (database level)
|
|
- ✅ Physically isolated (separate fields)
|
|
- ✅ Cryptographically signed (optional)
|
|
- ✅ Audited (all access logged)
|
|
|
|
### Tenant Checking
|
|
|
|
Every data access checks `tenantId`:
|
|
|
|
```typescript
|
|
const data = await db.data.findFirst({
|
|
where: {
|
|
id: dataId,
|
|
tenantId: currentTenantId // Ensures isolation
|
|
}
|
|
});
|
|
```
|
|
|
|
## 🔒 Data Protection
|
|
|
|
### At Rest
|
|
|
|
- Data encrypted at database level (optional)
|
|
- Sensitive fields hashed
|
|
- Backups encrypted
|
|
- Access logs maintained
|
|
|
|
### In Transit
|
|
|
|
- HTTPS only (deployment configured)
|
|
- API endpoint authentication required
|
|
- CSRF token validation
|
|
- Rate limiting on sensitive endpoints
|
|
|
|
### In Use
|
|
|
|
- Sandboxed Lua execution (no file system access)
|
|
- TypeScript type safety
|
|
- Input validation on all endpoints
|
|
- Output sanitization for HTML
|
|
|
|
## 🚨 Lua Script Sandboxing
|
|
|
|
Lua scripts run in sandboxed environment:
|
|
|
|
```lua
|
|
-- Allowed operations
|
|
local data = GetData("table_name")
|
|
local result = DatabaseQuery(...)
|
|
|
|
-- Blocked operations
|
|
os.execute("rm -rf /") -- ❌ NOT allowed
|
|
io.open("/etc/passwd") -- ❌ NOT allowed
|
|
require("unsafe_module") -- ❌ NOT allowed
|
|
```
|
|
|
|
### Sandbox Restrictions
|
|
|
|
| Operation | Allowed | Reason |
|
|
|-----------|---------|--------|
|
|
| File system | ❌ No | Isolation |
|
|
| Network | ❌ No | Security |
|
|
| System calls | ❌ No | Containment |
|
|
| Database queries | ✅ Yes | Business logic |
|
|
| Memory usage | ✅ Limited | Max heap enforced |
|
|
| JSON parsing | ✅ Yes | Data transformation |
|
|
| Math operations | ✅ Yes | Calculations |
|
|
|
|
## 🔍 Audit & Logging
|
|
|
|
### Audit Trail
|
|
|
|
All sensitive operations logged:
|
|
|
|
```typescript
|
|
interface AuditLog {
|
|
userId: string;
|
|
action: 'CREATE' | 'UPDATE' | 'DELETE' | 'LOGIN';
|
|
resource: string;
|
|
timestamp: DateTime;
|
|
tenantId: string;
|
|
ipAddress: string;
|
|
}
|
|
```
|
|
|
|
### Monitored Actions
|
|
|
|
- ✅ User login/logout
|
|
- ✅ Permission changes
|
|
- ✅ Data modifications
|
|
- ✅ Script execution
|
|
- ✅ Configuration changes
|
|
- ✅ Failed authentication attempts
|
|
|
|
## 🛡️ API Security
|
|
|
|
### Authentication Required
|
|
|
|
```typescript
|
|
// All endpoints require valid token
|
|
export async function GET(request: Request) {
|
|
const token = request.headers.get('Authorization');
|
|
const user = await verifyToken(token);
|
|
|
|
if (!user) {
|
|
return new Response('Unauthorized', { status: 401 });
|
|
}
|
|
|
|
return new Response(JSON.stringify(data));
|
|
}
|
|
```
|
|
|
|
### Permission Checking
|
|
|
|
```typescript
|
|
async function checkPermission(userId: string, action: string, resource: string) {
|
|
const user = await getUser(userId);
|
|
|
|
if (user.level < requiredLevel) {
|
|
throw new Error('Insufficient permissions');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
```
|
|
|
|
### Rate Limiting
|
|
|
|
Prevent brute force attacks:
|
|
|
|
```bash
|
|
# Login attempts: 5 per minute
|
|
# API requests: 100 per minute
|
|
# Lua execution: 10 per second
|
|
```
|
|
|
|
## 🔐 Sensitive Data
|
|
|
|
### Classification
|
|
|
|
| Level | Storage | Access | Audit |
|
|
|-------|---------|--------|-------|
|
|
| **Critical** | Encrypted | Admin+ only | All |
|
|
| **Sensitive** | Hashed | User+ | All |
|
|
| **Normal** | Plaintext | As configured | Some |
|
|
| **Public** | Plaintext | Public | None |
|
|
|
|
### Handling Secrets
|
|
|
|
```typescript
|
|
// ❌ Never do this
|
|
const API_KEY = "secret123"; // Hardcoded!
|
|
|
|
// ✅ Do this instead
|
|
const API_KEY = process.env.API_KEY; // Environment variable
|
|
const hashedKey = sha512(API_KEY); // Hash for storage
|
|
```
|
|
|
|
## 🚀 Security Best Practices
|
|
|
|
### For Developers
|
|
|
|
1. **Always hash passwords** - Use SHA-512
|
|
2. **Validate input** - Check type, length, format
|
|
3. **Check permissions** - Verify user level before action
|
|
4. **Log sensitive ops** - Audit trail required
|
|
5. **Encrypt secrets** - Never commit API keys
|
|
6. **Sanitize output** - Prevent XSS attacks
|
|
7. **Use types** - TypeScript prevents many bugs
|
|
8. **Test security** - Include security tests
|
|
|
|
### For Administrators
|
|
|
|
1. **Regular backups** - Daily encrypted backups
|
|
2. **Monitor logs** - Watch for suspicious activity
|
|
3. **Update immediately** - Apply security patches
|
|
4. **Strong passwords** - Enforce password policy
|
|
5. **Rotate secrets** - Regular credential rotation
|
|
6. **Limit access** - Principle of least privilege
|
|
7. **Verify integrations** - Vet third-party services
|
|
8. **Test recovery** - Verify backup restoration works
|
|
|
|
## 🔗 Related Documentation
|
|
|
|
- [Security Guidelines](../security/SECURITY.md) - Security policy
|
|
- [5-Level System](./5-level-system.md) - Permission model
|
|
- [Database Architecture](./database.md) - Data storage
|
|
- [API Development](../guides/api-development.md) - API security
|
|
|
|
## 📚 External Resources
|
|
|
|
- [OWASP Top 10](https://owasp.org/www-project-top-ten/) - Security vulnerabilities
|
|
- [SHA-512 Hashing](https://en.wikipedia.org/wiki/SHA-2) - Password hashing
|
|
- [Lua Sandboxing](https://www.lua.org/manual/5.4/manual.html#4.6) - Script isolation
|
|
- [Multi-Tenancy](https://www.singletenancy.com/) - Isolation patterns
|