本文档风哥主要介绍Spark安全配置与权限管理,包括Spark安全概述、Kerberos认证、ACL权限、加密配置等内容,风哥教程参考Spark官方文档Security、Kerberos等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 Spark安全概述
Spark安全机制包括认证、授权、加密三个层面,保护集群和数据安全。学习交流加群风哥微信: itpux-com
- 认证:验证用户身份,支持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用户:拥有所有权限
– 其他用户:需要显式授权
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规划建议:
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规划建议:
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
Part03-生产环境项目实施方案
3.1 Kerberos认证配置
3.1.1 创建Kerberos Principal
$ 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
$ 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权限配置
$ 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配置
$ 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
Part04-生产案例与实战讲解
4.1 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
# 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认证失败
# 排查步骤
# 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 审计建议
审计建议:
- 启用事件日志记录
- 记录用户操作日志
- 定期审计权限配置
- 监控异常访问
5.3 工具推荐
安全管理工具:
- kadmin:Kerberos管理工具
- kinit/klist:Kerberos票据管理
- keytool:SSL证书管理
- Ranger:权限管理平台
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
