高安全架构 学习笔记(第 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)