使用 dbweb 修改数据库表结构
1. 说明
我们以 dbweb 工程为基础, 增加了一些功能上的限制, 来方便开发人员直接修改线上的数据库表结构, 修改及增加的更新包括:
1. 去掉原有的修改密码功能;
2. 增加 google totp 密码验证, 每登录一次需要获取最新的密码信息;
3. 限制 sql 执行, 包括以下限制:
`delete/update` 语句必须带有 where 条件;
`select` 语句必须带有 where 或 limit 条件;
禁止执行以下 sql:
use <database>
create <database/schema>
alter ... drop
drop <database/schema>
drop/truncate <table>
purge ...
grant/revoke ..
格式化 sql;
4. 超过 200MB 大小的表禁止 alter table 操作;
5. 限制 usercfg.conf 配置里的用户仅允许访问允许的数据库;
整体的规则可以表述为允许开发者增加表, 字段, 索引, 禁止操作 drop 类的更新, where 和 limit 条件的限制则降低了开发者误操作的概率, 具体更新见 dbweb
2. 通过浏览器访问
使用以下命令启动 dbweb 后, 可以通过浏览器访问, 如下:
./dbweb -home /web/dbweb -port
如下图:
3. 如何获取登录信息
用户名由管理员给开发者指定, 密码则由下面两部分组成:
1. 管理员分配的固定密码串;
2. 按照 google totp 生成的 6 位数字
6位数字每 30 秒变更一次, 开发者每次登录的时候都要以 “密码串+6位数” 作为密码进行登录.
以用户名 arster
为例, 管理员分配固定密码串: “i8Y%TslP”, 下面介绍如何获取 6 为的 totp 数字.
(1). 获取 totp 6位数字
登录主机后执行名 otpget 获取当前用户下的 6 位 totp 信息(每 30 秒变更一次), 如下:
[root@cz ~]$ otpget
otp message:
secret: FNENMTM3BTB42EKM
197452 (6 second(s) remaining)
上述 197452 为 6 位 totp 信息, 括号里的则表示 6s 后 dbweb 就会变更改用户的密码, 这里开发人员需要保证有充足的时间登录 dbweb, 如果很快变更密码, 获取到的 6 位 totp 则很快过期, 相应的则登录 dbweb 会提示密码错误, 这时可以继续执行 otpget 命令获取时间较充足的 6 位数:
[root@cz ~]$ otpget
otp message:
secret: FNENMTM3BTB42EKM
194011 (20 second(s) remaining)
otpget
命令为 $HOME/.bash_profile
文件中的一个函数:
otpget() {
/usr/bin/sys-google-totp --secret FNENMTM3BTB42EKM
}
sys-google-totp
详见 sys-google-totp, secret 参数为 base32 格式的字符串, 具体见 usercfg.conf
文件配置.
(2). 登录 dbweb
获取到 6 位数后, arster 用户的密码则为 i8Y%TslP194011
, 这样就可以通过浏览器登录 dbweb, 输入密码及验证码后如下所示:
登录到 dbweb 后则不再后 totp 的限制, 直到用户退出为止, 开发者都可以在 dbweb 中进行操作.
(3). 添加数据库
进入 dbweb 后, 可以点击 添加数据库
增加新的库进行连接, 一旦创建后, 开发者以后就不需要再次输入密码, 如下所示:
编码仅支持 utf8 或 utf8mb4, 其它编码请联系管理操作表更新.数据库的用户名和密码由管理员指定, 开发者不接触, 如果有新增的库请联系管理员操作.
4. 限制
(1). sql 限制
比如在 blog 库下执行 delete * from mysql_diff
操作, 提示如下错误:
执行 1drop table if exists mysql_diff`, 提示如下错误:
(2). 开发者执行时限制
sql 执行仅以分号作为分隔, 含有多个分隔的当做一个 sql 执行, 这点意味着开发者一次只能执行一条 sql, 如果执行多条则报语法错误, 比如执行下面的 sql:
selec * from mysql_diff limit 10; select * from mysql_diff limit 1;
则报以下语法错误:
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selec * from mysql_diff limit 10; select * from mysql_diff limit 1' at line 1
5. 总结
整体而言, dbweb 的限制规则较多, 从登陆到 sql 执行, 都有较多的限制, 但是目的也在于控制开发者的 sql 更新, 以及减少误操作出现的频率, 另外更新表结构是一个低频率的需求, 希望开发者可以集中到一个时间点进行更新.