Benjamin Herrenschmidt
2018-Aug-05 04:52 UTC
[RFC 0/4] Virtio uses DMA API for all devices
On Sun, 2018-08-05 at 03:22 +0300, Michael S. Tsirkin wrote:> I see the allure of this, but I think down the road you will > discover passing a flag in libvirt XML saying > "please use a secure mode" or whatever is a good idea. > > Even thought it is probably not required to address this > specific issue. > > For example, I don't think ballooning works in secure mode, > you will be able to teach libvirt not to try to add a > balloon to the guest.Right, we'll need some quirk to disable balloons in the guest I suppose. Passing something from libvirt is cumbersome because the end user may not even need to know about secure VMs. There are use cases where the security is a contract down to some special application running inside the secure VM, the sysadmin knows nothing about. Also there's repercussions all the way to admin tools, web UIs etc... so it's fairly wide ranging. So as long as we only need to quirk a couple of devices, it's much better contained that way.> > Later on, (we may have even already run Linux at that point, > > unsecurely, as we can use Linux as a bootloader under some > > circumstances), we start a "secure image". > > > > This is a kernel zImage that includes a "ticket" that has the > > appropriate signature etc... so that when that kernel starts, it can > > authenticate with the ultravisor, be verified (along with its ramdisk) > > etc... and copied (by the UV) into secure memory & run from there. > > > > At that point, the hypervisor is informed that the VM has become > > secure. > > > > So at that point, we could exit to qemu to inform it of the change, > > That's probably a good idea too.We probably will have to tell qemu eventually for migration, as we'll need some kind of key exchange phase etc... to deal with the crypto aspects (the actual page copy is sorted via encrypting the secure pages back to normal pages in qemu, but we'll need extra metadata).> > and > > have it walk the qtree and "Switch" all the virtio devices to use the > > IOMMU I suppose, but it feels a lot grosser to me. > > That part feels gross, yes. > > > That's the only other option I can think of. > > > > > However in this specific case, the flag does not need to come from the > > > hypervisor, it can be set by arch boot code I think. > > > Christoph do you see a problem with that? > > > > The above could do that yes. Another approach would be to do it from a > > small virtio "quirk" that pokes a bit in the device to force it to > > iommu mode when it detects that we are running in a secure VM. That's a > > bit warty on the virito side but probably not as much as having a qemu > > one that walks of the virtio devices to change how they behave. > > > > What do you reckon ? > > I think you are right that for the dma limit the hypervisor doesn't seem > to need to know.It's not just a limit mind you. It's a range, at least if we allocate just a single pool of insecure pages. swiotlb feels like a better option for us.> > What we want to avoid is to expose any of this to the *end user* or > > libvirt or any other higher level of the management stack. We really > > want that stuff to remain contained between the VM itself, KVM and > > maybe qemu. > > > > We will need some other qemu changes for migration so that's ok. But > > the minute you start touching libvirt and the higher levels it becomes > > a nightmare. > > > > Cheers, > > Ben. > > I don't believe you'll be able to avoid that entirely. The split between > libvirt and qemu is more about community than about code, random bits of > functionality tend to land on random sides of that fence. Better add a > tag in domain XML early is my advice. Having said that, it's your > hypervisor. I'm just suggesting that when hypervisor does somehow need > to care then I suspect most people won't be receptive to the argument > that changing libvirt is a nightmare.It only needs to care at runtime. The problem isn't changing libvirt per-se, I don't have a problem with that. The problem is that it means creating two categories of machines "secure" and "non-secure", which is end-user visible, and thus has to be escalated to all the various management stacks, UIs, etc... out there. In addition, there are some cases where the individual creating the VMs may not have any idea that they are secure. But yes, if we have to, we'll do it. However, so far, we don't think it's a great idea. Cheers, Ben.> > > > > To get swiotlb you'll need to then use the DT/ACPI > > > > > dma-range property to limit the addressable range, and a swiotlb > > > > > capable plaform will use swiotlb automatically. > > > > > > > > This cannot be done as you describe it. > > > > > > > > The VM is created as a *normal* VM. The DT stuff is generated by qemu > > > > at a point where it has *no idea* that the VM will later become secure > > > > and thus will have to restrict which pages can be used for "DMA". > > > > > > > > The VM will *at runtime* turn itself into a secure VM via interactions > > > > with the security HW and the Ultravisor layer (which sits below the > > > > HV). This happens way after the DT has been created and consumed, the > > > > qemu devices instanciated etc... > > > > > > > > Only the guest kernel knows because it initates the transition. When > > > > that happens, the virtio devices have already been used by the guest > > > > firmware, bootloader, possibly another kernel that kexeced the "secure" > > > > one, etc... > > > > > > > > So instead of running around saying NAK NAK NAK, please explain how we > > > > can solve that differently. > > > > > > > > Ben.
On Sun, Aug 05, 2018 at 02:52:54PM +1000, Benjamin Herrenschmidt wrote:> On Sun, 2018-08-05 at 03:22 +0300, Michael S. Tsirkin wrote: > > I see the allure of this, but I think down the road you will > > discover passing a flag in libvirt XML saying > > "please use a secure mode" or whatever is a good idea. > > > > Even thought it is probably not required to address this > > specific issue. > > > > For example, I don't think ballooning works in secure mode, > > you will be able to teach libvirt not to try to add a > > balloon to the guest. > > Right, we'll need some quirk to disable balloons in the guest I > suppose. > > Passing something from libvirt is cumbersome because the end user may > not even need to know about secure VMs. There are use cases where the > security is a contract down to some special application running inside > the secure VM, the sysadmin knows nothing about. > > Also there's repercussions all the way to admin tools, web UIs etc... > so it's fairly wide ranging. > > So as long as we only need to quirk a couple of devices, it's much > better contained that way.So just the balloon thing already means that yes management and all the way to the user tools must know this is going on. Otherwise user will try to inflate the balloon and wonder why this does not work.> > > Later on, (we may have even already run Linux at that point, > > > unsecurely, as we can use Linux as a bootloader under some > > > circumstances), we start a "secure image". > > > > > > This is a kernel zImage that includes a "ticket" that has the > > > appropriate signature etc... so that when that kernel starts, it can > > > authenticate with the ultravisor, be verified (along with its ramdisk) > > > etc... and copied (by the UV) into secure memory & run from there. > > > > > > At that point, the hypervisor is informed that the VM has become > > > secure. > > > > > > So at that point, we could exit to qemu to inform it of the change, > > > > That's probably a good idea too. > > We probably will have to tell qemu eventually for migration, as we'll > need some kind of key exchange phase etc... to deal with the crypto > aspects (the actual page copy is sorted via encrypting the secure pages > back to normal pages in qemu, but we'll need extra metadata). > > > > and > > > have it walk the qtree and "Switch" all the virtio devices to use the > > > IOMMU I suppose, but it feels a lot grosser to me. > > > > That part feels gross, yes. > > > > > That's the only other option I can think of. > > > > > > > However in this specific case, the flag does not need to come from the > > > > hypervisor, it can be set by arch boot code I think. > > > > Christoph do you see a problem with that? > > > > > > The above could do that yes. Another approach would be to do it from a > > > small virtio "quirk" that pokes a bit in the device to force it to > > > iommu mode when it detects that we are running in a secure VM. That's a > > > bit warty on the virito side but probably not as much as having a qemu > > > one that walks of the virtio devices to change how they behave. > > > > > > What do you reckon ? > > > > I think you are right that for the dma limit the hypervisor doesn't seem > > to need to know. > > It's not just a limit mind you. It's a range, at least if we allocate > just a single pool of insecure pages. swiotlb feels like a better > option for us. > > > > What we want to avoid is to expose any of this to the *end user* or > > > libvirt or any other higher level of the management stack. We really > > > want that stuff to remain contained between the VM itself, KVM and > > > maybe qemu. > > > > > > We will need some other qemu changes for migration so that's ok. But > > > the minute you start touching libvirt and the higher levels it becomes > > > a nightmare. > > > > > > Cheers, > > > Ben. > > > > I don't believe you'll be able to avoid that entirely. The split between > > libvirt and qemu is more about community than about code, random bits of > > functionality tend to land on random sides of that fence. Better add a > > tag in domain XML early is my advice. Having said that, it's your > > hypervisor. I'm just suggesting that when hypervisor does somehow need > > to care then I suspect most people won't be receptive to the argument > > that changing libvirt is a nightmare. > > It only needs to care at runtime. The problem isn't changing libvirt > per-se, I don't have a problem with that. The problem is that it means > creating two categories of machines "secure" and "non-secure", which is > end-user visible, and thus has to be escalated to all the various > management stacks, UIs, etc... out there. > > In addition, there are some cases where the individual creating the VMs > may not have any idea that they are secure. > > But yes, if we have to, we'll do it. However, so far, we don't think > it's a great idea. > > Cheers, > Ben.Here's another example: you can't migrate a secure vm to hypervisor which doesn't support this feature. Again management tools above libvirt need to know otherwise they will try.> > > > > > To get swiotlb you'll need to then use the DT/ACPI > > > > > > dma-range property to limit the addressable range, and a swiotlb > > > > > > capable plaform will use swiotlb automatically. > > > > > > > > > > This cannot be done as you describe it. > > > > > > > > > > The VM is created as a *normal* VM. The DT stuff is generated by qemu > > > > > at a point where it has *no idea* that the VM will later become secure > > > > > and thus will have to restrict which pages can be used for "DMA". > > > > > > > > > > The VM will *at runtime* turn itself into a secure VM via interactions > > > > > with the security HW and the Ultravisor layer (which sits below the > > > > > HV). This happens way after the DT has been created and consumed, the > > > > > qemu devices instanciated etc... > > > > > > > > > > Only the guest kernel knows because it initates the transition. When > > > > > that happens, the virtio devices have already been used by the guest > > > > > firmware, bootloader, possibly another kernel that kexeced the "secure" > > > > > one, etc... > > > > > > > > > > So instead of running around saying NAK NAK NAK, please explain how we > > > > > can solve that differently. > > > > > > > > > > Ben.
Benjamin Herrenschmidt
2018-Aug-06 19:56 UTC
[RFC 0/4] Virtio uses DMA API for all devices
On Mon, 2018-08-06 at 16:46 +0300, Michael S. Tsirkin wrote:> > > Right, we'll need some quirk to disable balloons in the guest I > > suppose. > > > > Passing something from libvirt is cumbersome because the end user may > > not even need to know about secure VMs. There are use cases where the > > security is a contract down to some special application running inside > > the secure VM, the sysadmin knows nothing about. > > > > Also there's repercussions all the way to admin tools, web UIs etc... > > so it's fairly wide ranging. > > > > So as long as we only need to quirk a couple of devices, it's much > > better contained that way. > > So just the balloon thing already means that yes management and all the > way to the user tools must know this is going on. Otherwise > user will try to inflate the balloon and wonder why this does not work.There is *dozens* of management systems out there, not even all open source, we won't ever be able to see the end of the tunnel if we need to teach every single of them, including end users, about platform specific new VM flags like that. .../...> Here's another example: you can't migrate a secure vm to hypervisor > which doesn't support this feature. Again management tools above libvirt > need to know otherwise they will try.There will have to be a new machine type for that I suppose, yes, though it's not just the hypervisor that needs to know about the modified migration stream, it's also the need to have a compatible ultravisor with the right keys on the other side. So migration is going to be special and require extra admin work in all cases yes. But not all secure VMs are meant to be migratable. In any case, back to the problem at hand. What a qemu flag gives us is just a way to force iommu at VM creation time. This is rather sub-optimal, we don't really want the iommu in the way, so it's at best a "workaround", and it's not really solving the real problem. As I said replying to Christoph, we are "leaking" into the interface something here that is really what's the VM is doing to itself, which is to stash its memory away in an inaccessible place. Cheers, Ben.