我怎样才能创build一个locking的Python环境?

我负责开发一个在世界各地设有办事处的金融机构使用的大型Python / Windows / Excel应用程序。 最近一个国家的法规已经发生了变化,因此我们被告知我们需要创build一个“locking”的版本。

经过与外国对手的一些令人沮丧的对话后,似乎他们担心有人可能会误用他们的计算机上的Python解释器来生成可能被用来规避安全性的非标准应用程序。

我最初的build议只是拿走python.exe和pythonw.exe的执行权限:我们的应用程序作为一个只使用Python DLL的Excel插件。 这些exe文件从来没有实际使用。

我的对手仍然担心有人可能会对Python DLL进行调用 – 黑客可能利用“exec”函数,例如来自其他编程语言或能够调用Windows DLL中的函数的虚拟机,例如VBA。

有什么我们可以做,以防止我们要安装的DLL被滥用? 在这一点上,我用尽了想法。 我需要find一种方法来确保Python只能运行我们的授权程序。

当然,这个问题有一个荒谬的元素:由于计算机都具有Excel和Word,所以它们都具有VBA,这是一种着名的脚本语言,在某种程度上与Python相当。

当Excel的VBA是广泛开放的时候,显然没有必要去担心python,但是这是公司政治,我的团队正在build议使用Python,所以我们需要certificate我们的东西可以合理安全。

“合理安全”被任意定义为“比Excel和VBA更安全”。

你不能赢得这场战斗。 因为战斗是错误的事情。 任何人都可以使用任何EXE或DLL。

您需要以不同的方式定义“锁定” – 以一种可以成功的方式。

您需要将“锁定”定义为“无法更改.PY文件”或“我们可以审核对.PY文件的所有更改”。 如果你把比赛场地转换成你能控制的东西,你就有一个获胜的小机会。

获取规定 – 不要相信任何人为你解释。

要绝对确定法规要求 – 不要听别人的解释。

可悲的是,Python这种方式并不是很安全,这是相当有名的。 它的动态特性与标准操作系统功能上的非常薄的层面相结合,使得难以锁定。 通常最好的选择是确保用户运行应用程序的权限有限,但我认为这是不实际的。 另一种方法是在虚拟机器上运行,潜在的破坏至少局限于该环境。

如果没有,那些熟悉Python的C API的人可以建立一个定制的.dll,明确地限制这个特定的Python解释器的范围,审查导入和文件写入等,但是这需要对你需要什么功能进行彻底的检查,事实上并不需要和一些同样彻底的测试。

一个想法是在.NET上的AppDomain中运行IronPython。 请参阅David W.的评论。

此外,还有一个模块可以导入,以限制解释器写入文件。 这就是所谓的安全 。

你可以使用它,并指出即使是Python的发明者也无法打破这个模块的安全性! (超过两次)

我知道写文件不是你唯一担心的安全问题。 但是你被要求做的是愚蠢的,所以希望问你的人会看到“安全的Python”并得到满足。

按照geordi的方式。

每个可疑的程序都在自己的监狱帐户中运行。 监视进程的系统调用(我知道如何在Windows中执行此操作,但这超出了此问题的范围),并在需要时终止进程。

我同意你应该检查规定,看看他们实际上需要什么。 如果你真的需要一个“锁定”的Python DLL,这是一个可能的方法。 这可能需要一段时间,并不容易得到正确的。 顺便说一句,既然这是理论上的,我挥舞着从大到小的不同工作:-)。

这个想法是修改Python.DLL,所以它只会导入已经由您的私钥签名的.py模块。 它通过使用公钥和代码签名来验证这一点,该代码签名存储在您通过编码签名工具添加到您信任的每个.py中的变量中。

因此你有:

  1. 从Python源代码构建一个私有的构建。
  2. 在您的构建中,更改导入语句以在导入时检查每个模块上的代码签名。
  3. 创建一个代码签名工具,签署你使用的所有模块,并声明是安全的(又名可信代码)。 像__code_signature__ =“ABD03402340”; 但是在每个模块的__init__.py文件中都是密码保护的。
  4. 创建一个私钥/公钥对来对代码进行签名并保护私钥。
  5. 您可能不希望用exec()或eval()类型的功能签署任何模块。

如果你可以使用IronPython,.NET的代码签名模型可能会有所帮助。

我不确定它是一个好主意,但是最终你可以断言你的Python.DLL版本只能运行你用你的私钥签名的代码。