Skip to content

Commit

Permalink
feat: security guide (#268)
Browse files Browse the repository at this point in the history
  • Loading branch information
2013xile authored Jan 3, 2025
1 parent 7961b66 commit 9733a49
Show file tree
Hide file tree
Showing 4 changed files with 759 additions and 32 deletions.
68 changes: 36 additions & 32 deletions docs/config/handbook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1475,17 +1475,17 @@ export default [
'title.ja-JP': '開発ガイド',
children: [
{
title:'Extend Authentication Type',
'title.zh-CN':'扩展认证类型',
'title.ja-JP':'認証タイプの拡張',
title: 'Extend Authentication Type',
'title.zh-CN': '扩展认证类型',
'title.ja-JP': '認証タイプの拡張',
link: '/handbook/auth/dev/guide',
},
{
title:'API Reference',
'title.zh-CN':'API 参考',
'title.ja-JP':'API 参考',
title: 'API Reference',
'title.zh-CN': 'API 参考',
'title.ja-JP': 'API 参考',
link: '/handbook/auth/dev/api',
}
},
],
},
],
Expand Down Expand Up @@ -1521,18 +1521,17 @@ export default [
'title.zh-CN': '示例',
'title.ja-JP': '例',
children: [

{
title:'Sign in with Google',
'title.zh-CN':'谷歌登录',
'title.ja-JP':'Googleでサインイン',
link: '/handbook/auth-oidc/example/google'
title: 'Sign in with Google',
'title.zh-CN': '谷歌登录',
'title.ja-JP': 'Googleでサインイン',
link: '/handbook/auth-oidc/example/google',
},
{
title:'Microsoft Entra ID',
'title.zh-CN':'微软登录',
'title.ja-JP':'MicroSoft Entra ID',
link: '/handbook/auth-oidc/example/microsoft'
title: 'Microsoft Entra ID',
'title.zh-CN': '微软登录',
'title.ja-JP': 'MicroSoft Entra ID',
link: '/handbook/auth-oidc/example/microsoft',
},
],
},
Expand All @@ -1555,13 +1554,13 @@ export default [
'title.zh-CN': '示例',
'title.ja-JP': '例',
children: [
{
title:'Sign in with Google',
'title.zh-CN':'谷歌登录',
'title.ja-JP':'Googleでサインイン',
link: '/handbook/auth-saml/example/google'
}
],
{
title: 'Sign in with Google',
'title.zh-CN': '谷歌登录',
'title.ja-JP': 'Googleでサインイン',
link: '/handbook/auth-saml/example/google',
},
],
},
],
},
Expand Down Expand Up @@ -1628,15 +1627,15 @@ export default [
'title.zh-CN': '开发指南',
children: [
{
title:'Notification Extension',
'title.zh-CN':'扩展通知渠道类型',
link: '/handbook/notification-manager/development/extension'
title: 'Notification Extension',
'title.zh-CN': '扩展通知渠道类型',
link: '/handbook/notification-manager/development/extension',
},
{
title:'Notification API',
'title.zh-CN':'扩展通知API',
link: '/handbook/notification-manager/development/api'
}
title: 'Notification API',
'title.zh-CN': '扩展通知API',
link: '/handbook/notification-manager/development/api',
},
],
},
],
Expand Down Expand Up @@ -2007,8 +2006,8 @@ export default [
'title.ja-JP': 'ユーザーマニュアル',
link: '/handbook/email-manager/usage-user',
},
]
}
],
},
],
},
{
Expand Down Expand Up @@ -2728,6 +2727,11 @@ export default [
'title.zh-CN': '安全性',
type: 'group',
children: [
{
title: 'Security guide',
'title.zh-CN': '安全指南',
link: '/handbook/security',
},
{
title: 'Password policy',
'title.zh-CN': '密码策略',
Expand Down
241 changes: 241 additions & 0 deletions docs/en-US/handbook/security.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
# NocoBase 安全指南

NocoBase 从功能设计到系统实现都注重数据和应用的安全性。平台内置了用户认证、访问控制、数据加密等多项安全功能,同时允许根据实际需求灵活配置安全策略。无论是保护用户数据、管理访问权限,还是隔离开发和生产环境,NocoBase 都提供了实用的工具和方案。本指南旨在为安全地使用 NocoBase 提供指导,帮助用户保护数据、应用和环境的安全,确保用户安全的前提下高效使用系统功能。

## 用户认证

用户认证用于识别用户身份,防止用户在未授权的情况下进入系统,并确保用户身份不被滥用。

### Token 策略

默认情况下,NocoBase 使用 JWT (JSON Web Token) 对服务端 API 进行鉴权,并支持设置以下 Token 策略:

| 配置项 | 说明 |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 会话有效期 | 用户每次登录的最长有效时间,在会话有效期内,Token 会自动更新,超时后要求用户重新登录。 |
| Token 有效期 | 每次签发的 API Token 的有效期。Token 过期后,如果处于会话有效期内,并且没有超过刷新时限,服务端将自动签发新 Token 以保持用户会话,否则要求用户重新登录。(每个 Token 只能被刷新一次) |
| 过期 Token 刷新时限 | Token 过期后允许刷新的最大时限 |

通常情况下,我们建议管理员:

- 设置一个较短的 Token 有效期来限制 Token 的暴露时间。
- 设置一个合理的会话有效期,比 Token 有效期长但不宜过长,以平衡用户体验和安全性。利用 Token 自动刷新的机制保证活跃用户会话不中断的同时,减少长期会话被滥用的风险。
- 设置一个合理的过期 Token 刷新时限,使用户长时间不活跃的情况下 Token 自然过期而不签发新的 Token, 降低用户闲置会话被滥用的风险。

![](https://static-docs.nocobase.com/202501031613500.png)

### Token 客户端存储

默认情况下,用户 Token 存储在浏览器的 LocalStorage 中。关闭浏览器页面后再次打开,如果 Token 还在有效期内,用户不需要重新登录。

如果你希望用户每次进入页面都需要重新登录,可以设置环境变量 `API_CLIENT_STORAGE_TYPE=sessionStorage`, 将用户 Token 保存到浏览器的 SessionStorage 中,以达到用户每次打开页面重新登录的目的。

### 密码策略

> 专业版及以上
NocoBase 支持为所有用户设置密码规则和密码登录尝试锁定策略,来增强启用了密码登录的 NocoBase 应用的安全性。你可以参考[密码策略](./password-policy/index.md)了解每一个配置项。

#### 密码规则

| 配置项 | 说明 |
| -------------------------- | -------------------------------------------------------- |
| **密码长度** | 密码的最小长度要求,最大长度为 64。 |
| **密码复杂度** | 设置密码的复杂度要求,必须包含的字符种类。 |
| **不能在密码中包含用户名** | 设置密码是否能包含当前用户的用户名。 |
| **记住密码历史** | 记住用户最近使用的密码个数,用户修改密码时不能重复使用。 |

#### 密码过期配置

| 配置项 | 说明 |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- |
| **密码有效期** | 用户密码的有效期,密码过期后,需要管理员重新设置密码,用户才可以使用密码登录。<br>如果有配置其他的登录方式,用户可以使用其他方式登录。 |
| **密码过期提示通知渠道** | 用户密码到期的 10 天内,用户每次登录时,发送提醒。 |

#### 密码登录安全

| 配置项 | 说明 |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| **最大无效密码登录尝试次数** | 设置用户在规定时间间隔内最多可以尝试登录次数。 |
| **最大无效密码登录时间间隔(秒)** | 设置计算用户最大无效登录次数的时间间隔,单位为秒。 |
| **锁定时间(秒)** | 设置用户超过无效密码登录限制以后,锁定用户的时间(0 代表不限制)。<br>用户被锁定期间,将禁止以任何认证方式访问系统,包括 API keys。 |

通常情况下,我们建议:

- 设置强度较高的密码规则,以降低密码被关联性猜测、暴力破解的风险。
- 设置合理的密码有效期,以强制用户定期更换密码。
- 结合无效密码登录次数和时间配置,限制短时间内高频的密码登录尝试,防止暴力破解密码的行为。
- 如果在安全要求比较严格的场景下,可以设置一个合理的超过登录限制锁定用户的时间。但需要注意的是,锁定时间设置可能被恶意利用,攻击者可能针对目标账号故意多次输入错误密码,迫使账号被锁定,无法正常使用。实际使用过程中,可以结合 IP 限制,API 频率限制等手段来防范这类攻击。
- 另外,由于密码过期或账号锁定都将无法进入系统,包括管理员账号,建议在系统中设置多个有权限重置密码、解锁用户的账号。

![](https://static-docs.nocobase.com/202501031618900.png)

### 用户锁定

> 专业版及以上,包含在密码策略插件中
管理因为超过无效密码登录限制而被锁定的用户,可以主动解锁,也可以主动将异常用户添加到锁定列表。用户被锁定后,将禁止以任何认证方式访问系统,包括 API keys.

![](https://static-docs.nocobase.com/202501031618399.png)

### 单点登录 (Single Sign-On)

> 商业插件
NocoBase 提供了丰富的 SSO 认证插件,支持 OIDC, SAML 2.0, LDAP, CAS 等多种主流协议。同时,NocoBase 也有完备的认证方式扩展接口,可以支持快速开发和接入其他认证类型。用户可以简单地将已有 IdP 和 NocoBase 对接,在 IdP 上集中管理用户身份,提高安全性。
![](https://static-docs.nocobase.com/202501031619427.png)

### 双因素身份认证 (Two-factor authentication)

> 企业版
双因素身份认证要求用户在使用密码登录的时候,提供第二种证明身份的有效信息,例如通过向用户的可信设备发送一次性动态验证码,以验证用户身份,确保用户身份不被滥用,降低密码泄露产生的风险。

### IP 访问控制

> 企业版
NocoBase 支持对用户访问 IP 设置黑名单或白名单。

- 在安全要求严格的环境中,可以设置 IP 白名单,仅允许特定 IP 或 IP 段访问系统,以限制未授权的外部网络连接,从源头降低安全风险。
- 在公开的网络访问条件下,如果管理员发现访问异常,可以设置 IP 黑名单,阻止已知的恶意 IP 地址,或可疑来源的访问,减少恶意扫描、暴力破解等安全威胁。
- 对被拒绝的访问请求,保留日志记录。

## 权限控制

通过在系统中设置不同的角色,以及对角色设置相应的权限,可以精细化地控制用户访问资源的权限。管理员需要结合实际场景需要,合理配置,以降低系统资源泄漏的风险。

### 角色和权限

NocoBase 通过在系统中设置角色,对不同角色授权,并将用户绑定到对应的角色上来控制用户访问资源的权限。每个用户可以拥有多个角色,用户可以通过切换角色,以不同的视角来操作资源。如果安装了部门插件,还可以将角色和部门绑定,用户就可以拥有所属部门上绑定的角色。

![](https://static-docs.nocobase.com/202501031620965.png)

### 系统配置权限

系统配置权限包含了以下设置:

- 是否允许配置界面
- 是否允许安装、启用、禁用插件
- 是否允许配置插件
- 是否允许清除缓存、重启应用
- 各个插件的配置权限

### 菜单权限

菜单权限用于控制用户进入不同菜单页面的权限,包括桌面端和移动端。
![](https://static-docs.nocobase.com/202501031620717.png)

### 数据权限

NocoBase 为用户访问系统内数据的权限提供了精细化的控制,确保不同用户只能访问与其职责相关的数据,防止越权和数据泄露。

#### 全局控制

![](https://static-docs.nocobase.com/202501031620866.png)

#### 表级别、字段级别控制

![](https://static-docs.nocobase.com/202501031621047.png)

#### 数据范围控制

设置用户可操作的数据范围。注意此处的数据范围和区块中配置的数据范围不同,区块中配置的数据范围通常仅做前端过滤数据使用,如果需要严格控制用户访问数据资源的权限,需要在此处配置,由服务端控制。

![](https://static-docs.nocobase.com/202501031621712.png)

## 数据安全

在数据存储、备份的过程中,NocoBase 提供了有效的机制,来确保数据安全。

### 密码存储

NocoBase 的用户密码使用 scrypt 算法加密后存储,可以有效对抗大规模的硬件攻击。

### 环境变量和密钥

在 NocoBase 中使用第三方服务的时候,我们推荐你将第三方的密钥信息配置到环境变量中,加密存储。既方便在不同的地方配置使用,又增强了的安全性。你可以查看文档了解详细的使用方法。

:::warning
默认情况下,密钥采用 AES-256-CBC 算法加密,NocoBase 会自动生成 32 位加密密钥并保存到 storage/.data/environment/aes_key.dat. 用户应该妥善保管密钥文件,防止密钥文件被窃取。如果需要迁移数据,密钥文件需要一并迁移。
:::

![](https://static-docs.nocobase.com/202501031622612.png)

### 文件存储

如果有存储敏感文件的需要,建议使用兼容 S3 协议的云存储服务,并配合商业版插件 File storage: S3 (Pro) ,实现文件的私有读写。如果需要在内网环境使用,建议使用 MinIO 等支持私有化部署、兼容 S3 协议的存储应用。

![](https://static-docs.nocobase.com/202501031623549.png)

### 应用备份

为了确保应用数据安全,避免数据丢失,我们建议你定期备份数据库。

开源版用户可以参考 https://www.nocobase.com/en/blog/nocobase-backup-restore 利用数据库工具进行备份,同时我们建议你妥善保管好备份文件,防止数据泄漏。

专业版及以上用户可以使用备份管理器进行备份,备份管理器提供了以下特性:

- 定时自动备份:周期性自动备份,节省时间和人工操作,数据安全更有保障。
- 将备份文件同步到云存储:将备份文件和应用服务本身隔离,防止因服务器故障导致服务不可用的同时备份文件丢失。
- 备份文件加密:给备份文件设置密码,降低备份文件泄漏导致数据泄漏的风险。

![](https://static-docs.nocobase.com/202501031623107.png)

## 运行环境安全

正确部署 NocoBase 并保障运行环境安全,是确保 NocoBase 应用安全的关键之一。

### HTTPS 部署

为了防止中间人攻击,我们建议你为 NocoBase 应用站点添加 SSL/TLS 证书,以保障数据在网络传输过程中的安全。

### API 传输加密

> 企业版
在数据安全要求更为严格的环境中,NocoBase 支持启用 API 传输加密,为 API 的请求和响应内容加密,避免明文传输,提高数据破解的门槛。

### 私有化部署

默认情况下,NocoBase 不需要与第三方服务通信,NocoBase 团队不会收集用户的一切信息。只有在执行以下两种操作时需要连接 NocoBase 服务器:

1. 通过 NocoBase Service 平台自动下载商业插件。
2. 商业版用户在线验证身份和激活应用。

如果你愿意牺牲一定的便利性,这两种操作也都支持离线完成,不需要直接连接 NocoBase 服务器。

NocoBase 支持完全内网部署,参考

- https://www.nocobase.com/en/blog/load-docker-image
- [将插件上传到插件目录来安装与升级](../welcome/getting-started/plugin.md#将插件上传到插件目录来安装与升级)

### 多环境隔离

在实际的使用实践中,我们推荐企业用户将测试和生产环境隔离,以确保生产环境下的应用数据和运行环境安全。利用迁移管理插件,可以实现应用数据在不同环境之间迁移。

![](https://static-docs.nocobase.com/202501031627729.png)

## 审计和监控

### 审计日志

> 企业版
NocoBase 的审计日志功能记录了系统内用户的活动记录。通过记录用户的关键操作和访问行为,管理员可以:

- 检查用户访问的 IP, 设备等信息,以及操作时间,及时发现异常行为。
- 追溯系统内数据资源的操作历史。

![](https://static-docs.nocobase.com/202501031627719.png)

![](https://static-docs.nocobase.com/202501031627922.png)

### 应用日志

NocoBase 提供多种日志类型,帮助用户了解系统运行状况和行为记录,及时发现和定位系统问题,从不同维度保障系统的安全性和可控性。主要日志类型包括:

- 请求日志:API 请求日志,包括访问的 URL、HTTP 方法、请求参数、响应时间和状态码等信息。
- 系统日志:记录应用运行事件,包括服务启动、配置变更、错误信息和关键操作等。
- SQL 日志:记录数据库操作语句及其执行时间,涵盖查询、更新、插入和删除等行为。
- 工作流日志:工作流的执行日志,包括执行时间、运行信息、错误信息等。
Loading

0 comments on commit 9733a49

Please sign in to comment.