命令记录和命令规则
Casvisor会记下用户在SSH资产上执行的命令,不论是在网页终端里还是经由SSH网关,并能在你指定的命令执行之前把它拦下。RDP、VNC和Telnet会话没有命令记录。
两个页面都只对管理员开放:命令记录(/commands)和命令规则(/command-rules)。
怎么读出命令
交互式shell里,Casvisor在后端维护一块和用户终端一样大的虚拟屏幕,跟着会话走。用户按回车时,它从提示符末尾读到光标,读的是那一刻屏幕上显示的内容。所以记下来的就是实际执行的命令:
- Tab补全、用方向键调出的历史命令、在行中间做的修改,都包含在内。
- 折行的长命令和中文等字符都能读准。
- 打开
vim、top、less这类全屏程序时什么都不记。 - shell不回显的输入(例如给
sudo输入的密码)不在屏幕上,也不会被记下。
ssh命令行上带的命令,例如ssh web-01 'systemctl restart nginx',按客户端发来的原文记录,也包括scp -O和rsync在资产上执行的命令。
命令记录页面
每行是一条命令:时间、命令、用户、资产、客户端IP、会话,命中规则时还有规则和它的动作。可以按命令、用户、资产、客户端IP和会话搜索。会话列表里的命令记录列是每个SSH会话的命令数,点进去就是这个会话的命令。
命令规则
一条命令规则写明一个匹配规则,以及命令命中时怎么处理。
| 字段 | 含义 |
|---|---|
| 组织、名称 | 规则属于一个组织,作用于这个组织的资产。 |
| 匹配规则 | Go语法(RE2)的正则表达式。命令里任何位置匹配上就算命中,要匹配整条命令请用^和$。 |
| 动作 | Block(拦截)或Alert(告警)。 |
| 用户、用户组 | 对谁生效。两个都不填,或者填*,表示所有人。 |
| 资产、资产标签 | 对哪些资产生效。两个都不填,或者填*,表示组织里的所有资产。 |
| 启用 | 关掉后这条规则不起作用。 |
规则对管理员同样生效。多条规则同时命中时,拦截优先于告警。
几个例子:
| 匹配规则 | 命中 |
|---|---|
^\s*rm\s+-rf\s+/\s*$ | rm -rf /,不命中rm -rf /tmp/x |
\b(shutdown|reboot|halt|poweroff)\b | 任何提到这几个词的命令 |
^\s*(mkfs|fdisk|parted)\b | 以这几个命令开头的命令 |
拦截
在交互式shell里,Casvisor不把回车传下去,而是发一个Ctrl+C,让这一行不执行就清掉,并在用户终端里显示一行红字:[Casvisor] The command is blocked by the rule: ...。对ssh命令行上带的命令,网关直接拒绝,提示casvisor: the command is blocked by the rule: ...,退出码为1。
这条命令以动作Block记下。
告警
命令照常执行,以动作Alert和命中的规则记下,可以在命令记录页面里找到。Casvisor不会为它另外发通知。
规则拦不住什么
规则看到的是输入的那一行命令,有办法绕过:把命令写进脚本再执行脚本,用变量或别名拼出命令,在全屏程序里执行,或者用规则没想到的命令。请把拦截当作防误操作的手段,权限本身仍然要尽量收窄。