Lançamento do systemd system manager 252 com suporte UKI (Unified Kernel Image)

Após cinco meses de desenvolvimento, foi apresentado o lançamento do gerenciador de sistema systemd 252. A principal mudança na nova versão foi a integração do suporte para um processo de boot modernizado, que permite verificar não só o kernel e bootloader, mas também componentes do ambiente básico do sistema usando assinaturas digitais.

O método proposto envolve o uso de uma imagem unificada do kernel UKI (Unified Kernel Image) durante o carregamento, que combina um manipulador para carregar o kernel do UEFI (UEFI boot stub), uma imagem do kernel Linux e o ambiente do sistema initrd carregado na memória, usado para inicialização inicial na fase anterior à montagem do FS raiz. A imagem UKI é empacotada como um único arquivo executável no formato PE, que pode ser carregado usando bootloaders tradicionais ou chamado diretamente do firmware UEFI. Quando chamado da UEFI, é possível verificar a integridade e confiabilidade da assinatura digital não apenas do kernel, mas também do conteúdo do initrd.

Para calcular os parâmetros dos registros TPM PCR (Trusted Platform Module Platform Configuration Register) usados ​​para monitorar a integridade e gerar uma assinatura digital da imagem UKI, um novo utilitário systemd-measure está incluído. A chave pública e as informações de PCR que a acompanham usadas na assinatura podem ser incorporadas diretamente na imagem de inicialização do UKI (a chave e a assinatura são salvas em um arquivo PE nos campos '.pcrsig' e '.pcrkey') e extraídas dela por meio externo ou utilitários internos.

Em particular, os utilitários systemd-cryptsetup, systemd-cryptenroll e systemd-creds foram adaptados para usar esta informação, com os quais você pode garantir que as partições de disco criptografadas estejam vinculadas a um kernel assinado digitalmente (neste caso, o acesso à partição criptografada é fornecido somente se a imagem UKI tiver passado na verificação por assinatura digital com base em parâmetros localizados no TPM).

Além disso, o utilitário systemd-pcrphase está incluído, que permite controlar a ligação de vários estágios de inicialização a parâmetros localizados na memória de criptoprocessadores que suportam a especificação TPM 2.0 (por exemplo, você pode disponibilizar a chave de descriptografia da partição LUKS2 apenas em a imagem initrd e bloquear o acesso a ela em downloads posteriores).

Algumas outras mudanças:

  • Garante que a localidade padrão seja C.UTF-8, a menos que uma localidade diferente seja especificada nas configurações.
  • Agora é possível realizar uma operação completa de predefinição de serviço (“predefinição systemctl”) durante a primeira inicialização. Habilitar predefinições no momento da inicialização requer a construção com a opção "-Dfirst-boot-full-preset", mas está planejado para ser habilitado por padrão em versões futuras.
  • As unidades de gerenciamento de usuários envolvem um controlador de recursos de CPU, o que possibilitou garantir que as configurações de CPUWeight sejam aplicadas a todas as unidades de slice utilizadas para dividir o sistema em partes (app.slice, background.slice, session.slice) para isolar recursos entre diferentes serviços de usuário, competindo por recursos de CPU. CPUWeight também suporta o valor “idle” para ativar o modo de provisionamento de recursos apropriado.
  • Em unidades temporárias (“transitórias”) e no utilitário systemd-repart, a substituição de configurações é permitida criando arquivos drop-in no diretório /etc/systemd/system/name.d/.
  • Para imagens do sistema, o flag support-ended é definido, determinando este fato com base no valor do novo parâmetro “SUPPORT_END=” no arquivo /etc/os-release.
  • Adicionadas configurações “ConditionCredential=” e “AssertCredential=”, que podem ser usadas para ignorar ou travar unidades se determinadas credenciais não estiverem presentes no sistema.
  • Adicionadas configurações “DefaultSmackProcessLabel=” e “DefaultDeviceTimeoutSec=” a system.conf e user.conf para definir o nível de segurança SMACK padrão e o tempo limite de ativação da unidade.
  • Nas configurações “ConditionFirmware=” e “AssertFirmware=”, foi adicionada a capacidade de especificar campos SMBIOS individuais, por exemplo, para iniciar uma unidade somente se o campo /sys/class/dmi/id/board_name contiver o valor “Custom Board”, você pode especificar “ConditionFirmware=smbios” -field(board_name = "Custom Board")".
  • Durante o processo de inicialização (PID 1), foi adicionada a capacidade de importar credenciais de campos SMBIOS (Tipo 11, “strings de fornecedor OEM”), além de sua definição via qemu_fwcfg, o que simplifica o fornecimento de credenciais para máquinas virtuais e elimina o necessidade de ferramentas de terceiros, como cloud-init e ignição.
  • Durante o desligamento, a lógica de desmontagem dos sistemas de arquivos virtuais (proc, sys) foi alterada e as informações sobre os processos que bloqueiam a desmontagem dos sistemas de arquivos são salvas no log.
  • O filtro de chamada do sistema (SystemCallFilter) permite acesso à chamada do sistema riscv_flush_icache por padrão.
  • O bootloader sd-boot adiciona a capacidade de inicializar em modo misto, no qual o kernel Linux de 64 bits é executado a partir de firmware UEFI de 32 bits. Adicionada capacidade experimental de aplicar automaticamente chaves SecureBoot de arquivos encontrados no ESP (partição do sistema EFI).
  • Novas opções foram adicionadas ao utilitário bootctl: “—all-architectures” para instalar binários para todas as arquiteturas EFI suportadas, “—root=” e “—image=” para trabalhar com um diretório ou imagem de disco, “—install-source =” para definir a fonte de instalação, "-efi-boot-option-description=" para controlar os nomes das entradas de inicialização.
  • O comando 'list-automounts' foi adicionado ao utilitário systemctl para exibir uma lista de diretórios montados automaticamente e a opção "--image=" para executar comandos em relação à imagem de disco especificada. Adicionadas opções "--state=" e "--type=" aos comandos 'show' e 'status'.
  • systemd-networkd adicionou opções “TCPCongestionControlAlgorithm=” para selecionar o algoritmo de controle de congestionamento TCP, “KeepFileDescriptor=” para salvar o descritor de arquivo das interfaces TUN/TAP, “NetLabel=” para definir NetLabels, “RapidCommit=” para acelerar a configuração via DHCPv6 (RFC3315). O parâmetro “RouteTable=” permite especificar os nomes das tabelas de roteamento.
  • systemd-nspawn permite o uso de caminhos de arquivo relativos nas opções "--bind=" e "--overlay=". Adicionado suporte para o parâmetro 'rootidmap' à opção "--bind=" para vincular o ID do usuário root no contêiner ao proprietário do diretório montado no lado do host.
  • systemd-resolved usa OpenSSL como back-end de criptografia por padrão (o suporte a gnutls é mantido como uma opção). Algoritmos DNSSEC não suportados agora são tratados como inseguros em vez de retornarem um erro (SERVFAIL).
  • systemd-sysusers, systemd-tmpfiles e systemd-sysctl implementam a capacidade de transferir configurações por meio de um mecanismo de armazenamento de credenciais.
  • Adicionado o comando 'compare-versions' ao utilitário systemd-analyze para comparar strings com números de versão (semelhante a 'rpmdev-vercmp' e 'dpkg --compare-versions'). Adicionada a capacidade de filtrar unidades por máscara ao comando 'systemd-analyze dump'.
  • Ao selecionar um modo de suspensão de vários estágios (suspender e depois hibernar), o tempo gasto no modo de espera agora é selecionado com base na previsão da vida útil restante da bateria. A transição instantânea para o modo de suspensão ocorre quando resta menos de 5% da carga da bateria.
  • Um novo modo de saída "-o short-delta" foi adicionado ao 'journalctl', exibindo a diferença de tempo entre diferentes mensagens no log.
  • systemd-repart adiciona suporte para criação de partições com o sistema de arquivos Squashfs e partições para dm-verity, inclusive com assinaturas digitais.
  • Adicionada configuração "StopIdleSessionSec=" ao systemd-logind para encerrar uma sessão inativa após um tempo limite especificado.
  • Systemd-cryptenroll adicionou uma opção "--unlock-key-file=" para extrair a chave de descriptografia de um arquivo em vez de avisar o usuário.
  • Agora é possível executar o utilitário systemd-growfs em ambientes sem udev.
  • systemd-backlight melhorou o suporte para sistemas com múltiplas placas gráficas.
  • A licença para os exemplos de código fornecidos na documentação foi alterada de CC0 para MIT-0.

Mudanças que quebram a compatibilidade:

  • Ao verificar o número da versão do kernel usando a diretiva ConditionKernelVersion, uma comparação simples de strings agora é usada nos operadores '=' e '!=', e se o operador de comparação não for especificado, a correspondência de máscara glob pode ser usada usando o personagens '*', '?' E '[', ']'. Para comparar as versões do estilo stverscmp(), use os operadores '<', '>', '<=' e '>='.
  • A tag SELinux usada para verificar o acesso de um arquivo de unidade agora é lida no momento em que o arquivo é carregado, e não no momento da verificação de acesso.
  • A condição "ConditionFirstBoot" agora é acionada na primeira inicialização do sistema apenas diretamente no estágio de inicialização e retorna "false" ao chamar unidades após a conclusão da inicialização.
  • Em 2024, o systemd planeja parar de oferecer suporte ao mecanismo de limitação de recursos cgroup v1, que foi descontinuado na versão 248 do systemd. Os administradores são aconselhados a tomar cuidado antes de migrar serviços baseados em cgroup v2 para cgroup v1. A principal diferença entre cgroups v2 e v1 é o uso de uma hierarquia comum de cgroups para todos os tipos de recursos, em vez de hierarquias separadas para alocar recursos de CPU, para regular o consumo de memória e para E/S. Hierarquias separadas levam a dificuldades na organização da interação entre manipuladores e a custos adicionais de recursos do kernel ao aplicar regras para um processo referenciado em hierarquias diferentes.
  • No segundo semestre de 2023, planejamos encerrar o suporte para hierarquias de diretório divididas, onde /usr é montado separadamente da raiz, ou /bin e /usr/bin, /lib e /usr/lib são separados.

Fonte: opennet.ru

Adicionar um comentário