golang生产环境SQL执行与管理的安全网关插件database-gateway的使用
Golang生产环境SQL执行与管理的安全网关插件database-gateway的使用
概述
database-gateway是一个为生产环境设计的数据库安全网关,它提供了统一的Web界面来安全、可控地访问公司数据库。该服务允许员工在production
数据库上运行查询,同时强制执行访问控制(ACL
)策略。
架构图
┌───────────────────────────┐
│ PROD ┌─────────────┐ │
│ ┌───┤ Postgres1 │ │
┌────────┐ ┌────────┐ │ └─────────────┘ │
│ USER │────│ DBGW │───┼ │
└────────┘ └────────┘ │ ┌─────────────┐ │
│ └───┤ Postgres2 │ │
│ └─────────────┘ │
└───────────────────────────┘
快速开始示例
git clone https://github.com/kazhuravlev/database-gateway.git
cd database-gateway/example
docker compose up --pull always --force-recreate -d
open 'http://127.0.0.1:8080'
# 管理员: admin@example.com 密码: password
# 普通用户: user1@example.com 密码: password
核心功能
- 支持任何PostgreSQL协议的数据库
- 通过配置文件进行硬编码用户配置
- 集成OpenID Connect进行用户认证
- 通过ACL强制执行访问过滤
- 提供HTML和JSON格式的查询结果输出
- 查询结果的唯一链接(便于调试)
- 细粒度的表级权限控制
- 列级访问控制
- 连接池优化性能
- 查询验证和清理
完整配置示例
认证配置
"users": {
"provider": "oidc",
"configuration": {
"client_id": "example-app",
"client_secret": "example-app-secret",
"issuer_url": "http://localhost:5556",
"redirect_url": "http://localhost:8080/auth/callback",
"scopes": ["email", "profile"]
}
}
访问控制配置
"acls": [
{
"user": "admin@example.com",
"op": "*",
"target": "*",
"tbl": "*",
"allow": true
},
{
"user": "user1@example.com",
"op": "select",
"target": "pg-5433",
"tbl": "*",
"allow": true
}
]
数据库连接配置
"connection": {
"host": "postgres1",
"port": 5432,
"user": "pg01",
"password": "pg01",
"db": "pg01",
"use_ssl": false,
"max_pool_size": 4
}
Golang集成示例
以下是一个简单的Golang集成示例,展示如何使用database-gateway客户端库:
package main
import (
"context"
"fmt"
"log"
"github.com/kazhuravlev/database-gateway/client"
)
func main() {
// 创建客户端实例
cfg := client.Config{
BaseURL: "http://localhost:8080",
Auth: client.AuthConfig{
Username: "admin@example.com",
Password: "password",
},
}
cli, err := client.New(cfg)
if err != nil {
log.Fatalf("无法创建客户端: %v", err)
}
// 获取可用的数据库实例
instances, err := cli.ListInstances(context.Background())
if err != nil {
log.Fatalf("获取实例列表失败: %v", err)
}
fmt.Println("可用实例:")
for _, inst := range instances {
fmt.Printf("- %s\n", inst.Name)
}
// 执行查询
query := "SELECT id, name FROM clients"
result, err := cli.ExecuteQuery(context.Background(), "local-1", query)
if err != nil {
log.Fatalf("执行查询失败: %v", err)
}
fmt.Printf("查询结果: %+v\n", result)
}
安全考虑
- SQL注入防护:所有查询在执行前都会进行解析和验证
- 无直接数据库访问:远程数据库只能通过网关访问
- 列级限制:ACL可以限制用户可以查询的字段
- 查询类型限制:限制用户只能执行特定操作(SELECT, INSERT等)
- 会话安全:安全的cookie处理,可配置过期时间
- 错误处理:错误消息经过清理,防止信息泄露
性能优化
- 连接池:为每个数据库目标配置可调节的连接池大小
- 查询结果缓存:结果存储在本地数据库中供后续参考
- 高效查询执行:解析和验证以获得最佳性能
更多关于golang生产环境SQL执行与管理的安全网关插件database-gateway的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复