This commit is contained in:
Alexandre
2026-01-15 16:44:38 +01:00
committed by GitHub
parent af721d9f18
commit b482673af4
31 changed files with 465 additions and 1747 deletions

View File

@@ -1,146 +0,0 @@
# Security Improvements Implementation Summary
*Completed: 2025-08-02*
## ✅ Successfully Implemented
### 1. Critical Security Fixes
- **Fixed chmod 777 permissions**: Corrected 20/21 files automatically
- **Created secure download templates**: `ha_secure_download.sh` and `ha_autoapps_secure.sh`
- **Analyzed privilege usage**: Comprehensive review of 57 SYS_ADMIN instances
### 2. Documentation Created
- **`SECURITY_IMPROVEMENT_PLAN.md`**: Complete action plan with classifications
- **`SECURITY_REVIEW_CHECKLIST.md`**: Security review checklist for contributors
- **`PRIVILEGE_ANALYSIS_REPORT.md`**: Detailed analysis of container privileges
- **`config_reduction_examples.md`**: Practical examples for privilege reduction
### 3. Security Templates
- **`ha_input_validation.sh`**: Comprehensive input validation library
- **`example_validated_init.sh`**: Practical example of validation usage
- **Security templates**: Reusable patterns for secure add-on development
## 📊 Security Improvements Achieved
### Before Implementation
- **Critical vulnerabilities**: 3 unaddressed
- **Privilege usage**: 53% of add-ons with SYS_ADMIN
- **Input validation**: 0% coverage
- **Security documentation**: Minimal
### After Implementation
- **Critical vulnerabilities**: 2 fixed, 1 analyzed with mitigation plan
- **Privilege usage**: Analyzed with reduction roadmap
- **Input validation**: Complete library with examples
- **Security documentation**: Comprehensive coverage
## 🛡️ Risk Reduction
### Critical Risk Elimination
1. **File permission vulnerabilities**: 95% eliminated (20/21 fixed)
2. **Remote script execution**: Secure alternatives provided
3. **Injection attacks**: Input validation framework implemented
### Medium Risk Mitigation
1. **Container privilege escalation**: Analysis and reduction plan created
2. **Build system inconsistencies**: Identified for future standardization
3. **AppArmor profile gaps**: Review framework established
## 📈 Key Metrics
- **Files secured**: 20+ permission fixes applied
- **Add-ons analyzed**: 108 total, 57 with elevated privileges
- **Security templates**: 4 new secure templates created
- **Documentation**: 5 comprehensive security documents added
- **Risk reduction**: ~70% reduction in critical vulnerabilities
## 🔧 Technical Achievements
### Automated Security Fixes
```bash
# Fixed permissions across repository
chmod 755 # replaced chmod 777 in 20 files
```
### Security Library Functions
```bash
# New validation functions available:
validate_string() # Pattern-based string validation
validate_numeric() # Bounded numeric validation
validate_path() # Directory traversal prevention
validate_url() # URL format validation
validate_ip() # IP address validation
```
### Privilege Analysis
```
Total Add-ons: 108
Privileged Add-ons: 60 (55%)
SYS_ADMIN Usage: 57 (53%) - CRITICAL
NET_ADMIN Usage: 9 (8%) - REVIEW
DAC_OVERRIDE Usage: 0 (0%) - GOOD
```
## 🎯 Implementation Quality
### Code Quality
-**Error handling**: All scripts use `set -euo pipefail`
-**Input validation**: Comprehensive validation framework
-**Security practices**: Follow security best practices
-**Documentation**: Well-documented with examples
### Testing Coverage
-**Permission fixes**: Automatically verified
-**Validation functions**: Example usage provided
-**Security templates**: Ready for production use
## 📋 Next Steps (Recommended)
### Week 1: Privilege Reduction
1. Apply privilege reductions to top 5 add-ons
2. Test functionality with reduced privileges
3. Document any breaking changes
### Week 2: Validation Rollout
1. Integrate validation library into existing add-ons
2. Add validation to top 10 most used add-ons
3. Create migration guide for users
### Week 3: Build System Standardization
1. Convert remaining `build.json` to `build.yaml`
2. Standardize container base images
3. Implement automated security scanning
### Month 2: Advanced Security
1. Implement CI/CD security scanning
2. Add dependency vulnerability checking
3. Create security monitoring dashboard
## 🏆 Success Criteria Met
- [x] **Immediate security fixes applied** (chmod 777 eliminated)
- [x] **Security documentation complete** (5 comprehensive documents)
- [x] **Input validation framework ready** (production-ready library)
- [x] **Privilege analysis complete** (detailed reduction plan)
- [x] **Security templates available** (reusable secure patterns)
## 💡 Long-term Impact
### Security Posture
- **Attack surface**: Significantly reduced
- **Vulnerability detection**: Proactive frameworks in place
- **Security awareness**: Comprehensive documentation available
- **Development practices**: Security-first approach established
### Maintainability
- **Standardization**: Security templates and patterns
- **Automation**: Validation and checking frameworks
- **Documentation**: Clear guidelines and examples
- **Community**: Security review process established
---
**Overall Assessment**: ✅ **SUCCESSFUL IMPLEMENTATION**
The security improvements have been successfully implemented with immediate risk reduction and frameworks in place for ongoing security enhancement. The repository now has a solid security foundation with documented processes for maintaining and improving security going forward.
*Next review recommended: 2025-08-16 (2 weeks) to assess privilege reduction progress*

View File

@@ -1,199 +0,0 @@
# Container Privilege Analysis Report
*Generated: 2025-08-02*
## 🔍 Executive Summary
**Critical Finding**: 57 out of 108 add-ons (53%) request SYS_ADMIN privileges - a system administration capability that grants near-root access within containers.
**Risk Assessment**: HIGH - The widespread use of SYS_ADMIN significantly increases the attack surface and potential for container escapes.
## 📊 Privilege Usage Statistics
- **Total Add-ons**: 108
- **Add-ons with Privileges**: 60 (55%)
- **SYS_ADMIN Usage**: 57 add-ons (53%)
- **NET_ADMIN Usage**: 9 add-ons (8%)
- **DAC_OVERRIDE Usage**: 0 add-ons (0%) ✅
## 🚨 Top 5 Critical Add-ons Analysis
### 1. Filebrowser (8,427 installations)
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
**Device Access**: Extensive - All storage devices (sda-sdg, nvme, partitions)
**Purpose**: Web-based file management interface
**Analysis**:
-**Over-privileged**: SYS_ADMIN likely not needed for file browsing
-**Excessive device access**: Requests access to ALL possible storage devices
- ⚠️ **Security risk**: File manager with admin privileges = potential data exfiltration
- 🔧 **Alternative**: Use bind mounts with specific directories instead of SYS_ADMIN
**Justification Score**: 2/10 - Very weak justification
### 2. Nextcloud (Cloud Storage)
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
**Device Access**: All storage and video devices
**Purpose**: Personal cloud storage and collaboration platform
**Analysis**:
- ⚠️ **Potentially justified**: May need filesystem operations for cloud storage
-**Excessive device access**: Duplicate device entries in config
- 🔧 **Alternative**: Use specific capabilities like `CHOWN`, `FOWNER` instead of SYS_ADMIN
- ⚠️ **Security concern**: Cloud platform with admin access to all devices
**Justification Score**: 4/10 - Weak justification, alternatives exist
### 3. Plex NAS (Media Server)
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
**Device Access**: Storage + DVB TV tuners + video hardware
**Purpose**: Media server with hardware transcoding
**Analysis**:
- ⚠️ **Partially justified**: Hardware transcoding may require device access
-**SYS_ADMIN overkill**: Could use `DEVICE_CONTROL` for hardware access
-**Host networking**: Appropriate for media server discovery
- 🔧 **Alternative**: More specific device capabilities
**Justification Score**: 5/10 - Moderate justification, refinement needed
### 4. Arpspoof (Network Blocker)
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
**Device Access**: All storage devices (unnecessary)
**Purpose**: Block internet connection for local network devices
**Analysis**:
-**Justified for function**: ARP spoofing requires network manipulation
-**Wrong capabilities**: Should use `NET_ADMIN` + `NET_RAW`, not SYS_ADMIN
-**Inappropriate device access**: Doesn't need storage device access
- 🔧 **Alternative**: `NET_ADMIN` + `NET_RAW` capabilities only
**Justification Score**: 3/10 - Wrong privilege type used
### 5. Radarr (Movie Management)
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
**Device Access**: All storage devices
**Purpose**: Movie collection management (downloads, organization)
**Analysis**:
-**Not justified**: File management doesn't require SYS_ADMIN
-**Over-privileged**: Basic file operations don't need admin rights
- 🔧 **Alternative**: Standard file permissions with proper user mapping
- ⚠️ **Security risk**: Download manager with admin privileges
**Justification Score**: 1/10 - No justification
## 🔧 Privilege Reduction Recommendations
### Immediate Actions (Week 1)
#### 1. Filebrowser - Remove SYS_ADMIN
```json
"privileged": [
"DAC_READ_SEARCH" // Keep for file access
],
"devices": [
"/dev/fuse" // Only FUSE if needed
// Remove all storage devices, use bind mounts instead
]
```
#### 2. Radarr/Sonarr/Bazarr - Remove SYS_ADMIN
```json
"privileged": [
"DAC_READ_SEARCH" // Only for reading file attributes
],
"devices": [] // Remove all device access
```
#### 3. Arpspoof - Fix Privilege Type
```json
"privileged": [
"NET_ADMIN", // For network manipulation
"NET_RAW" // For raw socket access
],
"devices": [] // Remove storage device access
```
### Medium-term Actions (Week 2-4)
#### 4. Nextcloud - Reduce Privileges
```json
"privileged": [
"CHOWN", // For file ownership changes
"FOWNER", // For file permission changes
"DAC_READ_SEARCH" // For file access
],
// Remove duplicate device entries
```
#### 5. Plex - Specific Hardware Access
```json
"privileged": [
"DAC_READ_SEARCH" // For media file access
],
"devices": [
"/dev/dri", // GPU for transcoding
"/dev/dvb/", // TV tuners only
// Remove storage devices, use bind mounts
]
```
## 📋 Category-Based Privilege Guidelines
### Media Applications (Plex, Emby, Jellyfin, Radarr, Sonarr)
**Standard Privileges**: `DAC_READ_SEARCH` only
**Device Access**: GPU devices for transcoding only
**Justification**: Media management requires file reading, not system administration
### File Managers (Filebrowser, Nextcloud)
**Standard Privileges**: `DAC_READ_SEARCH`, optionally `CHOWN`/`FOWNER`
**Device Access**: None - use bind mounts
**Justification**: File operations can be handled through proper volume mounting
### Network Tools (Arpspoof)
**Standard Privileges**: `NET_ADMIN`, `NET_RAW`
**Device Access**: Network interfaces only
**Justification**: Network manipulation requires network capabilities, not system admin
### Development Tools (Code-server, Gitea)
**Standard Privileges**: Minimal - consider rootless containers
**Device Access**: None
**Justification**: Development tools should not require elevated privileges
## 🎯 Implementation Roadmap
### Phase 1: Critical Risk Reduction (Week 1)
- [ ] Remove SYS_ADMIN from Filebrowser
- [ ] Remove SYS_ADMIN from Radarr, Sonarr, Bazarr
- [ ] Fix Arpspoof privilege types
- [ ] Test functionality with reduced privileges
### Phase 2: Systematic Review (Week 2-3)
- [ ] Review all 57 SYS_ADMIN usage instances
- [ ] Create privilege justification documentation for each
- [ ] Implement alternatives for 80% of cases
### Phase 3: Documentation & Prevention (Week 4)
- [ ] Update CONTRIBUTING.md with privilege guidelines
- [ ] Add privilege justification requirements to PR template
- [ ] Implement automated privilege checking in CI/CD
## 📈 Success Metrics
- **Target**: Reduce SYS_ADMIN usage from 57 to <15 add-ons
- **Timeline**: 4 weeks
- **Verification**: Automated testing with reduced privileges
- **Documentation**: 100% of remaining SYS_ADMIN usage documented and justified
## 🛡️ Security Impact
**Before**: 53% of add-ons with near-root container access
**After**: <14% of add-ons with justified elevated privileges
**Risk Reduction**: ~70% reduction in high-privilege containers
**Attack Surface**: Significantly reduced container escape vectors
---
**Next Review**: 2025-09-02 (Monitor privilege usage trends and compliance)
*This analysis demonstrates that the majority of SYS_ADMIN usage in this repository is unnecessary and represents a significant security risk that can be mitigated through proper container security practices.*

View File

@@ -1,115 +0,0 @@
# Security Improvements for Home Assistant Add-ons Repository
This directory contains security improvements, analysis, and templates created to enhance the security posture of the Home Assistant add-ons repository.
## 📋 Documentation Files
### Security Analysis & Planning
- **`SECURITY_IMPROVEMENT_PLAN.md`** - Master security improvement plan with classified actions and priorities
- **`PRIVILEGE_ANALYSIS_REPORT.md`** - Detailed analysis of container privilege usage across all 108 add-ons
- **`IMPLEMENTATION_SUMMARY.md`** - Summary of completed security improvements and metrics
- **`SECURITY_REVIEW_CHECKLIST.md`** - Comprehensive security review checklist for contributors
### Implementation Guides
- **`config_reduction_examples.md`** - Practical examples for reducing container privileges
## 🛠️ Security Templates
### Secure Download & Script Management
- **`ha_secure_download.sh`** - Secure script downloader with integrity verification
- **`ha_autoapps_secure.sh`** - Secure version of the automatic app installer
### Input Validation Framework
- **`ha_input_validation.sh`** - Comprehensive input validation library for add-on configurations
- **`example_validated_init.sh`** - Example implementation showing how to use the validation library
## 🔍 Key Findings
### Critical Security Issues Addressed
1. **File Permission Vulnerabilities** - Fixed 20/21 instances of `chmod 777`
2. **Remote Script Execution** - Created secure alternatives with integrity verification
3. **Container Privilege Escalation** - Analyzed 57 add-ons using SYS_ADMIN (53% of repository)
### Security Improvements Achieved
- **95% reduction** in file permission vulnerabilities
- **Complete input validation framework** preventing injection attacks
- **70% potential reduction** in high-privilege containers
- **Comprehensive security documentation** and review processes
## 📊 Repository Statistics
- **Total Add-ons**: 108
- **Add-ons with Elevated Privileges**: 60 (55%)
- **SYS_ADMIN Usage**: 57 add-ons (53%) - **CRITICAL**
- **NET_ADMIN Usage**: 9 add-ons (8%)
- **DAC_OVERRIDE Usage**: 0 add-ons (0%) ✅
## 🎯 Implementation Roadmap
### Phase 1: Critical Fixes (✅ COMPLETED)
- [x] Fix chmod 777 permissions
- [x] Create secure download templates
- [x] Analyze privilege usage
### Phase 2: Privilege Reduction (📋 PLANNED)
- [ ] Apply privilege reductions to top 5 add-ons
- [ ] Test functionality with reduced privileges
- [ ] Roll out to remaining add-ons
### Phase 3: Validation Framework (✅ READY)
- [x] Input validation library created
- [x] Example implementation provided
- [ ] Integration into existing add-ons
### Phase 4: Process Improvements (📋 PLANNED)
- [ ] CI/CD security scanning
- [ ] Automated privilege checking
- [ ] Security monitoring dashboard
## 🏆 Success Metrics
- **Critical vulnerabilities**: 3 → 0 fixed
- **File permission issues**: 21 → 1 remaining
- **Input validation coverage**: 0% → Framework ready
- **Security documentation**: Minimal → Comprehensive
## 🔧 Usage Instructions
### For Add-on Developers
1. **Use the validation library**: Source `ha_input_validation.sh` in your init scripts
2. **Follow privilege guidelines**: Use templates in `config_reduction_examples.md`
3. **Review security checklist**: Use `SECURITY_REVIEW_CHECKLIST.md` before submissions
### For Repository Maintainers
1. **Apply privilege reductions**: Follow recommendations in `PRIVILEGE_ANALYSIS_REPORT.md`
2. **Implement security scanning**: Use templates and guidelines provided
3. **Enforce security reviews**: Use the checklist for all new add-ons
### For Security Auditors
1. **Review current status**: Start with `IMPLEMENTATION_SUMMARY.md`
2. **Understand risks**: Review `PRIVILEGE_ANALYSIS_REPORT.md`
3. **Track progress**: Monitor against `SECURITY_IMPROVEMENT_PLAN.md`
## 📚 Related Files
### Template Files (Still in `.templates/`)
- `ha_autoapps.sh` - **FIXED** (chmod 777 → 755)
- `00-aaa_dockerfile_backup.sh` - **FIXED** (chmod 777 → 755)
### Configuration Files
- Individual add-on `config.json` files with privilege analysis available in reports
## 🔮 Future Enhancements
1. **Automated Security Scanning** - CI/CD pipeline integration
2. **Real-time Monitoring** - Security dashboard for ongoing monitoring
3. **Community Guidelines** - Security-first development practices
4. **Dependency Scanning** - Vulnerability detection in container dependencies
---
**Last Updated**: 2025-08-02
**Security Status**: ✅ Significantly Improved
**Next Review**: 2025-08-16 (Privilege reduction progress)
*This security enhancement project has successfully reduced critical vulnerabilities and established frameworks for ongoing security improvement.*

View File

@@ -1,129 +0,0 @@
# Security Improvement Action Plan
*Generated: 2025-08-02*
## 🔴 CRITICAL - Immediate Actions Required (0-1 week)
### SEC-001: Fix Insecure File Permissions
- **Files**: `.templates/ha_autoapps.sh:24` and 22+ other scripts
- **Issue**: `chmod 777` grants excessive permissions
- **Fix**: Replace with `chmod 755` or `chmod +x`
- **Risk**: Critical - Full file system access vulnerability
- **Status**: ✅ FIXED - 20/21 files corrected automatically
### SEC-002: Remote Script Execution Without Verification
- **Files**: 100+ Dockerfiles using `ADD "https://raw.githubusercontent.com/..."`
- **Issue**: Downloads and executes scripts without integrity checks
- **Fix**: Add checksums or vendor scripts locally
- **Risk**: Critical - Supply chain attack vector
- **Status**: ✅ MITIGATED - Secure download templates created
### SEC-003: Excessive Container Privileges
- **Files**: Multiple `config.json` files with broad privileges
- **Issue**: Unnecessary `SYS_ADMIN`, `DAC_READ_SEARCH` capabilities
- **Fix**: Apply principle of least privilege
- **Risk**: High - Container escape potential
- **Status**: ✅ ANALYZED - Detailed analysis and reduction plan created
## 🟡 HIGH PRIORITY - Security Hardening (1-4 weeks)
### SEC-004: Input Validation Missing
- **Files**: 60+ configuration scripts
- **Issue**: No validation of user inputs (domains, paths, etc.)
- **Fix**: Implement validation functions
- **Risk**: Medium - Injection attacks
- **Status**: ✅ IMPLEMENTED - Comprehensive validation library created
### SEC-005: Inconsistent Build System
- **Files**: Mix of `build.json` and `build.yaml`
- **Issue**: Different build configurations, potential inconsistencies
- **Fix**: Standardize on `build.yaml` format
- **Risk**: Medium - Build reproducibility
- **Status**: ❌ Not Fixed
### SEC-006: AppArmor Profiles Too Permissive
- **Files**: Multiple `apparmor.txt` files
- **Issue**: Blanket `capability,` rules instead of specific ones
- **Fix**: Create restrictive, service-specific profiles
- **Risk**: Medium - Reduced container isolation
- **Status**: ❌ Not Fixed
### SEC-007: Dependency Version Pinning
- **Files**: All Dockerfiles
- **Issue**: Downloads from `master` branch, no version control
- **Fix**: Pin to specific commits/tags with checksums
- **Risk**: Medium - Supply chain instability
- **Status**: ❌ Not Fixed
## 🟢 MEDIUM PRIORITY - Quality Improvements (4-8 weeks)
### QUA-001: Error Handling Standardization
- **Files**: All init scripts in `rootfs/etc/cont-init.d/`
- **Issue**: Inconsistent error handling and logging
- **Fix**: Create standard error handling template
- **Risk**: Low - Operational issues
- **Status**: ❌ Not Fixed
### QUA-002: Multi-stage Build Implementation
- **Files**: All Dockerfiles
- **Issue**: Large image sizes due to build dependencies
- **Fix**: Implement multi-stage builds
- **Risk**: Low - Resource waste
- **Status**: ❌ Not Fixed
### QUA-003: Documentation Enhancement
- **Files**: README files, missing security docs
- **Issue**: No security guidelines for contributors
- **Fix**: Add security section to CONTRIBUTING.md
- **Risk**: Low - Process issues
- **Status**: ❌ Not Fixed
## 🔵 LOW PRIORITY - Long-term Improvements (8+ weeks)
### IMP-001: CI/CD Security Scanning
- **Files**: GitHub Actions workflows
- **Issue**: No automated security scanning
- **Fix**: Add Trivy, Hadolint, security linting
- **Risk**: Low - Preventive measure
- **Status**: ❌ Not Implemented
### IMP-002: Centralized Template System
- **Files**: All addon directories
- **Issue**: Duplicated patterns across addons
- **Fix**: Create shared template library
- **Risk**: Low - Maintenance overhead
- **Status**: ❌ Not Implemented
### IMP-003: Secrets Management
- **Files**: Configuration templates
- **Issue**: No standardized secrets handling
- **Fix**: Implement Home Assistant secrets integration
- **Risk**: Low - Security enhancement
- **Status**: ❌ Not Implemented
## Implementation Priority
1. **Week 1**: Fix SEC-001, SEC-002, SEC-003
2. **Week 2-3**: Address SEC-004, SEC-005
3. **Week 4**: Complete SEC-006, SEC-007
4. **Month 2**: Quality improvements (QUA-001, QUA-002, QUA-003)
5. **Month 3+**: Long-term improvements (IMP-001, IMP-002, IMP-003)
## Security Metrics
- **Critical vulnerabilities**: 3 ❌
- **High priority issues**: 4 ❌
- **Medium priority issues**: 3 ❌
- **Security score**: 0/10 (needs immediate attention)
## Success Criteria
- [ ] All `chmod 777` instances removed
- [ ] Script integrity verification implemented
- [ ] Container privileges reduced by 50%
- [ ] Input validation in 100% of user-facing scripts
- [ ] AppArmor profiles pass security audit
- [ ] CI/CD security scanning operational
- [ ] Security documentation complete
---
*This plan should be reviewed monthly and updated as issues are resolved.*

View File

@@ -1,180 +0,0 @@
# Security Review Checklist for Home Assistant Add-ons
## 🛡️ Pre-Submission Security Review
Use this checklist before submitting any new add-on or major changes to existing add-ons.
### ✅ Critical Security Requirements
#### File Permissions
- [ ] No `chmod 777` used anywhere in the add-on
- [ ] Scripts use `chmod 755` or `chmod +x` for executables
- [ ] Configuration files use `chmod 644` or more restrictive
- [ ] Sensitive files (keys, certs) use `chmod 600` or more restrictive
#### Container Privileges
- [ ] Add-on requests minimal required privileges only
- [ ] `privileged` array contains only necessary capabilities
- [ ] No blanket `SYS_ADMIN` unless absolutely required with justification
- [ ] Device access limited to specific devices needed
- [ ] Network access restricted to required ports/protocols
#### Script Security
- [ ] All scripts use `set -e` for error handling
- [ ] All scripts use `set -u` for undefined variable checking
- [ ] All scripts use `set -o pipefail` for pipeline error propagation
- [ ] Remote downloads include integrity verification (checksums)
- [ ] No remote script execution without verification
#### Input Validation
- [ ] All user inputs validated for format and safety
- [ ] Path inputs sanitized to prevent directory traversal
- [ ] Network inputs validated (URLs, IPs, ports)
- [ ] Configuration values have appropriate bounds checking
### 🔧 Dockerfile Security
#### Base Images
- [ ] Uses official Home Assistant base images
- [ ] Base image version is pinned (not `latest`)
- [ ] Base image is regularly updated
#### Build Process
- [ ] No secrets in build arguments or environment variables
- [ ] Build dependencies are pinned to specific versions
- [ ] Multi-stage builds used where appropriate to reduce attack surface
- [ ] Unnecessary packages removed after build
#### Runtime Security
- [ ] Non-root user used where possible
- [ ] Health checks implemented
- [ ] Proper signal handling for graceful shutdown
- [ ] Resource limits defined
### 🚪 Network Security
#### Port Configuration
- [ ] Only required ports exposed
- [ ] Internal services not exposed unnecessarily
- [ ] Ingress configuration reviewed for security
- [ ] SSL/TLS used for external communications
#### Service Discovery
- [ ] Service discovery limited to required services
- [ ] Authentication required for service access
- [ ] Service communication encrypted where sensitive
### 📁 Data Security
#### File System Access
- [ ] Read-only file system where possible
- [ ] Temporary files in appropriate directories
- [ ] Sensitive data not logged
- [ ] File permissions set appropriately on mounted volumes
#### Configuration Management
- [ ] Sensitive configuration values use Home Assistant secrets
- [ ] Default configurations are secure
- [ ] Configuration validation prevents dangerous settings
- [ ] Configuration files not world-readable
### 🔍 Code Quality
#### Error Handling
- [ ] Graceful error handling implemented
- [ ] Error messages don't leak sensitive information
- [ ] Appropriate logging levels used
- [ ] Failed operations don't leave system in unsafe state
#### Dependencies
- [ ] All dependencies are from trusted sources
- [ ] Dependencies are pinned to specific versions
- [ ] Vulnerability scanning performed on dependencies
- [ ] Unused dependencies removed
### 📋 AppArmor Profile
#### Profile Completeness
- [ ] AppArmor profile exists and is tested
- [ ] Profile follows principle of least privilege
- [ ] No blanket capability grants without justification
- [ ] File access restrictions appropriate
- [ ] Network access restrictions defined
#### Profile Testing
- [ ] Profile tested with add-on functionality
- [ ] Profile doesn't break legitimate operations
- [ ] Profile logs violations for monitoring
- [ ] Profile updated when add-on functionality changes
### 📚 Documentation
#### Security Documentation
- [ ] Security considerations documented in README
- [ ] Required privileges explained and justified
- [ ] Known security limitations documented
- [ ] Upgrade/migration security notes provided
#### Configuration Documentation
- [ ] Security-relevant configuration options explained
- [ ] Default security settings documented
- [ ] Best practices for secure configuration provided
- [ ] Examples show secure configurations
### 🧪 Testing
#### Security Testing
- [ ] Add-on tested with minimal privileges
- [ ] Input validation tested with malicious inputs
- [ ] Error conditions tested for security implications
- [ ] Integration testing performed with Home Assistant security features
#### Automated Testing
- [ ] Security linting passes (shellcheck, hadolint, etc.)
- [ ] Dependency vulnerability scanning passes
- [ ] Container image scanning passes
- [ ] Configuration validation testing passes
## 🚨 Red Flags - Automatic Review Required
The following items require mandatory security team review:
- [ ] `chmod 777` anywhere in the code
- [ ] `SYS_ADMIN` or `DAC_OVERRIDE` capabilities
- [ ] Network host mode requested
- [ ] Privileged container mode requested
- [ ] Direct hardware device access
- [ ] Custom AppArmor profile bypass
- [ ] Remote code execution capabilities
- [ ] Cryptographic key generation or storage
- [ ] User authentication mechanisms
- [ ] File system modifications outside add-on directories
## 📝 Review Sign-off
### Reviewer Information
- **Reviewer Name**: ________________
- **Review Date**: ________________
- **Add-on Name**: ________________
- **Add-on Version**: ________________
### Security Assessment
- **Risk Level**: [ ] Low [ ] Medium [ ] High [ ] Critical
- **Approval Status**: [ ] Approved [ ] Conditionally Approved [ ] Rejected
### Required Actions (if any)
1. _________________________________
2. _________________________________
3. _________________________________
### Final Approval
- [ ] All critical security requirements met
- [ ] All red flags addressed or justified
- [ ] Security documentation complete
- [ ] Testing completed successfully
**Reviewer Signature**: ________________ **Date**: ________________
---
*This checklist should be completed for every new add-on and major security-related changes to existing add-ons. Keep this document updated as security requirements evolve.*

View File

@@ -1,204 +0,0 @@
# Container Privilege Reduction Examples
## 🔧 Practical Examples for Immediate Implementation
This document provides specific configuration changes to reduce container privileges in the top add-ons.
### 1. Filebrowser - Remove Excessive Privileges
**Current Configuration** (High Risk):
```json
{
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
"devices": [
"/dev/dri", "/dev/dri/card0", "/dev/dri/card1",
"/dev/sda", "/dev/sdb", "/dev/sdc", "/dev/sdd",
"/dev/nvme", "/dev/nvme0", "/dev/nvme0n1",
"...70+ device entries..."
]
}
```
**Recommended Configuration** (Secure):
```json
{
"privileged": ["DAC_READ_SEARCH"],
"devices": [
"/dev/fuse" // Only if FUSE filesystems needed
]
}
```
**Rationale**: File browsing doesn't require system administration privileges. Use proper volume mounting instead of device access.
### 2. Radarr/Sonarr/Bazarr - Media Management
**Current Configuration** (High Risk):
```json
{
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
"devices": ["All storage devices..."]
}
```
**Recommended Configuration** (Secure):
```json
{
"privileged": ["DAC_READ_SEARCH"],
"devices": []
}
```
**Rationale**: Media collection management is file I/O operations that don't require admin privileges.
### 3. Arpspoof - Network Blocking Tool
**Current Configuration** (Wrong Privileges):
```json
{
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
"devices": ["All storage devices..."]
}
```
**Recommended Configuration** (Correct Privileges):
```json
{
"privileged": ["NET_ADMIN", "NET_RAW"],
"devices": [],
"host_network": true
}
```
**Rationale**: ARP spoofing requires network manipulation capabilities, not system administration. No storage access needed.
### 4. Nextcloud - Cloud Storage
**Current Configuration** (Over-privileged):
```json
{
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
"devices": ["Duplicate and excessive device entries..."]
}
```
**Recommended Configuration** (Minimal):
```json
{
"privileged": ["CHOWN", "FOWNER", "DAC_READ_SEARCH"],
"devices": [
"/dev/fuse" // For external storage mounting
]
}
```
**Rationale**: Cloud storage needs file ownership management, not full system administration.
### 5. Plex - Media Server
**Current Configuration** (Over-privileged):
```json
{
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
"devices": ["Storage + Video + DVB devices..."]
}
```
**Recommended Configuration** (Hardware-specific):
```json
{
"privileged": ["DAC_READ_SEARCH"],
"devices": [
"/dev/dri", "/dev/dri/card0", "/dev/dri/renderD128", // GPU transcoding
"/dev/dvb/adapter*/demux*", "/dev/dvb/adapter*/dvr*" // TV tuners only
]
}
```
**Rationale**: Media server needs GPU access for transcoding and TV tuner access, but not system administration.
## 🏗️ Implementation Templates
### Template A: File Management Applications
```json
{
"privileged": ["DAC_READ_SEARCH"],
"devices": [],
"map": [
"media:rw",
"share:rw",
"addon_config:rw"
]
}
```
**Use for**: Filebrowser, file managers, backup tools
### Template B: Media Applications
```json
{
"privileged": ["DAC_READ_SEARCH"],
"devices": [
"/dev/dri", // GPU transcoding only
"/dev/dri/card0",
"/dev/dri/renderD128"
],
"map": [
"media:rw",
"share:rw"
]
}
```
**Use for**: Plex, Emby, Jellyfin, Radarr, Sonarr
### Template C: Network Applications
```json
{
"privileged": ["NET_ADMIN", "NET_RAW"],
"devices": [],
"host_network": true
}
```
**Use for**: Network monitoring, VPN, proxy tools
### Template D: Database Applications
```json
{
"privileged": [],
"devices": [],
"map": [
"addon_config:rw"
]
}
```
**Use for**: PostgreSQL, MariaDB, Redis
## 📋 Validation Checklist
Before implementing privilege reduction:
- [ ] **Test functionality** with reduced privileges in development
- [ ] **Document breaking changes** in upgrade notes
- [ ] **Provide migration guide** for users
- [ ] **Update AppArmor profiles** to match new privilege set
- [ ] **Verify device access** is still functional where needed
## ⚠️ Breaking Changes Notice
**Important**: These privilege reductions may require users to:
1. **Restart add-ons** after configuration update
2. **Reconfigure external storage** for file managers
3. **Update file permissions** manually in some cases
4. **Check hardware transcoding** still works for media servers
## 🧪 Testing Approach
1. **Create test branch** with privilege reductions
2. **Test core functionality** of each affected add-on
3. **Verify security** with reduced privileges
4. **Document any issues** and create mitigation steps
5. **Rollback plan** if critical functionality breaks
---
*These examples provide a practical roadmap for implementing the security improvements identified in the privilege analysis.*

View File

@@ -1,111 +0,0 @@
#!/usr/bin/with-contenv bashio
# Example validated initialization script
# This demonstrates how to use the input validation library
set -euo pipefail
# Source the validation library
source /ha_input_validation.sh
bashio::log.info "🔍 Starting configuration validation..."
##################################
# VALIDATE COMMON CONFIGURATIONS #
##################################
# Use the common validation function
validate_common_config
##################################
# VALIDATE APPLICATION-SPECIFIC #
##################################
# Example for a media server add-on like Plex/Emby
if [[ "${ADDON_TYPE:-media}" == "media" ]]; then
# Validate transcoding quality settings
if bashio::config.has_value "transcoding_quality"; then
validate_string "transcoding_quality" "^(low|medium|high|ultra)$" "Transcoding quality (low, medium, high, ultra)" false
fi
# Validate maximum concurrent streams
if bashio::config.has_value "max_streams"; then
validate_numeric "max_streams" 1 20 "Maximum concurrent streams (1-20)" false
fi
fi
# Example for a file management add-on like Filebrowser
if [[ "${ADDON_TYPE:-file}" == "file" ]]; then
# Validate base folder (prevent directory traversal)
if bashio::config.has_value "base_folder"; then
validate_path "base_folder" "/config" "Base folder for file browsing" false
fi
# Validate disable thumbnails setting
if bashio::config.has_value "disable_thumbnails"; then
validate_boolean "disable_thumbnails" "Disable thumbnail generation" false
fi
fi
# Example for a network tool add-on like Arpspoof
if [[ "${ADDON_TYPE:-network}" == "network" ]]; then
# Validate target IP addresses
if bashio::config.has_value "target_ip"; then
validate_ip "target_ip" "Target device IP address"
fi
# Validate gateway IP
if bashio::config.has_value "gateway_ip"; then
validate_ip "gateway_ip" "Network gateway IP address"
fi
# Validate block duration
if bashio::config.has_value "block_duration"; then
validate_numeric "block_duration" 1 3600 "Block duration in seconds (1-3600)"
fi
fi
##################################
# VALIDATE SECURITY SETTINGS #
##################################
# Validate authentication settings
if bashio::config.has_value "enable_auth"; then
validate_boolean "enable_auth" "Enable authentication"
if bashio::config.true "enable_auth"; then
# If auth is enabled, validate credentials
validate_string "username" "^[a-zA-Z0-9_-]{3,20}$" "Username (3-20 alphanumeric characters)"
# Validate password strength
if bashio::config.has_value "password"; then
local password
password=$(bashio::config "password")
if [[ ${#password} -lt 8 ]]; then
bashio::log.fatal "Password too short. Minimum 8 characters required."
exit 1
fi
if [[ ! "$password" =~ [A-Z] ]] || [[ ! "$password" =~ [a-z] ]] || [[ ! "$password" =~ [0-9] ]]; then
bashio::log.warning "⚠️ Weak password detected. Consider using uppercase, lowercase, and numbers."
fi
bashio::log.debug "✅ Validated password strength"
fi
fi
fi
##################################
# FINALIZATION #
##################################
bashio::log.info "🎉 Configuration validation completed successfully!"
bashio::log.info "Starting application with validated configuration..."
# At this point, all configuration values have been validated
# and the application can start safely with trusted inputs
# Export validated configurations as environment variables for the application
export VALIDATED_CONFIG="true"
export CONFIG_VALIDATION_TIME="$(date -Iseconds)"
bashio::log.debug "Environment prepared with validated configuration"

View File

@@ -1,109 +0,0 @@
#!/bin/bash
# Secure version of automatic apps download
set -euo pipefail
##############################
# Automatic apps download #
# SECURE VERSION #
##############################
PACKAGES="$1"
echo "📦 Installing packages securely: $PACKAGES"
# Install dependencies securely
install_dependencies() {
echo "🔧 Installing required dependencies..."
# Install bash if needed
if ! command -v bash > /dev/null 2>&1; then
(apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) > /dev/null
fi
# Install curl if needed
if ! command -v curl > /dev/null 2>&1; then
(apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) > /dev/null
fi
# Install ca-certificates for SSL verification
(apt-get update && apt-get install -yqq --no-install-recommends ca-certificates || apk add --no-cache ca-certificates) > /dev/null 2>&1 || true
}
# Secure download function
secure_download() {
local url="$1"
local output_file="$2"
local expected_sha256="${3:-}"
echo "🔒 Downloading: $(basename "$output_file")"
# Download with security headers and timeouts
if ! curl -fsSL \
--retry 3 \
--retry-delay 2 \
--connect-timeout 10 \
--max-time 60 \
--user-agent "HomeAssistant-AddOn/1.0" \
--header "Accept: application/octet-stream" \
"$url" -o "$output_file"; then
echo "❌ Failed to download: $url" >&2
return 1
fi
# Verify checksum if provided
if [ -n "$expected_sha256" ]; then
local actual_sha256
actual_sha256=$(sha256sum "$output_file" | cut -d' ' -f1)
if [ "$actual_sha256" != "$expected_sha256" ]; then
echo "❌ Checksum verification failed for $output_file" >&2
echo "Expected: $expected_sha256" >&2
echo "Actual: $actual_sha256" >&2
rm -f "$output_file"
return 1
fi
echo "✅ Checksum verified"
else
echo "⚠️ No checksum provided - consider adding one for security"
fi
# Set secure permissions
chmod 755 "$output_file"
}
# Main execution
main() {
echo "🛡️ Starting secure package installation..."
# Install dependencies
install_dependencies
# For now, we'll download without checksum but with secure practices
# TODO: Add checksums for ha_automatic_packages.sh in future releases
echo "📥 Downloading package installer..."
local script_url="https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_automatic_packages.sh"
local script_file="/ha_automatic_packages.sh"
# Download securely (without checksum for now - to be added)
if secure_download "$script_url" "$script_file" ""; then
echo "🏃 Executing package installer..."
# Execute with error handling
if bash "$script_file" "${PACKAGES:-}"; then
echo "✅ Package installation completed successfully"
else
echo "❌ Package installation failed" >&2
exit 1
fi
# Clean up
rm -f "$script_file"
echo "🧹 Cleanup completed"
else
echo "❌ Failed to download package installer" >&2
exit 1
fi
}
# Execute main function
main "$@"

View File

@@ -1,256 +0,0 @@
#!/usr/bin/with-contenv bashio
# Input Validation Library for Home Assistant Add-ons
# Provides secure validation functions for user inputs
set -euo pipefail
##################################
# CONFIGURATION INPUT VALIDATION #
##################################
# Function to validate string input with pattern
validate_string() {
local config_key="$1"
local pattern="$2"
local description="$3"
local required="${4:-true}"
if ! bashio::config.has_value "$config_key"; then
if [[ "$required" == "true" ]]; then
bashio::log.fatal "Required configuration '$config_key' not found"
bashio::log.fatal "Expected: $description"
exit 1
else
return 0 # Optional field not provided
fi
fi
local value
value=$(bashio::config "$config_key")
if [[ ! $value =~ $pattern ]]; then
bashio::log.fatal "Invalid format for '$config_key': '$value'"
bashio::log.fatal "Expected: $description"
bashio::log.fatal "Pattern: $pattern"
exit 1
fi
bashio::log.debug "✅ Validated $config_key: $value"
}
# Function to validate numeric input with bounds
validate_numeric() {
local config_key="$1"
local min_val="$2"
local max_val="$3"
local description="$4"
local required="${5:-true}"
if ! bashio::config.has_value "$config_key"; then
if [[ "$required" == "true" ]]; then
bashio::log.fatal "Required configuration '$config_key' not found"
exit 1
else
return 0
fi
fi
local value
value=$(bashio::config "$config_key")
# Check if it's a valid number
if ! [[ "$value" =~ ^[0-9]+$ ]]; then
bashio::log.fatal "Invalid numeric value for '$config_key': '$value'"
bashio::log.fatal "Expected: $description"
exit 1
fi
# Check bounds
if [[ $value -lt $min_val ]] || [[ $value -gt $max_val ]]; then
bashio::log.fatal "Value for '$config_key' out of range: $value"
bashio::log.fatal "Expected: $description (range: $min_val-$max_val)"
exit 1
fi
bashio::log.debug "✅ Validated $config_key: $value"
}
# Function to validate boolean input
validate_boolean() {
local config_key="$1"
local description="$2"
local required="${3:-true}"
if ! bashio::config.has_value "$config_key"; then
if [[ "$required" == "true" ]]; then
bashio::log.fatal "Required configuration '$config_key' not found"
exit 1
else
return 0
fi
fi
local value
value=$(bashio::config "$config_key")
if [[ ! "$value" =~ ^(true|false)$ ]]; then
bashio::log.fatal "Invalid boolean value for '$config_key': '$value'"
bashio::log.fatal "Expected: $description (true or false)"
exit 1
fi
bashio::log.debug "✅ Validated $config_key: $value"
}
# Function to validate file path (prevent directory traversal)
validate_path() {
local config_key="$1"
local base_path="$2"
local description="$3"
local required="${4:-true}"
if ! bashio::config.has_value "$config_key"; then
if [[ "$required" == "true" ]]; then
bashio::log.fatal "Required configuration '$config_key' not found"
exit 1
else
return 0
fi
fi
local value
value=$(bashio::config "$config_key")
# Check for directory traversal attempts
if [[ "$value" =~ \.\. ]] || [[ "$value" =~ ^/ ]]; then
bashio::log.fatal "Invalid path for '$config_key': '$value'"
bashio::log.fatal "Path contains directory traversal or is absolute"
bashio::log.fatal "Expected: $description"
exit 1
fi
# Normalize path and check if it's within base path
local full_path="$base_path/$value"
local real_path
real_path=$(realpath -m "$full_path" 2> /dev/null || echo "$full_path")
local real_base
real_base=$(realpath -m "$base_path")
if [[ ! "$real_path" =~ ^"$real_base" ]]; then
bashio::log.fatal "Path '$config_key' outside allowed base: '$value'"
bashio::log.fatal "Expected: $description"
exit 1
fi
bashio::log.debug "✅ Validated path $config_key: $value"
}
# Function to validate URL
validate_url() {
local config_key="$1"
local allowed_schemes="$2" # e.g., "http|https"
local description="$3"
local required="${4:-true}"
if ! bashio::config.has_value "$config_key"; then
if [[ "$required" == "true" ]]; then
bashio::log.fatal "Required configuration '$config_key' not found"
exit 1
else
return 0
fi
fi
local value
value=$(bashio::config "$config_key")
# Basic URL validation
local url_pattern="^($allowed_schemes)://[A-Za-z0-9.-]+(:[0-9]+)?(/.*)?$"
if [[ ! "$value" =~ $url_pattern ]]; then
bashio::log.fatal "Invalid URL for '$config_key': '$value'"
bashio::log.fatal "Expected: $description"
bashio::log.fatal "Allowed schemes: $allowed_schemes"
exit 1
fi
bashio::log.debug "✅ Validated URL $config_key: $value"
}
# Function to validate IP address
validate_ip() {
local config_key="$1"
local description="$2"
local required="${3:-true}"
if ! bashio::config.has_value "$config_key"; then
if [[ "$required" == "true" ]]; then
bashio::log.fatal "Required configuration '$config_key' not found"
exit 1
else
return 0
fi
fi
local value
value=$(bashio::config "$config_key")
# IPv4 validation
local ipv4_pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ "$value" =~ $ipv4_pattern ]]; then
# Validate each octet is 0-255
IFS='.' read -ra octets <<< "$value"
for octet in "${octets[@]}"; do
if [[ $octet -gt 255 ]]; then
bashio::log.fatal "Invalid IP address for '$config_key': '$value'"
bashio::log.fatal "Expected: $description"
exit 1
fi
done
else
bashio::log.fatal "Invalid IP address format for '$config_key': '$value'"
bashio::log.fatal "Expected: $description"
exit 1
fi
bashio::log.debug "✅ Validated IP $config_key: $value"
}
# Function to validate common add-on configurations
validate_common_config() {
bashio::log.info "🔍 Validating common configuration parameters..."
# Validate SSL configuration if present
if bashio::config.has_value "ssl"; then
validate_boolean "ssl" "Enable/disable SSL"
if bashio::config.true "ssl"; then
validate_string "certfile" "^[a-zA-Z0-9._-]+\.pem$" "SSL certificate filename" true
validate_string "keyfile" "^[a-zA-Z0-9._-]+\.pem$" "SSL private key filename" true
fi
fi
# Validate user/group IDs if present
if bashio::config.has_value "PUID"; then
validate_numeric "PUID" 0 65535 "User ID (0-65535)"
fi
if bashio::config.has_value "PGID"; then
validate_numeric "PGID" 0 65535 "Group ID (0-65535)"
fi
# Validate timezone if present
if bashio::config.has_value "TZ"; then
validate_string "TZ" "^[A-Za-z0-9/_+-]+$" "Timezone (e.g., Europe/London)" false
fi
bashio::log.info "✅ Common configuration validation completed"
}
# If script is called directly, show usage
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
bashio::log.info "🛡️ Home Assistant Input Validation Library"
bashio::log.info "This library provides secure validation functions for add-on configurations"
echo ""
bashio::log.info "Usage: source /ha_input_validation.sh"
fi

View File

@@ -1,86 +0,0 @@
#!/bin/bash
# Secure script downloader with integrity verification
set -euo pipefail
##################################
# Secure Template Script Download #
##################################
# Function to securely download and verify scripts
secure_download() {
local url="$1"
local output_file="$2"
local expected_sha256="$3"
echo "🔒 Securely downloading: $(basename "$output_file")"
# Download with retry logic
local retries=3
local retry_delay=2
for i in $(seq 1 $retries); do
if curl -fsSL --retry 3 --retry-delay 1 --connect-timeout 10 --max-time 30 "$url" -o "$output_file"; then
break
elif [ $i -eq $retries ]; then
echo "❌ Failed to download after $retries attempts: $url" >&2
return 1
else
echo "⚠️ Download attempt $i failed, retrying in ${retry_delay}s..." >&2
sleep $retry_delay
fi
done
# Verify SHA256 checksum if provided
if [ -n "$expected_sha256" ]; then
echo "🔍 Verifying integrity..."
local actual_sha256
actual_sha256=$(sha256sum "$output_file" | cut -d' ' -f1)
if [ "$actual_sha256" = "$expected_sha256" ]; then
echo "✅ Integrity verification passed"
else
echo "❌ INTEGRITY VERIFICATION FAILED!" >&2
echo "Expected: $expected_sha256" >&2
echo "Actual: $actual_sha256" >&2
rm -f "$output_file"
return 1
fi
else
echo "⚠️ No checksum provided - skipping integrity verification"
fi
# Set secure permissions
chmod 755 "$output_file"
echo "🔧 Set secure permissions (755)"
}
# Function to install common dependencies securely
install_dependencies() {
echo "📦 Installing secure dependencies..."
# Install bash if needed
if ! command -v bash > /dev/null 2>&1; then
(apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) > /dev/null
fi
# Install curl if needed
if ! command -v curl > /dev/null 2>&1; then
(apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) > /dev/null
fi
# Install ca-certificates for SSL verification
(apt-get update && apt-get install -yqq --no-install-recommends ca-certificates || apk add --no-cache ca-certificates) > /dev/null 2>&1 || true
}
# Main execution if called directly
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
echo "🛡️ Home Assistant Secure Script Downloader"
echo "This script provides secure download functions for HA add-ons"
echo ""
echo "Usage:"
echo " source $0"
echo " secure_download <url> <output_file> <sha256_hash>"
echo ""
echo "Example:"
echo " secure_download 'https://example.com/script.sh' '/tmp/script.sh' 'abc123...'"
fi

View File

@@ -1,11 +0,0 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"allow": [
"Bash"
],
"deny": [
"Bash(git push -u origin main:*"
]
}
}

View File

@@ -1,6 +1,162 @@
## 1.85.120-ls68-3 (15-01-2026)
- Minor bugs fixed
# Changelog
## 1.85.120-ls68
- Initial release
## 4.16-r0-ls93 (2026-01-14)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls92 (2026-01-08)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-12-24)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-12-20)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-12-13)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-11-22)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls92 (2025-11-15)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-11-08)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
- Added support for configuring extra environment variables via the `env_vars` add-on option alongside config.yaml. See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
## "4.16-r0-ls94" (2025-10-25)
- Minor bugs fixed
## 4.16-r0-ls94 (2025-10-25)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-10-18)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-09-06)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-08-23)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-08-16)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-08-09)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-08-01)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-07-25)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-07-05)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-06-28)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-06-21)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-06-13)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-06-07)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94-6 (2025-06-01)
- Minor bugs fixed
## 4.16-r0-ls94-4 (2025-05-28)
- Minor bugs fixed
## 4.16-r0-ls94-2 (2025-05-28)
- Minor bugs fixed
## 4.16-r0-ls94 (2025-05-24)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93-2 (2025-05-17)
- Minor bugs fixed
## 4.16-r0-ls93 (2025-05-17)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-04-26)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-04-19)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-04-05)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-03-29)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-03-22)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94 (2025-03-15)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls93 (2025-03-08)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls95 (2025-03-01)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94-5 (2025-02-21)
- Option to install microsoft edge
## 4.16-r0-ls94-3 (2025-02-15)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## 4.16-r0-ls94-9 (2025-01-29)
- Minor bugs fixed
## 4.16-r0-ls94-7 (2025-01-29)
- External port disabled by default to rely on ingress
- Added a message that opening a port without password is a very high risk
- Add microsoft edge
## 4.16-r0-ls94 (2025-01-25)
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
## fb06d0b4-ls71-5 (2025-01-24)
- Minor bugs fixed
## fb06d0b4-ls71-4 (2025-01-24)
- Minor bugs fixed
## fb06d0b4-ls71-2 (2025-01-24)
- First version of Ubuntu KDE
- Use own ssl certificates

View File

@@ -39,14 +39,14 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# hadolint ignore=SC2015,DL4006,SC2013,SC2086
RUN \
# Change home folder location
usermod --home /config abc && \
usermod --home /config/data_kde abc && \
\
# Set +e
if [[ -d /etc/services.d ]] && ls /etc/services.d/*/run 1> /dev/null 2>&1; then sed -i "1a set +e" /etc/services.d/*/run; fi
# Global LSIO modifications
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_lsio.sh" "/ha_lsio.sh"
ARG CONFIGLOCATION="/config"
ARG CONFIGLOCATION="/config/data_kde"
RUN chmod 744 /ha_lsio.sh && if grep -qr "lsio" /etc; then /ha_lsio.sh "$CONFIGLOCATION"; fi && rm /ha_lsio.sh
##################
@@ -69,7 +69,7 @@ ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templat
RUN chmod 744 /ha_automodules.sh && /ha_automodules.sh "$MODULES" && rm /ha_automodules.sh
# Manual apps
ENV PACKAGES="nginx"
ENV PACKAGES="nginx engrampa kwalletmanager"
# Automatic apps & bashio
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_autoapps.sh" "/ha_autoapps.sh"
@@ -80,6 +80,7 @@ RUN chmod 744 /ha_autoapps.sh && /ha_autoapps.sh "$PACKAGES" && rm /ha_autoapps.
################
# Add entrypoint
#ENV S6_STAGE2_HOOK=/ha_entrypoint.sh
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_entrypoint.sh" "/ha_entrypoint.sh"
# Entrypoint modifications
@@ -90,11 +91,9 @@ RUN chmod 777 /ha_entrypoint.sh /ha_entrypoint_modif.sh && /ha_entrypoint_modif.
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/bashio-standalone.sh" "/.bashio-standalone.sh"
RUN chmod 777 /.bashio-standalone.sh
RUN sed -i "s|/usr/bin/env|/usr/bin/with-contenv|g" /etc/cont-init.d/*
#WORKDIR /
#ENTRYPOINT [ "/usr/bin/env" ]
#CMD [ "/ha_entrypoint.sh" ]
ENTRYPOINT [ "/usr/bin/env" ]
CMD [ "/ha_entrypoint.sh" ]
############
# 5 Labels #

View File

@@ -1,4 +1,5 @@
# Home assistant add-on: Brave Browser
# Home assistant add-on: Webtop KDE Alpine
I maintain this and other Home Assistant add-ons in my free time: keeping up with upstream changes, HA changes, and testing on real hardware takes a lot of time (and some money). I use around 5-10 of my >110 addons so regularly I install test machines (and purchase some test services such as vpn) that I don't use myself to troubleshoot and improve the addons
@@ -9,9 +10,9 @@ If this add-on saves you time or makes your setup easier, I would be very gratef
## Addon informations
![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fbrave%2Fconfig.yaml)
![Ingress](https://img.shields.io/badge/dynamic/yaml?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fbrave%2Fconfig.yaml)
![Arch](https://img.shields.io/badge/dynamic/yaml?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fbrave%2Fconfig.yaml)
![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fwebtop%2Fconfig.yaml)
![Ingress](https://img.shields.io/badge/dynamic/yaml?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fwebtop%2Fconfig.yaml)
![Arch](https://img.shields.io/badge/dynamic/yaml?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fwebtop%2Fconfig.yaml)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/9c6cf10bdbba45ecb202d7f579b5be0e)](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade)
[![GitHub Super-Linter](https://img.shields.io/github/actions/workflow/status/alexbelgium/hassio-addons/weekly-supelinter.yaml?label=Lint%20code%20base)](https://github.com/alexbelgium/hassio-addons/actions/workflows/weekly-supelinter.yaml)
@@ -24,54 +25,62 @@ _Thanks to everyone having starred my repo! To star it click on the image below,
[![Stargazers repo roster for @alexbelgium/hassio-addons](https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.github/stars2.svg)](https://github.com/alexbelgium/hassio-addons/stargazers)
![downloads evolution](https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/webtop/stats.png)
## About
---
[Brave](https://brave.com/) is a fast, private and secure web browser. This add-on is based on the docker image https://github.com/linuxserver/docker-brave.
[webtop](https://github.com/webtop/webtop) is a full desktop environments accessible via any modern web browser.
This addon is based on the docker image https://github.com/linuxserver/docker-webtop
## Configuration
---
Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
Webui can be found with ingress or at <https://homeassistant:PORT> (port 3001). Ports 3000 and 3001 are disabled by default and can be enabled through the add-on options.
Webui can be found with ingress or at <http://homeassistant:PORT>. The port is by default disabled but can be enabled through the addon options.
| Option | Description | Default |
|--------|-------------|---------|
| `PUID` | Permissions user ID | `0` |
| `PGID` | Permissions group ID | `0` |
| `TZ` | Timezone for the container | `UTC` |
| `CUSTOM_USER` | Basic auth username (optional) | `null` |
| `PASSWORD` | Basic auth password (optional) | `null` |
By default the image is based around the abc user and we recommend using this user as all of the init/config is based around it. The default password is also abc . If you want to change this password and require authentication when accessing the interface simply issue passwd inside a gui terminal in the webtop. Then when accessing the web interface use the path:
http://localhost:3000/?login=true
Apps installations are not remanent, you need to do it via addon options. Their config, however, is.
If graphics don't work, use the DRINODE feature to select your graphic device.
See all potential ENV variables here : https://docs.linuxserver.io/images/docker-webtop#optional-environment-variables
```yaml
PUID: 0
PGID: 0
TZ: UTC
TZ: timezone ; Country/City according to https://manpages.ubuntu.com/manpages/trusty/man3/DateTime::TimeZone::Catalog.3pm.html
additional_apps: engrampa,thunderbird # Allows installation of apps, as they are not persistent
DRINODE: specify a custom graphic device, default is /dev/dri/renderD128
DNS_servers: 8.8.8.8,1.1.1.1 # Keep blank to use routers DNS, or set custom DNS to avoid spamming in case of local DNS ad-remover
localdisks: sda1 #put the hardware name of your drive to mount separated by commas, or its label. ex. sda1, sdb1, MYNAS...
networkdisks: "//SERVER/SHARE" # optional, list of smb servers to mount, separated by commas
cifsusername: "username" # optional, smb username, same for all smb shares
cifspassword: "password" # optional, smb password
cifsdomain: "domain" # optional, allow setting the domain for the smb share
```
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
## Installation
---
The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on.
1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA)
[![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
1. Install this add-on.
1. Click the `Save` button to store your configuration.
1. Set the add-on options to your preferences.
1. Set the add-on options to your preferences
1. Start the add-on.
1. Check the logs of the add-on to see if everything went well.
1. Open the webUI and adapt the software options.
1. Open the webUI and adapt the software options
## Support
Create an issue on github
## Illustration
![illustration](https://www.linuxserver.io/user/pages/content/images/2021/05/menu.png)
[repository]: https://github.com/alexbelgium/hassio-addons

View File

@@ -1,6 +1,6 @@
#include <tunables/global>
profile brave_addon flags=(attach_disconnected,mediate_deleted) {
profile webtop_addon flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base>
capability,
@@ -22,7 +22,7 @@ profile brave_addon flags=(attach_disconnected,mediate_deleted) {
capability setuid,
capability sys_admin,
capability dac_read_search,
# capability dac_override,
capability dac_override,
# capability sys_rawio,
# S6-Overlay
@@ -49,10 +49,15 @@ profile brave_addon flags=(attach_disconnected,mediate_deleted) {
/dev/sda1 mrwkl,
/dev/sdb1 mrwkl,
/dev/nvme0 mrwkl,
/dev/nvme0n1 mrwkl,
/dev/nvme1 mrwkl,
/dev/mmcblk0p1 mrwkl,
/dev/* mrwkl,
/udev/* mrwkl,
/tmp/** mrkwl,
/dev/fuse/** mrkwl,
/dev/** mrkwl,
/sys/firmware/** mrkwl,
# Data access
/data/** rw,

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/brave:arm64v8-latest",
"amd64": "lscr.io/linuxserver/brave:amd64-latest"
"aarch64": "ghcr.io/linuxserver/webtop:arm64v8-ubuntu-kde",
"amd64": "ghcr.io/linuxserver/webtop:amd64-ubuntu-kde"
}
}

View File

@@ -2,7 +2,7 @@ arch:
- aarch64
- amd64
audio: true
description: Brave browser accessible via a web-based desktop
description: Brave browser
devices:
- /dev/dri
- /dev/dri/card0
@@ -66,36 +66,54 @@ devices:
- /dev/nvme1
- /dev/nvme2
environment:
HOME: /config
PGID: "0"
PUID: "0"
FM_HOME: /config/data
HOME: /config/data
START_DOCKER: "false"
TITLE: Brave Browser
TZ: UTC
TITLE: Brave browser
shm_size: 1gb
image: ghcr.io/alexbelgium/brave-{arch}
ingress: true
init: false
map:
- addon_config:rw
- media:rw
- share:rw
- ssl
name: Brave Browser
name: Brave
options:
env_vars: []
PUID: 0
DNS_server: 8.8.8.8
PGID: 0
TZ: UTC
PUID: 0
additional_apps: engrampa,libreoffice
certfile: fullchain.pem
data_location: /config/data
keyfile: privkey.pem
use_own_certs: true
panel_admin: false
panel_icon: mdi:shield
panel_icon: mdi:monitor
ports:
20/tcp: null
21/tcp: null
22/tcp: null
23/tcp: null
25/tcp: null
3000/tcp: null
3001/tcp: null
8082/tcp: null
3002/tcp: null
53/tcp: null
80/tcp: null
ports_description:
3000/tcp: Web interface (http)
3001/tcp: Web interface (https)
8082/tcp: Websocket port
20/tcp: FTP
21/tcp: FTP
22/tcp: SSH
23/tcp: TELNET
25/tcp: SMTP
3000/tcp: Web interface
3001/tcp: Web interface https
3002/tcp: custom port 2
53/tcp: DNS
80/tcp: http
privileged:
- SYS_ADMIN
- DAC_READ_SEARCH
@@ -103,16 +121,27 @@ schema:
env_vars:
- name: match(^[A-Za-z0-9_]+$)
value: str?
CUSTOM_USER: str?
DRI_NODE: str?
DRINODE: str?
ingress_user: str?
DNS_server: str?
DRINODE: list(/dev/dri/card0|/dev/dri/card1|/dev/dri/card2|/dev/dri/renderD128|/dev/dri/renderD129|)?
KEYBOARD: list(da-dk-qwerty|de-de-qwertz|en-gb-qwerty|en-us-qwerty|es-es-qwerty|fr-ch-qwertz|fr-fr-azerty|it-it-qwerty|ja-jp-qwerty|pt-br-qwerty|sv-se-qwerty|tr-tr-qwerty)?
PASSWORD: str?
PUID: int
PGID: int
TZ: str?
PUID: int
TZ: match([A-Z][a-z]*./[A-Z][a-z]*.)?
additional_apps: str?
certfile: str
cifsdomain: str?
cifspassword: str?
cifsusername: str?
data_location: str?
install_ms_edge: bool?
keyfile: str
localdisks: str?
networkdisks: str?
use_own_certs: bool?
slug: brave
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/brave
version: 1.85.120-ls68-3
url: https://github.com/alexbelgium/hassio-addons
version: "4.16-r0-ls93"
video: true

BIN
brave/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
brave/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,8 +1,83 @@
#!/bin/bash
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
# shellcheck disable=SC2046
set -e
if [ ! -d /config ]; then
echo "Creating /config"
mkdir -p /config
# Define user
PUID=$(bashio::config "PUID")
PGID=$(bashio::config "PGID")
# Set user for microsoft edge if available
if [ -f /usr/bin/microsoft-edge-real ]; then
chown "$PUID:$PGID" /usr/bin/microsoft-edge*
chmod +x /usr/bin/microsoft-edge*
fi
chown -R "$PUID:$PGID" /config
# Check data location
LOCATION=$(bashio::config 'data_location')
if [[ "$LOCATION" = "null" || -z "$LOCATION" ]]; then
# Default location
LOCATION="/config/data_kde"
else
# Check if config is located in an acceptable location
LOCATIONOK=""
for location in "/share" "/config" "/data" "/mnt"; do
if [[ "$LOCATION" == "$location"* ]]; then
LOCATIONOK=true
fi
done
if [ -z "$LOCATIONOK" ]; then
LOCATION="/config/data_kde"
bashio::log.fatal "Your data_location value can only be set in /share, /config or /data (internal to addon). It will be reset to the default location : $LOCATION"
fi
fi
# Set data location
bashio::log.info "Setting data location to $LOCATION"
# Correct home locations
for file in /etc/s6-overlay/s6-rc.d/*/run; do
if [ "$(sed -n '1{/bash/p};q' "$file")" ]; then
sed -i "1a export HOME=$LOCATION" "$file"
sed -i "1a export FM_HOME=$LOCATION" "$file"
fi
done
# Correct home location
for folders in /defaults /etc/cont-init.d /etc/services.d /etc/s6-overlay/s6-rc.d; do
if [ -d "$folders" ]; then
sed -i "s|/config/data_kde|$LOCATION|g" $(find "$folders" -type f) &> /dev/null || true
fi
done
# Change user home
sed -i "s|^\(abc:[^:]*:[^:]*:[^:]*:[^:]*:\)[^:]*|\1$LOCATION|" /etc/passwd
#usermod --home "$LOCATION" abc || true
# Add environment variables
if [ -d /var/run/s6/container_environment ]; then printf "%s" "$LOCATION" > /var/run/s6/container_environment/HOME; fi
if [ -d /var/run/s6/container_environment ]; then printf "%s" "$LOCATION" > /var/run/s6/container_environment/FM_HOME; fi
{
printf "%s\n" "export HOME=\"$LOCATION\""
printf "%s\n" "export FM_HOME=\"$LOCATION\""
} >> ~/.bashrc
# Create folder
echo "Creating $LOCATION"
mkdir -p "$LOCATION"
# Create cache
mkdir -p /.cache
chmod 755 /.cache
if [ -d "/config/.cache" ]; then
cp -rf /config/.cache /.cache
rm -r /config/.cache
fi
ln -sf /config/.cache /.cache
# Set ownership
bashio::log.info "Setting ownership to $PUID:$PGID"
chown -R "$PUID":"$PGID" "$LOCATION"
chmod -R 700 "$LOCATION"

View File

@@ -3,6 +3,23 @@
# shellcheck disable=SC2015
set -e
# Install specific apps
if bashio::config.has_value 'additional_apps'; then
bashio::log.info "Installing additional apps :"
# hadolint ignore=SC2005
NEWAPPS=$(bashio::config 'additional_apps')
for packagestoinstall in ${NEWAPPS//,/ }; do
bashio::log.green "... $packagestoinstall"
if command -v "apk" &> /dev/null; then
apk add --no-cache "$packagestoinstall" &> /dev/null || (bashio::log.fatal "Error : $packagestoinstall not found")
elif command -v "apt" &> /dev/null; then
apt-get install -yqq --no-install-recommends "$packagestoinstall" &> /dev/null || (bashio::log.fatal "Error : $packagestoinstall not found")
elif command -v "pacman" &> /dev/null; then
pacman --noconfirm -S "$packagestoinstall" &> /dev/null || (bashio::log.fatal "Error : $packagestoinstall not found")
fi
done
fi
# Set TZ
if bashio::config.has_value 'TZ'; then
TIMEZONE=$(bashio::config 'TZ')
@@ -11,11 +28,45 @@ if bashio::config.has_value 'TZ'; then
echo "$TIMEZONE" > /etc/timezone
fi || (bashio::log.fatal "Error : $TIMEZONE not found. Here is a list of valid timezones : https://manpages.ubuntu.com/manpages/focal/man3/DateTime::TimeZone::Catalog.3pm.html")
for env_var in CUSTOM_USER PASSWORD DRI_NODE DRINODE; do
if bashio::config.has_value "${env_var}"; then
bashio::log.info "Setting ${env_var} from add-on configuration"
if [ -d /var/run/s6/container_environment ]; then
printf "%s" "$(bashio::config "${env_var}")" > "/var/run/s6/container_environment/${env_var}"
fi
# Set keyboard
if bashio::config.has_value 'KEYBOARD'; then
KEYBOARD=$(bashio::config 'KEYBOARD')
bashio::log.info "Setting keyboard to $KEYBOARD"
if [ -d /var/run/s6/container_environment ]; then printf "%s" "$KEYBOARD" > /var/run/s6/container_environment/KEYBOARD; fi
printf "%s\n" "KEYBOARD=\"$KEYBOARD\"" >> ~/.bashrc
fi || true
# Set password
if bashio::config.has_value 'PASSWORD'; then
bashio::log.info "Setting password to the value defined in options"
PASSWORD=$(bashio::config 'PASSWORD')
passwd -d abc
echo -e "$PASSWORD\n$PASSWORD" | passwd abc
elif ! bashio::config.has_value 'PASSWORD' && [[ -n "$(bashio::addon.port "3000")" ]] && [[ -n $(bashio::addon.port "3001") ]]; then
bashio::log.warning "SEVERE RISK IDENTIFIED"
bashio::log.warning "You are opening an external port but your password is not defined"
bashio::log.warning "You risk being hacked ! Please disable the external ports, or use a password"
fi
# Set password
if bashio::config.true 'install_ms_edge'; then
bashio::log.info "Adding microsoft edge"
# Install edge
apt-get update
echo "**** install edge ****"
apt-get install --no-install-recommends -y ca-certificates
if [ -z ${EDGE_VERSION+x} ]; then
EDGE_VERSION=$(curl -sL https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/ \
| awk -F'(<a href="microsoft-edge-stable_|_amd64.deb\")' '/href=/ {print $2}' | sort --version-sort | tail -1)
fi
done
curl -o /tmp/edge.deb -L "https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_${EDGE_VERSION}_amd64.deb"
dpkg -I /tmp/edge.deb
apt-get install --no-install-recommends -y /tmp/edge.deb
echo "**** edge docker tweaks ****"
if [ -f /usr/bin/microsoft-edge-stable ]; then
mv /usr/bin/microsoft-edge-stable /usr/bin/microsoft-edge-real
else
mv /usr/bin/microsoft-edge /usr/bin/microsoft-edge-real
fi
mv /helpers/microsoft-edge-stable /usr/bin/
fi

View File

@@ -2,28 +2,28 @@
# shellcheck shell=bash
set -e
declare ingress_user
declare ingress_interface
declare ingress_port
ingress_user='admin'
if bashio::config.has_value 'ingress_user'; then
ingress_user=$(bashio::config 'ingress_user')
fi
ingress_port=$(bashio::addon.ingress_port)
ingress_interface=$(bashio::addon.ip_address)
sed -i "s/%%ingress_user%%/${ingress_user}/g" /etc/nginx/servers/ingress.conf
sed -i "s/%%port%%/${ingress_port}/g" /etc/nginx/servers/ingress.conf
sed -i "s/%%interface%%/${ingress_interface}/g" /etc/nginx/servers/ingress.conf
sed -i "s|%%UIPATH%%|$(bashio::addon.ingress_entry)|g" /etc/nginx/servers/ingress.conf
# nginx Path
NGINX_CONFIG=/etc/nginx/sites-available/ingress.conf
SUBFOLDER="$(bashio::addon.ingress_entry)"
if [[ -n "${SUBFOLDER}" && "${SUBFOLDER}" != "/" ]]; then
[[ "${SUBFOLDER}" == */ ]] || SUBFOLDER="${SUBFOLDER}/"
fi
if [ -d /var/run/s6/container_environment ]; then
printf "%s" "${SUBFOLDER}" > /var/run/s6/container_environment/SUBFOLDER
fi
# Copy template
cp /defaults/default.conf "${NGINX_CONFIG}"
# Remove ssl part
awk -v n=4 '/server/{n--}; n > 0' "${NGINX_CONFIG}" > tmpfile
mv tmpfile "${NGINX_CONFIG}"
# Remove ipv6
sed -i '/listen \[::\]/d' "${NGINX_CONFIG}"
# Add ingress parameters
sed -i "s|3000|$(bashio::addon.ingress_port)|g" "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a proxy_set_header Accept-Encoding "";' "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a sub_filter_once off;' "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a sub_filter_types *;' "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a sub_filter "vnc/index.html?autoconnect" "vnc/index.html?path=%%path%%/websockify?autoconnect";' "${NGINX_CONFIG}"
sed -i "s|%%path%%|${SUBFOLDER:1}|g" "${NGINX_CONFIG}"
# Correct image
sed -i "s|SUBFOLDERwebsockify|/websockify|g" "${NGINX_CONFIG}"
# Enable ingress
cp "${NGINX_CONFIG}" /etc/nginx/sites-enabled

View File

@@ -0,0 +1,22 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
if bashio::config.true 'use_own_certs'; then
bashio::log.green "Using referenced ssl certificates to connect with https. Please remember to open the ssl port in the addon options"
CERTFILE="$(bashio::config 'certfile')"
KEYFILE="$(bashio::config 'keyfile')"
NGINX_CONFIG="/defaults/default.conf"
#Check if files exist
echo "... checking if referenced files exist"
if [ -f /ssl/"$CERTFILE" ] && [ -f /ssl/"$KEYFILE" ]; then
# Add ssl file
sed -i "s|/config/data/ssl/cert.pem|/ssl/$CERTFILE|g" "$NGINX_CONFIG"
sed -i "s|/config/data/ssl/cert.key|/ssl/$KEYFILE|g" "$NGINX_CONFIG"
echo "... done"
else
bashio::log.warning "... certificate /ssl/$CERTFILE and /ssl/$KEYFILE and not found, using self-generated certificates"
fi
fi

View File

@@ -1,3 +1,3 @@
upstream backend {
server 127.0.0.1:3001;
server 127.0.0.1:8080;
}

View File

@@ -1,56 +0,0 @@
# Run nginx in foreground.
# daemon off;
# This is run inside Docker.
user root;
# Pid storage location.
pid /var/run/nginx.pid;
# Set number of worker processes.
worker_processes 1;
# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;
# Write error log to Hass.io add-on log.
error_log /proc/1/fd/1 error;
# Load allowed environment vars
env HASSIO_TOKEN;
# Load dynamic modules.
include /etc/nginx/modules/*.conf;
# Max num of simultaneous connections by a worker process.
events {
worker_connections 512;
}
http {
include /etc/nginx/includes/mime.types;
log_format hassio '[$time_local] $status '
'$http_x_forwarded_for($remote_addr) '
'$request ($http_user_agent)';
access_log /proc/1/fd/1 hassio;
client_max_body_size 4G;
default_type application/octet-stream;
gzip on;
keepalive_timeout 65;
sendfile on;
server_tokens off;
tcp_nodelay on;
tcp_nopush on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
include /etc/nginx/includes/resolver.conf;
include /etc/nginx/includes/upstream.conf;
include /etc/nginx/servers/*.conf;
}

View File

@@ -1,18 +0,0 @@
server {
listen %%interface%%:%%port%% default_server;
include /etc/nginx/includes/server_params.conf;
include /etc/nginx/includes/proxy_params.conf;
client_max_body_size 0;
location / {
allow 172.30.32.2;
deny all;
proxy_set_header X-WebAuth-User %%ingress_user%%;
proxy_set_header X-Script-Name %%UIPATH%%;
proxy_buffering off;
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_pass https://backend;
}
}

View File

@@ -1,8 +0,0 @@
#!/usr/bin/execlineb -S0
# ==============================================================================
# Take down the S6 supervision tree when Nginx fails
# ==============================================================================
if { s6-test ${1} -ne 0 }
if { s6-test ${1} -ne 256 }
s6-svscanctl -t /var/run/s6/services

View File

@@ -1,10 +0,0 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
# ==============================================================================
bashio::net.wait_for 3001 localhost 900
bashio::log.info "Starting NGinx..."
exec nginx

View File

@@ -0,0 +1,10 @@
#! /bin/bash
BIN=/usr/bin/microsoft-edge-real
# Run normally on privved containers or modified un non priv
${BIN} \
--password-store=basic \
--no-sandbox \
--test-type \
"$@" >/dev/null 2>&1

BIN
brave/stats.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,9 +1,9 @@
{
"github_fulltag": "false",
"last_update": "15-01-2026",
"github_fulltag": "true",
"last_update": "2026-01-14",
"repository": "alexbelgium/hassio-addons",
"slug": "brave",
"slug": "webtop",
"source": "github",
"upstream_repo": "linuxserver/docker-brave",
"upstream_version": "1.85.120-ls68"
"upstream_repo": "linuxserver/docker-webtop",
"upstream_version": "4.16-r0-ls93"
}