mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-05-03 05:57:25 +00:00
runtime: Enable choice between AMD SEV and SNP
This is based on a patch from @niteeshkd that adds a config parameter to choose between AMD SEV and SEV-SNP VMs as the confidential guest type in case both types are supported. SEV is the default. Signed-off-by: Joana Pecholt <joana.pecholt@aisec.fraunhofer.de>
This commit is contained in:
parent
22bda0838c
commit
ded60173d4
@ -34,6 +34,12 @@ machine_type = "@MACHINETYPE@"
|
|||||||
# Default false
|
# Default false
|
||||||
# confidential_guest = true
|
# confidential_guest = true
|
||||||
|
|
||||||
|
# Choose AMD SEV-SNP confidential guests
|
||||||
|
# In case of using confidential guests on AMD hardware that supports both SEV
|
||||||
|
# and SEV-SNP, the following enables SEV-SNP guests. SEV guests are default.
|
||||||
|
# Default false
|
||||||
|
# sev_snp_guest = true
|
||||||
|
|
||||||
# Enable running QEMU VMM as a non-root user.
|
# Enable running QEMU VMM as a non-root user.
|
||||||
# By default QEMU VMM run as root. When this is set to true, QEMU VMM process runs as
|
# By default QEMU VMM run as root. When this is set to true, QEMU VMM process runs as
|
||||||
# a non-root random user. See documentation for the limitations of this mode.
|
# a non-root random user. See documentation for the limitations of this mode.
|
||||||
|
@ -86,6 +86,7 @@ const defaultVhostUserStorePath string = "/var/run/kata-containers/vhost-user/"
|
|||||||
const defaultRxRateLimiterMaxRate = uint64(0)
|
const defaultRxRateLimiterMaxRate = uint64(0)
|
||||||
const defaultTxRateLimiterMaxRate = uint64(0)
|
const defaultTxRateLimiterMaxRate = uint64(0)
|
||||||
const defaultConfidentialGuest = false
|
const defaultConfidentialGuest = false
|
||||||
|
const defaultSevSnpGuest = false
|
||||||
const defaultGuestSwap = false
|
const defaultGuestSwap = false
|
||||||
const defaultRootlessHypervisor = false
|
const defaultRootlessHypervisor = false
|
||||||
const defaultDisableSeccomp = false
|
const defaultDisableSeccomp = false
|
||||||
|
@ -149,6 +149,7 @@ type hypervisor struct {
|
|||||||
DisableVhostNet bool `toml:"disable_vhost_net"`
|
DisableVhostNet bool `toml:"disable_vhost_net"`
|
||||||
GuestMemoryDumpPaging bool `toml:"guest_memory_dump_paging"`
|
GuestMemoryDumpPaging bool `toml:"guest_memory_dump_paging"`
|
||||||
ConfidentialGuest bool `toml:"confidential_guest"`
|
ConfidentialGuest bool `toml:"confidential_guest"`
|
||||||
|
SevSnpGuest bool `toml:"sev_snp_guest"`
|
||||||
GuestSwap bool `toml:"enable_guest_swap"`
|
GuestSwap bool `toml:"enable_guest_swap"`
|
||||||
Rootless bool `toml:"rootless"`
|
Rootless bool `toml:"rootless"`
|
||||||
DisableSeccomp bool `toml:"disable_seccomp"`
|
DisableSeccomp bool `toml:"disable_seccomp"`
|
||||||
@ -827,6 +828,7 @@ func newQemuHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) {
|
|||||||
GuestMemoryDumpPath: h.GuestMemoryDumpPath,
|
GuestMemoryDumpPath: h.GuestMemoryDumpPath,
|
||||||
GuestMemoryDumpPaging: h.GuestMemoryDumpPaging,
|
GuestMemoryDumpPaging: h.GuestMemoryDumpPaging,
|
||||||
ConfidentialGuest: h.ConfidentialGuest,
|
ConfidentialGuest: h.ConfidentialGuest,
|
||||||
|
SevSnpGuest: h.SevSnpGuest,
|
||||||
GuestSwap: h.GuestSwap,
|
GuestSwap: h.GuestSwap,
|
||||||
Rootless: h.Rootless,
|
Rootless: h.Rootless,
|
||||||
LegacySerial: h.LegacySerial,
|
LegacySerial: h.LegacySerial,
|
||||||
@ -1221,6 +1223,7 @@ func GetDefaultHypervisorConfig() vc.HypervisorConfig {
|
|||||||
TxRateLimiterMaxRate: defaultTxRateLimiterMaxRate,
|
TxRateLimiterMaxRate: defaultTxRateLimiterMaxRate,
|
||||||
SGXEPCSize: defaultSGXEPCSize,
|
SGXEPCSize: defaultSGXEPCSize,
|
||||||
ConfidentialGuest: defaultConfidentialGuest,
|
ConfidentialGuest: defaultConfidentialGuest,
|
||||||
|
SevSnpGuest: defaultSevSnpGuest,
|
||||||
GuestSwap: defaultGuestSwap,
|
GuestSwap: defaultGuestSwap,
|
||||||
Rootless: defaultRootlessHypervisor,
|
Rootless: defaultRootlessHypervisor,
|
||||||
DisableSeccomp: defaultDisableSeccomp,
|
DisableSeccomp: defaultDisableSeccomp,
|
||||||
|
@ -348,6 +348,10 @@ type HypervisorConfig struct {
|
|||||||
// Enable or disable different hardware features, ranging
|
// Enable or disable different hardware features, ranging
|
||||||
// from memory encryption to both memory and CPU-state encryption and integrity.
|
// from memory encryption to both memory and CPU-state encryption and integrity.
|
||||||
ConfidentialGuest bool
|
ConfidentialGuest bool
|
||||||
|
|
||||||
|
// Enables SEV-SNP guests in case both AMD SEV and SNP are supported.
|
||||||
|
// SEV is default.
|
||||||
|
SevSnpGuest bool
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -527,6 +527,9 @@ type HypervisorConfig struct {
|
|||||||
// from memory encryption to both memory and CPU-state encryption and integrity.
|
// from memory encryption to both memory and CPU-state encryption and integrity.
|
||||||
ConfidentialGuest bool
|
ConfidentialGuest bool
|
||||||
|
|
||||||
|
// Enable SEV-SNP guests on AMD machines capable of both
|
||||||
|
SevSnpGuest bool
|
||||||
|
|
||||||
// BootToBeTemplate used to indicate if the VM is created to be a template VM
|
// BootToBeTemplate used to indicate if the VM is created to be a template VM
|
||||||
BootToBeTemplate bool
|
BootToBeTemplate bool
|
||||||
|
|
||||||
|
@ -29,12 +29,12 @@ func availableGuestProtection() (guestProtection, error) {
|
|||||||
return tdxProtection, nil
|
return tdxProtection, nil
|
||||||
}
|
}
|
||||||
// SEV-SNP is supported and enabled when the kvm module `sev_snp` parameter is set to `Y`
|
// SEV-SNP is supported and enabled when the kvm module `sev_snp` parameter is set to `Y`
|
||||||
|
// SEV-SNP support infers SEV (-ES) support
|
||||||
if _, err := os.Stat(snpKvmParameterPath); err == nil {
|
if _, err := os.Stat(snpKvmParameterPath); err == nil {
|
||||||
if c, err := os.ReadFile(snpKvmParameterPath); err == nil && len(c) > 0 && (c[0] == 'Y') {
|
if c, err := os.ReadFile(snpKvmParameterPath); err == nil && len(c) > 0 && (c[0] == 'Y') {
|
||||||
return snpProtection, nil
|
return snpProtection, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Only choose SEV if SEV-SNP unsupported
|
|
||||||
// SEV is supported and enabled when the kvm module `sev` parameter is set to `1` (or `Y` for linux >= 5.12)
|
// SEV is supported and enabled when the kvm module `sev` parameter is set to `1` (or `Y` for linux >= 5.12)
|
||||||
if _, err := os.Stat(sevKvmParameterPath); err == nil {
|
if _, err := os.Stat(sevKvmParameterPath); err == nil {
|
||||||
if c, err := os.ReadFile(sevKvmParameterPath); err == nil && len(c) > 0 && (c[0] == '1' || c[0] == 'Y') {
|
if c, err := os.ReadFile(sevKvmParameterPath); err == nil && len(c) > 0 && (c[0] == '1' || c[0] == 'Y') {
|
||||||
|
@ -24,6 +24,8 @@ type qemuAmd64 struct {
|
|||||||
// inherit from qemuArchBase, overwrite methods if needed
|
// inherit from qemuArchBase, overwrite methods if needed
|
||||||
qemuArchBase
|
qemuArchBase
|
||||||
|
|
||||||
|
snpGuest bool
|
||||||
|
|
||||||
vmFactory bool
|
vmFactory bool
|
||||||
|
|
||||||
devLoadersCount uint32
|
devLoadersCount uint32
|
||||||
@ -122,6 +124,7 @@ func newQemuArch(config HypervisorConfig) (qemuArch, error) {
|
|||||||
legacySerial: config.LegacySerial,
|
legacySerial: config.LegacySerial,
|
||||||
},
|
},
|
||||||
vmFactory: factory,
|
vmFactory: factory,
|
||||||
|
snpGuest: config.SevSnpGuest,
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.ConfidentialGuest {
|
if config.ConfidentialGuest {
|
||||||
@ -176,7 +179,7 @@ func (q *qemuAmd64) cpuModel() string {
|
|||||||
// Temporary until QEMU cpu model 'host' supports AMD SEV-SNP
|
// Temporary until QEMU cpu model 'host' supports AMD SEV-SNP
|
||||||
protection, err := availableGuestProtection()
|
protection, err := availableGuestProtection()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if protection == snpProtection {
|
if protection == snpProtection && q.snpGuest {
|
||||||
cpuModel = "EPYC-v4"
|
cpuModel = "EPYC-v4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -212,6 +215,11 @@ func (q *qemuAmd64) enableProtection() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// Configure SNP only if specified in config
|
||||||
|
if q.protection == snpProtection && !q.snpGuest {
|
||||||
|
q.protection = sevProtection
|
||||||
|
}
|
||||||
|
|
||||||
logger := hvLogger.WithFields(logrus.Fields{
|
logger := hvLogger.WithFields(logrus.Fields{
|
||||||
"subsystem": "qemuAmd64",
|
"subsystem": "qemuAmd64",
|
||||||
"machine": q.qemuMachine,
|
"machine": q.qemuMachine,
|
||||||
|
Loading…
Reference in New Issue
Block a user