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

核心功能

  1. 支持任何PostgreSQL协议的数据库
  2. 通过配置文件进行硬编码用户配置
  3. 集成OpenID Connect进行用户认证
  4. 通过ACL强制执行访问过滤
  5. 提供HTML和JSON格式的查询结果输出
  6. 查询结果的唯一链接(便于调试)
  7. 细粒度的表级权限控制
  8. 列级访问控制
  9. 连接池优化性能
  10. 查询验证和清理

完整配置示例

认证配置

"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)
}

安全考虑

  1. SQL注入防护:所有查询在执行前都会进行解析和验证
  2. 无直接数据库访问:远程数据库只能通过网关访问
  3. 列级限制:ACL可以限制用户可以查询的字段
  4. 查询类型限制:限制用户只能执行特定操作(SELECT, INSERT等)
  5. 会话安全:安全的cookie处理,可配置过期时间
  6. 错误处理:错误消息经过清理,防止信息泄露

性能优化

  1. 连接池:为每个数据库目标配置可调节的连接池大小
  2. 查询结果缓存:结果存储在本地数据库中供后续参考
  3. 高效查询执行:解析和验证以获得最佳性能

更多关于golang生产环境SQL执行与管理的安全网关插件database-gateway的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang生产环境SQL执行与管理的安全网关插件database-gateway的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang生产环境SQL执行与管理安全网关插件database-gateway

database-gateway是一个用于Golang生产环境的SQL执行与管理安全网关插件,它提供了SQL执行的安全控制、审计日志、限流熔断等功能,适合在微服务架构中对数据库访问进行统一管控。

主要功能

  1. SQL执行安全控制(防注入、高危操作拦截)
  2. 完整的SQL审计日志
  3. 连接池管理与限流
  4. 慢查询监控与告警
  5. 多数据源支持

安装与基本使用

go get github.com/database-gateway/database-gateway

基本示例

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	gateway "github.com/database-gateway/database-gateway"
)

func main() {
	// 初始化网关配置
	config := gateway.Config{
		MaxOpenConns:    10,
		MaxIdleConns:    5,
		ConnMaxLifetime: time.Hour,
		SlowQueryThreshold: 500 * time.Millisecond,
		AuditLog:       true,
	}

	// 创建MySQL数据源
	dsn := "user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true"
	mysqlDS, err := gateway.NewMySQLDataSource("mysql1", dsn, config)
	if err != nil {
		log.Fatal(err)
	}

	// 注册数据源
	gateway.RegisterDataSource(mysqlDS)

	// 获取数据库连接
	db, err := gateway.GetDB("mysql1")
	if err != nil {
		log.Fatal(err)
	}

	// 执行查询
	ctx := context.Background()
	rows, err := db.QueryContext(ctx, "SELECT id, name FROM users WHERE id = ?", 1)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	// 处理结果
	for rows.Next() {
		var id int
		var name string
		if err := rows.Scan(&id, &name); err != nil {
			log.Fatal(err)
		}
		fmt.Printf("ID: %d, Name: %s\n", id, name)
	}
}

高级功能

SQL注入防护

// 启用SQL注入防护
config := gateway.Config{
	SQLInjectionProtection: true,
}

// 危险SQL会被拦截
_, err := db.ExecContext(ctx, "DROP TABLE users")
if err != nil {
	fmt.Println("Blocked dangerous SQL:", err)
}

审计日志

// 自定义审计日志处理器
gateway.SetAuditLogger(func(ctx context.Context, entry gateway.AuditEntry) {
	fmt.Printf("[AUDIT] %s | %s | %v | %s\n", 
		entry.Timestamp.Format(time.RFC3339),
		entry.Operation,
		entry.ExecutionTime,
		entry.SQL)
})

// 所有SQL执行都会被记录

限流与熔断

config := gateway.Config{
	RateLimit: gateway.RateLimitConfig{
		RequestsPerSecond: 100, // 每秒最大请求数
		Burst:            20,   // 突发请求容量
	},
	CircuitBreaker: gateway.CircuitBreakerConfig{
		FailureThreshold: 0.5,  // 失败率阈值
		RecoveryTimeout:  30*time.Second, // 恢复时间
	},
}

生产环境最佳实践

  1. 连接池配置

    config := gateway.Config{
        MaxOpenConns:    50,      // 根据数据库负载能力设置
        MaxIdleConns:    10,      // 通常为MaxOpenConns的20%
        ConnMaxLifetime: 30*time.Minute, // 避免长时间连接
    }
    
  2. 慢查询监控

    gateway.SetSlowQueryHandler(func(ctx context.Context, query gateway.SlowQuery) {
        // 发送告警到监控系统
        metrics.Inc("slow_queries", 1)
        alert.Send(fmt.Sprintf("Slow query detected: %s (%.2fms)", 
     	   query.SQL, query.Duration.Seconds()*1000))
    })
    
  3. 多数据源管理

    // 主从分离配置
    masterDS, _ := gateway.NewMySQLDataSource("master", masterDSN, config)
    slaveDS, _ := gateway.NewMySQLDataSource("slave", slaveDSN, config)
    
    gateway.RegisterDataSource(masterDS)
    gateway.RegisterDataSource(slaveDS)
    
    // 根据读写操作选择数据源
    func GetDBForOperation(isWrite bool) (*gateway.DB, error) {
        if isWrite {
     	   return gateway.GetDB("master")
        }
        return gateway.GetDB("slave")
    }
    

性能考虑

  1. 网关层会引入约5-10%的性能开销,但提供了更好的安全性和可观测性
  2. 对于超高并发场景,可以调整连接池大小和限流参数
  3. 审计日志建议异步写入,避免影响主流程性能

database-gateway为Golang应用提供了生产级的数据库访问安全防护和管理能力,是构建可靠微服务架构的重要组件。

回到顶部