使用 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

如下图: dbweb1.png

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, 输入密码及验证码后如下所示: dbweb2.png

登录到 dbweb 后则不再后 totp 的限制, 直到用户退出为止, 开发者都可以在 dbweb 中进行操作.

(3). 添加数据库

进入 dbweb 后, 可以点击 添加数据库 增加新的库进行连接, 一旦创建后, 开发者以后就不需要再次输入密码, 如下所示: dbweb3

编码仅支持 utf8 或 utf8mb4, 其它编码请联系管理操作表更新.数据库的用户名和密码由管理员指定, 开发者不接触, 如果有新增的库请联系管理员操作.

4. 限制

(1). sql 限制

比如在 blog 库下执行 delete * from mysql_diff 操作, 提示如下错误: dbweb4.png

执行 1drop table if exists mysql_diff`, 提示如下错误: dbweb5.png dbweb6.png

(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 更新, 以及减少误操作出现的频率, 另外更新表结构是一个低频率的需求, 希望开发者可以集中到一个时间点进行更新.