Secure Boot integrado com Yocto pt.2 (Kernel)



{getToc} $title={Índice}

Informações

Nível de dificuldade: Médio/Avançado

Requisitos: Conhecimento em Linux Embarcado, Yocto, Devtool, Secure Boot integrado com o Yocto pt.1 (Bootloader).

Ressalvas

Esse tutorial é uma continuação do tutorial:
Secure Boot integrado com o Yocto pt.1 (Bootloader)
Para a implementação dessa etapa, é necessário ter habilitado o AHAB Secure Boot e realizado os procedimentos necessários para validação do Bootloader.
É altamente recomendado que a primeira parte do tutorial seja consultada.

Introdução

Este tutorial contempla o segundo passo do Chain of Trust de um sistema Linux Embarcado, que corresponde à assinatura do Kernel.

Arquivos necessários 

Para assinar o kernel são necessários três arquivos:
  • Imagem do kernel 
  • Blob da device tree usada (.dtb)
  • Rootfs usado para gravação (.wic)
Esses arquivos se encontram na pasta de deploy do Yocto: 
<yocto-worskpace>/build-wayland/tmp/deploy/images/<machine>

No caso desse exemplo os arquivos são:
Image-5.4-...-.bin
Imx8qxp-mek-5.4-...-.bin
Arquivo wic compactado (.wic.bz2 ou .wic.tar)

Copiar esses arquivos pra pasta workspace do CST e descompactar a imagem .wic.bz2/tar para .wic.

Montagem do container

Agora precisamos montar o OS container, que é o binário da imagem a ser assinado.
Para isso, necessitamos de uma pasta que contém diversos arquivos importantes.

Copiar a pasta "git" do diretório:
<yocto-worskpace>/build_wayland/tmp/work/imx8qxpc0mek-poky-linux/imx-boot/1.0-r0

Para a pasta workspace do CST.
Renomear a pasta para mkimage_container.
Assim como no tutorial do Secure Boot do Bootloader, precisamos montar um Makefile para a construção do container, o seu conteúdo deve ser:

MKIMG = mkimage_container/mkimage_imx8

flash_kernel: $(MKIMG) Image imx8qxp-mek.dtb

./$(MKIMG) -soc QX -rev B0 -c -ap Image a35 0x80280000 --data imx8qxp-mek.dtb

0x83000000 -out flash_os.bin

Executar o comando:

$make flash_kernel

Caso dê tudo certo, o output mostrará os offsets do container.
Assim como no tutorial do Bootloader, salvar esses offsets para a assinatura do container.

Script de assinatura do container

Local do script:
<yocto-workspace>/build_wayland/workspace/sources/u-boot-imx/doc/imx/ahab/csf_examples/csf_linux_img.txt

Copiar esse script para a workspace CST.
Atualizar o script com o offset do container e corrigir eventuais mudanças de nome da tabela SRK ou caminhos.

Assinar o binário com o comando:
$./release/linux64/bin/cst -i csf_linux_img.txt -o os_cntr_signed.bin

O nome do output tem que ser exatamente esse, ou então você terá que modificar a variável de ambiente do u-boot relativa.

Copiar o container assinado para o .wic

Para utilizar a ferramenta wic, você precisa estar dentro do seu workspace yocto, com o ambiente setado ($source setup_environment build_wayland ou $. export).

Verificar os conteúdos da imagem com:
$wic ls <caminho para o arquivo wic>/<arquivo.wic>

Provavelmente serão mostrados dois containers, estamos interessados no diretório boot.
Com $wic ls <caminho para o arquivo wic>/<arquivo.wic>:1 conseguimos ver o conteúdo do diretório boot (caso ele seja o primeiro container, senão, utilize o número relativo ao diretório boot).

Copiar o binário de container assinado para dentro do boot com o comando:
$wic cp <caminho para o binário>/os_cntr_signed.bin <caminho para o arquivo wic>/<arquivo.wic>:1

Gravação

Agora é só gravar a placa, não é necessário compactar o arquivo.wic novamente, inclusive isso pode causar erros.
Caso dê tudo certo, o bootloader irá inicializar normalmente e após isso será iniciado o kernel, confirmando o sucesso do procedimento.

Também é possível utilizar o comando dentro do bootloader:
=> auth_cntr <endereço-do-kernel>

Que deverá retornar sucesso na autenticação do container.

Finalização

Com o final desse tutorial, temos que o AHAB verifica o Bootloader e o Bootloader verifica o Kernel.
Cada etapa precisa ser assinada pela chave privada específica do CST, que você gerou e só você deve ter acesso.
Qualquer imagem que não esteja assinada ou que esteja assinada com uma hash errada, não irá funcionar.

Guilherme Rossi

Especialista em Sistemas Embarcados formado em Engenharia Elétrica. Experiência de atuação em linguagem C, Linux Embarcado, Microcontroladores, protocolos de comunicação e debug. linkedin

2 Comentários

Deixe seu comentário ou sua sugestão!

  1. Muito bom! Tutorial simples e objetivo com conteúdo relevante!! Parabéns pelo site, sucesso.

    ResponderExcluir
  2. Muito bom e de extrema relevância para desenvolvedores e profissionais de micro programação.
    Parabéns pelo site e pela iniciativa, sucesso.

    ResponderExcluir
Postagem Anterior Próxima Postagem

Formulário de contato