1. 首页 > Hadoop教程 > 正文

大数据教程FG069-Spark安全配置与权限管理

本文档风哥主要介绍Spark安全配置与权限管理,包括Spark安全概述、Kerberos认证、ACL权限、加密配置等内容,风哥教程参考Spark官方文档Security、Kerberos等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 Spark安全概述

Spark安全机制包括认证、授权、加密三个层面,保护集群和数据安全。学习交流加群风哥微信: itpux-com

Spark安全组件:

  • 认证:验证用户身份,支持Kerberos、Token等
  • 授权:控制访问权限,支持ACL
  • 加密:数据传输加密,支持SSL/TLS
  • 审计:记录操作日志

1.2 认证机制详解

Spark认证机制详解:

# 认证类型

1. 共享密钥认证
– 简单配置
– 组件间通信认证
– 适合小型集群

2. Kerberos认证
– 企业级认证
– 强身份验证
– 适合生产环境

3. Token认证
– 临时凭证
– 避免频繁Kerberos认证
– 提高性能

# 认证配置
# 共享密钥认证
spark.authenticate=true
spark.authenticate.secret=fgedu-secret-key

# Kerberos认证
spark.security.credentials.enabled=true
spark.kerberos.principal=spark/fgedu.net.cn@FGEDU.NET.CN
spark.kerberos.keytab=/etc/security/keytabs/spark.service.keytab

# 认证流程
1. 用户获取Kerberos票据
2. Spark使用票据访问Hadoop服务
3. 生成Token用于组件间通信
4. Token过期后重新获取

# 认证组件
– Spark RPC:组件间通信
– Spark UI:Web界面访问
– Block Transfer:数据传输
– External Shuffle:Shuffle服务

1.3 授权机制详解

Spark授权机制详解:

# 授权类型

1. ACL授权
– 访问控制列表
– 控制谁可以访问
– 支持用户和组

2. 权限控制
– 修改应用权限
– 查看应用权限
– 提交应用权限

# ACL配置
spark.acls.enable=true
spark.admin.acls=sparkadmin,fgeduadmin
spark.admin.acls.groups=sparkadmin,fgeduadmin
spark.modify.acls=sparkuser,fgeduuser
spark.modify.acls.groups=sparkusers,fgeduusers
spark.ui.acls.enable=true
spark.ui.view.acls=sparkuser,fgeduuser
spark.ui.view.acls.groups=sparkusers,fgeduusers

# 权限级别
– Admin:管理员权限,可以操作所有应用
– Modify:修改权限,可以修改自己的应用
– View:查看权限,可以查看应用信息

# 默认权限
– 应用提交者:拥有所有权限
– Admin用户:拥有所有权限
– 其他用户:需要显式授权

风哥提示:生产环境建议启用Kerberos认证和ACL授权,确保集群安全。Kerberos提供强身份验证,ACL提供细粒度权限控制。

Part02-生产环境规划与建议

2.1 安全架构规划

安全架构规划建议:

# 安全架构层次

1. 网络层安全
– 防火墙规则
– 网络隔离
– 端口控制

2. 认证层安全
– Kerberos认证
– 用户身份验证
– 服务间认证

3. 授权层安全
– ACL权限控制
– 资源访问控制
– 操作权限控制

4. 数据层安全
– 传输加密
– 存储加密
– 数据脱敏

# 安全架构图
┌─────────────────────────────────────────┐
│ 用户层 │
│ 用户认证 │ 权限申请 │ 访问控制 │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│ 认证层 │
│ Kerberos │ Token │ ACL │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│ 服务层 │
│ Spark │ Hadoop │ Hive │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│ 数据层 │
│ HDFS │ Kafka │ 数据库 │
└─────────────────────────────────────────┘

# 安全配置清单
1. 启用Kerberos认证
2. 配置ACL权限
3. 启用SSL加密
4. 配置审计日志
5. 定期安全扫描

2.2 Kerberos规划

Kerberos规划建议:

# Kerberos规划要点

1. KDC服务器
– 至少2台KDC(主备)
– 独立部署或与Hadoop共用
– 时间同步(NTP)

2. Realm规划
– Realm名称:FGEDU.NET.CN
– 与DNS域名一致

3. Principal规划
– 服务Principal:spark/fgedu.net.cn@FGEDU.NET.CN
– 用户Principal:fgeduuser@FGEDU.NET.CN
– HTTP Principal:HTTP/fgedu.net.cn@FGEDU.NET.CN

4. Keytab文件
– 存储路径:/etc/security/keytabs/
– 权限:600
– 定期更新

# Principal命名规范
服务类型/主机名@REALM

示例:
spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN
spark/fgedu-spark-worker1.fgedu.net.cn@FGEDU.NET.CN
HTTP/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN

# 用户Principal
fgeduuser@FGEDU.NET.CN
fgeduadmin@FGEDU.NET.CN

2.3 ACL规划

ACL规划建议:

# ACL规划要点

1. 用户组规划
– sparkadmin:Spark管理员组
– sparkusers:Spark用户组
– fgeduadmin:业务管理员组
– fgeduusers:业务用户组

2. 权限矩阵
| 用户组 | Admin | Modify | View |
|————-|——-|——–|——|
| sparkadmin | ✓ | ✓ | ✓ |
| fgeduadmin | ✓ | ✓ | ✓ |
| sparkusers | ✗ | ✓ | ✓ |
| fgeduusers | ✗ | ✓ | ✓ |

3. 资源隔离
– 不同业务使用不同队列
– 不同用户使用不同数据库
– 敏感数据单独授权

# ACL配置示例
spark.acls.enable=true
spark.admin.acls.groups=sparkadmin,fgeduadmin
spark.modify.acls.groups=sparkusers,fgeduusers
spark.ui.view.acls.groups=sparkusers,fgeduusers

生产环境建议:生产环境建议启用完整的安全机制,包括Kerberos认证、ACL授权、SSL加密。定期审计安全配置,及时更新密钥和证书。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 Kerberos认证配置

3.1.1 创建Kerberos Principal

# 登录KDC服务器
$ kadmin.local

# 创建Spark服务Principal
kadmin.local: addprinc -randkey spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN

WARNING: no policy specified for spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN; defaulting to no policy
Principal “spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN” created.

kadmin.local: addprinc -randkey spark/fgedu-spark-worker1.fgedu.net.cn@FGEDU.NET.CN
Principal “spark/fgedu-spark-worker1.fgedu.net.cn@FGEDU.NET.CN” created.

kadmin.local: addprinc -randkey spark/fgedu-spark-worker2.fgedu.net.cn@FGEDU.NET.CN
Principal “spark/fgedu-spark-worker2.fgedu.net.cn@FGEDU.NET.CN” created.

# 创建HTTP Principal
kadmin.local: addprinc -randkey HTTP/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN
Principal “HTTP/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN” created.

# 创建用户Principal
kadmin.local: addprinc fgeduuser@FGEDU.NET.CN
Enter password for principal “fgeduuser@FGEDU.NET.CN”:
Re-enter password for principal “fgeduuser@FGEDU.NET.CN”:
Principal “fgeduuser@FGEDU.NET.CN” created.

# 生成Keytab文件
kadmin.local: xst -k /etc/security/keytabs/spark.service.keytab spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN

Entry for principal spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/keytabs/spark.service.keytab.

kadmin.local: xst -k /etc/security/keytabs/spark-http.keytab HTTP/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN

# 查看Keytab
kadmin.local: listprincs
spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN
spark/fgedu-spark-worker1.fgedu.net.cn@FGEDU.NET.CN
spark/fgedu-spark-worker2.fgedu.net.cn@FGEDU.NET.CN
HTTP/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN
fgeduuser@FGEDU.NET.CN

# 设置Keytab权限
$ chown spark:hadoop /etc/security/keytabs/spark.service.keytab
$ chmod 600 /etc/security/keytabs/spark.service.keytab

3.1.2 配置Spark Kerberos

# 配置spark-defaults.conf
$ cat > /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' # Kerberos认证 spark.security.credentials.enabled=true spark.kerberos.principal=spark/_HOST@FGEDU.NET.CN spark.kerberos.keytab=/etc/security/keytabs/spark.service.keytab spark.kerberos.renewal.credentials=keytab # 认证配置 spark.authenticate=true spark.authenticate.secret=fgedu-spark-secret # ACL配置 spark.acls.enable=true spark.admin.acls=sparkadmin,fgeduadmin spark.admin.acls.groups=sparkadmin,fgeduadmin spark.modify.acls.groups=sparkusers,fgeduusers spark.ui.view.acls.groups=sparkusers,fgeduusers # UI安全 spark.ui.acls.enable=true spark.ui.filters=org.apache.spark.ui.security.SparkUIAuthFilter spark.ui.security.realm=FGEDU.NET.CN spark.ui.security.keytab=/etc/security/keytabs/spark-http.keytab spark.ui.security.principal=HTTP/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN EOF # 配置spark-env.sh $ cat >> /bigdata/app/spark/conf/spark-env.sh << 'EOF' # Kerberos配置 export SPARK_HISTORY_OPTS="-Dspark.kerberos.principal=spark/_HOST@FGEDU.NET.CN -Dspark.kerberos.keytab=/etc/security/keytabs/spark.service.keytab" EOF # 启动Spark服务 $ kinit -kt /etc/security/keytabs/spark.service.keytab spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN $ /bigdata/app/spark/sbin/start-master.sh starting org.apache.spark.deploy.master.Master, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.master.Master-1-fgedu-spark-master.out # 验证Kerberos认证 $ klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: spark/fgedu-spark-master.fgedu.net.cn@FGEDU.NET.CN Valid starting Expires Service principal 04/08/2026 13:00:00 04/09/2026 13:00:00 krbtgt/FGEDU.NET.CN@FGEDU.NET.CN

3.2 ACL权限配置

# 配置ACL
$ cat >> /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' # ACL配置 spark.acls.enable=true spark.admin.acls=sparkadmin,fgeduadmin spark.admin.acls.groups=sparkadmin,fgeduadmin spark.modify.acls=sparkuser,fgeduuser spark.modify.acls.groups=sparkusers,fgeduusers spark.ui.acls.enable=true spark.ui.view.acls=sparkuser,fgeduuser spark.ui.view.acls.groups=sparkusers,fgeduusers # 黑名单 spark.blacklist.acls=baduser spark.blacklist.acls.groups=badusers EOF # 创建用户组 $ groupadd sparkadmin $ groupadd sparkusers $ groupadd fgeduadmin $ groupadd fgeduusers # 添加用户到组 $ usermod -aG sparkadmin sparkadmin $ usermod -aG sparkusers sparkuser $ usermod -aG fgeduadmin fgeduadmin $ usermod -aG fgeduusers fgeduuser # 提交应用测试 $ kinit fgeduuser@FGEDU.NET.CN Password for fgeduuser@FGEDU.NET.CN: $ /bigdata/app/spark/bin/spark-submit \ --master spark://192.168.1.60:7077 \ --principal fgeduuser@FGEDU.NET.CN \ --keytab /etc/security/keytabs/fgeduuser.keytab \ --class com.fgedu.spark.FgeduApp \ /bigdata/spark-apps/fgedu-app.jar # 查看应用权限 $ curl --negotiate -u : http://192.168.1.60:8080/api/v1/applications/app-20260408130000-0001 { "id" : "app-20260408130000-0001", "name" : "fgedu-app", "attempts" : [ { "startTime" : "2026-04-08T13:00:00.000Z", "endTime" : "2026-04-08T13:30:00.000Z", "sparkUser" : "fgeduuser" } ] }

3.3 加密配置

3.3.1 SSL/TLS配置

# 生成SSL证书
$ keytool -genkeypair -alias spark \
-keyalg RSA -keysize 2048 \
-dname “CN=fgedu-spark-master.fgedu.net.cn,OU=Spark,O=FGEDU,L=Beijing,ST=Beijing,C=CN” \
-validity 365 -keystore /etc/security/ssl/spark-keystore.jks \
-storepass fgedu123 -keypass fgedu123

# 导出证书
$ keytool -exportcert -alias spark \
-keystore /etc/security/ssl/spark-keystore.jks \
-file /etc/security/ssl/spark-cert.cer \
-storepass fgedu123

# 导入信任证书
$ keytool -importcert -alias spark \
-file /etc/security/ssl/spark-cert.cer \
-keystore /etc/security/ssl/spark-truststore.jks \
-storepass fgedu123 -noprompt

# 配置SSL
$ cat >> /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' # SSL配置 spark.ssl.enabled=true spark.ssl.keyPassword=fgedu123 spark.ssl.keyStore=/etc/security/ssl/spark-keystore.jks spark.ssl.keyStorePassword=fgedu123 spark.ssl.trustStore=/etc/security/ssl/spark-truststore.jks spark.ssl.trustStorePassword=fgedu123 spark.ssl.protocol=TLSv1.2 # 启用各组件SSL spark.ssl.enabledAlgorithms=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA spark.ui.https.enabled=true spark.ui.ssl.enabled=true EOF # 配置加密传输 $ cat >> /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' # 数据传输加密 spark.io.encryption.enabled=true spark.io.encryption.keySizeBits=128 spark.io.encryption.keygen.algorithm=HmacSHA1 # RPC加密 spark.network.crypto.enabled=true spark.network.crypto.saslFallback=false # Shuffle加密 spark.shuffle.encryption.enabled=true EOF # 重启Spark服务 $ /bigdata/app/spark/sbin/stop-master.sh $ /bigdata/app/spark/sbin/start-master.sh # 验证SSL $ curl -k https://192.168.1.60:8080

Spark Master at spark://192.168.1.60:7077

风哥提示:生产环境建议启用SSL加密,保护数据传输安全。证书应从正规CA获取或使用企业内部CA签发。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 Kerberos认证案例

# 完整Kerberos认证流程

# 1. 用户获取票据
$ kinit fgeduuser@FGEDU.NET.CN
Password for fgeduuser@FGEDU.NET.CN:

# 2. 验证票据
$ klist

Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: fgeduuser@FGEDU.NET.CN

Valid starting Expires Service principal
04/08/2026 13:00:00 04/09/2026 13:00:00 krbtgt/FGEDU.NET.CN@FGEDU.NET.CN

# 3. 提交Spark应用
$ /bigdata/app/spark/bin/spark-submit \
–master yarn \
–deploy-mode client \
–principal fgeduuser@FGEDU.NET.CN \
–keytab /etc/security/keytabs/fgeduuser.keytab \
–class com.fgedu.spark.FgeduApp \
/bigdata/spark-apps/fgedu-app.jar

2026-04-08 13:00:00 INFO SparkContext:54 – Running Spark version 3.5.1
2026-04-08 13:00:01 INFO SecurityManager:54 – SecurityManager: authentication enabled=true
2026-04-08 13:00:02 INFO SparkContext:54 – Kerberos principal: fgeduuser@FGEDU.NET.CN
2026-04-08 13:00:03 INFO SparkContext:54 – Kerberos keytab: /etc/security/keytabs/fgeduuser.keytab

2026-04-08 13:00:30 INFO Client:54 – Application report for application_1680940800000_0001 (state: RUNNING)

# 4. 访问HDFS
$ hdfs dfs -ls /user/fgeduuser

Found 2 items
drwxr-xr-x – fgeduuser fgeduusers 0 2026-04-08 13:00 /user/fgeduuser/data
drwxr-xr-x – fgeduuser fgeduusers 0 2026-04-08 13:00 /user/fgeduuser/output

# 5. 销毁票据
$ kdestroy

# 自动续期配置
spark.kerberos.renewal.credentials=keytab
spark.kerberos.renewal.time=1h

4.2 多租户隔离案例

# 多租户隔离配置

# 1. 创建租户用户
kadmin.local: addprinc tenant1@FGEDU.NET.CN
kadmin.local: addprinc tenant2@FGEDU.NET.CN

# 2. 创建租户组
$ groupadd tenant1users
$ groupadd tenant2users

# 3. 配置队列隔离
# capacity-scheduler.xml yarn.scheduler.capacity.root.queues
tenant1,tenant2
yarn.scheduler.capacity.root.tenant1.capacity
50
yarn.scheduler.capacity.root.tenant2.capacity
50

# 4. 配置HDFS隔离
$ hdfs dfs -mkdir /user/tenant1
$ hdfs dfs -mkdir /user/tenant2
$ hdfs dfs -chown tenant1:tenant1users /user/tenant1
$ hdfs dfs -chown tenant2:tenant2users /user/tenant2
$ hdfs dfs -chmod 700 /user/tenant1
$ hdfs dfs -chmod 700 /user/tenant2

# 5. 配置Hive隔离
scala> spark.sql(“CREATE DATABASE tenant1_db”)
scala> spark.sql(“CREATE DATABASE tenant2_db”)
scala> spark.sql(“GRANT ALL ON DATABASE tenant1_db TO USER tenant1”)
scala> spark.sql(“GRANT ALL ON DATABASE tenant2_db TO USER tenant2”)

# 6. 提交租户应用
$ kinit tenant1@FGEDU.NET.CN

$ spark-submit \
–master yarn \
–queue tenant1 \
–principal tenant1@FGEDU.NET.CN \
–keytab /etc/security/keytabs/tenant1.keytab \
/bigdata/spark-apps/tenant1-app.jar

# 7. 验证隔离
# tenant1只能访问自己的队列和数据
$ yarn application -list -appStates RUNNING

Total number of applications (application types: [] and states: [RUNNING]):1
Application-Id Application-Name
application_1680940800000_0001 tenant1-app

4.3 常见问题处理

4.3.1 Kerberos认证失败

# 问题现象:Kerberos认证失败

# 排查步骤
# 1. 检查票据
$ klist

# 2. 检查时间同步
$ ntpdate -q 192.168.1.1

# 3. 检查Principal
$ kadmin.local -q “listprincs”

# 解决方案
# 1. 同步时间
$ ntpdate 192.168.1.1

# 2. 重新获取票据
$ kdestroy
$ kinit fgeduuser@FGEDU.NET.CN

# 3. 检查krb5.conf
[libdefaults]
default_realm = FGEDU.NET.CN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d

[realms]
FGEDU.NET.CN = {
kdc = kdc1.fgedu.net.cn
kdc = kdc2.fgedu.net.cn
admin_server = kdc1.fgedu.net.cn
}

4.3.2 权限不足问题

# 问题现象:权限不足

# 排查步骤
# 1. 检查ACL配置
$ cat /bigdata/app/spark/conf/spark-defaults.conf | grep acl

# 2. 检查用户组
$ groups fgeduuser

# 3. 检查HDFS权限
$ hdfs dfs -ls /user/fgeduuser

# 解决方案
# 1. 添加用户到组
$ usermod -aG fgeduusers fgeduuser

# 2. 修改ACL配置
spark.modify.acls.groups=sparkusers,fgeduusers

# 3. 修改HDFS权限
$ hdfs dfs -chmod 755 /user/fgeduuser
$ hdfs dfs -chown fgeduuser:fgeduusers /user/fgeduuser

Part05-风哥经验总结与分享

5.1 安全最佳实践

Spark安全最佳实践建议:

# 安全最佳实践
1. 启用Kerberos认证
2. 配置ACL权限控制
3. 启用SSL加密传输
4. 定期更新密钥和证书
5. 启用审计日志
6. 最小权限原则
7. 网络隔离
8. 定期安全扫描

5.2 审计建议

审计建议:

Spark审计建议:

  • 启用事件日志记录
  • 记录用户操作日志
  • 定期审计权限配置
  • 监控异常访问

5.3 工具推荐

安全管理工具:

  • kadmin:Kerberos管理工具
  • kinit/klist:Kerberos票据管理
  • keytool:SSL证书管理
  • Ranger:权限管理平台
风哥提示:安全是大数据平台的重要基础,生产环境必须启用完整的安全机制。建议结合Ranger等权限管理平台实现更细粒度的权限控制。from bigdata视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息