Delete page "unnamed"
238
unnamed.md
238
unnamed.md
@@ -1,238 +0,0 @@
|
|||||||
# 🔒 Admin-Only Password Reset - Security Documentation
|
|
||||||
|
|
||||||
## 🚨 Critical Security Policy
|
|
||||||
|
|
||||||
**ONLY ADMINISTRATORS CAN FLAG USERS FOR PASSWORD RESET**
|
|
||||||
|
|
||||||
This document clarifies the security-critical aspect of the password reset workflow.
|
|
||||||
|
|
||||||
## 🎯 Security Principle
|
|
||||||
|
|
||||||
The DanceLessonsCoach password reset system follows a **zero-trust, admin-controlled** security model:
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
%%{init: {'theme': 'forest'}}%%
|
|
||||||
graph TD
|
|
||||||
A[User Forgets Password] --> B[User Cannot Self-Reset]
|
|
||||||
B --> C[User Must Contact Admin]
|
|
||||||
C --> D[Admin Verifies Identity]
|
|
||||||
D --> E[Admin Enables Reset Flag]
|
|
||||||
E --> F[User Can Now Reset Password]
|
|
||||||
F --> G[Flag Automatically Cleared]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔐 Security Rules
|
|
||||||
|
|
||||||
### ❌ What Users CANNOT Do
|
|
||||||
|
|
||||||
1. **Users cannot flag themselves** for password reset
|
|
||||||
2. **Users cannot flag other users** for password reset
|
|
||||||
3. **No self-service password recovery** without admin intervention
|
|
||||||
4. **No email/phone-based recovery** (privacy by design)
|
|
||||||
|
|
||||||
### ✅ What Admins CAN Do
|
|
||||||
|
|
||||||
1. **List all users** (requires admin authentication)
|
|
||||||
2. **Enable password reset** for specific users only
|
|
||||||
3. **Verify user identity** before enabling reset
|
|
||||||
4. **Monitor password reset activity**
|
|
||||||
|
|
||||||
### 🔓 What Flagged Users CAN Do
|
|
||||||
|
|
||||||
1. **Reset password without authentication** (one-time only)
|
|
||||||
2. **Only if admin has explicitly flagged them**
|
|
||||||
3. **Within rate limits** (3 attempts/hour)
|
|
||||||
|
|
||||||
## 🛡️ Implementation Requirements
|
|
||||||
|
|
||||||
### Admin Endpoints (Require Authentication)
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /api/v1/admin/users/{username}/allow-reset
|
|
||||||
Headers:
|
|
||||||
Authorization: Bearer <admin-jwt-token>
|
|
||||||
X-Admin-Key: <master-admin-key>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Security Checks:**
|
|
||||||
- ✅ Valid admin JWT token required
|
|
||||||
- ✅ Admin privileges verified
|
|
||||||
- ✅ User exists in database
|
|
||||||
- ✅ Sets `allow_password_reset = true`
|
|
||||||
|
|
||||||
### User Reset Endpoint (No Auth Required)
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /api/v1/auth/reset-password
|
|
||||||
Body:
|
|
||||||
{
|
|
||||||
"username": "forgotten_user",
|
|
||||||
"new_password": "secureNewPassword123!"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Security Checks:**
|
|
||||||
- ✅ User exists in database
|
|
||||||
- ✅ `allow_password_reset = true` (admin must have set this)
|
|
||||||
- ✅ Rate limit not exceeded (3 attempts/hour)
|
|
||||||
- ✅ New password meets requirements
|
|
||||||
- ✅ Automatically sets `allow_password_reset = false` after reset
|
|
||||||
|
|
||||||
## 📋 Security Test Cases
|
|
||||||
|
|
||||||
### BDD Test Scenarios
|
|
||||||
|
|
||||||
```gherkin
|
|
||||||
Feature: Admin-Only Password Reset
|
|
||||||
Scenario: Non-admin user cannot flag themselves for reset
|
|
||||||
Given I am authenticated as a regular user
|
|
||||||
When I try to POST to /api/v1/admin/users/myusername/allow-reset
|
|
||||||
Then I should receive 403 Forbidden
|
|
||||||
And the response should contain error "admin_required"
|
|
||||||
|
|
||||||
Scenario: Unauthenticated user cannot flag others for reset
|
|
||||||
Given I am not authenticated
|
|
||||||
When I try to POST to /api/v1/admin/users/otheruser/allow-reset
|
|
||||||
Then I should receive 401 Unauthorized
|
|
||||||
And the response should contain error "auth_unauthorized"
|
|
||||||
|
|
||||||
Scenario: User cannot reset password without admin flag
|
|
||||||
Given I am not authenticated
|
|
||||||
And user "forgotten_user" has allow_password_reset = false
|
|
||||||
When I POST to /api/v1/auth/reset-password with username "forgotten_user"
|
|
||||||
Then I should receive 403 Forbidden
|
|
||||||
And the response should contain error "password_reset_not_allowed"
|
|
||||||
|
|
||||||
Scenario: Admin successfully enables password reset
|
|
||||||
Given I am authenticated as admin
|
|
||||||
And user "forgotten_user" exists
|
|
||||||
When I POST to /api/v1/admin/users/forgotten_user/allow-reset
|
|
||||||
Then I should receive 200 OK
|
|
||||||
And user "forgotten_user" should have allow_password_reset = true
|
|
||||||
|
|
||||||
Scenario: Flagged user successfully resets password
|
|
||||||
Given user "forgotten_user" has allow_password_reset = true
|
|
||||||
When I POST to /api/v1/auth/reset-password with valid new password
|
|
||||||
Then I should receive 200 OK
|
|
||||||
And user password should be updated
|
|
||||||
And user "forgotten_user" should have allow_password_reset = false
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔧 Technical Implementation
|
|
||||||
|
|
||||||
### Database Model
|
|
||||||
|
|
||||||
```go
|
|
||||||
type User struct {
|
|
||||||
// ... other fields
|
|
||||||
AllowPasswordReset bool `gorm:"default:false"`
|
|
||||||
// This field can ONLY be set to true by admin users
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Admin Service
|
|
||||||
|
|
||||||
```go
|
|
||||||
type AdminService struct {
|
|
||||||
userRepo user.UserRepository
|
|
||||||
auth auth.AuthService
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only admins can call this method
|
|
||||||
func (s *AdminService) AllowPasswordReset(ctx context.Context, username string) error {
|
|
||||||
// Verify admin privileges from context
|
|
||||||
if !auth.IsAdmin(ctx) {
|
|
||||||
return errors.New("admin required")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the flag - only admins can do this
|
|
||||||
return s.userRepo.AllowPasswordReset(username)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Password Reset Service
|
|
||||||
|
|
||||||
```go
|
|
||||||
type AuthService struct {
|
|
||||||
userRepo user.UserRepository
|
|
||||||
}
|
|
||||||
|
|
||||||
// Anyone can call this, but it only works if admin flagged the user
|
|
||||||
func (s *AuthService) ResetPasswordWithoutAuth(username, newPassword string) error {
|
|
||||||
// Get user from database
|
|
||||||
user, err := s.userRepo.GetUserByUsername(username)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// CRITICAL SECURITY CHECK
|
|
||||||
if !user.AllowPasswordReset {
|
|
||||||
return errors.New("password reset not allowed")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update password
|
|
||||||
if err := s.userRepo.UpdatePassword(username, newPassword); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear the flag - one-time use only
|
|
||||||
return s.userRepo.ClearPasswordResetFlag(username)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🛑 Security Threat Model
|
|
||||||
|
|
||||||
### Potential Threats & Mitigations
|
|
||||||
|
|
||||||
| Threat | Impact | Mitigation |
|
|
||||||
|--------|--------|------------|
|
|
||||||
| User flags themselves for reset | High | Admin authentication required for flagging |
|
|
||||||
| User flags other users for reset | High | Admin authentication required for flagging |
|
|
||||||
| Brute force password reset | Medium | Rate limiting (3 attempts/hour) |
|
|
||||||
| Unauthorized admin access | Critical | Strong admin password + JWT security |
|
|
||||||
| Replay attacks on reset | Medium | One-time flag clearing after reset |
|
|
||||||
| Flag persistence after reset | Medium | Automatic flag clearing after successful reset |
|
|
||||||
|
|
||||||
## 📈 Security Metrics
|
|
||||||
|
|
||||||
1. **Admin-Only Flagging:** 100% of password reset flags set by admins
|
|
||||||
2. **No Self-Service:** 0% of users can flag themselves
|
|
||||||
3. **Rate Limit Compliance:** <3 reset attempts per hour per user
|
|
||||||
4. **Flag Clearing:** 100% of flags cleared after successful reset
|
|
||||||
|
|
||||||
## 🎯 Compliance Requirements
|
|
||||||
|
|
||||||
### Security Standards
|
|
||||||
- ✅ **OWASP Authentication Cheat Sheet** - Admin separation of duties
|
|
||||||
- ✅ **CIS Controls** - Access control and account management
|
|
||||||
- ✅ **GDPR** - No unnecessary personal data collection
|
|
||||||
- ✅ **Zero Trust** - Explicit verification for sensitive operations
|
|
||||||
|
|
||||||
### Audit Requirements
|
|
||||||
- ✅ All admin actions logged (who enabled reset for whom)
|
|
||||||
- ✅ Password reset attempts logged
|
|
||||||
- ✅ Failed attempts logged and rate limited
|
|
||||||
- ✅ Admin authentication events logged
|
|
||||||
|
|
||||||
## 📚 References
|
|
||||||
|
|
||||||
- [OWASP Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html)
|
|
||||||
- [CIS Controls v8](https://www.cisecurity.org/controls/)
|
|
||||||
- [GDPR Compliance Guide](https://gdpr-info.eu/)
|
|
||||||
- [Zero Trust Architecture](https://www.nist.gov/zero-trust)
|
|
||||||
|
|
||||||
## 🎉 Summary
|
|
||||||
|
|
||||||
**Security Principle:** Only authenticated administrators can enable password reset for users
|
|
||||||
|
|
||||||
**User Experience:** Users must contact admin for password reset assistance
|
|
||||||
|
|
||||||
**Technical Implementation:** Admin-only endpoints with strict security checks
|
|
||||||
|
|
||||||
**Compliance:** Meets OWASP, CIS, GDPR, and Zero Trust standards
|
|
||||||
|
|
||||||
**Status:** Security policy documented and implemented ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*DanceLessonsCoach - Secure by design, private by default 🔒*
|
|
||||||
Reference in New Issue
Block a user