如何创建一个锁定的python环境?

时间:2009-05-01 14:41:58

标签: python windows security excel

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

在与我的外国同行进行了一些令人沮丧的对话之后,他们似乎担心有人可能会滥用他们计算机上的python解释器来生成可能用于规避安全性的非标准应用程序。

我最初的建议就是取消对python.exe和pythonw.exe的执行权限:我们的应用程序是一个只使用Python DLL的Excel插件。这些exe文件实际上从未使用过。

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

我们可以采取哪些措施来防止我们想要安装的DLL被滥用?在这一点上,我没有想法。我需要找到一种方法来确保Python只运行我们的授权程序。

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

当Excel的VBA开放时,担心python显然没有意义,但这是公司政治,我的团队建议使用Python,所以我们需要证明我们的东西可以合理安全。

5 个答案:

答案 0 :(得分:9)

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

你无法赢得这场斗争。因为战斗是错误的。任何人都可以使用任何EXE或DLL。

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

您需要将“锁定”定义为“无法更改.PY文件”或“我们可以审核.PY文件的所有更改”。如果你将比赛场地转移到你可以控制的地方,那么你获胜的可能性很小。

获取规定 - 不要相信任何其他人为您解释它们。

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

答案 1 :(得分:3)

可悲的是,Python以这种方式不是很安全,而且这是众所周知的。它的动态特性与标准操作系统功能上的超薄层相结合,使得很难锁定。通常最好的选择是确保运行应用程序的用户拥有有限的权限,但我认为这是不切实际的。另一种方法是在虚拟机中运行它,潜在的损害至少限于该环境。

如果做不到这一点,有Python C API知识的人可以为你构建一个定制的.dll,明确限制特定Python解释器的范围,审查导入和文件写入等,但这需要对功能进行彻底的检查事后你需要并且不需要和一些同样彻底的测试。

答案 2 :(得分:3)

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

此外,还有一个模块可以导入以限制解释器写入文件。它被称为safelite

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

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

答案 3 :(得分:1)

遵循geordi方式。

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

答案 4 :(得分:0)

我同意您应该检查规则,看看他们实际需要什么。如果你确实需要一个“锁定”的Python DLL,这可能就是这样做的。它可能需要一段时间,并不容易做对。顺便说一句,因为这是理论上的,我挥舞着我的工作,从大块到琐碎的工作: - )。

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

因此你有:

  1. 从Python源构建私有构建。
  2. 在构建中,更改import语句以在导入时检查每个模块上的代码签名。
  3. 创建一个代码签名工具,对您使用的所有模块进行签名,并断言是安全的(也称为可信代码)。类似于__code_signature__ =“ABD03402340”;但在每个模块的__init__.py文件中加密安全。
  4. 创建一个私钥/公钥对,用于签署代码并保护私钥。
  5. 您可能不希望使用exec()或eval()类型功能对任何模块进行签名。
  6. 如果你可以使用IronPython,那么.NET的代码签名模型可能会有所帮助。

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