FreeBSD

22 de novembro de 2016

Alterando e Compilando o Kernel do FreeBSD

Mais artigos de »
Escrito por: Leonardo Souza
Tags:

Kernel do FreeBSD

Kernel é a parte central do sistema operacional, responsável por gerenciar os recursos e a comunicação entre os componentes de hardware, software e responsável por vários processos do sistema. Dessa forma, podemos dizer que o Kernel funciona como uma ponte entre o hardware e o software, realizando a comunicação entre eles. Neste artigo vamos apresentar o kernel do FreeBSD.




Isso é possível porque o kernel disponibiliza uma camada de abstração de hardware, essencial para áreas como memória, processos,  I/O (entrada e saída) responsável pela comunicação entre dispositivos físicos e softwares e gerenciando processos e chamadas do sistema. Fica evidente a importância do kernel para o sistema de uma forma geral.

kernel do FreeBSD

Existem basicamente três tipo de kernels, os monolíticos, microkernel e o modelo híbrido. Os monolíticos executam todo o seu código em uma mesma área (address space) para aumentar o desempenho, o que o torna mais seguro, já que não existe processamento na área de usuário e isso não poderia ser explorado por um atacante, através de um pentest, que pudesse realizar um escalonamento de privilégios e consequentemente obter um ataque bem sucedido. Exemplos de sistemas que utilizam este tipo de kernel são: OpenBSD, Solaris e Windows 9x.

O modelo microkernel executa muitos de seus serviços na área do usuário, executando módulos externos. Este modelo é mais inseguro pois permite a um atacante buscar vulnerabilidades nos módulos executados pelo usuário. Encontrando estas vulnerabilidades ele pode explorá-las e, posteriormente, ao conseguir acesso, escalonar privilégios.

Por fim, existe também o modelo híbrido, capaz de unir as qualidades do modelo monolítico com a flexibilidade do microkernel. Exemplos de sistemas que utilizam o modelo hibrido são: FreeBSD (e seus derivados, o PFSense e o PCBSD), Linux e versões modernas do Windows.

Copilando o Kernel do FreeBSD

O kernel padrão de qualquer sistema operacional possui dezenas de recursos disponíveis para funcionar de forma genérica, ou seja, para a maioria das distribuições e sistemas. Dessa forma, muitas vezes, o kernel acaba “carregando” recursos desnecessários para seu bom funcionamento. Isso significa que ao customizar um kernel específico para o hardware utilizado teremos várias vantagens, entre elas: processo de boot mais rápido, redução de memória utilizada, otimização de recursos utilizados.

Por este motivo, usuários avançados de sistemas Unix e/ou GNU/Linux, com frequencia, customizam seus sistemas para que utilizem um kernel mais “enxuto”, específico para o hardware que possuem, tornando o seu sistema mais seguro, já que não utilizam recursos desnecessário e com alto desempenho, pois seus sistemas deixam de executar códigos sem utilidade.

O Kernel do FreeBSD é o GENERIC e a instalação do arquivo fonte dele é sugerida durante a instalação do sistema. Sendo assim, é possível instalá-lo durante a instalação do sistema ou não, conforme explicado no artigo sobre a instalação do FreeBSD.

Veja a imagem abaixo:

kernel do FreeBSD

Neste momento da instalação do FreeBSD é possível instalar o código fonte do sistema, ou seja, o kernel do FreeBSD.

O kernel instalado no FreeBSD pode ser visto no momento do boot do sistema ou após o login no sistema. Na imagem abaixo é possível ver a tela de boas vindas do sistema, após o boot.

kernel do FreeBSD

Veja que neste exemplo, estamos utilizando o FreeBSD 10.2-RELEASE e o kernel que estamos utilizando é o GENERIC, ou seja, o padrão do sistema.

Para compilar o novo kernel do FreeBSD precisamos basicamente inserir as alterações no arquivo fonte, compilá-lo e instalar este arquivo, ou seja, transformá-lo no kernel padrão do sistema.

O arquivo do kernel

O arquivo padrão do kernel do FreeBSD é instalado por padrão no diretório /usr/src/sys/arch/conf. O diretório “arch” representa a arquitetura do sistema, por exemplo o amd64 ou i386. Neste exemplo, utilizarei um sistema que possui a arquitetura i386.

Vamos listar o conteúdo deste diretório com o comando ls:

ls_src2

Perceba o arquivo listado junto com o conteúdo do diretório.

Em alguns casos é possível que este diretório não exista, isso significa que o fonte do kernel não foi instalado durante a instalação do sistema.

ls_src

Neste caso, precisaremos instalar o fonte para o sistema, só assim conseguiremos editar e posteriormente compilar o novo kernel do FreeBSD. Existem duas formas de se instalar o código fonte do kernel: A primeira é por meio do CD/DVD de instalação do FreeBSD e a segunda é por meio de download nos sítios FTPs do projeto FreeBSD (procedimento que requer conexão com a internet).

Copiando o fonte pelo CD/DVD

Vamos começar copiando o fonte do kernel pelo CD/DVD de instalação do FreeBSD (se ele já existe não há necessidade deste procedimento). Para fazer isso por meio do CD/DVD, insira ele no drive e monte-o no sistema com o comando mount.

mount_cd

Primeiro executamos o comando mkdir para criar o diretório /cd, onde iremos montar o conteúdo do CD/DVD (1). Depois executamos o comando mount_cd9660, responsável pela montagem do CD e passamos para o comando o diretório onde desejamos montá-lo (2). Por fim, listamos o conteúdo do diretório /cd, para ter certeza que o conteúdo do CD/DVD realmente foi montado nele, o que pode ser confirmado com o resultado do comando.

Já com o CD de instalação montado,  vamos instalar o fonte do kernel. O conteúdo desejado é o arquivo src.txz que está no diretório usr/freebsd-dist do diretório montado. Vamos utilizar o comando TAR para extraí-lo na raiz do sistema.

tar_src-txz

Depois de inserir o comando todo o código será descompactado e a árvore de diretórios será criada. Este procedimento possui um inconveniente, por fazer parte do CD de instalação, não há garantias que este código conterá atualizações de segurança lançadas após a publicação da mídia de instalação utilizada.

Copiando o fonte através do FTP

A forma mais segura de obter o código fonte do kernel é através do FTP oficial do projeto. Para utilizar a versão mais atual deste arquivo pode-se baixá-lo da internet, direto do FTP do projeto FreeBSD. Para isso digite o comando:

# fetch  ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/10.2-RELEASE/src.txz

kernel do FreeBSD

Este endereço é fixo, variando, porém de versão para versão e de acordo com a arquitetura utilizada. Isso significa que se estiver utilizando uma versão diferente do sistema, deverá modificá-lá no comando, assim como sua arquitetura. Por exemplo, se estiver utilizando a versão 10.3-RELEASE e a arquitetura for amd64 o comando deve ser:

# fetch  ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.3-RELEASE/src.txz

Depois de fazer o download descompacte o conteúdo por meio do comando TAR:

# tar -C / -xvzf src.txz

Neste comando, estamos considerando que o diretório atual é o que realizamos o download do fonte.

Pronto, agora o fonte do nosso kernel está devidamente disponível. Vamos realizar as alterações e compilá-lo.

Alterando o kernel do FreeBSD

Vamos agora realizar alterações no kernel do FreeBSD e, como exemplo, vamos habilitar o firewall do sistema,  pois por padrão ele vem desabilitado e uma das formas de fazer isso é por meio do kernel. Poderíamos realizar qualquer alteração no kernel, como exemplo, porém vamos habilitar o firewall do FreeBSD, pois este será o tema de um de nossos artigos.

Por segurança nunca se deve alterar o arquivo GENERIC diretamente, por isso devemos copiá-lo e o novo arquivo é que sofrerá as alterações. Para copiar o arquivo utilize o comando CP.

A sintaxe correta é:

cp nome_do_arquivo novo_arquivo

cp_generic

Neste exemplo, criamos o arquivo NOVO_KERNEL, por meio do comando cp, este é o arquivo que será alterado e posteriormente instalado como kernel válido.

Agora vamos realizar as alterações necessárias, ou seja, as relativas a ativação do firewall no FreeBSD. Para editar o arquivo utilize o editor de textos ee:

# ee NOVO_KERNEL

Insira as seguintes linhas:

options_ipfw

A opção ident é o campo que identifica o kernel, é através deste campo que o sistema sabe seu nome. No momento do login, o sistema mostra esta informação para que saibamos o kernel que foi carregado.

As linhas seguintes são as que habilitam o firewall do FreeBSD. Basicamente estamos configurando o IPFW (firewall do FreeBSD) como sendo do tipo aberto e também permitido a geração de logs com um limite de mensagens por ocorrência. Estas opções serão explicadas melhor no artigo sobre o IPFW. Nosso intuito aqui é explicar como compilar o kernel do FreeBSD, por isso, por hora, vamos ignorar estes detalhes.

Compilando o Kernel

Agora que já realizamos as alterações necessárias vamos compilar o novo kernel. Existem basicamente duas formas de se compilar o kernel, vamos começar pela forma tradicional.

Começaremos com o o comando config.

# config NOVO_KERNEL

config_novo_kernel

Este comando cria um diretório com o mesmo nome do kernel configurado, dentro do diretório ../compile/. Perceba que depois do comando surgirá uma mensagem dizendo que precisamos ir para o diretório ../compile/NOVO_KERNEL e executar o comando make depend:

# cd ../compile/NOVO_KERNEL

cd_compile

Já dentro do diretório ../compile/NOVO_KERNEL execute o comando make depend:

# make depend

make_depend

Este procedimento pode ser bem demorado, por isso precisamos ter paciência. Finalizado todo o processamento precisaremos executar o comando make:

# make

make

Mais uma vez precisaremos aguardar, pois este processo também é bem demorado. Quando finalmente tudo estiver terminado, significa que o kernel está devidamente configurado e que agora ele pode ser instalado. Para isso digite o comando:

# make install

Este é o comando que instalada realmente o kernel, por isso é bem demorado. No fim deste processo o sistema deverá ser reiniciado.

Pronto, kernel compilado, instalado e funcionando. Na imagem abaixo podemos ver o sistema já utilizando o kernel instalado.

login2

Esta é a forma tradicional de compilar o kernel do FreeBSD, existe uma outra forma de realizar este procedimento e é o que veremos agora.

Segunda forma de compilar o kernel do FreeBSD

Como explicando anteriormente existe uma outra forma de compilar o kernel do FreeBSD. Vamos partir do principio que o arquivo já foi alterado e vamos pular para a compilação do kernel.

Com o arquivo NOVO_KERNEL já criado e devidamente modificado, acesso o diretório /usr/src:

# cd /usr/src

Compile o kernel do FreeBSD com o seguinte comando:

# make buildkernel KERNCONF=NOVO_KERNEL

Após a compilação instale o novo kernel:

# make installkernel KERNCONF=NOVO_KERNEL

Perceba que esta opção possui um passo a menos que a compilação tradicional, por isso é um pouco mais prática. Após este procedimento o sistema deve ser reiniciado.

Pronto, se tudo tiver sido feito segundo o apresentado, o sistema estará utilizando o novo kernel.

Considerações Finais

O FreeBSD é um sistema operacional completo, diferente do Linux, que é apenas um kernel e precisa ser implementado para se transformar em uma distro com suas ferramentas GNU. Não existe FreeBSD sem kernel, por isso a versão do kernel é a própria versão do sistema operacional. Isso significa que se alguém perguntar qual a versão do kernel, basta dizer que é a própria versão do FreeBSD.

Outro ponto importante é que quem já está familiarizado com o mundo GNU/Linux vai perceber que compilar o kernel do FreeBSD é muito mais simples do que a própria compilação do Linux. Concorda? Conseguiu?

Fique a vontade e utilize os comentários. Até a próxima.






Sobre o Autor

Foto de perfil de Leonardo Souza
Leonardo Souza
Bacharel em Informática, pós graduado em Segurança de Redes de Computadores e analista de Segurança da Informação. Entusiasta de Segurança da Informação e usuário FreeBSD, porém sem xiismo.




0 Comments


Seja o Primeiro a Comentar!


You must be logged in to post a comment.