【问题标题】:Can a Worker Role process call Antimalware for Azure Cloud Services programmatically?辅助角色进程能否以编程方式调用 Azure 云服务的反恶意软件?
【发布时间】:2015-05-05 22:41:07
【问题描述】:
我正在尝试找到一种解决方案,可用于对已上传到 Azure blob 存储的文件执行病毒扫描。我想知道是否可以将文件复制到工作角色实例上的本地存储,调用 Azure 云服务的反恶意软件以对特定文件执行扫描,然后根据文件是否干净,相应地处理文件.
如果 Worker Role 无法以编程方式调用扫描,是否有明确的方法来检查文件是否已被扫描以及在将文件复制到本地存储后是否干净(我不知道该服务是否添加新文件时是否进行实时扫描,或仅按计划运行)?
【问题讨论】:
标签:
azure
azure-worker-roles
【解决方案1】:
我认为让您了解的最佳方法是使用 Azure VM (IaaS) 并激活 Microsoft Antimalware 扩展。然后,您可以登录并针对该服务进行所有必要的检查和测试。
稍后,您会将所有这些应用到 Worker Role(有一个类似的 PaaS 扩展可用,称为 PaaSAntimalware)。
参见https://msdn.microsoft.com/en-us/library/azure/dn832621.aspx的下一段摘录:
“在 PaaS 中,VM 代理称为 GuestAgent,并且始终在 Web 和工作角色 VM 上可用。(有关详细信息,请参阅 Azure 角色架构。)角色 VM 的 VM 代理现在可以向云服务添加扩展虚拟机的方式与持久性虚拟机相同。
角色 VM 和持久 VM 上的 VM 扩展之间的最大区别在于,对于角色 VM,扩展首先添加到云服务中,然后再添加到该云服务中的部署中。
使用 Get-AzureServiceAvailableExtension cmdlet 列出所有可用的角色 VM 扩展。"
【解决方案2】:
我们没有找到直接的 API,但反恶意软件服务符合 Windows 桌面病毒检查器使用的标准,因为它们实现了 IAttachmentExecute COM API。
所以我们最终实现了一个文件上传服务,该服务将上传的文件写入隔离本地资源,然后调用IAttachmentExecute API。如果文件被感染,则根据使用的反恶意软件服务,它会抛出异常、静默删除文件或将其标记为不可访问。因此,通过尝试读取文件的第一个字节,我们可以测试文件是否仍然可以访问。
var type = Type.GetTypeFromCLSID(new Guid("4125DD96-E03A-4103-8F70-E0597D803B9C"));
var svc = (IAttachmentExecute)Activator.CreateInstance(type);
try {
svc.SetClientGuid(ref clientGuid);
svc.SetLocalPath(path);
svc.Save();
}
finally
{
svc.ClearClientState();
}
using (var fileStream = File.OpenRead(path))
{
fileStream.ReadByte();
}
[Guid("73DB1241-1E85-4581-8E4F-A81E1D0F8C57")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IAttachmentExecute
{
void SetClientGuid(ref Guid guid);
void SetLocalPath(string pszLocalPath);
void Save();
void ClearClientState();
}
【讨论】:
-
我无法让此代码按其编写方式工作 - 我收到错误消息“无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“IAttachmentExecute”。 [...为简洁而省略...] 不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE())。但是,这个问题stackoverflow.com/a/4516938/4633714 使我对同一想法的实现略有不同。我能够让它在我的开发机器上本地运行的 Worker Role 上工作。稍后我将在 Azure 上进行测试并报告我的结果。