No release in over 3 years
Low commit activity in last 3 years
At work, many times, we need to connect to the server to enter the rails c query or some data. When the operator has plenty of time, the situation is relatively good; if an operator is responsible for many servers at the same time, it will waste a lot of time to help with the query; to solve this problem, I want to find a secure and convenient query console, after searching some gem, found and did not meet my expectations gem, so decided to write a related function of the console designed to provide a safe, convenient web.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Runtime

 Project Readme

WebSandboxConsole

工作中许多时候,都需要我们连到服务器进入rails c下查询或一些数据。当运维人员时间比较充足的时候,情况还相对较好;如果一个运维人员,同时负责许多台服务器,让其帮忙负责查询就会浪费很大的一部分时间;为了解决这个问题,我想找到一种即安全、又方便的查询控制台,搜索了一些gem后,发现并没有符合我预期的gem,于是决定写一个相关功能的gem,旨在提供一个安全、方便的web 控制台.

这个控制台提供一个类似沙盒的安全环境,这里做的所有数据操作,都会回滚(不会真正写入数据库);你可以配置 ip 白名单、基本认证,来增加访问安全性;另外在这个沙盒中,内置禁止了linux命令的执行,所以不用担心,ruby越界去做了linux的相关事情,当然还禁止了文件的新建、删除、目录的新建、删除等一系列方法;如果你需要更强的限制,你还可以去配置你想禁止使用的哪些方法等等,具体看配置文件。

此gem基本涵盖了日常使用的常用功能,包括:数据查询、数据修改、数据导出、日志查看、日志时间或内容过滤、文件查看,日志下载等。

Usage

使用过程相当简单,和一般的gem,安装后你不用特殊去配置任何东西,就可以正常使用。所有的配置选项都是可选的。

Installation

在 Gemfile 中添加:

gem 'web_sandbox_console'

然后执行:

$ bundle

此时,如果是在本地,你访问 http://localhost:3000/web_sandbox_console 就能看到web控制台了,下面这个样子。

PS:代码输入框支持代码高亮,你可以像在代码编辑器一样自由编写代码 Snip20200710_1.png

配置

在bundle后,就可以直接使用了,为了安全起见,建议进一步配置基本认证;如果需要数据修改权限,还需要配置公钥;关于配置选项的具体说明,请参阅配置文件注释。

在 rails 项目路径下,执行:

$ rails g web_sandbox_console

会在项目路径下,创建两个配置文件 一、config/initializers/web_sandbox_console.rb文件

# config/initializers/web_sandbox_console.rb

require 'yaml'

config_file_path = "#{Rails.root}/config/web_sandbox_console.yml"
config_hash = File.exists?(config_file_path) ? YAML.load_file(config_file_path).with_indifferent_access[:web_sandbox_console] : {}

# web_sandbox_console 配置文件 
# 以下配置 都是可选的 缺少的情况下用默认值 或者 不生效
WebSandboxConsole.setup do |config|
  # 配置 引擎挂载位置
  # config.mount_engine_route_path = '/web_sandbox_console'

  # 配置 ip 白名单
  # config.ip_whitelist = %w(192.168.23.12 192.145.2.0/24)

  # 配置 基本认证 在 config/web_sandbox_console.yml中配置
  # PS: 1. 即使config/web_sandbox_console.yml文件不存在,也不会有任何使用上的影响,效果相当于没有开启
  #     2. 下面这行不用注释掉,只要不配置yml文件就行
  config.http_basic_auth = config_hash[:http_basic_auth]

  # # 配置 黑名单 类方法
  # config.class_method_blacklist = {File: %i(delete read write),Dir: %i(new delete mkdir)}

  # # 配置 黑名单 实例方法
  # config.instance_method_blacklist = {Kernel: %i(system exec `),File: %i(chmod chown)}

  # 文件黑名单列表 (如果是目录 则目录下所有文件都不可用)目录以 / 结尾
  # 默认都是项目路径下的
  # config.view_file_blacklist = %w(config/secrets.yml vendor/)

  # 配置 文件权限,是否仅能查看log文件,默认开启
  #config.only_view_log_file = false

  # 通过非对称加密方式 升级权限,授权通过后,可获得执行数据权限(PS: 数据操作不再回滚)
  # PS:配置同 http_basic_auth
  config.public_key = config_hash[:public_key]

  # # 配置 日志路径 默认路径位于项目下
  # config.console_log_path = "log/web_sandbox_console.log"
end

二、config/web_sandbox_console.yml.example 文件

主要用于配置基本授权、升级权限需要用到的公钥,参照example文件创建yml文件即可

# config/web_sandbox_console.yml.example

web_sandbox_console:
  http_basic_auth:
    name: dmy
    password: 123456
  public_key: "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMbJOE1vQT1jFpaH1GPYzdRJN/\nLh8VePmzXs5BYOLHB0xIjArL1NlXMbCJ+AS2rv3/oHIOdHhEuZw0tmm9DhG100R8\nRjBpsEKCDI88jl9qRkFmD3CVk8XQXv6c2IkRZCYSTvgDkmnKAlORksfw+p0cR2AQ\nlAtAsNsNviKYBzXKfQIDAQAB\n-----END PUBLIC KEY-----\n"

关于配置的补充说明:

建议不要轻易配置黑名单方法,因为禁用某些方法后,可能会导致许多意想不到问题;有可能不小心禁用到rails框架或gem使用的一些方法;

对于此gem内置禁用的方法,gem内部是做了一些兼容性的处理的,因此不会有什么问题

深入了解

主要包含三大功能块:代码执行、文件查看、日志下载,下面分别介绍

代码执行

  1. 提交和异步执行

提交后代码会立即执行,及时返回执行结果

异步执行,代码会在后台异步执行,这对于执行时间非常长的代码,强烈建议异步执行;比如批量更新数据、导出数据等

  1. 升级权限 Snip20200703_1.png

大多数时候,可能用到的操作就是查数据,但是,有时你可能需要修改某条数据,那么功能就不够用了

为了支持数据的修改,同时保证安全性,加入了升级权限这个功能

整个过程相当简单,在yaml文件中配置好公钥 -> 获取token -> 本地加密后回传 -> 授权成功

授权成功后,所有数据操作将不再执行回滚(PS:未升级授权时,做的所有数据操作都会执行回滚,不会真正写入数据库)

升级权限流程如下:

  1. config/web_sandbox_console.yml`中配置公钥

  2. 进入授权页面,点击获取令牌

  3. 用私钥对令牌加密,然后用base64加密

  4. 将加密的打印结果(注意是puts 文本),输入加密密文框,提交

# 本地生成 加密密文代码
require 'openssl'
require 'base64'

private_key = "你的私钥"
p_key = OpenSSL::PKey::RSA.new private_key
secret_text = p_key.private_encrypt("你的令牌")
encode_text = Base64.encode64(secret_text)
puts encode_text

文件查看

Snip20200703_2.png

  1. 目录和文件

    你可以查看一个目录下有哪些文件夹或文件,你也可以直接查看文件的内容,默认返回一个文件的前100行

  2. 指定行数

    你可以根据文件总行数,指定查看文件的开始行数、结束行数。 PS: a. 在过滤文件(过滤内容/过滤时间)的时候,此时指定行数将被忽略 b. 对于大文件(默认超过10M),处于性能考虑,此时指定行数也会被忽略

  3. 过滤内容

    当过滤内容时,仅返回匹配的行,匹配行的上下文是不会返回的

    因此如果需要查看匹配行的上下文,需要再次根据匹配行的时间做过滤(PS:此时需清掉内容输入框)

  4. 过滤时间

    可以只填开始时间,不填结束时间,此时返回该时间的日志

  5. 权限

    默认情况,只能查看日志文件或目录,当然你也可以去配置做调整。

  6. 其它

    1. 可以根据返回内容的提示,了解当前查询(文件总行数、当前按照某种方式返回)
    2. 查询的逻辑如下:
    3. 如果只指定文件名,且文件比较小(小文件),默认返回文件前100行
    4. 如果只指定文件名,文件比较大(大文件),默认返回文件最后1000行
    5. 如果指定了文件名、过滤内容,则忽略行数查找,直接依据过滤内容匹配行,如果匹配到的行数超过1000行,则返回匹配出的前1000行
    6. 如果指定了文件名、过滤内容、过滤时间,则先按照时间匹配出内容,然后根据内容进行匹配

日志下载

Snip20200703_3.png 你可以直接输入文件名(需要带后缀)下载日志

关于数据导出

可以先在代码执行页面,用CSV.open方式生成 csv文件,然后在日志下载中去下载创建的csv文件

有一下几点需注意:

  1. CSV.open中写的任何路径,都不会生效,最终只会在log目录下创建csv文件;比如`CSV.open('#{Rails.root}/hu/bar.txt') 会在log目录下,生成bar.csv文件
  2. csv 文件下载后,会自动删除掉,因此只能下载一次

Contributing

Contribution directions go here.

License

The gem is available as open source under the terms of the MIT License.