传统安全 3 网络安全

网络欺骗 - 50% 概述:局域网内,结合数据传播特点,伪造数据,欺骗机器网卡 模型: 主机:维护ARP缓存,内容为 [IP:MAC] 协议:ARP:Address Resolution Protol:根据IP获取MAC 主机网卡: 网卡工作模式: 混杂:接收所有数据 广播:接收dest_addr为广播地址的数据 多播:接收dest_addr为多播地址的数据 单播:接收dest_addr为本机地址的数据 链路层:需要MAC地址 交换机 分类:二层、三层、四层交换机 二层交换机:根据MAC,找到端口,发送数据,维护MAC缓存,内容为 [MAC:端口] 示意图 帧[mac][ip] 帧[mac][ip] [主机1] -----------> [交换机] -------------> [主机2] | IP | MAC | | 端口 | MAC | | IP | MAC | | 端口 | MAC | 攻击方式: 1 攻击机:发送大量 虚假MAC 的帧,占满交换机缓存,让交换机广播数据 2 攻击机:发送虚假的ARP:欺骗局域网内的主机 3 受害机:把数据发到错误的地方,比如攻击机 解决: 预防:主机静态ARP表、进制ARP 检测:看某台主机的ARP缓存,判断是否有主机发送大量ARP包 检测:看无通信主机的ARP缓存,检测是否缓存了ARP包 信息收集 - ok 概述:在进行攻击之前,收集受害者的信息 攻击方式: 主机状态 ICMP Echo攻击:发送ICMP Echo包,如果回复,则主机开启 Non-Echo ICMP:发送其他类型的ICMP包,如果回复,则主机开启 IP异常包头:发送异常IP包(无效字段、错误分片、静止分片),判断主机返回信息 TCP扫描 UDP扫描 操作系统版本 被动栈指纹识别:嗅探,收集网络中数据包,判断IP的TTL、TOS、DF和TCP 的Windows-size等特征 主动栈指纹识别:TCP三次握手,ACK序号相等还是加一 TCP ISN取样:向目标主机多次握手,多次取样返回的ISN ICMP包错误信息发送速率:向目标主机连续发送大量icmp错误包 ICP消息引用:向目标主机发送ICMP错误包,判断返回的错误引用长度 端口 TCP 连接(开放):tcp三次握手后,tcp反向ident协议可查看:对方进程pid和角色 TCP SYN(半开放):发送tcp syn包,端口关闭:返回rst,开启:返回syn+ack TCP FIN(隐蔽):发送fin包,关闭:返回rst,开启:无返回 TCP Xmax(隐蔽):发送fin、urg、push标记的包,关闭:返回rst,开启:返回 TCP NULL (隐蔽):发送关闭无标记包 FTP PROXY (隐藏):请求ftp服务向目标主机建立连接 UDP:发送UDP包,关闭:ICMP port unreachable,开启:无返回 软件版本 漏洞 操作系统漏洞:基于漏洞库,扫描CGI漏洞、POP3漏洞、FTP漏洞、SSH漏洞等 拒绝服务 - ok 概述:合法用户无法访问服务 ...

January 21, 2025 · 2 min · 220 words · Me

PostgreSQL 1-4 存储模块

摘要 本博客以循序渐进的方式,依次简要介绍PostgreSQL存储模块的各个子模块的基础功能,提及内容适合数据库内核初学者。本博客旨在介绍核心原理,以便于理解为首,部分内容可能不会100%准确与具体,针对每个提及的子模块,之后会分别单独写博客详细介绍 目录 摘要 目录 1 概述 1.1 PostgreSQL的使用流程 1.2 PostgreSQL的基础架构 1.3 PostgreSQL的功能场景 1.4 PostgreSQL存储模块的介绍流程 2 执行模块 3 存储模块 3.1 存储结构 (1) data_directory (2) oid (3) data-file (4) page (5) tuple 3.2 关键机制 (1) mvcc (2) delete 3.3 执行流程 (1) input (2) heapam (3) trancation (4) fsm (5) buffer (6) smgr (7) vfd (8) vm (9) wal (10) wal-buffer 3.4 关键进程 (1) bgwriter (2) walwriter (3) checkpointer (5) walsender (6) autovacuum 3.5 关键流程 (1) heap_insert (2) heap_delete (3) heap_update (4) heap_scan 3.6 辅助机制 (1) index (2) recovery (3) backup (4) toast (5) logical 1 概述 1.1 PostgreSQL的使用流程 本博客仅讨论存储模块的关键原理。简而言之,PostgreSQL将数据合理地组织并存储在磁盘上,并向用户提供SQL接口,让其读写磁盘上的指定数据。以下是PostgreSQL简单工作流程: ...

January 21, 2025 · 4 min · 686 words · Me

传统安全 4 防火墙

1 netfilter 1.1 netfilter 架构 1.2 netfilter 编程 struct nf_hook_state { unsigned int hook; int thresh; u_int8_t pf; struct net_device *in; struct net_device *out; struct sock *sk; struct net *net; struct list_head *hook_list; int (*okfn)(struct net *, struct sock *, struct sk_buff *); }; /* 回调函数 */ typedef unsigned int nf_hookfn( void *priv, struct sk_buff *skb, const struct nf_hook_state *state); /* 回调函数返回值 */ #define NF_DROP 0 #define NF_ACCEPT 1 #define NF_STOLEN 2 #define NF_QUEUE 3 #define NF_REPEAT 4 #define NF_STOP 5 /* 向内核注册回调函数 */ struct nf_hook_ops { struct list_head list; /* 链表成员 */ nf_hookfn *hook; /* 回调函数 */ struct module *owner; int pf; /* 协议簇 */ int hooknum; /* NF_ARP_IN, NF_ARP_OUT */ int priority; /* 优先级 */ } ; /* 协议簇 */ #define AF_UNSPEC 0 #define AF_UNIX 1 #define AF_LOCAL 1 #define AF_INET 2 /* IP */ #define AF_INET6 10 /* IPV6 */ #define AF_LLC 26 /* 注册 */ void nf_register_hooks(struct nf_hook_ops *ops_arr, int arr_len); module_init(arp_hook_init) 参考:netfilter结构体:https://www.cnblogs.com/ink-white/p/16818769.html 参考:netfilter构造报文:https://www.cnblogs.com/ink-white/p/16816464.html 参考:netfilter捕获arp:https://blog.csdn.net/fuyuande/article/details/79772134 2 iptables 2.1 iptables 命令 # 1 查看所有规则 iptables --list -n iptables --list -t [filter/mangle/nat/raw] # 2 规则管理 iptables [操作] [链名] [动作] [过滤条件] # 操作 -A : 新增规则,添加至末尾 -I : 新增规则,添加到指定位置 -D : 删除规则 -R : 替换规则 # 链名 PREROUTING INPUT OUTPT FORWARD # 动作 -j ACCEPT -j DROP -j REJECT -j SNAT # 过滤条件 -s 0.0.0.0 : 源IP -sport 100 : 源端口 -d 1.1.1.1 : 目标IP -dport 100 : 目标端口 -p icmp/tcp/udp : 协议类型 -p icmp --icmp-type 8 : ping -i etho : 数据接收网口 -o eth1 : 数据发送网口 -m 其他参数 -m mac --mac-source 00:00:00:00:01 -m owner --uid-owner 100 -m owner --pid-owner 100 -m state --state [NEW, RELATED, ESTABLISHED, INVALID] # 3 启动与停止 [ location: /etc/init.d/iptables ] iptables start iptables stop iptables restart # 4 批量操作 iptables -F # 清空规则 iptables -X # 清空用户规则 iptables -Z # 清空计数 # 5 保存规则 [ storage: /etc/sysconfig/iptables ] iptables save 3 kkwall 3.1 命令 # 1 过滤 # 1.1 过滤ip kkwall filter -sip 10.10.10.10 kkwall accept -dip 10.10.10.10 # 1.2 过滤端口 kkwall filter -sport 100 kkwall accept -dport 100 kkwall filter -dport all # 1.2 过滤协议 kkwal filter -protol tcp/icmp/udp/igmp # 3 入侵检测 # 3.1 防 arp 欺骗 # 网关固定mac kkwal set mac 0.0.0.0/00:00:00:00:01 # 短时间内,大量arp报文 # 3.2 端口扫描 # 设置端口白名单,如果报文目标端口在白名单外的端口,为异常报文 kkwal set ports 22,80 # 检测所有tcp状态,识别所有syn和fin扫描 # 3.3 拒绝服务 # 系统漏洞: # ping of death: 超长icmp包 63336, 分片发送 -> 丢弃 # tear drop: 重复的IP分片 -> 丢弃 # 有限资源 # smurf: 短时间接收到大量icmp echo包 -> 全丢弃 # tcp syn flood: 短时间,大量半开请求 # tcp syn land: tcp src_addr和dst_addr都是自己 # http flood: http请求 typedef struct { ; } ArpHdr; typedef struct { ; } IpHdr; typedef struct { ; } TcpHdr; typedef struct { int type; IpHdr *iphdr; TcpHdr *tcphdr; } Fragment; /* */ void detecte_trick(ArpHdr *arp) { ArpItem staticarp = arp_list_find(arp->mac); if (arp->dst_ip != staticarp) { printf("arp trick"); } } 参考:iptables常用命令 https://blog.csdn.net/shiner_chen/article/details/132104300

January 21, 2025 · 3 min · 466 words · Me

PostgreSQL 1-5 initdb

initdb 流程 opengauss main # initdb.cpp canonicalize_path # PGDATA find_other_exec # 在gs_initdb bin目录下,查找gaussdb bin # 在$GAUSSHOME/share/postgrsql目录下,检查以下文件是否存在 check_input('postgres.bki, postgres.description, pg_hba.conf.sample, postgresql.conf.sample, ..., system_views.sql, ...') check_locale_encoding init_log gs_getenv_r('GAUSSLOG') write_version_file canonicalize_path('$PGDATA/PG_VERSION') fprintf(PG_MAJORVERSION = '9.2') setup_config readfile('$GAUSSHOME/share/postgrsql/postgresql.conf.sample') sprintf_s('$PGDATA/postgresql.conf') writefile('$PGDATA/postgresql.conf') InitUndoSubsystemMeta bootstrap_template1 write_version_file setup_auth get_set_pwd setup_depend load_plpgsql setup_sysviews setup_description ... setup_privileges setup_schema setup_update vacuum_db make_template0 make_postgres

February 26, 2025 · 1 min · 51 words · Me

传统安全 5 数据库加密

1 数据库加密的背景 1.1 数据库安全机制 应用将数据发送给数据库后,数据库组织数据,将数据存储在文件中,并提供一系列安全机制,保护数据安全。比如: 安全传输:基于TLS等安全协议,保证数据在应用与数据库之间传输的机密性、完整性等,避免攻击者对传输中的数据进行窃听、伪造、篡改等 身份认证:基于IP、口令、证书等鉴别用户身份,避免攻击者非法访问数据库 访问控制:通过多种访问控制机制,限制攻击者对数据库对象的的访问范围 安全审计:记录攻击者在数据库中执行的各项操作 数据脱敏:对隐私数据库进行脱敏处理,避免攻击者查看数据库中的隐私数据 数据防篡改:基于区块链等技术,记录数据变化情况,识别攻击者非法篡改磁盘上的数据库文件 1.2 数据泄露问题 在很多针对数据库的攻击行为中,攻击者可绕过上述数据库安全机制,直接从磁盘窃取数据,造成数据泄露问题。 为了规避此类问题,有效的方案是对数据进行加密,使攻击者仅能从磁盘获取数据密文,无法解密数据,从而解决数据泄露问题。 1.3 数据库加密方案分类 数据库加密方案较多,本博客仅介绍一些常见的,且适用于大部分场景的加密方案。 一、按加密位置分类 首先,按加密位置分类,可分为以下6种: 各方案的基本原理如下: 应用加密:应用先将数据加密,再使用SQL语句,将数据密文存储至数据库 全密态加密:数据库驱动识别并加密SQL语法中的数据,同时自动解密SQL查询结果。部分数据库产品提供此功能 网关或代理加密:在应用与数据库之间的中继节点中,比如代理或网关中,通过解析网络流量,自动识别与加解密流量中的数据,包括SQL语法中的数据与SQL查询结果。很多云服务、安全厂商提供此服务 加密函数:数据库内置加密函数或存储过程,应用可通过SQL语法主动调用加密函数。大部分数据库产品提供此功能 透明加密:数据库将数据存储至磁盘前,自动加密数据,数据库从磁盘读取数据时,自动解密数据。大部分数据库产品提供此功能 磁盘加密:操作系统处理磁盘读写请求时,自动加密与解密读写到的数据。部分操作系统或云存储服务提供此功能 二、按加密定义方式分类 上述加密方案中,按应用是否主动感知加密过程,可将其分为非自动加密与自动加密。 非自动加密 以应用加密为例,用户加密数据的流程如下: -- 1 首先,定义表 CREATE TABLE t1 (c1 TEXT, c2 TEXT); -- 2 假设需向t1中存储数据 (1, 'data1'),应用需要先将数据加密,在通过SQL语法将加密后的数据存储至数据库 -- 3 存储数据 INSERT INTO t1 VALUES ('encrypted[1]', 'encrypted[data1]'); -- 4 查询数据时,查询结果为数据密文,数据无法直接使用 SELECT * FROM t1; -- 查询结果为:('encrypted[1]', 'encrypted[data1]') -- 5 应用需自行解密查询结果,最终解密后得到原始数据 (1, 'data1') 此类加密方案中,每次涉及数据读写操作时,都需要主动进行加密与解密,操作复杂。 ...

January 21, 2025 · 3 min · 550 words · Me

海量 2 博客 profile

摘要:本文主要分为3个章节: 介绍Vastbase基于密码的身份认证机制,介绍密码相关配置参数,指出当前控制参数的局限性,提出PROFILE功能支持细粒度设置密码相关配置参数。 介绍Vastbase的PROFILE功能如何使用,包括管理PROFILE功能、管理PROFILE参数、管理用户PROFILE 介绍Vastbase身份认证流程与原理,介绍PROFILE功能的实现原理 目录 1 PROFILE 功能背景 1.1 身份认证机制 1.2 身份认证配置 1.3 身份认证优化 2 PROFILE 功能使用 2.1 PROFILE 简单示例 2.2 管理 PROFILE 功能 2.3 管理 PROFILE 参数 2.4 管理 用户 PROFILE 3 PROFILE 功能原理 3.1 身份认证元数据 3.2 身份认证流程 1 PROFILE 功能背景 1.1 身份认证机制 Vastbase身份认证模块,主要采用基于密码的认证机制,常用的密码操作包括: 创建密码 创建新用户时,需指定密码。语法示例如下: CREATE USER u1 PASSWORD 'u1.password'; Vastbase接收密码后,计算密码的哈希值,并将密码哈希值、密码创建时间等存储至系统表中。 使用密码 用户连接Vastbase时,需提供密码,使用vsql连接的命令如下: vsql -h {host} -p {port} -U u1 -W 'u1.password' -d vastbase -r Vastbase会与vsql进行身份认证交互,基于存储的密码哈希值,校验密码是否正确。同时,Vastbase还会进行其他检查,比如:密码是否过期、密码错误次数是否过多等。 修改密码 用户修改密码时,语法示例如下: ...

May 22, 2025 · 4 min · 684 words · Me

海量 2 用例 profile

1 CREATE/ALTER/DROP PROFILE 2 CREATE/ALTER USER .. PROFILE 3 验证profile生效 验证 failed_login_attempts 与 password_lock_time 验证 password_life_time 与 password_grace_time 验证 password_reuse_time 和 password_reuse_max 验证 idle_time 3 view CREATE PROFILE pro1 limit password_reuse_time 0.00002 password_reuse_max 10; -- 1.72s CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; ALTER USER u1 PASSWORD 'u1.pass2'; ALTER USER u1 PASSWORD 'u1.pass1'; -- error, interval < password_reuse_time \! sleep 2 ALTER USER u1 PASSWORD 'u1.pass1'; -- succeed, interval > password_reuse_time ALTER PROFILE pro1 LIMIT password_reuse_time 0.00005; -- 4.32s ALTER USER u1 PASSWORD 'u1.pass3'; ALTER USER u1 PASSWORD 'u1.pass4'; ALTER USER u1 PASSWORD 'u1.pass3'; -- error, interval < password_reuse_time \! sleep 5 ALTER USER u1 PASSWORD 'u1.pass3'; -- succeed, interval > password_reuse_time 1 CREATE/ALTER/DROP PROFILE -- check profile feature SHOW resource_limit; -- ================================ part 1 ================================ -- create profile CREATE PROFILE pro1; -- succeed: can set setting CREATE PROFILE pro2 LIMIT failed_login_attempts 10; -- succeed: can set more settings CREATE PROFILE pro3 LIMIT failed_login_attempts 10 password_lock_time 20 password_life_time 30 password_grace_time 40 password_reuse_time 50 password_reuse_max 60 idle_time 80; -- succeed: repeated settings are allowed CREATE PROFILE pro4 LIMIT password_life_time 10 password_life_time 20.2; -- succeed: setting value could be 'unlimited' CREATE PROFILE pro5 LIMIT failed_login_attempts unlimited password_lock_time 10 password_life_time unlimited; -- succeed: name max len is 64, name will be truncated CREATE PROFILE aaaaa111111111122222222223333333333444444444455555555556666666666; -- too long, max 64, wi -- truncated name: aaaaa1111111111222222222233333333334444444444555555555566666666 SELECT profile,count(*) FROM vb_profiles GROUP BY profile ORDER BY profile; SELECT * FROM vb_profiles WHERE profile = 'pro5' ORDER BY setname; -- error: profile name is invalid CREATE PROFILE 1; -- int CREATE PROFILE 1.1; -- numeric -- error: profile already exists CREATE PROFILE default LIMIT failed_login_attempts 10; CREATE PROFILE pro1 LIMIT failed_login_attempts 10; /* error: setting is invalid, supported settings: unit type min max ------------------------+---------+----------+---------+------------+---- failed_login_attempts | times | int | 1 | 2147483646 | 10 password_lock_time | days | double | 0.00001 | 24855 | 1 password_life_time | days | double | 0.00001 | 24855 | 180 password_grace_time | days | double | 0.00001 | 24855 | 7 password_reuse_time | days | double | 0.00001 | 24855 | 1 password_reuse_max | times | int | 1 | 2147483646 | 1 idle_time | minutes | double | 0.00001 | 2147483646 | 10 */ CREATE PROFILE epro2 LIMIT data_directory anyvalue; CREATE PROFILE epro3 LIMIT password_effect_time 10; CREATE PROFILE epro4 LIMIT 10 failed_login_attempts; -- error: setting lose value CREATE PROFILE epro5 LIMIT failed_login_attempts; CREATE PROFILE epro6 LIMIT failed_login_attempts 10 password_lock_time; -- error: setting value type is invalud CREATE PROFILE epro7 LIMIT failed_login_attempts 'iamstring'; CREATE PROFILE epro8 LIMIT failed_login_attempts 1.1; CREATE PROFILE epro9 LIMIT failed_login_attempts noint; CREATE PROFILE epro10 LIMIT failed_login_attempts default; -- error: setting value is out of limit CREATE PROFILE epro11 LIMIT failed_login_attempts 0; CREATE PROFILE epro12 LIMIT failed_login_attempts 1 password_lock_time 0; CREATE PROFILE epro13 LIMIT password_lock_time 24856; CREATE PROFILE epro14 LIMIT password_lock_time 0.000001; SELECT profile,count(*) FROM vb_profiles GROUP BY profile ORDER BY profile; DROP PROFILE pro1, pro2, pro3, pro4, pro5; DROP PROFILE aaaaa111111111122222222223333333333444444444455555555556666666666; -- ================================ part 2 ================================ -- alter profile CREATE PROFILE pro1; CREATE PROFILE pro2 LIMIT failed_login_attempts 100; CREATE PROFILE pro3 LIMIT password_lock_time 20; -- succeed: can set setting ALTER PROFILE pro1 LIMIT failed_login_attempts 1000; -- succeed: can set more settings ALTER PROFILE pro2 LIMIT failed_login_attempts 10 password_lock_time 20 password_life_time 30 password_grace_time 40 password_reuse_time 50 password_reuse_max 60 idle_time 80; -- succeed: setting value could be 'unlimited' ALTER PROFILE pro3 LIMIT failed_login_attempts unlimited password_lock_time 10 password_life_time unlimited; -- succeed: can alter default profile ALTER PROFILE default LIMIT failed_login_attempts 80 password_reuse_time 70.3; SELECT * FROM vb_profiles ORDER BY profile,setname; -- error: profile name is invalid ALTER PROFILE 1 LIMIT failed_login_attempts 10; -- int ALTER PROFILE 1.1 LIMIT failed_login_attempts 10; -- numeric ALTER PROFILE aaaaa111111111122222222223333333333444444444455555555556666666666 LIMIT failed_login_attempts 10; -- too long, max 64 -- error: repeated settings are not allowed ALTER PROFILE pro3 LIMIT password_reuse_time 10 password_reuse_time 20.2; -- error: profile doesn't exist ALTER PROFILE epro1 LIMIT failed_login_attempts 10; ALTER PROFILE epro2 LIMIT failed_login_attempts 10; /* error: setting is invalid */ ALTER PROFILE pro1 LIMIT data_directory anyvalue; ALTER PROFILE pro1 LIMIT password_effect_time 10; ALTER PROFILE pro1 LIMIT 10 failed_login_attempts; -- error: setting lose value ALTER PROFILE pro1 LIMIT failed_login_attempts; ALTER PROFILE pro1 LIMIT failed_login_attempts 10 password_lock_time; -- error: setting value type is invalud ALTER PROFILE pro1 LIMIT failed_login_attempts 'iamstring'; ALTER PROFILE pro1 LIMIT failed_login_attempts 1.1; ALTER PROFILE pro1 LIMIT failed_login_attempts noint; ALTER PROFILE pro1 LIMIT failed_login_attempts default; -- error: setting value is out of limit ALTER PROFILE pro1 LIMIT failed_login_attempts 0; ALTER PROFILE pro1 LIMIT failed_login_attempts 1 password_lock_time 0; ALTER PROFILE pro1 LIMIT password_lock_time 24856; ALTER PROFILE pro1 LIMIT password_lock_time 0.000001; DROP PROFILE pro1, pro2, pro3; -- ================================ part 3 ================================ -- drop profile CREATE PROFILE pro1; CREATE PROFILE pro2 LIMIT failed_login_attempts 100; CREATE PROFILE pro3 LIMIT password_lock_time 20; CREATE PROFILE pro4; CREATE PROFILE pro5; -- succeed: drop profile DROP PROFILE pro1; DROP PROFILE IF EXISTS pro1; DROP PROFILE IF EXISTS pro1, pro2, pro3; SELECT profile,count(*) FROM vb_profiles GROUP BY profile; -- error: profile doesn't exist DROP PROFILE pro0; DROP PROFILE pro1, pro4, pro5; -- error: default profile can't be dropped DROP PROFILE default; DROP PROFILE pro4, default; DROP PROFILE IF EXISTS pro4, pro5; 2 CREATE/ALTER USER .. PROFILE -- ================================ part 4 ================================ -- set profile for user SELECT * FROM vb_user_profiles; CREATE PROFILE pro1; CREATE PROFILE pro2; -- succeed: set profile for user CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; CREATE USER u2 PASSWORD 'u2.pass1' PROFILE pro1; CREATE USER u3 PASSWORD 'u3.pass1' PROFILE default; CREATE USER u4 PASSWORD 'u4.pass1'; -- error: profile doesn't exist CREATE USER eu1 PASSWORD 'u4.pass1' PROFILE pro1000; -- error: profile name invalid CREATE USER eu2 PASSWORD 'u4.pass1' PROFILE 1; CREATE USER eu3 PASSWORD 'u4.pass1' PROFILE; SELECT * FROM vb_user_profiles; DROP USER IF EXISTS u1, u2, u3, u4; -- catalog also changed SELECT * FROM vb_user_profiles; DROP PROFILE IF EXISTS pro1, pro2; -- ================================ part 5 ================================ -- alter user profile CREATE PROFILE pro1; CREATE PROFILE pro2; CREATE USER u1 PASSWORD 'u1.pass1'; CREATE USER u2 PASSWORD 'u2.pass1' PROFILE pro2; CREATE USER u3 PASSWORD 'u3.pass1' PROFILE default; -- succeed: alter user set profile ALTER USER u1 PROFILE pro1; ALTER USER u2 PROFILE default; ALTER USER u3 PROFILE pro1; -- error: profile doesn't exist ALTER USER u1 PROFILE pro1000; -- error: profile name invalid ALTER USER u1 PROFILE 1; ALTER USER u1 PROFILE; SELECT * FROM vb_user_profiles ORDER BY roloid; DROP USER IF EXISTS u1, u2, u3; DROP PROFILE IF EXISTS pro1, pro2; -- ================================ part 6 ================================ -- drop user and profile CREATE PROFILE pro1; CREATE PROFILE pro2; CREATE PROFILE pro3; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; CREATE USER u2 PASSWORD 'u2.pass1' PROFILE pro2; -- succeed: drop user SELECT * FROM vb_user_profiles WHERE rolname = 'u1'; DROP USER u1; SELECT * FROM vb_user_profiles WHERE rolname = 'u1'; -- error: can't drop profile if any user are using it DROP PROFILE pro2; -- error: default profile can't be dropped DROP PROFILE default; DROP PROFILE pro3, default; DROP PROFILE default, pro3; SELECT * FROM vb_user_profiles ORDER BY roloid; DROP USER IF EXISTS u1, u2; DROP PROFILE IF EXISTS pro1, pro2, pro3; 3 验证profile生效 验证 failed_login_attempts 与 password_lock_time CREATE PROFILE pro1 LIMIT failed_login_attempts 3 password_lock_time 0.0001; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; -- 运行登录失败3次,失败后锁定8秒 CREATE USER u2 PASSWORD 'u2.pass1'; -- 允许登录失败无数次 vsql -p 5432 -d postgres -U u1 -W "u1.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u1 -W "u1.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u1 -W "u1.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- u2 vsql -p 5432 -d postgres -U u2 -W "u2.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" vsql -p 5432 -d postgres -c "DROP USER u1,u2" 验证 password_life_time 与 password_grace_time CREATE PROFILE pro2 LIMIT password_life_time 0.0001 -- 8s password_grace_time 0.0001; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro2; -- 密码有效期为8s,密码宽容期也为8s CREATE USER u2 PASSWORD 'u2.pass1'; -- 密码有效期无限制 \q vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" 验证 password_reuse_time 和 password_reuse_max CREATE PROFILE pro3 LIMIT password_reuse_time 0.0001 -- 不能用过去8秒使用过的密码 password_reuse_max 100; -- 不能用过去100次使用过的 DROP USER IF EXISTS u1,u2; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro3; ALTER USER u1 PASSWORD 'u1.pass2'; ALTER USER u1 PASSWORD 'u1.pass1'; SELECT pg_sleep(3); ALTER USER u1 PASSWORD 'u1.pass1'; SELECT pg_sleep(3); ALTER USER u1 PASSWORD 'u1.pass1'; SELECT pg_sleep(3); ALTER USER u1 PASSWORD 'u1.pass1'; CREATE USER u2 PASSWORD 'u2.pass1'; ALTER USER u2 PASSWORD 'u2.pass2'; ALTER USER u2 PASSWORD 'u2.pass1'; ALTER USER u2 PASSWORD 'u2.pass2'; ALTER USER u2 PASSWORD 'u2.pass1'; -- ----------------------------- CREATE PROFILE pro4 LIMIT password_reuse_max 2 -- 不能用过去2次使用过的 password_reuse_time 20; DROP USER IF EXISTS u1,u2; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro4; ALTER USER u1 PASSWORD 'u1.pass2'; ALTER USER u1 PASSWORD 'u1.pass3'; ALTER USER u1 PASSWORD 'u1.pass4'; ALTER USER u1 PASSWORD 'u1.pass3'; -- error ALTER USER u1 PASSWORD 'u1.pass2'; -- ok 验证 idle_time CREATE PROFILE pro5 LIMIT idle_time 0.1; -- 6s DROP USER IF EXISTS u1,u2; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro5; CREATE USER u2 PASSWORD 'u2.pass1'; \q vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -r SELECT 1; -- 不用pg_sleep \! sleep 7 SELECT 1; \q vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -r SELECT 1; -- 不用pg_sleep \! sleep 7 SELECT 1; 3 view CREATE OR REPLACE VIEW SYS.DBA_PROFILES AS SELECT profile "PROFILE", setname "RESOURCE_NAME", setkind "RESOURCE_TYPE", setval "LIMIT" FROM vb_profiles; 升级 审计 oid knl_u_misc_init AuthenticatedUserId = InvalidOid ResetStreamStatus AuthenticatedUserId = InvalidOid InitializeSessionUserId AuthenticatedUserId = SearchSysCache(rolname / useroid) InitializeSessionUserIdStandalone AuthenticatedUserId = BOOTSTRAP_SUPERUSERID SessionUserId CurrentUserId create_session_context # get_setting_from_guc_or_profile enable_session_sig_alarm # get_setting_from_guc_or_profile ReadCommand # get_setting_from_guc_or_profile enable_session_sig_alarm # get_setting_from_guc_or_profile disable_session_sig_alarm TpoolSchedulerMain CheckSessionTimeout # get_setting_from_guc_or_profile handle_sig_alarm CheckSessionTimeout # get_setting_from_guc_or_profile WaitMission # get_setting_from_guc_or_profile enable_session_sig_alarm

March 14, 2025 · 9 min · 1719 words · Me

海量 2 设计 profile

1 Oracle兼容性-支持profile功能 1.1 功能简述 本特性实现与oracle profile相同的功能,支持为不同用户设置7个不同的配置参数: failed_login_attempts password_lock_time password_life_time password_grace_time password_reuse_time password_reuse_max idle_time 简单使用示例如下: CREATE PROFILE pro1 LIMIT failed_login_attempts 10; CREATE USER u1 PASSWORD 'u1.pass1'; ALTER USER u1 PROFILE u1; 1.2 实现方案 一、元数据 本特性的关键实现为:对用户提供DDL接口,在内核中存储配置数据。因此,在介绍代码流程前,先介绍接口与元数据。 新增GUC参数resource_limit (与oracle参数名一致) 控制是否启用oracle profile功能。 如果该参数为on,以下5个guc参数则不再生效:[failed_login_attempts, password_lock_time, password_effect_time, password_reuse_time, password_reuse_max]。另外,对于已经过身份认证的连接,session_timeout也不再生效,相关功能均由profile中的用户级参数控制。 对于新安装的集群、旧版本升级的集群,该参数的值存在差异: 新安装:新安装的数据库,即3.0.8版本及之后,该guc参数值默认为on(初始值为off,由initdb自动设置为on) 升级:从3.0.8之前版本,升级到3.0.8版本时,在升级的过程中,该参数的值仍然是off,即升级上来默认不可用profile功能 SELECT * FROM pg_settings WHERE name = 'resource_limit'; -[ RECORD 1 ]------------------------------------------- name | resource_limit setting | on -- 默认为on (由initdb设置为on,从旧版本升级到新版本时,升级脚本会将该参数设置为off) unit | category | Ungrouped short_desc | Used to enable profile feature extra_desc | default on context | postmaster -- 需重启生效 vartype | bool source | default min_val | max_val | enumvals | boot_val | off reset_val | off sourcefile | sourceline | 修改6个GUC参数的生效条件 当GUC参数resource_limit取值为on时,以下6个GUC参数不再生效:[failed_login_attempts, password_lock_time, password_effect_time, password_reuse_time, password_reuse_max, session_timeout] ...

March 6, 2025 · 6 min · 1256 words · Me

海量 2 设计 oracle profile

2 代码 新增试图 SELECT * FROM pg_user_settings; -- 新增视图 pg_user_settings SELECT rolname,profile FROM pg_authid WHERE rolcanlogin = true LEFT JOIN vb_profile ON rolname | setname | setting | settype | settype | setsource --------+-----------------------+----------+---------+-------------+---------------- u1 | password_effect_time | 90 | int | profile guc | pro1 | cluster guc | postgresql.conf 参数1: failed_login_attempts # opegauss使用1个内存中的hash表,存储密码失败次数 ClientAuthentication # 进行身份认证时,如果认证失败,则更新hash表中的失败次数值 UpdateFailCountToHashTable InitAccountLockHashTable hash_search # 如果失败次数超过GUC限制,则锁定账户 if failed_login_attempts: lockflag = True 参数2: password_lock_time 参数3: password_effect_time # 通过内置函数,主动查看密码剩余天数 gs_password_deadline GetCurrentUserId # 1 获取当前用户 GetUserCurrentPwdtime # 2 从系统表pg_auth_history中,获取密码创建时间passwordtime heap_open('pg_auth_history') systable_beginscan floor(u_sess->attr.attr_security.Password_effect_time) # 3 从guc参数password_effect_time中获取密码有效天数 # 计算步骤2和3中的时间,返回剩余过期天数 参数4: password_reuse_max AddAuthHistory systable_beginscan('pg_auth_history') # 1 从系统表pg_auth_history中,获取曾用过的密码rolpassword,获取生成密码的时间passwordtime systable_getnext_back # 倒着从系统表扫描,即先扫描不太古老的旧密码,再扫描更古老的旧密码 pg_sha256_encrypt # 使用旧密码的salt,加密新密码 if strncmp : # 比较新密码是否与旧密码相等 hasSame = True # 如果新旧密码相等,计算新旧密码间隔天数,与GUC参数password_reuse_time比较,判断是否满足密码重用时间限制 if now - pg_auth_history.passwordtime > 'password_reuse_time': isTimeSafe = True # 计算这是倒数第几个密码 changeTimes++ if changeTimes > 'password_reuse_max': isMaxSafe # 满足 password_reuse_time 和 password_reuse_max 中任意一个条件,都可以修改密码 # - 要么用好几次之前的密码(满足 password_reuse_max 条件) # - 要么用很旧之间使用的密码(满足 password_reuse_time 条件) if hasSame and not isTimeSafe and not isMaxSafe: # 报错 参数5: password_reuse_time

February 20, 2025 · 1 min · 159 words · Me

海量 2 需求 profile

1 简介 1.1 目的 vastbase与oracle都支持设置运行参数: vastbase:支持设置集群级guc参数,例如,guc参数failed_login_attempts用于设置’用户密码错误多少次后锁定账户’,该参数对集群中所有用户(非初始用户)都有效。 oracle:也支持failed_login_attempts参数,但是oracle支持为不同用户设置不同的failed_login_attempts值。我们且将此类参数称为用户级参数。 与oracle相比,vastbase的guc参数功能存在2个差异: 作用范围:oracle支持设置用户级参数,vastbase大部分参数都是集群级guc参数 参数个数:23版本的oracle支持18个用户级参数,其中6个可在vastbase找到对应的guc参数 参数取值:vastbase中,6个guc参数的取值范围与oracle profile不同 本文主要介绍以下几点: oracle用户级参数的个数、设置方法 vastbase中对应集群级guc参数的个数、设置方法 vastbase新需求:尽量实现与oracle一致的用户级guc参数 本文档可指导开发者、测试者熟悉vastbase用户级guc配置参数特性 本文档的内容已被上传至tapd,tapd上,排版更好看,测试用例更方便复制。建议直接从tapd上查看本文档原文: https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196 1.2 适用范围 vastbase 3.0.8及之后版本,vastbase用户级参数profile特性接口设计、使用指导等。 1.3 术语定义、首字母缩写词和缩略语 GUC:Grand Unifed Configuralion,postgresql和vastbase的配置参数 1.3 参考资料 原始需求: https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627 tapd上本需求文档链接: https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196 tapd上6个与密码相关的guc参数的使用参考: https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007200 oracle 23 profile语法以及相关参数: https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html mysql 8.0 create user语法以及相关参数: https://mysql.net.cn/doc/refman/8.0/en/create-user.html mysql 配置参数列表:https://mysql.net.cn/doc/refman/8.0/en/server-system-variable-reference.html vastbase g100 create user语法以及相关参数: https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/6a4766151e29496b9f88cd2d9dd3db2e 2 支持oracle用户级配置profile 2.1 功能简述 【需求来源】桂林银行 需求链接:https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627 需求描述:桂林银行客户指出,目前对于数据库用户的管理方式不够便捷,无法像oracle profile方式为用户赋予一组安全策略。一些属性如密码有效期、密码过期天数、密码尝试次数等也只能全局设定,无法指定用户配置。- 需求范围:桂林银行使用的数据库兼容模式包括oracle和mysql两种兼容模式。 【需求背景】oracle 23的profile功能 通俗来讲,oracle的profle可理解为细粒度的配置参数。1个profile包含1组配置参数,不同用户可使用不同的profile。按上述例子,要单独控制某个用户的密码有效期,操作步骤如下: 创建用户 CREATE USER u1 IDENTIFIED BY "u1.1234"; 创建profile,同时设置用户级参数 此处,以设置密码有效期参数为例: CREATE PROFILE pro1 LIMIT FAILED_LOGIN_ATTEMPTS 10; 设置用户u1使用profile pro1 ...

February 19, 2025 · 11 min · 2197 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀