mirror of
https://github.com/edgelesssys/constellation.git
synced 2024-12-25 07:29:38 -05:00
240 lines
6.5 KiB
Python
240 lines
6.5 KiB
Python
""" Constellation OS image configuration / variants """
|
|
|
|
VARIANTS = [
|
|
{
|
|
"attestation_variant": "aws-sev-snp",
|
|
"csp": "aws",
|
|
},
|
|
{
|
|
"attestation_variant": "aws-nitro-tpm",
|
|
"csp": "aws",
|
|
},
|
|
{
|
|
"attestation_variant": "azure-sev-snp",
|
|
"csp": "azure",
|
|
},
|
|
{
|
|
"attestation_variant": "gcp-sev-es",
|
|
"csp": "gcp",
|
|
},
|
|
{
|
|
"attestation_variant": "gcp-sev-snp",
|
|
"csp": "gcp",
|
|
},
|
|
{
|
|
"attestation_variant": "qemu-vtpm",
|
|
"csp": "openstack",
|
|
},
|
|
{
|
|
"attestation_variant": "qemu-vtpm",
|
|
"csp": "qemu",
|
|
},
|
|
]
|
|
|
|
STREAMS = [
|
|
"stable",
|
|
"nightly",
|
|
"console",
|
|
"debug",
|
|
]
|
|
|
|
CSPS = [
|
|
"aws",
|
|
"azure",
|
|
"gcp",
|
|
"openstack",
|
|
"qemu",
|
|
]
|
|
|
|
base_cmdline = "selinux=1 enforcing=0 audit=0"
|
|
|
|
csp_settings = {
|
|
"aws": {
|
|
"kernel_command_line_dict": {
|
|
"constel.csp": "aws",
|
|
"idle": "poll",
|
|
"mitigations": "auto",
|
|
},
|
|
},
|
|
"azure": {
|
|
"kernel_command_line_dict": {
|
|
"constel.csp": "azure",
|
|
"mitigations": "auto,nosmt",
|
|
},
|
|
},
|
|
"gcp": {
|
|
"kernel_command_line_dict": {
|
|
"constel.csp": "gcp",
|
|
"mitigations": "auto,nosmt",
|
|
},
|
|
},
|
|
"openstack": {
|
|
"autologin": True,
|
|
"kernel_command_line": "console=tty0 console=ttyS0",
|
|
"kernel_command_line_dict": {
|
|
"console": "tty0",
|
|
"constel.csp": "openstack",
|
|
"kvm_amd.sev": "1",
|
|
"mem_encrypt": "on",
|
|
"mitigations": "auto,nosmt",
|
|
"module_blacklist": "qemu_fw_cfg",
|
|
},
|
|
},
|
|
"qemu": {
|
|
"autologin": True,
|
|
"kernel_command_line_dict": {
|
|
"constel.csp": "qemu",
|
|
"mitigations": "auto,nosmt",
|
|
},
|
|
},
|
|
}
|
|
|
|
attestation_variant_settings = {
|
|
"aws-nitro-tpm": {
|
|
"kernel_command_line_dict": {
|
|
"constel.attestation-variant": "aws-nitro-tpm",
|
|
},
|
|
},
|
|
"aws-sev-snp": {
|
|
"kernel_command_line_dict": {
|
|
"constel.attestation-variant": "aws-sev-snp",
|
|
},
|
|
},
|
|
"azure-sev-snp": {
|
|
"kernel_command_line_dict": {
|
|
"constel.attestation-variant": "azure-sev-snp",
|
|
},
|
|
},
|
|
"gcp-sev-es": {
|
|
"kernel_command_line_dict": {
|
|
"constel.attestation-variant": "gcp-sev-es",
|
|
},
|
|
},
|
|
"gcp-sev-snp": {
|
|
"kernel_command_line_dict": {
|
|
"constel.attestation-variant": "gcp-sev-snp",
|
|
},
|
|
},
|
|
"qemu-vtpm": {
|
|
"kernel_command_line_dict": {
|
|
"constel.attestation-variant": "qemu-vtpm",
|
|
},
|
|
},
|
|
}
|
|
|
|
stream_settings = {
|
|
"console": {
|
|
"autologin": True,
|
|
},
|
|
"debug": {
|
|
"autologin": True,
|
|
"kernel_command_line": "constellation.debug",
|
|
},
|
|
"nightly": {},
|
|
"stable": {},
|
|
}
|
|
|
|
def from_settings(csp, attestation_variant, stream, strict = True, default = None):
|
|
"""Generates a list of settings dictionaries for the given csp, attestation_variant and stream.
|
|
|
|
Args:
|
|
csp: The cloud service provider to use.
|
|
attestation_variant: The attestation variant to use.
|
|
stream: The stream to use.
|
|
strict: If True, fail if any of the given csp, attestation_variant or stream is unknown.
|
|
default: The default value to use if any of the given csp, attestation_variant or stream is unknown.
|
|
|
|
Returns:
|
|
A list of settings dictionaries.
|
|
"""
|
|
if strict:
|
|
if not csp in csp_settings:
|
|
fail("Unknown csp: " + csp)
|
|
if not attestation_variant in attestation_variant_settings:
|
|
fail("Unknown attestation_variant: " + attestation_variant)
|
|
if not stream in stream_settings:
|
|
fail("Unknown stream: " + stream)
|
|
return [
|
|
csp_settings.get(csp, default),
|
|
attestation_variant_settings.get(attestation_variant, default),
|
|
stream_settings.get(stream, default),
|
|
]
|
|
|
|
def constellation_packages(stream):
|
|
base_packages = ["//measurement-reader/cmd:measurement-reader-package"]
|
|
if stream == "debug":
|
|
return ["//debugd/cmd/debugd:debugd-package"] + base_packages
|
|
return [
|
|
"//upgrade-agent/cmd:upgrade-agent-package",
|
|
"//bootstrapper/cmd/bootstrapper:bootstrapper-package",
|
|
] + base_packages
|
|
|
|
def autologin(csp, attestation_variant, stream):
|
|
"""Generates a boolean indicating whether autologin should be enabled for the given csp, attestation_variant and stream.
|
|
|
|
Args:
|
|
csp: The cloud service provider to use.
|
|
attestation_variant: The attestation variant to use.
|
|
stream: The stream to use.
|
|
|
|
Returns:
|
|
A boolean indicating whether autologin should be enabled.
|
|
"""
|
|
out = None
|
|
for settings in from_settings(csp, attestation_variant, stream):
|
|
if not "autologin" in settings:
|
|
continue
|
|
if out != None and out != settings["autologin"]:
|
|
fail("Inconsistent autologin settings")
|
|
out = settings["autologin"]
|
|
return out
|
|
|
|
def kernel_command_line(csp, attestation_variant, stream):
|
|
cmdline = base_cmdline
|
|
for settings in from_settings(csp, attestation_variant, stream, default = {}):
|
|
cmdline = append_cmdline(cmdline, settings.get("kernel_command_line", ""))
|
|
return cmdline
|
|
|
|
def kernel_command_line_dict(csp, attestation_variant, stream):
|
|
commandline_dict = {}
|
|
for settings in from_settings(csp, attestation_variant, stream, default = {}):
|
|
commandline_dict = commandline_dict | settings.get("kernel_command_line_dict", {})
|
|
return commandline_dict
|
|
|
|
def append_cmdline(current, append):
|
|
"""Append a string to an existing commandline, separating them with a space.
|
|
|
|
Args:
|
|
current: The existing commandline. May be empty.
|
|
append: The string to append. May be empty.
|
|
|
|
Returns:
|
|
The combined commandline.
|
|
"""
|
|
if len(current) == 0:
|
|
return append
|
|
if len(append) == 0:
|
|
return current
|
|
return current + " " + append
|
|
|
|
def images_for_stream(stream):
|
|
return [
|
|
variant["csp"] + "_" + variant["attestation_variant"] + "_" + stream
|
|
for variant in VARIANTS
|
|
]
|
|
|
|
def images_for_csp(csp):
|
|
return [
|
|
csp + "_" + variant["attestation_variant"] + "_" + stream
|
|
for variant in VARIANTS
|
|
if variant["csp"] == csp
|
|
for stream in STREAMS
|
|
]
|
|
|
|
def images_for_csp_and_stream(csp, stream):
|
|
return [
|
|
csp + "_" + variant["attestation_variant"] + "_" + stream
|
|
for variant in VARIANTS
|
|
if variant["csp"] == csp
|
|
]
|