Readur/docs/self-hosting/authentication.md

499 lines
11 KiB
Markdown

# Authentication Configuration
## Overview
Readur supports multiple authentication methods to integrate with your existing identity infrastructure. This guide covers configuration for local authentication, OIDC/SSO, LDAP, and multi-factor authentication.
## Authentication Methods
### Local Authentication
Default authentication using Readur's built-in user management.
#### Basic Configuration
```bash
# In .env file
AUTH_METHOD=local
ENABLE_REGISTRATION=false # Disable public registration
REQUIRE_EMAIL_VERIFICATION=true
PASSWORD_MIN_LENGTH=12
PASSWORD_REQUIRE_SPECIAL=true
PASSWORD_REQUIRE_NUMBERS=true
SESSION_LIFETIME_HOURS=24
```
#### User Management
Create and manage users via the API:
```bash
# Create admin user via API
curl -X POST http://localhost:8000/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"email": "admin@company.com",
"password": "SecurePass123!",
"role": "admin"
}'
# Create regular user via API
curl -X POST http://localhost:8000/api/users \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"username": "john",
"email": "john@company.com",
"password": "UserPass456!",
"role": "user"
}'
# Users can also self-register if enabled:
# Set ENABLE_REGISTRATION=true in environment
```
### OIDC/OAuth2 (Recommended)
Integrate with enterprise identity providers for single sign-on.
#### Generic OIDC Configuration
```bash
# In .env file
AUTH_METHOD=oidc
OIDC_ISSUER=https://auth.company.com
OIDC_CLIENT_ID=readur-app
OIDC_CLIENT_SECRET=your-client-secret
OIDC_REDIRECT_URI=https://readur.company.com/auth/callback
OIDC_SCOPE=openid profile email
OIDC_USER_CLAIM=email
OIDC_GROUPS_CLAIM=groups
OIDC_ADMIN_GROUP=readur-admins
```
#### Keycloak Integration
```bash
AUTH_METHOD=oidc
OIDC_ISSUER=https://keycloak.company.com/realms/master
OIDC_CLIENT_ID=readur
OIDC_CLIENT_SECRET=abc123def456
OIDC_REDIRECT_URI=https://readur.company.com/auth/callback
OIDC_SCOPE=openid profile email roles
OIDC_USER_CLAIM=preferred_username
OIDC_GROUPS_CLAIM=realm_access.roles
OIDC_ADMIN_GROUP=readur-admin
OIDC_AUTO_CREATE_USERS=true
```
#### Auth0 Integration
```bash
AUTH_METHOD=oidc
OIDC_ISSUER=https://company.auth0.com/
OIDC_CLIENT_ID=your-client-id
OIDC_CLIENT_SECRET=your-client-secret
OIDC_REDIRECT_URI=https://readur.company.com/auth/callback
OIDC_SCOPE=openid profile email
OIDC_AUDIENCE=https://readur.company.com/api
OIDC_USER_CLAIM=email
OIDC_GROUPS_CLAIM=https://readur.com/groups
```
#### Azure AD Integration
```bash
AUTH_METHOD=oidc
OIDC_ISSUER=https://login.microsoftonline.com/{tenant-id}/v2.0
OIDC_CLIENT_ID=application-id
OIDC_CLIENT_SECRET=client-secret
OIDC_REDIRECT_URI=https://readur.company.com/auth/callback
OIDC_SCOPE=openid profile email User.Read
OIDC_USER_CLAIM=upn
OIDC_GROUPS_CLAIM=groups
OIDC_ADMIN_GROUP=readur-administrators
OIDC_TOKEN_ENDPOINT_AUTH_METHOD=client_secret_post
```
#### Google Workspace Integration
```bash
AUTH_METHOD=oidc
OIDC_ISSUER=https://accounts.google.com
OIDC_CLIENT_ID=your-client-id.apps.googleusercontent.com
OIDC_CLIENT_SECRET=your-client-secret
OIDC_REDIRECT_URI=https://readur.company.com/auth/callback
OIDC_SCOPE=openid profile email
OIDC_USER_CLAIM=email
OIDC_HOSTED_DOMAIN=company.com # Restrict to company domain
```
### LDAP Authentication
Connect to Active Directory or OpenLDAP servers.
#### Basic LDAP Configuration
```bash
AUTH_METHOD=ldap
LDAP_SERVER=ldap://ldap.company.com:389
LDAP_BIND_DN=cn=readur,ou=services,dc=company,dc=com
LDAP_BIND_PASSWORD=bind-password
LDAP_BASE_DN=ou=users,dc=company,dc=com
LDAP_USER_FILTER=(uid={username})
LDAP_USER_ATTR_MAP={"email": "mail", "name": "cn"}
LDAP_GROUP_SEARCH_BASE=ou=groups,dc=company,dc=com
LDAP_GROUP_FILTER=(member={user_dn})
LDAP_ADMIN_GROUP=cn=readur-admins,ou=groups,dc=company,dc=com
```
#### Active Directory Configuration
```bash
AUTH_METHOD=ldap
LDAP_SERVER=ldaps://ad.company.com:636
LDAP_BIND_DN=readur@company.com
LDAP_BIND_PASSWORD=service-account-password
LDAP_BASE_DN=DC=company,DC=com
LDAP_USER_FILTER=(&(objectClass=user)(sAMAccountName={username}))
LDAP_USER_ATTR_MAP={"email": "mail", "name": "displayName"}
LDAP_GROUP_SEARCH_BASE=DC=company,DC=com
LDAP_GROUP_FILTER=(&(objectClass=group)(member={user_dn}))
LDAP_ADMIN_GROUP=CN=Readur Admins,OU=Groups,DC=company,DC=com
LDAP_USE_TLS=true
LDAP_TLS_VERIFY=true
```
### SAML2 Authentication
For organizations using SAML identity providers.
#### Configuration
```bash
AUTH_METHOD=saml2
SAML2_IDP_METADATA_URL=https://idp.company.com/metadata
SAML2_SP_ENTITY_ID=https://readur.company.com
SAML2_SP_ACS_URL=https://readur.company.com/saml/acs
SAML2_SP_X509_CERT=/etc/readur/saml/cert.pem
SAML2_SP_PRIVATE_KEY=/etc/readur/saml/key.pem
SAML2_ATTRIBUTE_MAPPING={"email": "EmailAddress", "name": "DisplayName"}
SAML2_ADMIN_GROUP=readur-administrators
```
## Multi-Factor Authentication
### TOTP (Time-based One-Time Password)
Enable 2FA using authenticator apps:
```bash
# Enable TOTP
MFA_ENABLED=true
MFA_METHOD=totp
MFA_ISSUER=Readur
MFA_ENFORCE_FOR_ADMINS=true
MFA_GRACE_PERIOD_DAYS=7 # Days before enforcement
```
### WebAuthn/FIDO2
Hardware security key support:
```bash
MFA_ENABLED=true
MFA_METHOD=webauthn
WEBAUTHN_RP_ID=readur.company.com
WEBAUTHN_RP_NAME=Readur Document Management
WEBAUTHN_REQUIRE_ATTESTATION=direct
```
## Role-Based Access Control (RBAC)
### Role Configuration
Define roles and permissions:
```yaml
# roles.yaml
roles:
admin:
permissions:
- documents.*
- users.*
- settings.*
- system.*
editor:
permissions:
- documents.create
- documents.read
- documents.update
- documents.delete.own
- ocr.*
viewer:
permissions:
- documents.read
- search.*
auditor:
permissions:
- documents.read
- audit.view
- reports.generate
```
### Group Mapping
Map external groups to Readur roles:
```bash
# OIDC group mapping
OIDC_GROUP_ROLE_MAPPING='{
"readur-admins": "admin",
"readur-editors": "editor",
"readur-viewers": "viewer",
"compliance-team": "auditor"
}'
# LDAP group mapping
LDAP_GROUP_ROLE_MAPPING='{
"CN=Readur Admins,OU=Groups,DC=company,DC=com": "admin",
"CN=Readur Users,OU=Groups,DC=company,DC=com": "editor"
}'
```
## Session Management
### Session Configuration
```bash
# Session settings
SESSION_COOKIE_NAME=readur_session
SESSION_COOKIE_SECURE=true # HTTPS only
SESSION_COOKIE_HTTPONLY=true
SESSION_COOKIE_SAMESITE=Lax
SESSION_LIFETIME_HOURS=8
SESSION_IDLE_TIMEOUT_MINUTES=30
SESSION_REMEMBER_ME_DAYS=30
SESSION_MAX_CONCURRENT=3 # Max sessions per user
```
### Session Storage
```bash
# Redis-backed sessions (recommended)
SESSION_BACKEND=redis
REDIS_SESSION_URL=redis://localhost:6379/1
# Database sessions
SESSION_BACKEND=database
SESSION_CLEANUP_INTERVAL_HOURS=24
```
## Security Headers
Configure security headers for authentication:
```bash
# Security headers
SECURITY_HEADERS_ENABLED=true
SECURITY_CSP="default-src 'self'; script-src 'self' 'unsafe-inline'"
SECURITY_HSTS_SECONDS=31536000
SECURITY_HSTS_INCLUDE_SUBDOMAINS=true
SECURITY_X_FRAME_OPTIONS=DENY
SECURITY_X_CONTENT_TYPE_OPTIONS=nosniff
SECURITY_REFERRER_POLICY=strict-origin-when-cross-origin
```
## API Authentication
### API Key Authentication
For service-to-service communication:
```bash
# Enable API keys
API_KEY_ENABLED=true
API_KEY_HEADER=X-API-Key
API_KEY_EXPIRY_DAYS=90
```
Generate API keys via the API:
```bash
# Create API key for service (requires admin authentication)
curl -X POST http://localhost:8000/api/keys \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "backup-service",
"scope": ["documents.read"]
}'
```
### JWT Tokens
For programmatic access:
```bash
# JWT configuration
JWT_ENABLED=true
JWT_SECRET_KEY=your-jwt-secret
JWT_ALGORITHM=HS256
JWT_EXPIRY_MINUTES=60
JWT_REFRESH_ENABLED=true
JWT_REFRESH_EXPIRY_DAYS=7
```
## Troubleshooting
### OIDC Issues
#### Discovery Failed
```bash
# Test OIDC discovery
curl https://auth.company.com/.well-known/openid-configuration
# Check network connectivity
docker-compose exec readur curl https://auth.company.com
```
#### Token Validation Errors
```bash
# Enable debug logging
OIDC_DEBUG=true
LOG_LEVEL=DEBUG
# Check token claims
docker-compose exec readur python manage.py debug_oidc_token
```
### LDAP Issues
#### Connection Failed
```bash
# Test LDAP connection
ldapsearch -x -H ldap://ldap.company.com:389 \
-D "cn=readur,ou=services,dc=company,dc=com" \
-W -b "dc=company,dc=com" "(uid=testuser)"
# Test from container
docker-compose exec readur ldapsearch -x -H $LDAP_SERVER
```
#### User Not Found
```bash
# Debug LDAP queries
LDAP_DEBUG=true
LOG_LEVEL=DEBUG
# Test LDAP user filter directly
ldapsearch -x -H $LDAP_SERVER \
-D "$LDAP_BIND_DN" \
-w "$LDAP_BIND_PASSWORD" \
-b "$LDAP_BASE_DN" \
"(uid=testuser)"
```
### Session Issues
#### Sessions Expiring Too Quickly
```bash
# Check Redis connectivity
docker-compose exec readur redis-cli -h redis ping
# Monitor session creation
docker-compose exec readur redis-cli monitor | grep session
```
## Best Practices
### Security Recommendations
1. **Always use HTTPS** in production
2. **Enable MFA** for administrative accounts
3. **Regular password rotation** for service accounts
4. **Audit authentication logs** regularly
5. **Use external IdP** when possible
6. **Implement rate limiting** on authentication endpoints
7. **Monitor failed login attempts**
### Integration Testing
Test authentication before production:
```bash
# Test OIDC flow via health endpoint
curl http://localhost:8000/api/health/auth/oidc
# Test LDAP connection
curl -X POST http://localhost:8000/api/auth/test \
-H "Content-Type: application/json" \
-d '{
"method": "ldap",
"username": "testuser",
"password": "testpass"
}'
# Verify user groups via API
curl http://localhost:8000/api/users/testuser@company.com/groups \
-H "Authorization: Bearer $ADMIN_TOKEN"
```
### Monitoring
Set up authentication monitoring:
```bash
# Monitor failed login attempts via logs
docker-compose logs readur | grep -E "(auth|login|failed)" | tail -n 100
# Check active sessions in database
docker-compose exec readur psql -U readur -d readur -c \
"SELECT username, last_login, session_count FROM users WHERE last_login > NOW() - INTERVAL '24 hours';"
# Monitor authentication metrics (if metrics endpoint enabled)
curl http://localhost:8000/metrics | grep -E "(auth|login|session)"
```
## Migration from Other Systems
### Migrating Users
```bash
# Export users from old system
old_system_export_users > users.json
# Import to Readur via bulk API
curl -X POST http://localhost:8000/api/users/import \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d @users.json
# Or create users one by one via API
while IFS=, read -r username email role; do
curl -X POST http://localhost:8000/api/users \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"username\": \"$username\",
\"email\": \"$email\",
\"role\": \"$role\"
}"
done < users.csv
```
## Related Documentation
- [User Management Guide](../user-management-guide.md)
- [Security Best Practices](../security-guide.md)
- [OIDC Setup](../oidc-setup.md)
- [API Reference](../api-reference.md)