PostgreSQL 的审计和权限控制系统

【PostgreSQL 小课】日志及审计 01:日志 就像许多其他服务和数据库一样,PostgreSQL 提供了自己的日志基础设施,以便管理员可以检查守护进程正在做什么以及数据库系统的当前状态。虽然日志对于数据和数据库活动并不是必不可少的,但它们代表了关于整个系统中发生的事情的非常重要的部分,并且通过日志提供的重要线索,可以帮助管理员采取相应的动作。PostgreSQL 有一个非常灵活和可配置的日志基础设施,允许不同的日志配置、轮转、归档和后续分析。 阅读详情

背景介绍

GrowingIO 作为一家大数据公司,核心资产虽然在大数据平台上,但关系型数据库仍扮演着不可或缺的角色。它担负着存储产品逻辑,配置信息等重要数据信息。
GrowingIO 目前的数据库实例较多,例如按环境区分为开发环境,测试环境,生产环境等不同环境。按需求来说,又存在运维人员需要直接修改线上脏数据,开发人员本地访问开发环境的实例进行联调等情况。
而随着公司员工不断发展,人员的流动性会加剧,数据库权限控制会越来越复杂。
这时一个易用的数据库管理工具会减少相当大的工作量。
由于 GrowingIO 选用 PostgreSQL 作为关系型数据库,所以以下内容以 PostgreSQL 作为基础展开。

目前状况

之前 GrowingIO 是使用基于 SSH + Iptables + PostgreSQL 日志的组合架构来实现的 PostgreSQL 的管理。
这种架构只是满足了权限控制和审计的基本需求,但是实际使用中有些问题是很难解决,例如:

  • 由于权限控制和日志审计属于独立的系统,造成审计的溯源比较麻烦。

  • 权限控制比较粗粒度,只能控制能不能访问,无法做更细粒度的权限划分。

  • 无法做到 SQL 级别的限制。

  • 没有接到统一账号管理系统,账号管理繁琐。

由于以上种种原因,所以决定将该架构进行一次重构。

基于 PostgreSQL 审计和权限控制系统

前期准备

功能需求

  • 不对 PostgreSQL 数据库做变更或者侵入较小。
  • 支持 RBAC 权限控制。
  • 使用 LDAP 作为 RBAC中的角色和用户认证系统。
  • 有审计功能。
  • 有 SQL 过滤的功能。 易于使用和管理。

工具调研

由于目前市面上主要数据库使用 MySQL 居多,而 PostgreSQL 使用的较少,扩展工具方面的资料相对较少。
目前找到的可行的方案是 PostgreSQL 本身的 LDAP 功能 + pgAudit 组合来达到权限和审计功能。
该方案可实现的功能包括:

  • 基于 LDAP 的用户和角色认证。
  • 基于 pgAudit 的日志审计功能。

该方案存在的问题:

  • 需要操作 PostgreSQL 本身,对 PostgreSQL 本身有一定的侵入性。
  • 各个 PostgreSQL
  • 实例的管理还是割裂的状态。 后期功能扩展性不强。

由于该方案每个 PostgreSQL 实例的管理还是割裂的状态,当实例过多时仍会带来管理的复杂,对于不支持公网的实例仍需在 PostgreSQL 实例前端搭建一个 Proxy 程序来做流量转发的工作。
基于以上困难,决定自己开发一个 PostgreSQL 的审计和权限控制系统。

数据库审计系统设计与实现

程序架构设计

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210610091137427.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dyb3dpbmdJT18=,size_16,color_FFFFFF,t_70#pic_center)

整体架构较为简单,整个系统的核心为 Server 端和 Proxy 端。
Server 端需要实现与 PostgreSQL 客户端通过某些认证方式建立连接,并将用户发来的请求进行处理,并通过一些模块来扩展功能,例如:

  • 登录和权限通过 Auth 模块来处理,Auth 后面接入 LDAP 模块来进行用户的登录和权限认证。
  • Audit模块记录用户的请求信息,并将用户的行为格式化后输出到日志和其他系统中作为审计记录。
  • Filter 模块监测用户的请求,例如可以对 drop database 等语句禁止执行,后端可以对接其他系统进行动态控制。
  • Proxy 端则主要通过 PostgreSQL 的系统用户与 PostgreSQL 数据库建立连接,作为 Server 端和 PostgreSQL 数据库之间沟通的桥梁。

所以系统的核心为 Server 端和 Proxy 端的实现,当这两块实现后我们就可以在此上做扩展,增加不同的功能。

Server 和 Proxy 实现

这里似乎只要找到 PostgreSQL Server 和 Client 的包然后做一次封装后就差不多可以实现 Server 和 Proxy 了。
但是真正问题的是网上找了一圈没发现有实现 PostgreSQL 服务端的示例,也没找到官方的包。只在 PostgreSQL 官方文档中找到了前后端的通信协议。
最后只能自己实现 PostgreSQL 的前后端。
PostgreSQL 前后端交互的核心为通信协议和会话过程这两部分,下面主要进行这两块的讲解。

PostgreSQL 前后端通信协议

这里介绍一下我个人去了解 PostgreSQL 通信协议的方法。
首先是官方文档中关于 PostgreSQL 前后端协议。
查看 PostgreSQL 的客户端源码进行分析和 Debug,并通过 Wireshark 进行抓包。这里主要查看的客户端为 psycopg2,node-postgres,go-pg,这里发现 psycopg2 其实是封装了 libpq 这个官方库,没有更多的关于协议的细节,帮助不大。但是发现 go-pg 和 node-postgres 是自己做了客户端协议,通过源码可以明白数据包内容的提取方法和协议格式。
PostgreSQL 前后端协议格式中,我们主要介绍如下两种,这两种弄懂后,其他格式其实大同小异。
第一种比较特殊的 StartupMessage 消息格式为客户端发送的第一条正式消息。

在这里插入图片描述

第二种为普通消息类型也是 PostgreSQL 前后端交互的主要消息格式。

在这里插入图片描述

协议字段说明:
内容的长度 标记了这个数据包中消息的长度(包括自身),大部分协议格式中都有这个字段,绝大部分长度为 4 Byte,类型为 Int32 。这里需要注意的是部分协议格式中的长度不是 4 Byte。
StartupMessage 协议的版本信息 标记客户端请求使用的协议版本,其中前 16bits 为 Major Version,后 16bits 为 Minor Version。
消息类型 标记本条消息的类型,在大部分消息中为第一个字节,Char 类型,例如

  • ‘R’ 为服务端的认证消息类型。
  • ‘p’ 为客户端的认证信息。
  • ‘Q’ 为客户端的简单查询消息类型。

消息主体内容 消息类型中的主体内容。根据不同的消息类型,需要不同的解析方式,下面会主要介绍 StartupMessage 和 消息类型(‘R’) 中的主体内容格式,其他消息类型请查看官方文档。

StartupMessage 消息
为客户端发送的第一次的消息格式,用于标记客户端的一些信息。
数据类型为 String,使用 key/value 格式,使用 0 做分割符,主要字段有 user database,如下:

user\x00xiaoming\x00database\x00hello\x00application_name\x00navicat…

消息类型(’R‘)
是服务端发送到客户端的一种消息格式,用于通知客户端的认证方式。
主体消息 中前四位使用 Int32,标记认证格式,部分含义如下。

  • 0 表示认证成功。
  • 2 指定使用 Kerberos V5 认证方式。
  • 3 指定明文密码认证方式。
  • 5 指定需要 MD5加密的密码认证方式,其中主体消息的 4-7 位为加密的 SALT 值,加密过程如下。
password = 'md5' + string(md5(md5(USERNAME+PASSWORD) + string(SALT)))

PostgreSQL 前后端会话过程
通过上面的介绍,我们大致对协议格式有了一些了解,下面内容介绍一下 PostgreSQL 的会话过程,同样先放一张图,然后我们再来进行说明。

在这里插入图片描述

如图,我们可以将一个前后端会话过程概括为如下四个阶段:

  1. 建立连接
    主要为建立 TCP 网络连接请求过程,如果启用 SSL,则客户端需要发送一条包含 SSL Requests 信息的 TCP 请求。
    SSL Requests 内容为
    []byte{0, 0, 0, 8, 4, 210, 22, 47}

  2. 认证阶段
    该阶段主要为用户登录的认证阶段,主要过程如下。
    客户端发送一条包含用户名,数据库等信息 StartupMessage 的消息。
    服务端发送一条包含认证方式的 ‘R’ 格式消息。
    客户端根据认证方式发送一条包含认证信息的 ‘p’ 消息进行验证。
    服务端根据认证信息进行认证,根据认证结果进行回复,如 ‘R’ 的认证成功格式消息。

  3. 会话阶段
    认证通过后前后端开始进入会话进行 SQL 的请求操作。
    这时客户端会发送例如 ‘Q’ 和 ‘P’ 等格式消息的 SQL 请求,服务端进行应答。

  4. 结束会话
    客户端发送一条 ‘X’ 的 Close 请求后,进入 SSL/TCP 挥手阶段。

[]byte{'X', '\x00', '\x00', '\x00', '\x04'}

数据库审计系统的会话流程
通过上一节介绍的 PostgreSQL 前后端通信协议格式 和 前后端的会话过程 我们对 Server 和 Proxy 端的开发已经不存在障碍了,下面我会简单的介绍一下数据库审计系统的会话流程,同样还是先放一张图。

在这里插入图片描述

整个数据库审计系统的处理流程大体如下:

  1. PostgreSQL 客户端建立与系统的 TCP 连接。
  2. 系统通知 PostgreSQL 客户端使用 SSL 连接。
  3. PostgreSQL 客户端开始与系统建立 SSL 连接。
  4. 连接建立后,所有的客户端数据都会先经过 Parser 模块进行消息解析。
  5. 如果发现客户端没有登录,那么系统会走到认证过程进行登录认证。
  6. 认证通过后系统中的 Proxy 模块会与 PostgreSQL服务端进行连接建立,并完成认证过程。
  7. 后续客户端的请求通过 Parser 解析后会进行认证信息校验。
  8. 认证信息校验通过后,请求会进入到Filter 模块进行 SQL 的过滤。
  9. Filter 过滤后,将请求通过 Proxy 模块转发到 PostgreSQL 服务端上。
  10. 服务端返回的信息到达 Proxy 后,数据在转回 Server 模块将消息发回 PostgreSQL 客户端。
  11. 当会话达到超时或者PostgreSQL 客户端发起关闭请求等状态,则进入到关闭会话阶段。
  12. 最后关闭会话,关闭 TCP/SSL 会话。

通过上面的介绍,我们可以知道数据库审计系统的核心还是在于 PostgreSQL 的前后端协议和会话过程,其他功能相对比较简单,所以对于系统更多的细节介绍这里不在展开。

总结

目前该系统已经稳定运行了一年多的时间,通过这段时间的使用可以确认该系统达到了当初的设计目标,完全满足了目前的使用场景,并且大大减轻了日常中关于数据库管理的相关工作,并且由于没有对 PostgreSQL 数据库做任何方面的改动,从而没有对线上的业务产生任何影响。

参考

https://www.postgresql.org/docs/current/protocol-message-formats.html

https://github.com/go-pg/pg

https://github.com/psycopg/psycopg2

https://github.com/brianc/node-postgres

在这里插入图片描述

作者:邢建辉

GrowingIO 运维开发工程师,主要负责平台化,自动化方向的设计与开发。

招聘信息

GrowingIO技术团队是一个活力四射、对技术充满激情的团队,多个岗位持续招聘中!诚招前端工程师/大数据工程师/Java工程师等
,欢迎有兴趣的同学投递简历至:jianli@growingio.com(邮件标题请注明具体岗位名称)
,更多职位及信息可进入招聘官网查看

关于 GrowingIO

GrowingIO 是国内领先的一站式数据增长引擎整体方案服务商,创立于2015年,以数据智能分析能力为核心,通过构建客户数据平台,打造增长营销闭环,帮助企业提升数据驱动能力,赋能商业决策、实现业务增长。

PostgreSQL权限管理实战:如何用Schema隔离不同团队的数据访问? 本文深入探讨了PostgreSQL在企业级环境中的权限管理实战,重点介绍了如何利用Schema机制实现不同团队间的数据访问隔离。文章详细解析了PostgreSQL的四层权限架构,并提供了基于角色的权限管理(RBAC)模式、多团队协作的Schema隔离模式等企业级设计模板,旨在帮助构建安全、灵活且符合最小权限原则的数据库权限体系。 阅读详情

相关推荐

从二进制部署深入理解HashiCorp Vault:PostgreSQL后端与生产级配置实战

在现代云原生架构中,密钥与敏感数据管理是保障基础设施安全的核心环节。其基本原理在于将加密能力与数据存储分离,通过集中化的服务提供统一的密钥生命周期管理、动态凭据颁发和访问策略控制。这项技术的核心价值在于实现最小权限原则和可审计性,从根本上降低敏感信息泄露风险。典型的应用场景包括数据库凭据动态管理、API密钥集中存储、TLS证书自动化颁发以及加密即服务等。本文聚焦于HashiCorp Vault这一行业标准工具,通过**二进制部署**方式,结合**PostgreSQL存储后端**的实战配置,深入解析其服务模型

weixin_34095889的博客 396

pgsql开启数据库审计

pgsql开启数据库审计

qq_44605317的博客 3733

PostgreSQL:十三. PostgreSQL的用户管理

十三. PostgreSQL的用户管理 13.1 组角色管理 【例13.1】创建一个名称为post2的角色,SQL代码如下: CREATE ROLE post2; 【例13.2】查看系统中的角色,SQL代码如下: SELECT rolname FROM pg_roles; 【例13.3】修改角色post1的名称为post3。SQL语句如下: ALTER ROLE post1 RENAME TO post3; 【例13.4】删除角色post3。SQL语句如下: DROP ROLE post3; 13.

数据知道的博客 3万+

PostgreSQL 的审计日志

log_disconnections:记录每个断开与数据库的客户端的信息。这将使用 CSV 格式记录审计日志,并在每行日志信息前添加时间戳、用户 ID、数据库名称和进程 ID。其中,逗号分隔的字段依次为时间戳、用户名、数据库名、进程 ID、主机名、会话 ID、命令标识符、日志级别和日志消息。在 PostgreSQL 中,还有许多其他的选项可供配置,以记录更详细的审计日志信息。log_line_prefix:设置每行日志信息的前缀,可以包括时间戳、用户名、数据库名等信息。

一天不看代码浑身难受 7594

Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程

如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。

jackerjin123的博客 1799

Zemax:初学者的混合模式

光线以序列模式开始,然后接近非序列组件的入口端口。到达入口端口后,光线以非序列模式传播,然后接近出口端口。光线离开出口端口后,我们又回到序列模式。在此博客中,使用混合模式的示例将演示根据您自己的需要复制此工作流程所需的基本设置,以及一些有用的技巧。非序列组件表面类型必须在序列模式和非序列模式下定义。为了定义非序列组件的几何形状,请转到设置->编辑器->非序列,单击非序列编辑器。一旦我们进入非序列组件编辑器:表面 2 上的组件组,找到一个对象类型并进行定义。它能让您兼具序列模式的精确性和非序列模式的灵活性。

jkh920184196的博客 1340

如何在PostgreSQL中进行数据库审计,记录用户对数据库的操作行为?

通过使用pgAudit扩展或PostgreSQL的内置日志记录功能,您可以有效地在PostgreSQL中进行数据库审计,并记录用户对数据库的操作行为。根据您的具体需求和安全策略,选择适合的解决方案并进行配置。这些解决方案将帮助您更好地理解和监控数据库的使用情况,确保数据的安全性和完整性。相关阅读推荐PostgreSQL入门到精通.PDF 领取Postgres专栏推荐如何在PostgreSQL中备份和恢复整个数据库,包括相关的用户和权限设置。

发现生活,分享智慧,一起成长! 1868

WorkBuddy任务对话上下文管理:Token、compact与上下文窗口实战指南

在大语言模型应用中,Token作为文本处理的最小单位,直接决定上下文窗口的消耗速度,而上下文窗口则限定了单次对话可承载的信息总量。当对话超出窗口限制时,compact压缩机制会触发有损摘要,导致关键约束丢失或工具调用结果被稀释。合理管理上下文不仅能提升多步骤任务的稳定性,还能显著降低Token成本与响应延迟。在文档处理、代码开发、多步自动化等场景中,通过主动压缩、状态外置、分段喂入等策略,可有效避免任务后期遗忘、版本混乱等问题。本文围绕WorkBuddy的上下文管理机制,从Token与compact的底层原

weixin_29055699的博客 391

Supa_Audit:一款优秀的PostgreSQL表数据审计开源项目

Supa_Audit 是一个基于 PostgreSQL 的通用表数据审计解决方案,由 Supabase 团队开发并维护。该项目主要使用 PLpgSQL 编程语言,同时包含了 Nix 和 Makefile 等辅助性语言。 ## 项目核心功能 Supa_Audit 的核心功能是跟踪并记录 PostgreSQL 表中数据的变更历史,包括插入、更新和删除操作。以下是项目的主要特点: - **自动记录

gitblog_00210的博客 437

三菱FX5U PLC与CCLINK模块通信配置全流程(附接线图与参数详解)

本文详细解析了三菱FX5U PLC与CCLINK模块的通信配置全流程,包括硬件接线规范、参数设置及软件编程方法。通过实战指南帮助工程师快速掌握FX5U与CCLINK模块的高效通信技术,提升工业自动化控制系统的稳定性和可靠性。

weixin_27014595的博客 430

绕过ROS2!在RDK X5上直接用Python调用海康相机C++ SDK的避坑指南

本文详细介绍了在RDK X5上绕过ROS2,直接使用Python调用海康相机C++ SDK的轻量化方案。通过Cython构建Python绑定,提取海康相机SDK核心组件,实现高效图像采集。文章涵盖环境准备、Cython接口设计、编译系统配置及性能优化技巧,特别适合ARM64平台开发者。

weixin_33712987的博客 249

AgentGit:面向企业级AI协作的会话版本控制系统

在AI工程化落地过程中,'Agent会话管理'正成为继模型、工具、记忆之后的关键技术栈。其核心原理是将AI交互过程建模为可版本化、可分支、可审计的结构化单元,借鉴软件工程中Git的协作范式,解决多角色协同下AI行为不可追溯、不可复用、不可治理的痛点。该技术显著提升AI系统的可靠性与合规性,广泛应用于跨部门合同审查、知识协同、自动化运营等需强审计与高可信的场景。AgentGit正是这一理念的代表性开源实现,它不替代LangChain或AutoGen,而是为其提供会话层基础设施。

weixin_30694389的博客 301

微信小程序 - 最新详细实现模板消息订阅通知功能,给用户微信发送“服务通知“模板消息并点击进入跳转到小程序页面路由,订阅消息通知详细后台申请流程及示例代码,解决授权申请弹框被拒绝后无法调起、常见报错!

微信小程序,vue2,vue3,模板消息,订阅通知,服务通知,小程序模板通知,订阅微信模板消息功能,唤起模板消息订阅弹框并发送服务通知,消息订阅与模板消息发送,一次性订阅,长期永久订阅,申请模板id,详细示例代码教程,配置流程,消息模板,模板ID,用户收不到消息,订阅了通知但微信不来服务通知,报错,小程序平台模板消息订阅功能,唤起订阅模板消息弹框,订阅模板消息发送服务通知功能,如何做模板消息订阅,一直收不到通知,用户通过弹窗订阅,订阅消息,无法打开申请授权弹框,用户拒绝/关闭后,如何引导用户再开启,拒绝后怎

🏆 前端领域优质创作者 5329

PostgreSQL数据库权限精细化控制:如何为特定用户分配专属数据库访问权限

本文详细讲解了如何在PostgreSQL中实现数据库权限的精细化控制,重点介绍了为特定用户分配专属数据库访问权限的完整流程。内容涵盖从创建用户、设置安全属性,到授予数据库连接、模式使用及表级操作权限,并深入探讨了默认权限设置、列级权限控制等高级技巧,旨在帮助管理员构建安全、合规的数据访问体系。

postgres8guard的博客 1048

华为OD机试真题 新系统【优化充电桩调度算法】

华为OD机试 新系统真题【优化充电桩调度算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【优化充电桩调度算法】

qq_45776114的博客 753

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 448

PostgreSQL权限管理与RBAC实战指南

数据库权限管理是保障数据安全的核心机制,其本质是通过访问控制模型限制用户操作范围。PostgreSQL采用基于角色的访问控制(RBAC)体系,通过角色继承、对象权限和行级安全策略(RLS)实现精细化管控。相比简单的用户-权限绑定,RBAC模型更适应企业级权限分层需求,特别是在多团队协作场景下。PostgreSQL 16增强了列级权限控制和WITH CHECK约束,配合模式(Schema)隔离机制,可构建从数据库实例到表字段的多级防御体系。实际部署时需遵循最小权限原则,结合连接限制、密码策略等安全配置,并利用

weixin_33806859的博客 187

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

PostgreSQL数据库权限管理与RBAC实战指南

数据库权限管理是保障数据安全的核心机制,其本质是通过访问控制策略限制用户操作范围。基于角色的访问控制(RBAC)作为主流实现方案,通过角色继承和权限分离实现精细化管控。PostgreSQL的RBAC模型支持列级权限控制和安全屏障函数,特别适合金融、医疗等敏感场景。在工程实践中,合理的角色体系设计能有效防止越权访问,结合GRANT/REVOKE语句和行级安全策略(RLS),可实现动态权限分配。通过权限审计脚本和pg_auth_members系统表,可快速定位权限问题。掌握这些技术对构建符合GDPR等合规要求的

weixin_31364787的博客 240

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Phi-3 Forest Lab完整教程:添加用户权限控制与审计日志功能模块

本文介绍了如何在星图GPU平台上自动化部署🌿 Phi-3 Forest Laboratory | 森林晨曦实验室镜像,并为其添加用户权限控制与审计日志功能模块。通过该平台,用户可快速构建安全可控的AI对话系统,适用于企业级团队协作场景,有效管理用户访问权限并记录操作日志,保障数据安全与合规性。

weixin_35995661的博客 547

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PostgreSQL数据库只读权限配置实战指南

数据库权限管理是保障数据安全的核心机制,PostgreSQL通过GRANT/REVOKE体系实现细粒度的访问控制。其三层权限模型(数据库-模式-对象)支持精确到表列的权限分配,特别适合需要严格数据隔离的企业级应用。在实际工程中,为数据分析、报表系统等场景配置只读账号是典型需求,涉及连接权限、模式访问、表查询等多层授权。通过ALTER DEFAULT PRIVILEGES设置可确保新建对象自动继承权限,结合角色管理和视图控制能有效提升运维效率。本文以DSS_NIS数据库为例,详解从基础连接到业务模式授权的完整

weixin_33508411的博客 191

数据库安全与权限管理

本文摘要: 《数据库安全与权限管理实战指南》系统介绍了数据库安全的核心维度(CIA三元组),深入解析了主流数据库认证机制和权限模型(DAC/MAC/RBAC/ABAC)。重点探讨了MySQL和PostgreSQL的权限层级体系,提出最小权限原则为权限管理的黄金标准。文章包含Python实战代码,演示如何通过自动化工具管理MySQL用户权限,实现用户创建、权限授予/撤销等功能。通过理论结合实践的方式,为开发者提供了一套完整的数据库安全防护方案,帮助构建合规且高效的数据访问控制体系。(149字)

闲人编程的博客 1773

PostgreSQL权限管理实战:从零配置多用户开发环境(Ubuntu版)

本文详细介绍了在Ubuntu系统上配置PostgreSQL多用户开发环境的实战指南,涵盖从安装、安全加固到细粒度权限管理的全过程。通过角色体系设计、表级权限控制和行级安全策略等高级技巧,帮助团队构建安全高效的数据库协作环境,特别适合开发、测试和运维人员参考。

weixin_30897233的博客 495

数据安全-数据库统一权限管理和访问控制系统DBKEEPER

摘要:DBKEEPER提供一站式数据库安全解决方案,支持多种数据库类型,主要功能包括:1)精细化权限管控,实现RBAC模型和动态审批;2)敏感数据识别与动态脱敏;3)高危操作拦截与完整审计日志;4)可视化统一管理平台。适用于金融、医疗等行业,帮助防范数据泄露、满足合规要求。相比传统方案,具有一体化管理、灵活扩展等优势,有效降低数据安全风险。(149字)

datasecurity的博客 313

Linux运维安全:基于sudo与Ansible的智能权限管理与审计实践

在Linux系统管理中,权限控制是保障安全与效率的核心基础。传统的root密码共享模式存在权限滥用、操作无痕等风险。sudo机制通过精细化授权和自身密码验证,实现了权限收束与最小权限原则,从原理上解决了密码泄露问题。结合配置代码化(如Ansible)与集中化日志(如ELK Stack或Loki),可以构建一套可审计、自动化的运维体系。这种实践将系统配置视为代码进行版本管理,并通过自动化工具确保环境一致性,极大提升了运维安全性与效率。本文介绍的smartroot方案,正是围绕sudo构建权限网关,集成Ansi

chikuai9995的博客 521

别再硬编码密码了!PostgreSQL dblink安全连接的最佳实践

本文详细介绍了PostgreSQL dblink安全连接的最佳实践,帮助开发者避免硬编码密码的风险。通过视图封装、外部凭据存储、SSL加密等多种安全措施,确保数据库连接的安全性,特别适用于金融、电商等高安全要求的行业。

g5h6i7j的博客 609

phpPgAdmin深度解析:支持多版本PostgreSQL的核心技术实现

phpPgAdmin作为一款基于Web的PostgreSQL数据库管理工具,为新手和普通用户提供了简单直观的数据库操作界面。这款工具的核心价值在于其**多版本PostgreSQL支持能力**,能够无缝兼容从PostgreSQL 7.0到最新版本的数据库系统。无论您是数据库管理员还是开发人员,phpPgAdmin都能显著提升您的工作效率。 ## 🚀 phpPgAdmin的核心架构设计 phpP

gitblog_00122的博客 741
上一篇: GrowingIO Design 组件库搭建之组件开发
下一篇: GrowingIO 增长平台产研项目管理实践
GrowingIO_
博客等级 码龄8年 56粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值