#privileges #role #style #manage #password #git-ops

bin+lib grant

以 GitOps 风格管理数据库角色和权限

2 个版本

0.1.0 2021 年 11 月 18 日
0.0.1-beta.32021 年 12 月 10 日
0.0.1-beta.22021 年 12 月 6 日
0.0.1-beta.1 2021 年 11 月 18 日

数据库接口 中排名第 1089

MIT 许可证

94KB
2K SLoC

grant.rs

一个开源项目,旨在以 GitOps 风格管理 Redshift 数据库角色和权限,使用 Rust 编写。

该项目仍处于开发初期,尚未准备好用于任何类型的生产使用或 alpha/beta 测试。

使用方法

从 crates.io 安装二进制文件

cargo install grant

使用 grant 工具

$ grant --help

grant 0.0.1-beta.2
Manage database roles and privileges in GitOps style

USAGE:
    grant <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    apply       Apply a configuration to a redshift by file name. Yaml format are accepted
    gen         Generate sample configuration file
    gen-pass    Generate random password
    help        Prints this message or the help of the given subcommand(s)
    inspect     Inspect current database cluster with connection info from configuration file
    validate    Validate a configuration file or a target directory that contains configuration files

生成项目结构

grant gen --target ./cluster

Creating path: "./cluster"
Generated: "./cluster/config.yml"

应用权限更改

./examples/example.yaml 的内容

connection:
  type: "postgres"
  # support environment variables, e.g. postgres://${HOSTNAME}:5432
  url: "postgres://postgres@localhost:5432/postgres"

roles:
  - name: role_database_level
    type: database
    grants:
      - CREATE
      - TEMP
    databases:
      - postgres

  - name: role_schema_level
    type: schema
    grants:
      - CREATE
    databases:
      - postgres
    schemas:
      - public
  - name: role_all_schema
    type: table
    grants:
      - SELECT
      - INSERT
      - UPDATE
    databases:
      - postgres
    schemas:
      - public
    tables:
      - ALL

users:
  - name: duyet
    password: 1234567890 # password in plaintext
    roles:
      - role_database_level
      - role_all_schema
      - role_schema_level
  - name: duyet2
    password: md58243e8f5dfb84bbd851de920e28f596f # support md5 style: grant gen-pass -u duyet2
    roles:
      - role_database_level
      - role_all_schema
      - role_schema_level

将此配置应用到集群

grant apply -f ./examples/example.yaml

[2021-12-06T14:37:03Z INFO  grant::connection] Connected to database: postgres://postgres@localhost:5432/postgres
[2021-12-06T14:37:03Z INFO  grant::apply] Summary:
    ┌────────────┬───────────────────────────┐
     User       │ Action                    │
     ---        │ ---                       │
     duyet      │ update password           │
     duyet2     │ update password           │
    └────────────┴───────────────────────────┘

[2021-12-06T14:37:03Z INFO  grant::apply] Summary:
    ┌────────┬───────────────────────────────────────────────────────────┬─────────┐
     User   │ Database Privilege                                        │ Action  │
     ---    │ ---                                                       │ ---     │
     duyet  │ privileges `role_database_level` for database: ["postgre+ │ updated │
    │ duyet2 │ privileges `role_database_level` for database: ["postgre+ │ updated │
    └────────┴───────────────────────────────────────────────────────────┴─────────┘

[2021-12-06T14:37:03Z INFO  grant::apply] Summary:
    ┌────────┬───────────────────────────────────────────────────────┬─────────┐
     User   │ Schema Privileges                                     │ Action  │
     ---    │ ---                                                   │ ---     │
     duyet  │ privileges `role_schema_level` for schema: ["public"] │ updated │
     duyet2 │ privileges `role_schema_level` for schema: ["public"] │ updated │
    └────────┴───────────────────────────────────────────────────────┴─────────┘

[2021-12-06T14:37:03Z INFO  grant::apply] Summary:
    ┌────────┬─────────────────────────────────────────────────┬─────────┐
     User   │ Table Privileges                                │ Action  │
     ---    │ ---                                             │ ---     │
     duyet  │ privileges `role_all_schema` for table: ["ALL"] │ updated │
     duyet2 │ privileges `role_all_schema` for table: ["ALL"] │ updated │
    └────────┴─────────────────────────────────────────────────┴─────────┘

生成随机密码

$ grant gen-pass

Generated password: q)ItTjN$EXlkF@Tl
$ grant gen-pass --user duyet

Generated password: o^b3aD1L$xLm%#~U
Generated MD5 (user: duyet): md58243e8f5dfb84bbd851de920e28f596f

检查当前集群

$ grant inspect -f examples/example.yaml

[2021-11-29T07:46:44Z INFO  grant::inspect] Current users in postgres://postgres@localhost:5432/postgres:
    ┌────────────┬──────────┬───────┬──────────┐
     User       │ CreateDB │ Super │ Password │
     ---        │ ---      │ ---   │ ---      │
     postgres   │ true     │ true  │ ********
     duyet      │ false    │ false │ ********
    └────────────┴──────────┴───────┴──────────┘

开发

克隆存储库

git clone https://github.com/duyet/grant.rs && cd grant.rs

测试需要 Postgres,可能需要使用 docker-compose.yaml

docker-compose up -d

确保您已连接到 postgres://postgres:postgres@localhost:5432/postgres

在 MacOS 上,最简单的方法是安装 Postgres.app

运行单元测试

cargo test

待办事项

  • 支持从环境变量读取连接信息
  • 支持在 Git 中存储加密密码
  • 支持 Postgres 和 Redshift
  • 支持更改密码
  • 可视化(谁可以看到什么?)
  • 应用显示更多关于差异更改的详细信息
  • 检查显示更多关于用户权限的详细信息

许可证

MIT

依赖项

~16–27MB
~379K SLoC