A aplicação de patches em tempo real permite atualizar o kernel do Linux sem reiniciar o sistema. Essa abordagem é, sem dúvida, a solução perfeita para grandes empresas com serviços sensíveis a interrupções, nas quais pausas podem causar efeitos prejudiciais para todo o negócio. No entanto, a atualização do kernel é imprescindível no mundo atual, repleto de vulnerabilidades, problemas de segurança e falhas. Somente uma atualização proativa do kernel pode garantir o funcionamento tranquilo e sem problemas do seu negócio.
Talvez você já tenha lido nossos tutoriais sobre aplicação de patches no kernel em tempo real: “Aplicação de patches em tempo real no kernel do Debian 10 com o Kpatch ” e “Aplicação de patches em tempo real no kernel do Ubuntu 20.04 LTS Focal Fossa com o Kpatch”. E, caso ainda não tenha lido, considere-os materiais úteis para compartilhar com seus colegas e amigos.
Neste tutorial, vou mostrar como aplicar patches no kernel do Oracle Enterprise Linux 7 – UEK4 usando o Kpatch sem precisar reiniciar o sistema.
O Kpatch é um projeto da Red Hat e funciona no RHEL e em suas distribuições derivadas. A Red Hat oferece um serviço comercial de correções em tempo real para clientes do RHEL, assim como as seguintes empresas, cada uma delas voltada para distribuições diferentes:
- Serviço Livepatch da Canonical para o Ubuntu;
- KernelCare para a maioria das principais distribuições do Linux;
- Ksplice para Oracle Linux;
- SUSE Live Patching (anteriormente conhecido como Kgraft) para o SUSE Enterprise Linux.
Escolhemos o Kpatch para este tutorial porque seu código-fonte está disponível gratuitamente e é atualizado regularmente
Pré-requisitos
Aqui estão os pré-requisitos de sistema para acompanhar este tutorial.
- Um sistema de teste (fora de produção) que executa o Oracle7 UEK4 em uma arquitetura x86_64/amd64.
- 20 Gb de espaço livre em disco. (O código-fonte do kernel do Linux ocupa cerca de 909 Mb no disco, chegando a 17 Gb quando compilado.)
- Seu kernel não foi personalizado; você está usando o kernel padrão fornecido pelo Debian
- Seu kernel possui o recurso de correção dinâmica integrado. Use este comando e você verá dois valores definidos como
yparaCONFIG_HAVE_LIVEPATCHeCONFIG_LIVEPATCH:
grep LIVEPATCH /boot/config-$(uname -r)
- A versão do gcc instalada corresponde à utilizada para compilar o kernel original. (O
kpatch-buildO comando falhará se as versões não corresponderem. Isso pode ser contornado com a opção--skip-gcc-check, embora seu uso não seja recomendado.)- Para verificar a versão do gcc instalada:
gcc --version (if gcc not installed run ”sudo apt install gcc”) - Para verificar a versão do gcc usada para compilar o kernel atual:
cat /proc/version
- Para verificar a versão do gcc instalada:
1. Instalar os pacotes de dependências
- Instalar e configurar
sudo.Comoroot:apt-get install sudo adduser <user> sudoonde
<user>é o nome de usuário de um usuário comum. (Todos os comandos a seguir devem ser executados como esse usuário.) - Instalar pacotes.
sudo yum install elfutils elfutils-devel sudo yum install pesign yum-utils zlib-devel binutils-devel newt-devel python-devel perl-ExtUtils-Embed audit-libs numactl-devel pciutils-devel bison patchutils bc rpm-build glib2-devel
- Baixe e instale o libdtrace:
wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-0.8.0-1.el7.x86_64.rpm wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm rpm -ivh libdtrace-ctf-0.8.0-1.el7.x86_64.rpm libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
- Baixe e instale os códigos-fonte do kernel e os pacotes kernel-devel:
wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackageSource/kernel-uek-4.1.12-124.40.6.3.el7uek.src.rpm wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm rpm -ivh kernel-uek-4.1.12-124.40.6.3.el7uek.x86_64.rpm --nodeps rpm -ivh --nodeps kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
- Baixe e instale os pacotes de informações de depuração:
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm
rpm -ivh kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm
2. Instalar o Kpatch
git clone https://github.com/dynup/kpatch.git cd kpatch && make && sudo make install cd kmod && make mkdir /lib/modules/`uname -r`/extra/kpatch cp core/kpatch.ko /lib/modules/`uname -r`/extra/kpatch cp core/Module.symvers /lib/modules/`uname -r`/extra/kpatch
3. Obtenha uma cópia do código-fonte do kernel do Linux
Descompactar os códigos-fonte do kernel:
cd /root/rpmbuild/SOURCES tar xfj linux-4.1.12.tar.bz2
4. Criar o arquivo de configuração do kernel do Linux
O kernel do Linux é compilado usando as configurações de um arquivo de configuração fornecido com a sua distribuição. Faça uma cópia e altere algumas configurações para que o kpatch-build possa compilar um kernel do Linux com as mesmas configurações do kernel que está em execução.
cd linux-source-5.4.0/ cp /boot/config-$(uname -r) .config
Verifique se as configurações necessárias do kernel estão ativadas para o uso do Kpatch. Todas devem retornar “y”.
scripts/config -s DYNAMIC_FTRACE_WITH_REGS scripts/config -s FUNCTION_TRACER scripts/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS scripts/config -s HAVE_FENTRY scripts/config -s HAVE_LIVEPATCH scripts/config -s KALLSYMS_ALL scripts/config -s KALLSYMS scripts/config -s LIVEPATCH scripts/config -s MODULES scripts/config -s MODULE_SIG scripts/config -s SYSFS scripts/config -s SYSTEM_TRUSTED_KEYRING
Altere o valor de um item de configuração do kernel.
scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
Saia do diretório de origem.
cd ..
5. Criar um patch
Um arquivo-fonte de patch é o resultado da execução do diff comando executado nos arquivos de código-fonte originais e nos modificados.
O exemplo de aplicação de patch mostrado na seção “Introdução rápida” do Página do kpatch no GitHub altera a saída de /proc/meminfo. Muitos outros artigos do Kpatch reproduzem esse exemplo, então eu queria algo diferente e um pouco mais interessante, mas que continuasse sendo seguro.
Este exemplo altera a saída do uptime comando para dar a eles a impressão de que o tempo de atividade do seu servidor aumentou em uma década.
1. Ainda no diretório de trabalho, copie um arquivo.
cd /root/rpmbuild/SOURCES cp linux-4.1.12/fs/proc/uptime.c .
2. Edite-o. Na linha 26, altere:
(unsigned long) uptime.tv_sec,
para
(unsigned long) uptime.tv_sec + 315576000,
Salve o arquivo.
3. Crie o arquivo de patch.
diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch
4. Crie o módulo de patch. (Na primeira vez que você fizer isso, o processo levará algumas horas, pois o código-fonte do kernel precisa ser compilado. As compilações subsequentes são significativamente mais rápidas, da ordem de minutos.)
kpatch-build -t vmlinux -v /usr/lib/debug/boot/vmlinux-5.4.0-37-generic uptime.patch
5. Ao concluir, você terá um arquivo de módulo carregável do kernel do Linux, chamado kpatch-uptime.ko, correspondente ao patch.
6. Teste o patch
- Antes de carregar o módulo de patch, verifique o tempo de atividade atual.
cat /proc/uptime && uptime -p - Carregue o módulo de patch.
# kpatch load kpatch-uptime.ko carregando o módulo de patch: kpatch-uptime.ko
- Verifique o tempo de atividade novamente.
cat /proc/uptime && uptime -p - Descarregue o módulo de patch.
# kpatch unload kpatch-uptime.ko desativando o módulo de patch: kpatch_uptime descarregando o módulo de patch: kpatch_uptime
- Verifique se o tempo de atividade voltou ao valor anterior.
# cat /proc/uptime && uptime -p 7215,13 27930,41 em funcionamento há 2 horas
Conclusão
Analisamos o processo de aplicação de patches em tempo real no kernel do Oracle Enterprise Linux 7 – UEK4 usando o Kpatch. É possível perceber que o processo em si é bastante simples, mas não é fácil. E o desenvolvimento do patch representa a principal dificuldade. O patch não deve causar falhas no sistema e deve ser compatível com os pacotes anteriores e posteriores. Acrescente a isso as diferentes distribuições e versões do kernel, além dos testes e do suporte, e você pode acabar arcando com um custo considerável por uma ferramenta de aplicação de patches em tempo real.
Obtenha uma versão de avaliação GRATUITA de 7 dias do KernelCare com suporte técnico
Você pode conhecer três maneiras diferentes de aplicar patches de segurança no kernel do Linux em nosso guia detalhado. O artigo explica como atualizar kernels do Linux sem reiniciar o sistema, abordando três métodos diferentes para alguns dos kernels mais populares do Linux.
