使用 dbweb 修改数据库表结构

By | 2017/07/14

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.png

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

4. 限制

(1). sql 限制

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

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

2 thoughts on “使用 dbweb 修改数据库表结构

  1. cfeng2007

    我按照了你净化SQL版本的dbweb,现在有两个问题:
    1、admin/admin仍可以登录系统
    2、使用usercfg.conf中定义的用户+otpget密码登录报用户名和密码出错,一直登录不上不。
    totp message:
    secret: FNENMTM3BTB42EKM
    116022 (1 second(s) remaining)
    [cfeng2007@gmail.com]
    name = cfeng2007
    pass = Pass2016
    secret = FNENMTM3BTB42EKM
    db = all

    请问是否哪里配置有问题?

    Reply
    1. admin Post author

      最新的可以关注 github 上的 dbwebv2 分支.

      admin 用户在 master 分支就已经去掉了, 我在本地测试并不能登录.

      运行 otpget 命令所在的主机需要和 dbweb 所在主机的时间都一致, 可以用 ntp 同步下, 另外你上面运行的输出 1 seconds remaining 只剩下1s就会变更, 等你在 web 登录界面重新输入的话口令已经变了, 可以重新执行 otpget 确保你有足够的时间输入密码, 默认 30s 变更一次, 另外登录的密码是 pass + 6位数字.

      Reply

Leave a Reply to cfeng2007 Cancel reply

Your email address will not be published. Required fields are marked *