Ver código fonte

docs(kb): 补 Impala 链路、HMS Ranger 待验证、datasource env 目录

tianyu.chu 2 semanas atrás
pai
commit
f081fdfe19
3 arquivos alterados com 78 adições e 13 exclusões
  1. 61 13
      kb/02-权限与账号.md
  2. 16 0
      kb/90-重构路线.md
  3. 1 0
      kb/92-重构进度.md

+ 61 - 13
kb/02-权限与账号.md

@@ -28,6 +28,27 @@ poyee 的鉴权体系有两条并行的入口链路,共用同一套 Ranger 策
   审计日志落地:Solr + HDFS `/ranger/audit`
   审计日志落地:Solr + HDFS `/ranger/audit`
 ```
 ```
 
 
+**链路 C:分析师走 Hue/Impala(身份 = LDAP 账号)**
+
+```
+用户/分析师
+   │  LDAP 登录
+   ▼
+  Hue (Web 入口)
+   │  JDBC / Impyla 会话(user=最终用户)
+   ▼
+  Impala Daemon ── LDAP 认证
+   │  (CDH 6.3.2 下 Impala 无 Ranger 细粒度授权,SQL 层不拦截)
+   ▼
+  NameNode ── Ranger HDFS Plugin(仅数据平面兜底)
+   │
+   ▼
+  HDFS DataNodes
+   │
+   ▼
+  审计日志落地:Solr + HDFS `/ranger/audit`
+```
+
 **链路 B:开发/调度走 PySpark / Spark-SQL(身份 = Unix 账号)**
 **链路 B:开发/调度走 PySpark / Spark-SQL(身份 = Unix 账号)**
 
 
 ```
 ```
@@ -36,7 +57,7 @@ poyee 的鉴权体系有两条并行的入口链路,共用同一套 Ranger 策
   spark-submit / pyspark (YARN client/cluster)
   spark-submit / pyspark (YARN client/cluster)
    │  Driver 和 Executor 以 Unix 账号向下游发请求
    │  Driver 和 Executor 以 Unix 账号向下游发请求
-   ├──▶ Hive Metastore ── Ranger Hive Plugin(库/表/列元数据授权
+   ├──▶ Hive Metastore(元数据查询;Ranger Hive 拦截**视 HMS 侧插件状态而定**,见下方关键点
   NameNode ── Ranger HDFS Plugin(数据平面兜底授权)
   NameNode ── Ranger HDFS Plugin(数据平面兜底授权)
@@ -48,7 +69,9 @@ poyee 的鉴权体系有两条并行的入口链路,共用同一套 Ranger 策
   审计日志落地:Solr + HDFS `/ranger/audit`
   审计日志落地:Solr + HDFS `/ranger/audit`
 ```
 ```
 
 
-> **关键点**:PySpark 不经过 HiveServer2,它直连 Hive Metastore + HDFS。Ranger Hive Plugin 同样作用在 HMS 侧,所以 SQL 语义的库/表/列授权仍然生效;只是不走 HS2 的 doAs 代理。
+> **关键点**:
+> - PySpark 不经过 HiveServer2,它直连 Hive Metastore + HDFS,不走 HS2 的 doAs 代理。
+> - **Ranger Hive 策略对 HMS 直连方是否拦截,取决于集群侧是否在 HiveMetastore 服务端也挂载 Ranger Hive Plugin**(CDH 6.3.2 默认只在 HS2 挂)。若 HMS 未挂插件,PySpark 的库/表/列授权绕过 Ranger Hive,仅由 NameNode 上的 Ranger HDFS Plugin 做数据平面兜底 —— 规律上与同版本 Impala 一致。**本集群实际状态待验证**,见 `90-重构路线.md §7.5`。
 
 
 **账号来源:Ranger UserSync 同时同步 LDAP 和 Unix 组**
 **账号来源:Ranger UserSync 同时同步 LDAP 和 Unix 组**
 
 
@@ -58,7 +81,7 @@ poyee 的鉴权体系有两条并行的入口链路,共用同一套 Ranger 策
 
 
 **开发需要理解的四件事:**
 **开发需要理解的四件事:**
 
 
-1. **身份(Who)**:Hue 路径下是 LDAP 账号;spark-submit / DS JOB 路径下是 Unix 账号。**同一个人在两条链路下对 Ranger 来说是两个身份**,授权不通用。
+1. **身份(Who)**:Hue 路径下是 LDAP 账号;spark-submit / DS JOB 路径下是 Unix 账号。**同一个人在两条链路下对 Ranger 来说是两个身份**,授权不通用(除非账号名一致)
 2. **SQL 授权(What)**:HiveServer2 / Hive Metastore 上的 Ranger Hive Plugin 拦截库/表/列级操作。**你的 SQL 被拒多半发生在这一层**。
 2. **SQL 授权(What)**:HiveServer2 / Hive Metastore 上的 Ranger Hive Plugin 拦截库/表/列级操作。**你的 SQL 被拒多半发生在这一层**。
 3. **数据面兜底(Where)**:NameNode 上的 Ranger HDFS Plugin 拦截文件路径访问,即使绕过 Hive 直接访问 HDFS 也会被校验。
 3. **数据面兜底(Where)**:NameNode 上的 Ranger HDFS Plugin 拦截文件路径访问,即使绕过 Hive 直接访问 HDFS 也会被校验。
 4. **doAs 代理(仅链路 A)**:`hive.server2.enable.doAs=true`,Hue/beeline 提交的作业以**你本人的 LDAP 账号**访问 HDFS,而不是以 `hive` 服务账号。意味着 **LDAP 个人账号必须有目标路径的权限**,不能假设 hive 服务账号有权限就行。链路 B(PySpark)天然就是以提交者 Unix 账号发起,无 doAs。
 4. **doAs 代理(仅链路 A)**:`hive.server2.enable.doAs=true`,Hue/beeline 提交的作业以**你本人的 LDAP 账号**访问 HDFS,而不是以 `hive` 服务账号。意味着 **LDAP 个人账号必须有目标路径的权限**,不能假设 hive 服务账号有权限就行。链路 B(PySpark)天然就是以提交者 Unix 账号发起,无 doAs。
@@ -101,7 +124,7 @@ sequenceDiagram
   participant D as Dev / DS tenant
   participant D as Dev / DS tenant
   participant PS as PySpark / spark-submit
   participant PS as PySpark / spark-submit
   participant YARN as YARN ResourceManager
   participant YARN as YARN ResourceManager
-  participant HMS as Hive Metastore (Ranger Hive Plugin)
+  participant HMS as Hive Metastore
   participant RAdmin as Ranger Admin
   participant RAdmin as Ranger Admin
   participant NN as NameNode (Ranger HDFS Plugin)
   participant NN as NameNode (Ranger HDFS Plugin)
   participant HDFS as HDFS / Solr
   participant HDFS as HDFS / Solr
@@ -110,14 +133,39 @@ sequenceDiagram
   PS->>YARN: 提交 application(spark.yarn.principal = 提交者 Unix 账号)
   PS->>YARN: 提交 application(spark.yarn.principal = 提交者 Unix 账号)
   YARN-->>PS: 分配 Driver / Executor
   YARN-->>PS: 分配 Driver / Executor
   PS->>HMS: 读 / 写 Hive 元数据(user=Unix 账号)
   PS->>HMS: 读 / 写 Hive 元数据(user=Unix 账号)
-  HMS->>RAdmin: 拉取策略(缓存)
-  HMS->>HMS: Ranger Hive 插件 库/表/列 授权
+  Note over HMS: Ranger Hive 拦截仅在 HMS 侧挂插件时生效<br/>(CDH 6.3.2 默认不挂;待验证,见 90 §7.5)
   HMS-->>PS: 元数据 / 位置信息
   HMS-->>PS: 元数据 / 位置信息
   PS->>NN: 直读 / 直写 HDFS(user=Unix 账号,无 doAs)
   PS->>NN: 直读 / 直写 HDFS(user=Unix 账号,无 doAs)
   NN->>RAdmin: 拉取策略(缓存)
   NN->>RAdmin: 拉取策略(缓存)
   NN->>NN: Ranger HDFS 插件 路径授权
   NN->>NN: Ranger HDFS 插件 路径授权
   NN-->>PS: 允许 / 拒绝
   NN-->>PS: 允许 / 拒绝
-  HMS->>HDFS: 写审计日志到 /ranger/audit
+  NN->>HDFS: 写审计日志到 /ranger/audit
+```
+
+**链路 C:Hue / Impala(身份 = LDAP 账号)**
+
+```mermaid
+sequenceDiagram
+  participant U as User(Analyst)
+  participant Hue as Hue(Web UI)
+  participant LDAP as LDAP
+  participant IMP as Impala Daemon
+  participant NN as NameNode (Ranger HDFS Plugin)
+  participant RAdmin as Ranger Admin
+  participant HDFS as HDFS / Solr
+
+  U->>Hue: 登录(用户名/密码)
+  Hue->>LDAP: Bind 认证
+  LDAP-->>Hue: 认证成功 + 用户组
+  U->>Hue: 提交 Impala 查询
+  Hue->>IMP: JDBC / Impyla (user=U)
+  IMP->>LDAP: LDAP 认证
+  Note over IMP: CDH 6.3.2 下 Impala 无 Ranger 细粒度授权<br/>SQL 层不拦截,仅靠 HDFS 层兜底
+  IMP->>NN: 访问 HDFS (user=U)
+  NN->>RAdmin: 拉取策略(缓存)
+  NN->>NN: Ranger HDFS 插件路径授权
+  NN-->>IMP: 允许/拒绝
+  IMP-->>Hue: 返回结果
   NN->>HDFS: 写审计日志
   NN->>HDFS: 写审计日志
 ```
 ```
 
 
@@ -136,17 +184,17 @@ sequenceDiagram
 
 
 ## 4. 数据源账号(非 LDAP/Ranger 链路)
 ## 4. 数据源账号(非 LDAP/Ranger 链路)
 
 
-DataX 采集需要访问外部数据源(PG / MySQL / MongoDB / ES 等),这些账号**不走 LDAP/Ranger**,而是以明文/加密形式存放在项目同级目录:
+DataX 采集需要访问外部数据源(PG / MySQL / MongoDB / ES 等),这些账号**不走 LDAP/Ranger**,而是以明文/加密形式存放在项目同级目录,按 `{db_type}/{env}/{instance}.ini` 三段式组织
 
 
 ```
 ```
 /home/bigdata/release/datasource/
 /home/bigdata/release/datasource/
-├── pg/{业务库}.ini
-├── mysql/{业务库}.ini
-├── mongodb/{业务库}.ini
-└── es/{集群}.ini
+├── pg/{env}/{业务库}.ini           # env = dev / test / prod
+├── mysql/{env}/{业务库}.ini
+├── mongodb/{env}/{业务库}.ini
+└── es/{env}/{集群}.ini
 ```
 ```
 
 
-由运维同学维护,**不纳入本仓库版本控制**。开发 DataX 作业时引用 `{ds_type}/{ds_file}`(两段式,见 `21-命名规范.md` §4.4)。
+由运维同学维护,**不纳入本仓库版本控制**。开发 DataX 作业时 ini 引用 `{ds_type}/{ds_file}`(两段式不带 env;env 由启动命令 `-env <name>` 或 `conf/env.sh` 默认值注入,见 `21-命名规范.md` §4.4)。
 
 
 ## 5. 相关公共文档
 ## 5. 相关公共文档
 
 

+ 16 - 0
kb/90-重构路线.md

@@ -657,6 +657,21 @@ else:
 ```
 ```
 **建议**:将时间段和速率配置化,避免硬编码。
 **建议**:将时间段和速率配置化,避免硬编码。
 
 
+### 7.5 Spark / HMS 侧 Ranger Hive 策略验证(低优先级)
+
+**背景**:`02-权限与账号.md §1` 链路 B 原先假设 HMS 侧也挂载 Ranger Hive Plugin,从而 PySpark 直连 HMS 的库/表/列操作仍受 Ranger Hive 管辖。但在 CDH 6.3.2 默认部署中,Ranger Hive Plugin **只挂载在 HiveServer2**,HMS 服务端未必部署;若 HMS 未挂,PySpark / spark-submit 的 SQL 层授权会绕过 Ranger Hive,**仅剩 NameNode 上的 Ranger HDFS Plugin 做数据平面兜底** —— 与同版本 Impala 的"无 Ranger 细粒度授权,只能 HDFS 兜底"规律一致。
+
+**代码侧查证已完成**:仓库内 `dw_base/spark/spark_sql.py:167` 等 8 处 `.enableHiveSupport()`,Spark 确实走 HMS 读元数据,不走 HS2,因此是否受 Ranger Hive 管辖完全看集群侧 HMS 是否挂插件。
+
+**集群侧验证动作(待做)**:
+
+1. 登 HiveMetastore 节点,查 `hive-site.xml`:有无 `hive.metastore.pre.event.listeners = org.apache.ranger.authorization.hive.authorizer.RangerHiveMetastoreAuthorizer`
+2. 查 HMS 进程 classpath 里是否包含 `ranger-hive-plugin-*.jar`
+3. 从开发环境跑一条故意触发 column 级禁权的 PySpark SQL,看是否被拒 —— 端到端佐证
+4. 结论回填到 `02-权限与账号.md §1` 链路 B 关键点段 + 关键点段里的 mermaid Note
+
+**后续处理**:若 HMS 未挂 Ranger Hive,调研补挂成本 + 评估现有 HDFS 兜底是否足够(大部分数仓读写场景下足够,因为 PySpark 任务绝大多数以受控 Unix 账号提交、权限粒度粗即可;若要满足敏感列屏蔽类需求则必须补挂)。
+
 ## 八、重构优先级排序
 ## 八、重构优先级排序
 
 
 | 阶段 | 任务 | 优先级 |
 | 阶段 | 任务 | 优先级 |
@@ -673,3 +688,4 @@ else:
 | P3 | 日志模块统一 | 低 |
 | P3 | 日志模块统一 | 低 |
 | P3 | SQL 注入修复 | 低 |
 | P3 | SQL 注入修复 | 低 |
 | P3 | 部署脚本改进 | 低 |
 | P3 | 部署脚本改进 | 低 |
+| P3 | Spark/HMS 侧 Ranger Hive 策略验证(见 §7.5) | 低 |

+ 1 - 0
kb/92-重构进度.md

@@ -111,6 +111,7 @@
 - [ ] DataX 配置生成单测
 - [ ] DataX 配置生成单测
 - [ ] `__contains__` → `in` 全局替换
 - [ ] `__contains__` → `in` 全局替换
 - [ ] 删除废弃空模块和注释代码
 - [ ] 删除废弃空模块和注释代码
+- [ ] Spark / HMS 侧 Ranger Hive 策略验证(低优先级,见 `90-重构路线.md` §7.5)
 - [x] 精简 `requirements.txt`(2026-04-15 提前完成:48 行 → 10 个强依赖,老清单备份到 `requirements.txt.bak` 并逐行打标)
 - [x] 精简 `requirements.txt`(2026-04-15 提前完成:48 行 → 10 个强依赖,老清单备份到 `requirements.txt.bak` 并逐行打标)
 
 
 ## 阶段 5:老项目残留删除
 ## 阶段 5:老项目残留删除