使用Python和Pandas实现的Amazon Redshift权限检查与SQL生成用于IT审计

import pandas as pd
import psycopg2
from psycopg2 import sql# 连接Redshift
conn = psycopg2.connect(host='your-cluster.endpoint.redshift.amazonaws.com',port=5439,dbname='dev',user='admin',password='your-password'
)# 权限检查函数
def check_redshift_permissions(conn):"""获取所有权限信息"""permissions = {'table_level': [],'column_level': [],'row_level': [],'data_masking': []}with conn.cursor() as cur:# 获取表级权限cur.execute("""SELECT grantee, table_schema, table_name, privilege_type FROM information_schema.table_privilegesWHERE grantee != 'PUBLIC'""")permissions['table_level'] = cur.fetchall()# 获取列级权限cur.execute("""SELECT grantee, table_schema, table_name, column_name, privilege_type FROM information_schema.column_privileges""")permissions['column_level'] = cur.fetchall()# 获取行级权限(基于视图定义)cur.execute("""SELECT viewname, definition FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema')""")for view in cur.fetchall():if ' WHERE ' in view[1].upper():permissions['row_level'].append((view[0],view[1].split('WHERE')[1].strip()))# 获取数据掩码函数cur.execute("""SELECT proname, prosrc FROM pg_proc WHERE proname LIKE 'mask%' OR proname LIKE 'dynamic_mask%'""")permissions['data_masking'] = cur.fetchall()return permissions# 获取权限数据
permissions = check_redshift_permissions(conn)# 构建自然语言描述
permission_desc = []# 表级权限处理
table_df = pd.DataFrame(permissions['table_level'], columns=['角色', 'schema', '表名', '权限类型'])
for _, row in table_df.iterrows():desc = f"角色 {row['角色']} 在表 {row['schema']}.{row['表名']} 上拥有 {row['权限类型']} 权限"sql_stmt = f"GRANT {row['权限类型']} ON {row['schema']}.{row['表名']} TO {row['角色']};"permission_desc.append(('表级权限', desc, sql_stmt))# 列级权限处理
column_df = pd.DataFrame(permissions['column_level'],columns=['角色', 'schema', '表名', '列名', '权限类型'])
for _, row in column_df.iterrows():desc = f"角色 {row['角色']} 在表 {row['schema']}.{row['表名']}{row['列名']} 列上拥有 {row['权限类型']} 权限"sql_stmt = f"GRANT {row['权限类型']}({row['列名']}) ON {row['schema']}.{row['表名']} TO {row['角色']};"permission_desc.append(('列级权限', desc, sql_stmt))# 行级权限处理
for view, condition in permissions['row_level']:desc = f"视图 {view} 实施了行级过滤,条件: {condition.split('/*')[0].strip()}"sql_stmt = f"CREATE VIEW {view} AS SELECT ... WHERE {condition};"  # 需要根据实际视图定义补充permission_desc.append(('行级权限', desc, sql_stmt))# 数据掩码处理
for func_name, func_def in permissions['data_masking']:desc = f"数据掩码函数 {func_name} 实现规则: {func_def[:100]}..."sql_stmt = f"CREATE FUNCTION {func_name} ... \n{func_def};"permission_desc.append(('数据掩码', desc, sql_stmt))# 打印结果
df = pd.DataFrame(permission_desc, columns=['权限类型', '描述', 'SQL示例'])
print("权限描述:")
print(df[['权限类型', '描述']].to_markdown(index=False))print("\n对应SQL语句示例:")
print(df[['权限类型', 'SQL示例']].to_markdown(index=False))conn.close()

输出结果说明:

权限描述示例:
权限类型描述
表级权限角色 sales_dept 在表 sales_data.orders 上拥有 SELECT 权限
列级权限角色 hr_dept 在表 hr.employees 的 salary 列上拥有 SELECT 权限
行级权限视图 sales_apac_view 实施了行级过滤,条件: region = ‘APAC’
数据掩码数据掩码函数 mask_ssn 实现规则: CASE WHEN …
对应SQL语句示例:
权限类型SQL示例
表级权限GRANT SELECT ON sales_data.orders TO sales_dept;
列级权限GRANT SELECT(salary) ON hr.employees TO hr_dept;
行级权限CREATE VIEW sales_apac_view AS SELECT … WHERE region = ‘APAC’;
数据掩码CREATE FUNCTION mask_ssn …

完整权限控制SQL生成模板:

-- 角色体系
CREATE ROLE sales_dept;
CREATE ROLE hr_dept;-- 表级权限
GRANT SELECT ON TABLE sales_data.* TO sales_dept;
GRANT USAGE ON SCHEMA hr TO hr_dept;-- 列级权限
CREATE VIEW hr_limited_view AS
SELECT employee_id, name, department, CASE WHEN CURRENT_USER = 'hr_director' THEN salary ELSE NULL END AS salary
FROM employees;GRANT SELECT ON hr_limited_view TO hr_dept;-- 行级权限
CREATE VIEW sales_region_view AS
SELECT * FROM orders
WHERE region = CURRENT_SCHEMA();-- 动态数据掩码
CREATE FUNCTION mask_email(email varchar) RETURNS varchar AS $$
BEGINRETURN regexp_replace(email, '(.)(.*)@', '\1***@');
END;
$$ LANGUAGE plpgsql;CREATE VIEW customer_masked_view AS
SELECT customer_id,mask_email(email) AS email,LEFT(phone, 3) || '****' AS phone
FROM customers;-- 权限组合
GRANT sales_dept TO user1;
GRANT hr_dept TO user2;

各权限类型说明:

  1. 表级权限

    • 控制对整张表的访问
    • 典型操作:SELECT/INSERT/UPDATE/DELETE
    • 最佳实践:通过角色授权,避免直接授予用户
  2. 列级权限

    • 通过创建受限视图实现
    • 使用CASE语句动态控制列可见性
    • 配合列加密保护敏感数据
  3. 行级权限

    • 使用视图WHERE子句过滤数据
    • 动态条件:CURRENT_USER/SESSION变量
    • 可结合安全策略(Security Policy)
  4. 数据掩码

    • 使用自定义函数实现动态脱敏
    • 支持条件掩码(根据用户角色不同显示不同数据)
    • 常用方法:正则替换、数值模糊、部分隐藏

权限管理建议:

  1. 使用三层角色体系:

    -- 组织级角色
    CREATE ROLE org_analyst;
    -- 部门角色
    CREATE ROLE dept_finance;
    -- 功能角色
    CREATE ROLE sensitive_data_access;GRANT sensitive_data_access TO dept_finance;
    GRANT dept_finance TO org_analyst;
    
  2. 定期审计脚本:

    -- 检查权限分布
    SELECT * FROM svv_user_grants;
    -- 查看列权限
    SELECT * FROM svv_column_privileges;
    -- 审计数据访问
    SELECT * FROM svl_userlog;
    
  3. 自动化清理:

    # 自动撤销过期权限示例
    def revoke_expired_permissions():expired_users = query_db("SELECT user_name FROM expired_users")for user in expired_users:execute_sql(f"REVOKE ALL PRIVILEGES ON ALL TABLES FROM {user}")
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cribl 数据脱敏 更多方法 MASK (三)

我做过好几个cribl 数据脱敏的实验: Cribl 脱敏mask-CSDN博客

Android Studio下载安装教程

## 什么是Android Studio Android Studio是Google官方推出的Android应用开发集成环境(IDE),基于IntelliJ IDEA开发,专门用于Android应用开发。它包含了代码编辑器、可视化布局编辑器、应用性能分析工具、模拟器等功能,为开发者提供了一站式的…

如何测试登录模块?全面测试思路解析

思路如下: 面试官问"如何测试一个登录模块?"时,考察的是你的测试思维是否全面,能否覆盖功能、安全、性能、兼容性等多个维度。下面我会从不同角度详细展开,确保回答既系统又深入。 1. 功能测试(Functional Testing) 1.1 正常流程测试 ✅ 正确的用户名+密码:…

MySQL基础篇 | 数据库概述及在TencentOS中安装MySQL8.0.42版本

MySQL基础篇 | 在TencentOS中安装MySQL8.0.42版本 1. 数据库概述2. 部署前准备工作2.1. 安装依赖包2.2. GCC版本升级3. MySQL服务部署3.1. 编译部署MySQL3.2. 初始化数据库3.3. 启动数据库4. 数据库配置4.1 配置环境变量4.2. 首次登录设置1. 数据库概述 SQL Server:SQL Server…

Angular教程前言:历史、安装与用途

Angular 是一个强大且流行的开源前端 Web 应用程序框架,由 Google 开发并维护 1。它在现代 Web 开发中占据着重要的地位,尤其在构建动态、高效且可扩展的 Web 应用程序方面表现出色,特别适用于单页应用程序 (SPA) 和复杂的用户界面 1。本教程…

systemd和OpenSSH

1 systemd 1.1 配置文件 /etc/systemd/system /lib/systemd/system /run/systemd/system /usr/lib/systemd/user 1.2 commands systemctl list-unit-files | grep enable systemctl cat dlt-daemon.service systemctl cat dlt-system.service systemctl show dlt-daemon.ser…

如何实现一个可视化的文字编辑器(C语言版)?

一、软件安装 Visual Studio 2022 Visual Studio 2022 是微软提供的强大集成开发环境(IDE),广泛用于C/C、C#、Python等多种编程语言的开发。它提供了许多强大的工具,帮助开发者编写、调试和优化代码。 1.下载 Visual Studio 202…

ArrayList的特点及应用场景

ArrayList的特点及应用场景 一、ArrayList核心特点 基于动态数组实现 底层使用Object[]数组存储元素 默认初始容量为10 扩容机制:每次扩容为原来的1.5倍(int newCapacity oldCapacity (oldCapacity >> 1)) 快速随机访问 实现了R…

深挖Java基础之:变量与类型

今天我要介绍的是在Java中对变量和类型的一些相关知识点的介绍,包括对基本数据类型,引用类型,变量命名规则和类型转换以及其注意事项的解明。 java变量与类型:Java 是静态类型语言,变量必须先声明类型后使用。变量是存…

数据结构与算法学习笔记(Acwing提高课)----动态规划·背包模型(一)

数据结构与算法学习笔记----动态规划背包模型(一) author: 明月清了个风 first publish time: 2025.5.1 ps⭐️背包模型是动态规划中的重要模型,基础课中已对背包模型的几种模版题有了讲解,[链接在这](数据结构与算法学习笔记----背包问题_有 n 件物品…

Java关键字解析

Java关键字是编程语言中具有特殊含义的保留字,不能用作标识符(如变量名、类名等)。Java共有50多个关键字(不同版本略有差异),下面我将分类详细介绍这些关键字及其使用方式。 一、数据类型相关关键字 1. 基…

vue自定义表头内容excel表格导出

1、安装 npm install xlsx file-saver 2、使用 import * as XLSX from xlsx import { saveAs } from file-saverconst exportAccounts (data) > {// 将对象数组转换为 worksheetconst worksheet XLSX.utils.json_to_sheet(data)// 创建 workbook 并附加 sheetconst wor…

鸿蒙NEXT开发组件截图和窗口截图工具类SnapshotUtil(ArkTs)

import { image } from kit.ImageKit; import { componentSnapshot, window } from kit.ArkUI; import { AppUtil } from ./AppUtil; import { ArrayUtil } from ./ArrayUtil;/*** 组件截图和窗口截图工具类* author 鸿蒙布道师* since 2025/04/28*/ export class SnapshotUtil…

C#与SVN的深度集成:实现版本控制自动化管理​

目录 1. 环境准备 2. 创建 C# 工程 3. 引用 SharpSvn 库 4. 编写代码 1. 环境准备 2. 创建 C# 工程 3. 引用 SharpSvn 库 4. 编写代码 5. 代码说明 6. 注意事项 1. 环境准备 首先,需要安装 SharpSvn 库。可以从 SharpSvn 官方网站 下载适合 .NET Framewor…

本文不定期更新,用于收录各种怪异的python脚本

1.计算自然数对数底 a b 1 for n in range(1, 1001):a a * n 1b b * n t a % br . for i in range(1, 1001):t 10if t < b:r 0else:r str(t // b)t % bprint(str(a//b) r) 得到 2.7182818284590452353602874713526624977572470936999595749669676277240766303…

日志之ClickHouse部署及替换ELK中的Elasticsearch

文章目录 1 ELK替换1.1 Elasticsearch vs ClickHouse1.2 环境部署1.2.1 zookeeper 集群部署1.2.2 Kafka 集群部署1.2.3 FileBeat 部署1.2.4 clickhouse 部署1.2.4.1 准备步骤1.2.4.2 添加官方存储库1.2.4.3 部署&启动&连接1.2.4.5 基本配置服务1.2.4.6 测试创建数据库和…

2025年大一ACM训练-搜索

2025年大一ACM训练-搜索 前期知识&#xff1a;DFS&#xff0c;本文搜索题解法以深度优先搜索为主 1.1 DFS 的定义 深度优先搜索&#xff08;Depth-First Search&#xff09;是一种用于遍历树或图的算法。核心思想是尽可能“深入”访问图的每个节点&#xff0c;直到无法继续前进…

Nginx核心功能02

目录 一&#xff0c;正向代理 1&#xff0c;编译安装Nginx &#xff08;1&#xff09;安装支持软件 &#xff08;2&#xff09;创建运行用户&#xff0c;组和日志目录 &#xff08;3&#xff09;编译安装Nginx &#xff08;4&#xff09;添加Nginx系统服务 2&#xff0c…

rk3568安全启动功能实践

本文主要讲述笔者在rk3568芯片上开发安全启动功能实践的流程。其中主要参考瑞芯微官方文档《Rockchip_Developer_Guide_Secure_Boot_for_UBoot_Next_Dev_CN.pdf》。文档中描述逻辑不是很清晰而且和当前瑞芯微的sdk中安全启动的流程匹配度不高。本文就不再对瑞芯微官方文档的内容…

[操作系统] 线程互斥

文章目录 背景概念线程互斥的引出互斥量锁的操作初始化 (Initialization)静态初始化动态初始化 加锁 (Locking)阻塞式加锁非阻塞式加锁 (尝试加锁/一般不考虑) 解锁 (Unlocking)销毁 (Destruction)设置属性 (Setting Attributes - 通过 pthread_mutex_init) 锁本身的保护互斥锁…