权限
一条权限说的是:这些人,可以在这段时间里,从这些地址,对这些资产做这些事。不是管理员的用户,只有在权限允许时才能访问资产。
管理员在授权页面管理权限。
字段
| 字段 | 含义 |
|---|---|
| 组织、名称 | 和资产一样,权限属于一个Casdoor组织,只对这个组织的用户和资产生效。 |
| 用户 | 按用户名填。*表示组织里的所有用户。 |
| 用户组 | Casdoor用户组,组里所有成员都算在内。 |
| 资产 | 按资产名称填。*表示组织里的所有资产。 |
| 资产标签 | 标签是其中之一的所有资产,包括以后才打上这个标签的。 |
| 动作 | Connect、Copy、Paste、Upload、Download中的任意几个。 |
| 来源IP | 用户必须从这些地址或网段连接,例如10.0.0.0/8或203.0.113.7。不填表示不限。 |
| 开始时间、结束时间 | 权限生效的时间段。两头都可以不填,表示那一头不限。 |
| 启用 | 关掉后这条权限不起任何作用,但不用删除。 |
一条权限覆盖用户里的每个人和用户组里的每个人,作用于资产里的每个资产和资产标签命中的每个资产。
动作
| 动作 | 允许什么 |
|---|---|
| Connect(连接) | 在工作台里看到这个资产并建立会话。没有它,其他动作都没有意义。 |
| Copy(复制) | 远端剪贴板里的文字能传到用户的浏览器。 |
| Paste(粘贴) | 用户剪贴板里的文字能传到远端。 |
| Upload(上传)、Download(下载) | 为文件传输预留,界面里还没有这个功能。 |
复制和粘贴在哪里执行,见协议:Telnet由guacd执行,VNC由前端执行;SSH暂未限制,RDP暂时没有剪贴板。
多条权限怎么叠加
权限只有允许,没有拒绝。只要任意一条已启用、在有效期内的权限同时覆盖了这个用户(按用户名、*或用户组)、这个资产(按名称、*或标签)、这个动作和他连接时的地址,就允许。要收回某项访问,就修改或关掉给出它的那条权限。
几个例子:
| 目标 | 用户 / 用户组 | 资产 / 资产标签 | 动作 | 来源IP | 时间 |
|---|---|---|---|---|---|
| 运维组从办公网访问所有Linux服务器 | 用户组ops | 标签linux | Connect、Copy、Paste | 198.51.100.0/24 | |
| 外包人员访问两台服务器一周,不能用剪贴板 | 用户alice | web-01、web-02 | Connect | 2026-11-01至2026-11-08 | |
| 所有人都能用跳板桌面 | * | jump-desktop | Connect、Paste |
什么时候检查
Casvisor在列出用户工作台里的资产时、建立会话时、以及打开会话的WebSocket时都会检查权限。所以改动对下一次连接立刻生效。
已经打开的会话不会再检查,所以收回权限并不会断开此刻正连着的人。要断开他,在会话里停止他的会话。
用户组成员关系在用户登录时读取,见Casdoor里的改动什么时候生效。
客户端IP
和来源IP比较的,是连接的来源地址。如果连接来自本机或内网地址(反向代理和Casvisor在同一个网络时就是这样),Casvisor改用X-Forwarded-For的最后一项,也就是你的代理看到的地址。请确保代理设置了这个头,见放在反向代理后面。
Casbin模型
对每个请求,Casvisor把组织里已启用的权限转成Casbin策略,用这个模型判断:
[request_definition]
r = sub, obj, act, ip
[policy_definition]
p = sub, obj, act, ip
[role_definition]
g = _, _
g2 = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && g2(r.obj, p.obj) && r.act == p.act && ipAllowed(r.ip, p.ip)g把用户归入user:*和他的每个用户组,g2把每个资产归入asset:*和它的标签,ipAllowed判断地址是否等于某个IP或落在某个网段里。每条权限按“用户或用户组 × 资产或标签 × 动作 × 地址段”展开成多行策略。
*在用户和资产里有效。在用户组和资产标签里它暂时没有特殊含义;要覆盖所有人或所有资产,请在用户或资产里填*。