# OKR 绩效考核系统 — 生产部署清单

## 部署前安全检查

在将系统部署到云主机前，**必须**完成以下安全配置：

### 1. 环境变量设置

```bash
# 生成随机密钥（至少 256-bit = 32 字节）
export APP_JWT_SECRET=$(openssl rand -base64 32)

# 设置超级管理员初始密码（部署后立即修改）
export APP_SUPER_ADMIN_PASSWORD="请替换为强密码"

# 数据库加密密钥（启用 SQLCipher 时必需）
export DB_ENCRYPT_KEY=$(openssl rand -base64 32)

# CORS 允许的域名（生产环境用实际域名）
export APP_CORS_ORIGINS="https://okr.your-company.com"
```

### 2. 系统服务配置（systemd）

```ini
# /etc/systemd/system/okr-performance.service
[Unit]
Description=OKR Performance System
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/okr-performance
EnvironmentFile=/opt/okr-performance/env.prod
ExecStart=/usr/bin/java -jar /opt/okr-performance/okr-performance.jar --spring.profiles.active=prod
Restart=on-failure
RestartSec=10

# 安全加固
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/okr-performance/data
PrivateTmp=yes

[Install]
WantedBy=multi-user.target
```

### 3. 数据库文件权限

```bash
chmod 700 /opt/okr-performance/data
chmod 600 /opt/okr-performance/data/okr-performance.db
chown -R appuser:appuser /opt/okr-performance
```

### 4. 启用 SQLCipher 加密（推荐）

1. 取消 `pom.xml` 中 `sqlcipher-jdbc` 依赖的注释，重新构建
2. 修改 `application-prod.yml` 中 datasource 配置，使用 SQLCipher URL
3. 迁移现有明文数据库（如有）：
   ```bash
   # 方案: 导出 → 启用加密 → 导入
   sqlcipher data/okr-performance.db "PRAGMA key='${DB_ENCRYPT_KEY}';"
   ```

### 5. Nginx + HTTPS

```bash
# 安装 certbot
apt install certbot python3-certbot-nginx

# 复制 Nginx 配置
cp deployment/nginx-okr-performance.conf /etc/nginx/sites-available/
ln -s /etc/nginx/sites-available/nginx-okr-performance.conf /etc/nginx/sites-enabled/

# 获取 SSL 证书
certbot --nginx -d okr.your-company.com

# 测试并重载
nginx -t && systemctl reload nginx
```

### 6. 防火墙规则

```bash
# 仅开放 80/443 端口（Nginx）
ufw allow 80/tcp
ufw allow 443/tcp
# 阻止直接访问应用端口
ufw deny 18080/tcp
ufw enable
```

### 7. 部署后验证清单

- [ ] HTTPS 可访问，HTTP 自动跳转
- [ ] 安全头齐全（检查 `curl -I https://okr.your-company.com`）
- [ ] 使用 `admin` 登录后立即修改密码
- [ ] SQL 日志已关闭（检查日志文件无 SQL 输出）
- [ ] 非管理员用户无法查看他人的评分详情
- [ ] 数据库文件权限为 600
- [ ] 环境变量未包含默认值（生产配置无 fallback）

## 应急响应

如怀疑数据泄露：

1. 立即轮换 `APP_JWT_SECRET`（所有用户需重新登录）
2. 检查 `/var/log/nginx/okr-access.log` 中的异常访问模式
3. 检查 `operation_log` 表中的可疑操作
4. 重置所有用户密码
5. 如数据库文件被拷贝，评估是否需要通知相关人员
