如何在Databricks集群/工作区级别禁用指定危险命令?
在Databricks集群/工作区禁用特定危险命令的方法
一、禁用dbutils.fs.rm的方案
1. 集群初始化脚本覆盖方法
通过集群初始化脚本,在集群启动时重写dbutils.fs.rm方法,使其无法执行删除操作:
- Python 初始化脚本示例:
将以下代码保存为DBFS路径下的脚本(如dbfs:/scripts/disable_rm.py),然后在集群配置的「初始化脚本」中添加该路径:def blocked_rm(path, recursive=False): raise Exception("`dbutils.fs.rm` has been disabled for security purposes.") dbutils.fs.rm = blocked_rm - Scala 初始化脚本示例:
若集群以Scala为主,可通过Shell脚本调用Spark执行覆盖逻辑,保存为dbfs:/scripts/disable_rm_scala.sh:
同样在集群初始化脚本中配置该Shell脚本路径。#!/bin/bash spark-shell -e ' dbutils.fs.rm = (path: String, recursive: Boolean) => throw new Exception("`dbutils.fs.rm` has been disabled for security purposes.") '
2. 工作区策略细粒度限制
在Databricks管理控制台的「工作区策略」中添加规则,直接禁止调用dbutils.fs.rm:
{ "actions": [ { "action": "deny", "operation": "execute", "object": "dbutils.fs.rm" } ] }
该策略会作用于整个工作区的所有集群,无需逐个配置集群。
二、禁用Python/Scala中的危险删除命令
1. 重写核心删除方法
针对Python的os.remove、shutil.rmtree或Scala的java.io.File.delete等方法,同样通过初始化脚本重写:
- Python 示例:
import os import shutil # 禁用os.remove original_remove = os.remove def blocked_remove(path): raise PermissionError("File deletion via `os.remove` is disabled.") os.remove = blocked_remove # 禁用shutil.rmtree original_rmtree = shutil.rmtree def blocked_rmtree(path): raise PermissionError("Directory deletion via `shutil.rmtree` is disabled.") shutil.rmtree = blocked_rmtree - Scala 示例:
在初始化脚本中通过Spark执行:import java.io.File val originalDelete = File.delete _ def blockedDelete(file: File): Boolean = { throw new Exception("File deletion via `File.delete` is disabled.") false } File.delete = blockedDelete
2. 限制代码执行权限
将集群设置为「安全模式」,仅允许用户执行预定义的代码或使用指定库,禁止自定义代码执行。此方法较为严格,适合高安全需求的场景。
三、优化已有的%sh rm禁用策略
若已禁用Shell的rm命令,可进一步通过工作区策略限制%sh魔术命令的使用:
- 仅禁止
%sh rm:{ "actions": [ { "action": "deny", "operation": "execute", "object": "%sh rm" } ] } - 完全禁用
%sh命令(若业务允许):{ "actions": [ { "action": "deny", "operation": "execute", "object": "%sh" } ] }
内容的提问来源于stack exchange,提问作者pallavi vetal
相关产品推荐
相关产品推荐

