# 权限与安全 > 本文档只记录 `poyee-data-warehouse` 开发者需要了解的**认证授权架构**,用于回答"我的 SQL 为什么被拒、数据访问走哪条链路、账号从哪里来"。 > **不记录运维细节**(Ranger 源码编译、UserSync 配置项、Hue 安全阀 ini、LDAP schema 明细)。这些内容由大数据负责人在公共知识库 `大数据空间` 中维护。 ## 1. 认证授权架构 poyee 的鉴权体系有两条并行的入口链路,共用同一套 Ranger 策略和 HDFS 兜底授权: **链路 A:分析师走 Hue/HiveServer2(身份 = LDAP 账号)** ``` 用户/分析师 │ LDAP 登录 ▼ Hue (Web 入口) │ JDBC / Beeline 代理访问(doAs=最终用户) ▼ HiveServer2 ── LDAP 认证 ── Ranger Hive Plugin(SQL 层授权) │ ▼ NameNode ── Ranger HDFS Plugin(数据平面兜底授权) │ ▼ HDFS DataNodes │ ▼ 审计日志落地: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 账号)** ``` 数据开发 / DS JOB │ ssh / ds tenant 以 Unix 账号登录 (bigdata / dolphinscheduler / 个人 unix) ▼ spark-submit / pyspark (YARN client/cluster) │ Driver 和 Executor 以 Unix 账号向下游发请求 ├──▶ Hive Metastore(元数据查询;Ranger Hive 拦截**视 HMS 侧插件状态而定**,见下方关键点) │ ▼ NameNode ── Ranger HDFS Plugin(数据平面兜底授权) │ ▼ HDFS DataNodes │ ▼ 审计日志落地:Solr + HDFS `/ranger/audit` ``` > **关键点**: > - 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 组** - Hue/HiveServer2 进来的是 LDAP 账号 —— Ranger 策略按 LDAP user / group 匹配 - PySpark / spark-submit / DS JOB 进来的是 Unix 账号(`bigdata`、`dolphinscheduler`、开发个人 unix)—— Ranger 策略按 Unix user / group 匹配 - 同一条策略可以同时授权给 "LDAP group `analyst`" 和 "Unix group `hadoop`",互不冲突 **开发需要理解的四件事:** 1. **身份(Who)**:Hue 路径下是 LDAP 账号;spark-submit / DS JOB 路径下是 Unix 账号。**同一个人在两条链路下对 Ranger 来说是两个身份**,授权不通用(除非账号名一致)。 2. **SQL 授权(What)**:HiveServer2 / Hive Metastore 上的 Ranger Hive Plugin 拦截库/表/列级操作。**你的 SQL 被拒多半发生在这一层**。 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。 ## 2. 认证授权审计链路 **链路 A:Hue / HiveServer2(身份 = LDAP)** ```mermaid sequenceDiagram participant U as User(Analyst) participant Hue as Hue(Web UI) participant LDAP as LDAP participant HS2 as HiveServer2 participant RAdmin as Ranger Admin participant NN as NameNode (Ranger HDFS Plugin) participant HDFS as HDFS / Solr U->>Hue: 登录(用户名/密码) Hue->>LDAP: Bind 认证 LDAP-->>Hue: 认证成功 + 用户组 U->>Hue: 提交 Hive 查询 Hue->>HS2: JDBC 会话 (user=U) HS2->>LDAP: LDAP 认证 HS2->>RAdmin: 拉取策略(缓存) HS2->>HS2: Ranger Hive 插件 SQL 授权 HS2->>NN: 访问 HDFS (doAs=U) NN->>RAdmin: 拉取策略(缓存) NN->>NN: Ranger HDFS 插件路径授权 NN-->>HS2: 允许/拒绝 HS2-->>Hue: 返回结果 HS2->>HDFS: 写审计日志到 /ranger/audit NN->>HDFS: 写审计日志 ``` **链路 B:PySpark / spark-submit / DS JOB(身份 = Unix 账号)** ```mermaid sequenceDiagram participant D as Dev / DS tenant participant PS as PySpark / spark-submit participant YARN as YARN ResourceManager participant HMS as Hive Metastore participant RAdmin as Ranger Admin participant NN as NameNode (Ranger HDFS Plugin) participant HDFS as HDFS / Solr D->>PS: ssh / ds tenant 发起(Unix 账号:bigdata / dolphinscheduler / 个人 unix) PS->>YARN: 提交 application(spark.yarn.principal = 提交者 Unix 账号) YARN-->>PS: 分配 Driver / Executor PS->>HMS: 读 / 写 Hive 元数据(user=Unix 账号) Note over HMS: Ranger Hive 拦截仅在 HMS 侧挂插件时生效
(CDH 6.3.2 默认不挂;待验证,见 90 §7.5) HMS-->>PS: 元数据 / 位置信息 PS->>NN: 直读 / 直写 HDFS(user=Unix 账号,无 doAs) NN->>RAdmin: 拉取策略(缓存) NN->>NN: Ranger HDFS 插件 路径授权 NN-->>PS: 允许 / 拒绝 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 细粒度授权
SQL 层不拦截,仅靠 HDFS 层兜底 IMP->>NN: 访问 HDFS (user=U) NN->>RAdmin: 拉取策略(缓存) NN->>NN: Ranger HDFS 插件路径授权 NN-->>IMP: 允许/拒绝 IMP-->>Hue: 返回结果 NN->>HDFS: 写审计日志 ``` ## 3. 账号体系(开发视角) | 账号类型 | 来源 | 用途 | |---------|------|------| | **个人账号** | LDAP | 开发/分析师通过 Hue 登录、写 SQL、看调度任务 | | **调度账号** `dolphinscheduler` | Linux 用户,归属 `dolphinscheduler` + `hadoop` 组 | DolphinScheduler 提交的工作流以该账号运行 | | **运维账号** `bigdata` | Linux 用户,归属 `hadoop` 组 | 运维/发布场景,提交 Hive/Spark 作业,管理 HDFS 数据目录 | | **服务账号** `hdfs` | Linux 用户,`supergroup` | 仅平台团队使用,**开发者不应使用** | **开发注意事项:** - 调度任务使用的是 `dolphinscheduler/bigdata` 账号,**授权给个人账号能跑通,不代表调度任务能跑通**——需要一并把权限授予 `dolphinscheduler` 用户或其所属组。 - 个人账号用 Hue/beeline/ssh(开发个人账号) 手动跑通后,上调度时一定要选用正确的ds租户再跑一次,否则容易在生产报 permission denied。 - 个人 unix 账号首次把项目部署到自己家目录后,需执行一次 `chmod +x bin/*.sh`,否则启动脚本跑不起来。 ## 4. 数据源账号(非 LDAP/Ranger 链路) DataX 采集需要访问外部数据源(PG / MySQL / MongoDB / ES 等),这些账号**不走 LDAP/Ranger**,而是以明文/加密形式存放在项目同级目录,按 `{db_type}/{env}-{实例简称}.ini` 扁平组织(不再按 env 分子目录)。完整目录结构见 `00-项目导览.md` §1。 由运维同学维护,**不纳入本仓库版本控制**。开发 DataX 作业时 sync ini 里 `dataSource = {db_type}/{env}-{实例简称}`,代码按首段斜杠定位 source ini。 ## 5. 相关公共文档 以下内容属于运维/安全范畴,保留在团队自建Docmost知识库,开发仅在排查权限问题时查阅: - CDH 整体权限策略设计(Linux 组 + HDFS ACL + Ranger 的分层策略) - Ranger 集成 CDH 6.3.2 落地方案 / 实施步骤 - Ranger 集成 LDAP(UserSync 配置) - Hue 集成 LDAP - Ranger 审计踩坑记录