Add comprehensive authentik documentation and improve role configuration
- Add authentik-deployment-guide.md: Complete step-by-step deployment guide - Add architecture-decisions.md: Document native DB vs containerized rationale - Add authentication-architecture.md: SSO strategy and integration patterns - Update deployment-guide.md: Integrate authentik deployment procedures - Update security-hardening.md: Add multi-layer security documentation - Update service-integration-guide.md: Add authentik integration examples - Update README.md: Professional project overview with architecture benefits - Update authentik role: Fix HTTP binding, add security configs, improve templates - Remove unused authentik task files: containers.yml, networking.yml Key improvements: * Document security benefits of native databases over containers * Document Unix socket IPC architecture advantages * Provide comprehensive troubleshooting and deployment procedures * Add forward auth integration patterns for services * Fix authentik HTTP binding from 127.0.0.1 to 0.0.0.0 * Add shared memory and IPC security configurations
This commit is contained in:
@@ -1,7 +1,930 @@
|
||||
# Securing the VPS
|
||||
## Network Security
|
||||
- **SSH Hardening**: Password authentication disabled, root login disabled, key-only authentication
|
||||
- **Firewall Configuration**: UFW with deny-all incoming, allow-all outgoing defaults
|
||||
- **Fail2ban**: SSH brute-force protection with configurable ban times
|
||||
- **Kernel Network Hardening**: IP forwarding disabled, source routing blocked, ICMP redirects disabled
|
||||
# Security Hardening Guide
|
||||
|
||||
Comprehensive security hardening for rick-infra, implementing defense-in-depth with network, container, database, and application security layers.
|
||||
|
||||
## Security Architecture Overview
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ rick-infra Security Architecture (Defense in Depth) │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Layer 1: Network Security │ │
|
||||
│ │ • SSH Hardening • Firewall • Fail2ban • TLS/HTTPS │ │
|
||||
│ └─────────────────────────────────────────────────────────────┘ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Layer 2: Authentication & Authorization │ │
|
||||
│ │ • Authentik SSO • MFA • Forward Auth • Policy Engine │ │
|
||||
│ └─────────────────────────────────────────────────────────────┘ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Layer 3: Container Security │ │
|
||||
│ │ • Rootless Podman • User Namespaces • Capabilities │ │
|
||||
│ │ • SELinux • Resource Limits • Security Labels │ │
|
||||
│ └─────────────────────────────────────────────────────────────┘ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Layer 4: Database & Cache Security │ │
|
||||
│ │ • Unix Sockets Only • No Network Exposure • Group ACLs │ │
|
||||
│ │ • Encrypted Storage • Backup Security • Access Logging │ │
|
||||
│ └─────────────────────────────────────────────────────────────┘ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Layer 5: Application Security │ │
|
||||
│ │ • Secret Management • Secure Headers • Audit Logging │ │
|
||||
│ │ • Input Validation • Session Security • CSRF Protection │ │
|
||||
│ └─────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Layer 1: Network Security
|
||||
|
||||
### SSH Hardening
|
||||
|
||||
#### Configuration Applied by Security Role
|
||||
|
||||
```yaml
|
||||
# SSH hardening settings
|
||||
sshd_config:
|
||||
# Authentication Security
|
||||
PasswordAuthentication: no
|
||||
ChallengeResponseAuthentication: no
|
||||
PermitRootLogin: no
|
||||
PubkeyAuthentication: yes
|
||||
AuthenticationMethods: "publickey"
|
||||
|
||||
# Protocol Security
|
||||
Protocol: 2
|
||||
PermitEmptyPasswords: no
|
||||
MaxAuthTries: 3
|
||||
LoginGraceTime: 60
|
||||
|
||||
# Connection Security
|
||||
X11Forwarding: no
|
||||
AllowAgentForwarding: no
|
||||
AllowTcpForwarding: no
|
||||
PermitTunnel: no
|
||||
|
||||
# Session Security
|
||||
ClientAliveInterval: 300
|
||||
ClientAliveCountMax: 2
|
||||
MaxSessions: 2
|
||||
MaxStartups: "2:30:10"
|
||||
```
|
||||
|
||||
#### Verification Commands
|
||||
|
||||
```bash
|
||||
# Verify SSH hardening
|
||||
ssh root@your-vps "sshd -T | grep -E '(passwordauth|rootlogin|pubkey)'"
|
||||
|
||||
# Test SSH security
|
||||
ssh-audit your-vps # External tool for SSH security assessment
|
||||
|
||||
# Monitor SSH attempts
|
||||
ssh root@your-vps "journalctl -u sshd | grep -i 'failed\|invalid'"
|
||||
```
|
||||
|
||||
### Firewall Configuration
|
||||
|
||||
#### nftables Firewall Rules
|
||||
|
||||
```bash
|
||||
# Deployed firewall configuration
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow loopback traffic
|
||||
iifname "lo" accept
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
|
||||
# Allow SSH (rate limited)
|
||||
tcp dport 22 ct state new limit rate 5/minute accept
|
||||
|
||||
# Allow HTTP/HTTPS
|
||||
tcp dport {80, 443} accept
|
||||
|
||||
# Allow ICMP (rate limited)
|
||||
icmp type echo-request limit rate 1/second accept
|
||||
|
||||
# Log dropped packets
|
||||
log prefix "DROPPED: " drop
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Firewall Management
|
||||
|
||||
```bash
|
||||
# Check firewall status
|
||||
ssh root@your-vps "nft list ruleset"
|
||||
|
||||
# Monitor dropped connections
|
||||
ssh root@your-vps "journalctl -k | grep DROPPED"
|
||||
|
||||
# Temporary rule addition (emergency access)
|
||||
ssh root@your-vps "nft add rule inet filter input tcp dport 8080 accept"
|
||||
```
|
||||
|
||||
### Intrusion Detection (fail2ban)
|
||||
|
||||
#### fail2ban Configuration
|
||||
|
||||
```ini
|
||||
# SSH protection jail
|
||||
[sshd]
|
||||
enabled = true
|
||||
port = ssh
|
||||
filter = sshd
|
||||
logpath = /var/log/auth.log
|
||||
maxretry = 3
|
||||
findtime = 600
|
||||
bantime = 3600
|
||||
backend = systemd
|
||||
|
||||
# HTTP brute force protection
|
||||
[caddy-auth]
|
||||
enabled = true
|
||||
port = http,https
|
||||
filter = caddy-auth
|
||||
logpath = /var/log/caddy/access.log
|
||||
maxretry = 10
|
||||
findtime = 600
|
||||
bantime = 1800
|
||||
|
||||
# Authentik protection
|
||||
[authentik-auth]
|
||||
enabled = true
|
||||
port = http,https
|
||||
filter = authentik-auth
|
||||
logpath = /opt/authentik/logs/server.log
|
||||
maxretry = 5
|
||||
findtime = 300
|
||||
bantime = 3600
|
||||
```
|
||||
|
||||
#### Intrusion Monitoring
|
||||
|
||||
```bash
|
||||
# Check fail2ban status
|
||||
ssh root@your-vps "fail2ban-client status"
|
||||
ssh root@your-vps "fail2ban-client status sshd"
|
||||
|
||||
# View banned IPs
|
||||
ssh root@your-vps "fail2ban-client get sshd banned"
|
||||
|
||||
# Unban IP (if needed)
|
||||
ssh root@your-vps "fail2ban-client set sshd unbanip 203.0.113.100"
|
||||
```
|
||||
|
||||
### TLS/HTTPS Security
|
||||
|
||||
#### Caddy TLS Configuration
|
||||
|
||||
```caddyfile
|
||||
# Automatic HTTPS with security headers
|
||||
(security_headers) {
|
||||
header {
|
||||
# HSTS (HTTP Strict Transport Security)
|
||||
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
||||
|
||||
# Content Security Policy
|
||||
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"
|
||||
|
||||
# Additional security headers
|
||||
X-Content-Type-Options "nosniff"
|
||||
X-Frame-Options "DENY"
|
||||
X-XSS-Protection "1; mode=block"
|
||||
Referrer-Policy "strict-origin-when-cross-origin"
|
||||
|
||||
# Remove server information
|
||||
-Server
|
||||
}
|
||||
}
|
||||
|
||||
# Apply to all sites
|
||||
*.jnss.me {
|
||||
import security_headers
|
||||
tls {
|
||||
protocols tls1.2 tls1.3
|
||||
curves x25519 secp384r1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### TLS Monitoring
|
||||
|
||||
```bash
|
||||
# Check certificate status
|
||||
curl -vI https://auth.jnss.me/ 2>&1 | grep -E "(certificate|expire|protocol)"
|
||||
|
||||
# Test TLS configuration
|
||||
nmap --script ssl-enum-ciphers -p 443 your-domain.com
|
||||
|
||||
# Monitor certificate renewal
|
||||
ssh root@your-vps "journalctl -u caddy | grep -i cert"
|
||||
```
|
||||
|
||||
## Layer 2: Authentication & Authorization Security
|
||||
|
||||
### Authentik Security Configuration
|
||||
|
||||
#### Password Policy
|
||||
|
||||
```yaml
|
||||
# Authentik password policy
|
||||
password_policy:
|
||||
length_min: 12
|
||||
amount_lowercase: 1
|
||||
amount_uppercase: 1
|
||||
amount_digits: 1
|
||||
amount_symbols: 1
|
||||
password_field: "password"
|
||||
check_static_rules: true
|
||||
check_have_i_been_pwned: true
|
||||
check_zxcvbn: true
|
||||
zxcvbn_score_threshold: 3
|
||||
```
|
||||
|
||||
#### Multi-Factor Authentication
|
||||
|
||||
```yaml
|
||||
# MFA enforcement policies
|
||||
mfa_policies:
|
||||
- name: "Admin MFA Required"
|
||||
bound_to: "group:admins"
|
||||
authenticators: ["totp", "webauthn"]
|
||||
enforce: true
|
||||
|
||||
- name: "Sensitive Services MFA"
|
||||
bound_to: "application:admin_*"
|
||||
authenticators: ["totp"]
|
||||
enforce: true
|
||||
|
||||
- name: "External Access MFA"
|
||||
bound_to: "source_ip:!10.0.0.0/8"
|
||||
authenticators: ["totp", "sms"]
|
||||
enforce: true
|
||||
```
|
||||
|
||||
#### Session Security
|
||||
|
||||
```yaml
|
||||
# Session security settings
|
||||
session_security:
|
||||
cookie_secure: true
|
||||
cookie_httponly: true
|
||||
cookie_samesite: "Strict"
|
||||
session_timeout: 3600 # 1 hour
|
||||
remember_me_timeout: 86400 # 24 hours
|
||||
concurrent_sessions_limit: 3
|
||||
session_fixation_protection: true
|
||||
```
|
||||
|
||||
### Access Control Policies
|
||||
|
||||
#### Time-Based Access Control
|
||||
|
||||
```yaml
|
||||
# Business hours access policy
|
||||
policies:
|
||||
- name: "Business Hours Only"
|
||||
type: "time"
|
||||
parameters:
|
||||
start_time: "08:00"
|
||||
end_time: "18:00"
|
||||
days: ["monday", "tuesday", "wednesday", "thursday", "friday"]
|
||||
timezone: "UTC"
|
||||
applications: ["admin_dashboard", "financial_systems"]
|
||||
```
|
||||
|
||||
#### IP-Based Access Control
|
||||
|
||||
```yaml
|
||||
# Geographic/Network access restrictions
|
||||
policies:
|
||||
- name: "Office Network Only"
|
||||
type: "source_ip"
|
||||
parameters:
|
||||
cidr: ["10.0.0.0/8", "192.168.0.0/16"]
|
||||
applications: ["admin_*", "backup_*"]
|
||||
|
||||
- name: "Block High-Risk Countries"
|
||||
type: "geoip"
|
||||
parameters:
|
||||
countries: ["CN", "RU", "KP"]
|
||||
action: "deny"
|
||||
applications: ["*"]
|
||||
```
|
||||
|
||||
## Layer 3: Container Security
|
||||
|
||||
### Rootless Container Architecture
|
||||
|
||||
#### Security Benefits of Rootless Podman
|
||||
|
||||
```bash
|
||||
# Rootless container verification
|
||||
ssh root@your-vps "sudo -u authentik podman info | grep -A10 'security'"
|
||||
|
||||
# User namespace mapping
|
||||
ssh root@your-vps "sudo -u authentik cat /proc/self/uid_map"
|
||||
ssh root@your-vps "sudo -u authentik cat /proc/self/gid_map"
|
||||
|
||||
# Process tree verification (containers run as unprivileged user)
|
||||
ssh root@your-vps "ps aux | grep -E '(authentik|gitea)'"
|
||||
```
|
||||
|
||||
#### Container User Security
|
||||
|
||||
```ini
|
||||
# Container configuration with security
|
||||
[Container]
|
||||
# Run as specific UID/GID (not root)
|
||||
User=963:963
|
||||
|
||||
# Preserve supplementary groups for socket access
|
||||
Annotation=run.oci.keep_original_groups=1
|
||||
|
||||
# Minimal capabilities
|
||||
AddCapability=IPC_OWNER
|
||||
DropCapability=ALL
|
||||
|
||||
# Security labels
|
||||
SecurityLabelDisable=true
|
||||
SecurityLabelType=container_t
|
||||
```
|
||||
|
||||
### Container Isolation
|
||||
|
||||
#### Filesystem Security
|
||||
|
||||
```yaml
|
||||
# Read-only root filesystem where possible
|
||||
security_settings:
|
||||
read_only_root_fs: true
|
||||
temp_fs_mounts:
|
||||
- "/tmp:rw,noexec,nosuid,size=100M"
|
||||
- "/var/tmp:rw,noexec,nosuid,size=100M"
|
||||
|
||||
# Minimal volume mounts
|
||||
volume_mounts:
|
||||
- "/opt/authentik/data:/data:Z" # SELinux label
|
||||
- "/opt/authentik/media:/media:Z"
|
||||
- "/var/run/postgresql:/var/run/postgresql:Z"
|
||||
- "/var/run/valkey:/var/run/valkey:Z"
|
||||
```
|
||||
|
||||
#### Resource Limits
|
||||
|
||||
```ini
|
||||
# systemd resource controls
|
||||
[Service]
|
||||
# Memory limits
|
||||
MemoryMax=1G
|
||||
MemorySwapMax=0
|
||||
|
||||
# CPU limits
|
||||
CPUQuota=200% # 2 CPU cores max
|
||||
|
||||
# Process limits
|
||||
TasksMax=100
|
||||
LimitNOFILE=1024
|
||||
|
||||
# I/O limits
|
||||
IODeviceWriteBandwidthMax=/dev/sda 50M
|
||||
```
|
||||
|
||||
### SELinux Security
|
||||
|
||||
#### Container Labeling
|
||||
|
||||
```bash
|
||||
# Verify SELinux labels on container volumes
|
||||
ssh root@your-vps "ls -Z /var/run/postgresql/"
|
||||
ssh root@your-vps "ls -Z /opt/authentik/"
|
||||
|
||||
# Check container SELinux context
|
||||
ssh root@your-vps "sudo -u authentik podman exec authentik-server cat /proc/self/attr/current"
|
||||
|
||||
# SELinux audit logs
|
||||
ssh root@your-vps "ausearch -m AVC -ts recent"
|
||||
```
|
||||
|
||||
#### Custom SELinux Policies
|
||||
|
||||
```bash
|
||||
# Generate custom SELinux policy for containers
|
||||
ssh root@your-vps "audit2allow -a -m rick_containers"
|
||||
|
||||
# Apply custom policy
|
||||
ssh root@your-vps "semodule -i rick_containers.pp"
|
||||
```
|
||||
|
||||
## Layer 4: Database & Cache Security
|
||||
|
||||
### Unix Socket Security Model
|
||||
|
||||
#### Socket File Permissions
|
||||
|
||||
```bash
|
||||
# Verify socket permissions
|
||||
ssh root@your-vps "ls -la /var/run/postgresql/"
|
||||
# Should show: srwxrwx--- postgres postgres .s.PGSQL.5432
|
||||
|
||||
ssh root@your-vps "ls -la /var/run/valkey/"
|
||||
# Should show: srwxrwx--- valkey valkey valkey.sock
|
||||
|
||||
# Verify group access
|
||||
ssh root@your-vps "groups authentik"
|
||||
# Should include: postgres valkey
|
||||
```
|
||||
|
||||
#### Network Isolation
|
||||
|
||||
```yaml
|
||||
# Database configuration (no network exposure)
|
||||
postgresql_config:
|
||||
listen_addresses: '' # Unix sockets only
|
||||
port: 0 # Disable TCP port
|
||||
unix_socket_directories: '/var/run/postgresql'
|
||||
unix_socket_permissions: 0770
|
||||
|
||||
valkey_config:
|
||||
bind: '' # No network binding
|
||||
port: 0 # Disable TCP port
|
||||
unixsocket: '/var/run/valkey/valkey.sock'
|
||||
unixsocketperm: 770
|
||||
```
|
||||
|
||||
### Database Security Hardening
|
||||
|
||||
#### PostgreSQL Security
|
||||
|
||||
```sql
|
||||
-- Database security configuration
|
||||
-- Remove public schema permissions
|
||||
REVOKE ALL ON SCHEMA public FROM PUBLIC;
|
||||
|
||||
-- Create application-specific schemas
|
||||
CREATE SCHEMA authentik AUTHORIZATION authentik;
|
||||
CREATE SCHEMA gitea AUTHORIZATION gitea;
|
||||
|
||||
-- Row-level security (if needed)
|
||||
ALTER TABLE authentik.sensitive_data ENABLE ROW LEVEL SECURITY;
|
||||
CREATE POLICY user_data_policy ON authentik.sensitive_data
|
||||
FOR ALL TO authentik USING (user_id = current_setting('app.user_id'));
|
||||
|
||||
-- Audit logging
|
||||
CREATE EXTENSION IF NOT EXISTS pgaudit;
|
||||
ALTER SYSTEM SET pgaudit.log = 'all';
|
||||
```
|
||||
|
||||
#### Database Access Monitoring
|
||||
|
||||
```bash
|
||||
# Monitor database connections
|
||||
ssh root@your-vps "sudo -u postgres psql -h /var/run/postgresql -c 'SELECT datname, usename, application_name, client_addr FROM pg_stat_activity;'"
|
||||
|
||||
# Check for suspicious queries
|
||||
ssh root@your-vps "sudo -u postgres psql -h /var/run/postgresql -c 'SELECT query, query_start, state FROM pg_stat_activity WHERE state != '\''idle'\'';'"
|
||||
|
||||
# Review authentication logs
|
||||
ssh root@your-vps "grep -i 'authentication\|connection' /var/log/postgresql/postgresql.log"
|
||||
```
|
||||
|
||||
### Cache Security
|
||||
|
||||
#### Valkey/Redis Security Configuration
|
||||
|
||||
```bash
|
||||
# Valkey security settings
|
||||
CONFIG SET requirepass "strong_password"
|
||||
CONFIG SET rename-command FLUSHDB ""
|
||||
CONFIG SET rename-command FLUSHALL ""
|
||||
CONFIG SET rename-command DEBUG ""
|
||||
CONFIG SET rename-command CONFIG "CONFIG_b3a0f6c8"
|
||||
|
||||
# Disable dangerous commands
|
||||
CONFIG SET protected-mode yes
|
||||
CONFIG SET save "" # Disable automatic snapshots
|
||||
```
|
||||
|
||||
#### Cache Access Control
|
||||
|
||||
```bash
|
||||
# Verify cache authentication
|
||||
ssh root@your-vps "redis-cli -s /var/run/valkey/valkey.sock -a \$VALKEY_PASSWORD ping"
|
||||
|
||||
# Monitor cache operations
|
||||
ssh root@your-vps "redis-cli -s /var/run/valkey/valkey.sock -a \$VALKEY_PASSWORD monitor"
|
||||
|
||||
# Check cache configuration
|
||||
ssh root@your-vps "redis-cli -s /var/run/valkey/valkey.sock -a \$VALKEY_PASSWORD CONFIG GET '*'"
|
||||
```
|
||||
|
||||
## Layer 5: Application Security
|
||||
|
||||
### Secret Management
|
||||
|
||||
#### Ansible Vault Security
|
||||
|
||||
```yaml
|
||||
# Vault encryption verification
|
||||
vault_security:
|
||||
encryption_method: "AES256"
|
||||
key_derivation: "PBKDF2"
|
||||
vault_password_source: "prompt" # Never store in files
|
||||
|
||||
# Vault best practices
|
||||
vault_practices:
|
||||
- rotate_vault_password: "quarterly"
|
||||
- separate_vault_files: "by_environment"
|
||||
- backup_encrypted_vaults: "securely"
|
||||
- audit_vault_access: "regularly"
|
||||
```
|
||||
|
||||
#### Environment Variable Security
|
||||
|
||||
```bash
|
||||
# Verify secrets are not in process environment
|
||||
ssh root@your-vps "sudo -u authentik cat /proc/\$(pgrep -f authentik-server)/environ | tr '\0' '\n' | grep -v SECRET"
|
||||
|
||||
# Check for secrets in logs
|
||||
ssh root@your-vps "journalctl --user -M authentik@ -u authentik-server | grep -i 'password\|secret\|token'"
|
||||
```
|
||||
|
||||
### Secure Headers and Middleware
|
||||
|
||||
#### Application-Level Security Headers
|
||||
|
||||
```python
|
||||
# Example application security middleware
|
||||
security_middleware = {
|
||||
'SECURE_BROWSER_XSS_FILTER': True,
|
||||
'SECURE_CONTENT_TYPE_NOSNIFF': True,
|
||||
'SECURE_HSTS_SECONDS': 31536000,
|
||||
'SECURE_HSTS_INCLUDE_SUBDOMAINS': True,
|
||||
'SECURE_HSTS_PRELOAD': True,
|
||||
'SECURE_REDIRECT_EXEMPT': [],
|
||||
'SECURE_SSL_REDIRECT': True,
|
||||
'SESSION_COOKIE_SECURE': True,
|
||||
'SESSION_COOKIE_HTTPONLY': True,
|
||||
'SESSION_COOKIE_SAMESITE': 'Strict',
|
||||
'CSRF_COOKIE_SECURE': True,
|
||||
'X_FRAME_OPTIONS': 'DENY'
|
||||
}
|
||||
```
|
||||
|
||||
#### Content Security Policy
|
||||
|
||||
```http
|
||||
# Strict CSP for web applications
|
||||
Content-Security-Policy: default-src 'self';
|
||||
script-src 'self' 'unsafe-inline' https://cdn.example.com;
|
||||
style-src 'self' 'unsafe-inline';
|
||||
img-src 'self' data: https:;
|
||||
font-src 'self' https://fonts.gstatic.com;
|
||||
connect-src 'self' https://api.example.com;
|
||||
frame-ancestors 'none';
|
||||
base-uri 'self';
|
||||
form-action 'self'
|
||||
```
|
||||
|
||||
### Audit Logging and Monitoring
|
||||
|
||||
#### System-Wide Audit Configuration
|
||||
|
||||
```bash
|
||||
# auditd configuration for security events
|
||||
auditctl -w /etc/passwd -p wa -k user_modification
|
||||
auditctl -w /etc/shadow -p wa -k password_modification
|
||||
auditctl -w /opt/authentik -p wa -k authentik_access
|
||||
auditctl -w /var/run/postgresql -p wa -k database_access
|
||||
auditctl -w /var/run/valkey -p wa -k cache_access
|
||||
|
||||
# Monitor systemd service changes
|
||||
auditctl -w /etc/systemd/system -p wa -k service_modification
|
||||
auditctl -w /home/*/.*config/containers/systemd -p wa -k container_modification
|
||||
```
|
||||
|
||||
#### Application Audit Logging
|
||||
|
||||
```yaml
|
||||
# Application-level audit events
|
||||
audit_events:
|
||||
authentication:
|
||||
- user_login_success
|
||||
- user_login_failure
|
||||
- password_change
|
||||
- mfa_enrollment
|
||||
- session_timeout
|
||||
|
||||
authorization:
|
||||
- access_granted
|
||||
- access_denied
|
||||
- privilege_escalation
|
||||
- policy_violation
|
||||
|
||||
data_access:
|
||||
- sensitive_data_access
|
||||
- data_export
|
||||
- configuration_change
|
||||
- backup_access
|
||||
```
|
||||
|
||||
### Security Monitoring and Alerting
|
||||
|
||||
#### Real-Time Security Monitoring
|
||||
|
||||
```bash
|
||||
# Security monitoring scripts
|
||||
#!/bin/bash
|
||||
# security-monitor.sh
|
||||
|
||||
# Monitor failed authentication attempts
|
||||
FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log | wc -l)
|
||||
if [ $FAILED_LOGINS -gt 10 ]; then
|
||||
echo "ALERT: High number of failed login attempts: $FAILED_LOGINS"
|
||||
fi
|
||||
|
||||
# Monitor unusual database connections
|
||||
DB_CONNECTIONS=$(sudo -u postgres psql -h /var/run/postgresql -t -c "SELECT count(*) FROM pg_stat_activity WHERE application_name NOT IN ('authentik', 'gitea');")
|
||||
if [ $DB_CONNECTIONS -gt 5 ]; then
|
||||
echo "ALERT: Unusual database connections: $DB_CONNECTIONS"
|
||||
fi
|
||||
|
||||
# Monitor container security violations
|
||||
SELINUX_VIOLATIONS=$(ausearch -m AVC -ts recent 2>/dev/null | wc -l)
|
||||
if [ $SELINUX_VIOLATIONS -gt 0 ]; then
|
||||
echo "ALERT: SELinux violations detected: $SELINUX_VIOLATIONS"
|
||||
fi
|
||||
```
|
||||
|
||||
#### Log Aggregation and Analysis
|
||||
|
||||
```yaml
|
||||
# Log analysis configuration
|
||||
log_analysis:
|
||||
sources:
|
||||
- /var/log/auth.log # SSH and system authentication
|
||||
- /var/log/audit/audit.log # System audit events
|
||||
- /opt/authentik/logs/ # Application logs
|
||||
- /var/log/caddy/ # Web server logs
|
||||
- /var/log/postgresql/ # Database logs
|
||||
|
||||
alerts:
|
||||
- pattern: "Failed password.*from.*"
|
||||
threshold: 5
|
||||
timeframe: "5m"
|
||||
action: "block_ip"
|
||||
|
||||
- pattern: "AUTHENTICATION_FAILED.*authentik"
|
||||
threshold: 10
|
||||
timeframe: "10m"
|
||||
action: "alert_admin"
|
||||
```
|
||||
|
||||
## Security Best Practices
|
||||
|
||||
### Regular Security Maintenance
|
||||
|
||||
#### Security Updates
|
||||
|
||||
```bash
|
||||
# Automated security updates (weekly)
|
||||
#!/bin/bash
|
||||
# security-updates.sh
|
||||
|
||||
# System package updates
|
||||
pacman -Syu --noconfirm
|
||||
|
||||
# Container image updates
|
||||
for user in authentik gitea; do
|
||||
sudo -u $user podman auto-update
|
||||
done
|
||||
|
||||
# Certificate renewal check
|
||||
systemctl reload caddy
|
||||
|
||||
# Restart services if security updates require it
|
||||
if [ -f /var/run/reboot-required ]; then
|
||||
systemctl reboot
|
||||
fi
|
||||
```
|
||||
|
||||
#### Security Auditing
|
||||
|
||||
```bash
|
||||
# Monthly security audit checklist
|
||||
#!/bin/bash
|
||||
# security-audit.sh
|
||||
|
||||
echo "=== Security Audit Report $(date) ==="
|
||||
|
||||
# Check for unauthorized users
|
||||
echo "Checking system users:"
|
||||
awk -F: '$3 >= 1000 {print $1, $3}' /etc/passwd
|
||||
|
||||
# Check sudo access
|
||||
echo "Checking sudo access:"
|
||||
grep -v '^#' /etc/sudoers
|
||||
|
||||
# Check listening services
|
||||
echo "Checking listening services:"
|
||||
netstat -tulpn | grep LISTEN
|
||||
|
||||
# Check file permissions on critical files
|
||||
echo "Checking critical file permissions:"
|
||||
ls -la /etc/shadow /etc/passwd /etc/ssh/sshd_config
|
||||
|
||||
# Check for SUID/SGID files
|
||||
echo "Checking SUID/SGID files:"
|
||||
find /usr -perm /6000 -type f 2>/dev/null
|
||||
|
||||
# Check container security
|
||||
echo "Checking container security:"
|
||||
for user in authentik gitea; do
|
||||
echo "User: $user"
|
||||
sudo -u $user podman ps --format "table {{.Names}}\t{{.RunningFor}}\t{{.Status}}"
|
||||
done
|
||||
|
||||
# Check database security
|
||||
echo "Checking database connections:"
|
||||
sudo -u postgres psql -h /var/run/postgresql -c "SELECT datname, usename, client_addr FROM pg_stat_activity;"
|
||||
```
|
||||
|
||||
### Incident Response Procedures
|
||||
|
||||
#### Security Incident Response Plan
|
||||
|
||||
```yaml
|
||||
incident_response:
|
||||
detection:
|
||||
- automated_alerts: "fail2ban, audit logs, monitoring"
|
||||
- manual_review: "daily log review, weekly security audit"
|
||||
|
||||
assessment:
|
||||
- severity_levels: ["low", "medium", "high", "critical"]
|
||||
- response_time:
|
||||
critical: "15 minutes"
|
||||
high: "1 hour"
|
||||
medium: "4 hours"
|
||||
low: "24 hours"
|
||||
|
||||
containment:
|
||||
- isolate_affected_systems: "fail2ban, iptables blocks"
|
||||
- preserve_evidence: "log snapshots, memory dumps"
|
||||
- maintain_operations: "failover procedures"
|
||||
|
||||
eradication:
|
||||
- remove_threats: "malware removal, account cleanup"
|
||||
- patch_vulnerabilities: "system updates, configuration fixes"
|
||||
- strengthen_defenses: "additional monitoring, access controls"
|
||||
|
||||
recovery:
|
||||
- restore_services: "service restart, data restoration"
|
||||
- monitor_operations: "enhanced monitoring period"
|
||||
- validate_security: "penetration testing, vulnerability scans"
|
||||
```
|
||||
|
||||
#### Emergency Response Commands
|
||||
|
||||
```bash
|
||||
# Emergency security response toolkit
|
||||
#!/bin/bash
|
||||
# emergency-response.sh
|
||||
|
||||
case "$1" in
|
||||
"isolate")
|
||||
# Emergency network isolation
|
||||
iptables -I INPUT -j DROP
|
||||
iptables -I OUTPUT -j DROP
|
||||
echo "System isolated from network"
|
||||
;;
|
||||
|
||||
"lockdown")
|
||||
# Lock all user accounts except emergency admin
|
||||
for user in $(cat /etc/passwd | cut -d: -f1); do
|
||||
if [ "$user" != "root" ] && [ "$user" != "emergency" ]; then
|
||||
usermod -L $user
|
||||
fi
|
||||
done
|
||||
echo "All user accounts locked"
|
||||
;;
|
||||
|
||||
"audit")
|
||||
# Emergency audit collection
|
||||
mkdir -p /tmp/emergency-audit
|
||||
cp -r /var/log/* /tmp/emergency-audit/
|
||||
journalctl --no-pager > /tmp/emergency-audit/journalctl.log
|
||||
netstat -tulpn > /tmp/emergency-audit/network.log
|
||||
ps auxf > /tmp/emergency-audit/processes.log
|
||||
echo "Audit data collected in /tmp/emergency-audit/"
|
||||
;;
|
||||
|
||||
"restore")
|
||||
# Restore from isolation
|
||||
iptables -F
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
echo "Network access restored - apply proper firewall rules"
|
||||
;;
|
||||
esac
|
||||
```
|
||||
|
||||
## Compliance and Standards
|
||||
|
||||
### Security Standards Alignment
|
||||
|
||||
#### CIS (Center for Internet Security) Benchmarks
|
||||
|
||||
```yaml
|
||||
cis_compliance:
|
||||
level_1_controls:
|
||||
- filesystem_configuration: "implemented"
|
||||
- software_updates: "automated"
|
||||
- secure_boot_settings: "implemented"
|
||||
- additional_process_hardening: "implemented"
|
||||
- mandatory_access_controls: "selinux_enforcing"
|
||||
|
||||
level_2_controls:
|
||||
- address_space_layout_randomization: "enabled"
|
||||
- prelink_disabled: "implemented"
|
||||
- activate_gpg_check: "implemented"
|
||||
- disable_automounting: "implemented"
|
||||
```
|
||||
|
||||
#### NIST Cybersecurity Framework
|
||||
|
||||
```yaml
|
||||
nist_framework:
|
||||
identify:
|
||||
- asset_management: "complete inventory of systems and services"
|
||||
- risk_assessment: "quarterly risk assessments"
|
||||
|
||||
protect:
|
||||
- access_control: "authentik SSO with MFA"
|
||||
- awareness_training: "security documentation and procedures"
|
||||
- data_security: "encryption at rest and in transit"
|
||||
|
||||
detect:
|
||||
- anomalies_events: "automated monitoring and alerting"
|
||||
- security_monitoring: "continuous monitoring of security events"
|
||||
|
||||
respond:
|
||||
- response_planning: "documented incident response procedures"
|
||||
- communications: "stakeholder notification procedures"
|
||||
|
||||
recover:
|
||||
- recovery_planning: "documented recovery procedures"
|
||||
- improvements: "lessons learned and security enhancements"
|
||||
```
|
||||
|
||||
### Documentation and Training
|
||||
|
||||
#### Security Documentation
|
||||
|
||||
```yaml
|
||||
required_documentation:
|
||||
policies:
|
||||
- information_security_policy
|
||||
- access_control_policy
|
||||
- incident_response_policy
|
||||
- backup_recovery_policy
|
||||
|
||||
procedures:
|
||||
- user_onboarding_offboarding
|
||||
- security_incident_response
|
||||
- vulnerability_management
|
||||
- change_management
|
||||
|
||||
technical_guides:
|
||||
- system_hardening_guide
|
||||
- application_security_guide
|
||||
- network_security_guide
|
||||
- monitoring_alerting_guide
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
This comprehensive security hardening guide implements defense-in-depth security across all layers of the rick-infra stack, emphasizing the security benefits of native database services, Unix socket IPC, rootless containers, and centralized authentication.
|
||||
|
||||
## References
|
||||
|
||||
- **[Authentication Architecture](authentication-architecture.md)** - Detailed authentication and authorization
|
||||
- **[Architecture Decisions](architecture-decisions.md)** - Security-focused architectural choices
|
||||
- **[Authentik Deployment Guide](authentik-deployment-guide.md)** - Secure authentication deployment
|
||||
- **[Service Integration Guide](service-integration-guide.md)** - Secure service integration patterns
|
||||
|
||||
Reference in New Issue
Block a user