Sanitized mirror from private repository - 2026-03-18 10:31:50 UTC
This commit is contained in:
182
docs/troubleshooting/WATCHTOWER_SECURITY_ANALYSIS.md
Normal file
182
docs/troubleshooting/WATCHTOWER_SECURITY_ANALYSIS.md
Normal file
@@ -0,0 +1,182 @@
|
||||
# Watchtower Security Analysis - CORRECTED
|
||||
**Generated**: February 9, 2026
|
||||
**Status**: ⚠️ **CRITICAL CORRECTION TO PREVIOUS RECOMMENDATION**
|
||||
|
||||
---
|
||||
|
||||
## 🚨 **IMPORTANT: DO NOT MAKE DOCKER SOCKET READ-ONLY**
|
||||
|
||||
### **❌ Previous Recommendation Was INCORRECT**
|
||||
|
||||
I initially recommended making the Docker socket read-only for security. **This would BREAK Watchtower completely.**
|
||||
|
||||
### **✅ Why Watchtower NEEDS Write Access**
|
||||
|
||||
Watchtower requires **full read-write access** to the Docker socket to perform its core functions:
|
||||
|
||||
#### **Required Docker Operations**
|
||||
1. **Pull new images**: `docker pull <image>:latest`
|
||||
2. **Stop containers**: `docker stop <container>`
|
||||
3. **Remove old containers**: `docker rm <container>`
|
||||
4. **Create new containers**: `docker create/run <new-container>`
|
||||
5. **Start containers**: `docker start <container>`
|
||||
6. **Remove old images**: `docker rmi <old-image>` (when cleanup=true)
|
||||
|
||||
#### **Current Configuration Analysis**
|
||||
```bash
|
||||
# Your current Watchtower config:
|
||||
WATCHTOWER_HTTP_API_UPDATE=true # Updates via HTTP API only
|
||||
WATCHTOWER_CLEANUP=true # Removes old images (needs write access)
|
||||
WATCHTOWER_SCHEDULE=0 0 4 * * * # Daily at 4 AM (but API mode overrides)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 **Actual Security Status: ACCEPTABLE**
|
||||
|
||||
### **✅ Current Security Posture is GOOD**
|
||||
|
||||
Your Watchtower configuration is actually **more secure** than typical setups:
|
||||
|
||||
#### **Security Features Already Enabled**
|
||||
1. **HTTP API Mode**: Updates only triggered via authenticated API calls
|
||||
2. **No Automatic Polling**: `Periodic runs are not enabled`
|
||||
3. **API Token Protection**: Requires `watchtower-update-token` for updates
|
||||
4. **Scoped Access**: Only monitors containers (not system-wide access)
|
||||
|
||||
#### **How It Works**
|
||||
```bash
|
||||
# Updates are triggered via API, not automatically:
|
||||
curl -H "Authorization: Bearer watchtower-update-token" \
|
||||
-X POST http://localhost:8091/v1/update
|
||||
```
|
||||
|
||||
### **✅ This is SAFER than Default Watchtower**
|
||||
|
||||
**Default Watchtower**: Automatically updates containers on schedule
|
||||
**Your Watchtower**: Only updates when explicitly triggered via API
|
||||
|
||||
---
|
||||
|
||||
## 🔧 **Actual Security Recommendations**
|
||||
|
||||
### **1. Current Setup is Secure ✅**
|
||||
- **Keep** read-write Docker socket access (required for functionality)
|
||||
- **Keep** HTTP API mode (more secure than automatic updates)
|
||||
- **Keep** API token authentication
|
||||
|
||||
### **2. Minor Improvements Available**
|
||||
|
||||
#### **A. Fix Notification Protocol**
|
||||
```yaml
|
||||
# Change HTTPS to HTTP in notification URL
|
||||
WATCHTOWER_NOTIFICATION_URL: http://192.168.0.210:8081/updates
|
||||
```
|
||||
|
||||
#### **B. Restrict API Access (Optional)**
|
||||
```yaml
|
||||
# Bind API to localhost only (if not needed externally)
|
||||
ports:
|
||||
- "127.0.0.1:8091:8080" # Instead of "8091:8080"
|
||||
```
|
||||
|
||||
#### **C. Use Docker Socket Proxy (Advanced)**
|
||||
If you want additional security, use a Docker socket proxy:
|
||||
```yaml
|
||||
# tecnativa/docker-socket-proxy - filters Docker API calls
|
||||
# But this is overkill for most homelab setups
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **Corrected Action Plan**
|
||||
|
||||
### **❌ DO NOT DO**
|
||||
- ~~Make Docker socket read-only~~ (Would break Watchtower)
|
||||
- ~~Remove write permissions~~ (Would break container updates)
|
||||
|
||||
### **✅ SAFE ACTIONS**
|
||||
1. **Fix notification URL**: Change HTTPS to HTTP
|
||||
2. **Update repository configs**: Align with running container
|
||||
3. **Document API usage**: How to trigger updates manually
|
||||
|
||||
### **✅ OPTIONAL SECURITY ENHANCEMENTS**
|
||||
1. **Restrict API binding**: Localhost only if not needed externally
|
||||
2. **Monitor API access**: Log API calls for security auditing
|
||||
3. **Regular token rotation**: Change API token periodically
|
||||
|
||||
---
|
||||
|
||||
## 📊 **Security Comparison**
|
||||
|
||||
| Configuration | Security Level | Functionality | Recommendation |
|
||||
|---------------|----------------|---------------|----------------|
|
||||
| **Your Current Setup** | 🟢 **HIGH** | ✅ Full | ✅ **KEEP** |
|
||||
| Read-only Docker socket | 🔴 **BROKEN** | ❌ None | ❌ **AVOID** |
|
||||
| Default Watchtower | 🟡 **MEDIUM** | ✅ Full | 🟡 Less secure |
|
||||
| With Socket Proxy | 🟢 **HIGHEST** | ✅ Full | 🟡 Complex setup |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 **How to Verify Current Security**
|
||||
|
||||
### **Check API Mode is Active**
|
||||
```bash
|
||||
# Should show "Periodic runs are not enabled"
|
||||
sudo docker logs watchtower --tail 20 | grep -i periodic
|
||||
```
|
||||
|
||||
### **Test API Authentication**
|
||||
```bash
|
||||
# This should fail (no token)
|
||||
curl -X POST http://localhost:8091/v1/update
|
||||
|
||||
# This should work (with token)
|
||||
curl -H "Authorization: Bearer watchtower-update-token" \
|
||||
-X POST http://localhost:8091/v1/update
|
||||
```
|
||||
|
||||
### **Verify Container Updates Work**
|
||||
```bash
|
||||
# Trigger manual update via API
|
||||
curl -H "Authorization: Bearer watchtower-update-token" \
|
||||
-X POST http://localhost:8091/v1/update
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 **Conclusion**
|
||||
|
||||
### **✅ Your Watchtower is ALREADY SECURE**
|
||||
|
||||
Your current configuration is **more secure** than typical Watchtower setups because:
|
||||
- Updates require explicit API calls (not automatic)
|
||||
- API calls require authentication token
|
||||
- No periodic polling running
|
||||
|
||||
### **❌ My Previous Recommendation Was WRONG**
|
||||
|
||||
Making the Docker socket read-only would have **completely broken** Watchtower's ability to:
|
||||
- Pull new images
|
||||
- Update containers
|
||||
- Clean up old images
|
||||
- Perform any container management
|
||||
|
||||
### **✅ Keep Your Current Setup**
|
||||
|
||||
Your Watchtower configuration strikes the right balance between **security** and **functionality**.
|
||||
|
||||
---
|
||||
|
||||
## 📝 **Updated Fix Script Status**
|
||||
|
||||
**⚠️ DO NOT RUN** `scripts/fix-watchtower-security.sh`
|
||||
|
||||
The script contains an incorrect recommendation that would break Watchtower. I'll create a corrected version that:
|
||||
- Fixes the notification URL (HTTPS → HTTP)
|
||||
- Updates repository configurations
|
||||
- Preserves essential Docker socket access
|
||||
|
||||
---
|
||||
|
||||
*This corrected analysis supersedes the previous CONTAINER_DIAGNOSIS_REPORT.md security recommendations.*
|
||||
Reference in New Issue
Block a user