{T}

高安全架构 学习笔记(第 3 部分)

3.1 数据安全三要素

plaintext
数据安全三要素:
 
1. 访问权限控制
   ├── 责任分层
   ├── 用户权限设置
   └── 最小权限原则
 
2. 数据加密
   ├── 对称加密
   ├── 非对称加密
   └── 数字签名
 
3. 数据保护
   ├── 逻辑保护
   ├── 高可用保障
   └── 备份恢复

3.2 访问权限控制

责任分层

plaintext
数据访问分层:
 
┌─────────────────────────────────┐
│  数据所有者                      │
│  - 决定数据分类                 │
│  - 审批访问权限                 │
└─────────────┬───────────────────┘

┌─────────────────────────────────┐
│  数据管理员                      │
│  - 执行访问控制                 │
│  - 维护数据安全                 │
└─────────────┬───────────────────┘

┌─────────────────────────────────┐
│  数据使用者                      │
│  - 按权限访问数据               │
│  - 遵守安全规范                 │
└─────────────────────────────────┘

权限设置示例

javascript
// 数据访问权限控制
class DataAccessControl {
  constructor() {
    this.permissions = new Map()
    this.roles = new Map()
  }
  
  // 定义角色权限
  defineRole(roleName, permissions) {
    this.roles.set(roleName, permissions)
  }
  
  // 授予用户权限
  grantPermission(userId, resource, action, conditions = {}) {
    const key = `${userId}:${resource}`
    
    const permission = {
      userId,
      resource,
      action,  // read, write, delete, admin
      conditions,
      grantedAt: Date.now(),
      grantedBy: 'system'
    }
    
    if (!this.permissions.has(key)) {
      this.permissions.set(key, [])
    }
    
    this.permissions.get(key).push(permission)
  }
  
  // 检查权限
  checkPermission(userId, resource, action, context = {}) {
    const key = `${userId}:${resource}`
    const permissions = this.permissions.get(key) || []
    
    for (const perm of permissions) {
      if (perm.action === action || perm.action === 'admin') {
        // 检查条件
        if (this.checkConditions(perm.conditions, context)) {
          return {
            allowed: true,
            permission: perm
          }
        }
      }
    }
    
    return {
      allowed: false,
      reason: '权限不足'
    }
  }
  
  // 检查条件
  checkConditions(conditions, context) {
    for (const [key, value] of Object.entries(conditions)) {
      if (context[key] !== value) {
        return false
      }
    }
    return true
  }
  
  // 最小权限原则:只授予必要的权限
  applyLeastPrivilege(userId, resources) {
    const minimalPermissions = []
    
    for (const resource of resources) {
      // 分析用户实际需要的权限
      const requiredActions = this.analyzeRequiredActions(userId, resource)
      
      // 只授予必要的权限
      for (const action of requiredActions) {
        minimalPermissions.push({
          userId,
          resource,
          action
        })
      }
    }
    
    return minimalPermissions
  }
  
  // 分析所需权限
  analyzeRequiredActions(userId, resource) {
    // 根据业务逻辑分析用户需要的权限
    return ['read']  // 默认只读权限
  }
  
  // 审计日志
  auditAccess(userId, resource, action, result) {
    const auditEntry = {
      timestamp: Date.now(),
      userId,
      resource,
      action,
      result: result.allowed ? 'granted' : 'denied',
      reason: result.reason || '',
      ipAddress: this.getClientIP(),
      userAgent: this.getUserAgent()
    }
    
    this.saveAuditLog(auditEntry)
    
    return auditEntry
  }
  
  // 辅助方法
  getClientIP() {
    return '192.168.1.100'
  }
  
  getUserAgent() {
    return 'Mozilla/5.0...'
  }
  
  saveAuditLog(entry) {
    console.log('审计日志:', entry)
  }
}
 
// 使用示例
const accessControl = new DataAccessControl()
 
// 定义角色
accessControl.defineRole('admin', ['read', 'write', 'delete', 'admin'])
accessControl.defineRole('user', ['read'])
accessControl.defineRole('editor', ['read', 'write'])
 
// 授予权限
accessControl.grantPermission('user123', '/api/users', 'read')
accessControl.grantPermission('user123', '/api/users/profile', 'write', { owner: 'user123' })
 
// 检查权限
const result = accessControl.checkPermission('user123', '/api/users', 'read')
console.log('权限检查结果:', result)  // { allowed: true }
 
// 审计
accessControl.auditAccess('user123', '/api/users', 'read', result)