<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Guto Ribeiro</title>
    <description>The latest articles on DEV Community by Guto Ribeiro (@gutobrutus).</description>
    <link>https://dev.to/gutobrutus</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1439988%2F9fc31f0e-49ae-4569-87c0-00a7f218bda9.jpg</url>
      <title>DEV Community: Guto Ribeiro</title>
      <link>https://dev.to/gutobrutus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gutobrutus"/>
    <language>en</language>
    <item>
      <title>Instalação do RKE2 em HA</title>
      <dc:creator>Guto Ribeiro</dc:creator>
      <pubDate>Sun, 05 Jan 2025 04:52:09 +0000</pubDate>
      <link>https://dev.to/gutobrutus/instalacao-do-rke2-em-ha-1968</link>
      <guid>https://dev.to/gutobrutus/instalacao-do-rke2-em-ha-1968</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;1. Apresentação&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Neste artigo, demonstro a instalação de um cluster em HA (High Availability -&amp;gt; Alta disponibilidade) utilizando a distribuição Kubernetes &lt;a href="https://docs.rke2.io/" rel="noopener noreferrer"&gt;RKE2&lt;/a&gt;, mantida pela SUSE. A distribuição RKE2 foca em boas práticas e conformidade com requisitos de segurança. Existe uma distribuição mais antiga, apenas RKE, aqui será utilizada a RKE2. A sigla &lt;strong&gt;RKE&lt;/strong&gt; vem de &lt;em&gt;Rancher Kubernetes Engine&lt;/em&gt;.&lt;br&gt;
Mais informações sobre RKE vs RKE2, &lt;a href="https://www.suse.com/c/pt-br/rancher_blog/rke-vs-rke2-comparing-kubernetes-distros/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O sistema operacional base validado aqui será o &lt;em&gt;Oracle Linux 8&lt;/em&gt;. Porém, possivelmente o mesmo procedimento em distribuições Red Hat like (CentOS, Alma Linux, Rocky Linux, etc) funcionará sem problemas.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. O Cluster RKE2 - Topologia Básica&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Esta instalação considera cinco nodes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;03 nodes com as roles control-plane + etcd&lt;/li&gt;
&lt;li&gt;02 nodes com a role agent (worker)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04nmfrmefejx6ixy2qds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04nmfrmefejx6ixy2qds.png" alt="Image description" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outras configurações de cluster podem ser consultadas na &lt;a href="https://docs.rke2.io/install/ha" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2.1. Sugestão de recursos&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Uma sugestão de capacidade computacional, pode ser a listada abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Control-plane&lt;/strong&gt;: 4GB de RAM, 4 cpus, espaço em disco para o /var de 150GB. Mínimo de 3 nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker&lt;/strong&gt;: 16GB de RAM, 8 cpus, espaço em disco para o /var de 250GB. Mínimo de 3 nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada ambiente é único, e uma análise detalhada das suas necessidades é essencial para dimensionar adequadamente o cluster Kubernetes com RKE2.&lt;/p&gt;

&lt;p&gt;Uma dica útil é usar volumes lógicos (LVM) para o &lt;strong&gt;/var&lt;/strong&gt;, assim ficará mais fácil realizar aumento do volume.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2.2. Esclarecimentos&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O cluster RKE2 que será implantado utilizará como plugin de rede o &lt;strong&gt;Canal&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;O RKE2 denomina como &lt;strong&gt;server&lt;/strong&gt; uma instalação de node que terá a role de &lt;strong&gt;control-plane&lt;/strong&gt;. E os nodes que terão a role de &lt;strong&gt;worker&lt;/strong&gt;, denomina como &lt;strong&gt;agent&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3.Preparação do ambiente&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nesse artigo tutorial, é utilizado DNS. Assim, é essencial que o DNS interno da sua rede funcione corretamente, pois será necessário criar os devidos apontamentos.. &lt;/p&gt;

&lt;p&gt;Para facilitar a execução dos passos desse tutorial, será realizado apontamento no arquivo &lt;strong&gt;/etc/hosts&lt;/strong&gt; de cada node, conforme abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;192.168.100.101    rke01.devsecops.local.in
192.168.100.102    rke02.devsecops.local.in
192.168.100.103    rke03.devsecops.local.in
192.168.100.104    rke04.devsecops.local.in
192.168.100.105    rke05.devsecops.local.in
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso vá validar esse tutorial em seu ambiente, adeque os ips e nomes conforme seu ambiente.&lt;/p&gt;

&lt;p&gt;Vamos ao trabalho!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.1. Entradas DNS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Adicionando as entradas no /etc/hosts de cada node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/hosts &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
192.168.100.101    rke01.devsecops.local.in
192.168.100.102    rke02.devsecops.local.in
192.168.100.103    rke03.devsecops.local.in
192.168.100.104    rke04.devsecops.local.in
192.168.100.105    rke05.devsecops.local.in
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3.2. Desabilitar SWAP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O uso de swap em ambientes Kubernetes não é recomendado. Assim, desabilite o swap em cada node.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl disable swap.target
swapoff &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3.3. Configuração do firewall host&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Este passo é opcional, mas altamente recomendado. Embora aumente a complexidade da configuração, é essencial em ambientes que exigem maior controle. Se esse for o seu cenário, aqui será demonstrada a configuração do FirewallD, disponível em distribuições Linux baseadas no Red Hat.&lt;/p&gt;

&lt;p&gt;O firewall do host será configurado em cada node utilizando o comando CLI do FirewallD, firewall-cmd. No geral, a configuração é parecida em cada node, com algumas pequenas diferenças:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certifique-se de não adicionar o próprio IP do node como origem (source), pois isso pode causar problemas.&lt;/li&gt;
&lt;li&gt;A configuração nos nodes workers é um pouco menor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta configuração segue as orientações da &lt;a href="https://docs.rke2.io/install/requirements#networking" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;sobre as portas que devem ser liberadas. Lembre-se, aqui trata-se de uma liberação na rede interna de seu ambiente, considerando um cenário de um ambiente que tenha mais controle.&lt;/p&gt;

&lt;p&gt;Em cada node, crie uma nova zona no FirewallD com o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--new-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, denominei a zona de "rke2-zone".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;a. Configuração no node rke01 (control-plane):&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Associe os IPs dos outros nodes como origens (sources) à zona criada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.102 &lt;span class="c"&gt;#rke02&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.103 &lt;span class="c"&gt;#rke03&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.104 &lt;span class="c"&gt;#rke04&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.105 &lt;span class="c"&gt;#rke05&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criação das regras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2379/tcp &lt;span class="c"&gt;#etcd client port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2380/tcp &lt;span class="c"&gt;#etcd peer port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2381/tcp &lt;span class="c"&gt;#etcd metrics&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6443/tcp &lt;span class="c"&gt;#Kubernetes API&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9345/tcp &lt;span class="c"&gt;#RKE2 Supervisor API&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8472/udp &lt;span class="c"&gt;#Canal VXLAN&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9099/tcp &lt;span class="c"&gt;#Canal CNI health checks&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10250/tcp &lt;span class="c"&gt;#Kubelet metrics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras para zone public:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30000-32767/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicando a configuração de forma efetiva com um reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;b. Configuração no node rke02 (control-plane):&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Associe os IPs dos outros nodes como origens (sources) à zona criada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.101 &lt;span class="c"&gt;#rke01&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.103 &lt;span class="c"&gt;#rke03&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.104 &lt;span class="c"&gt;#rke04&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.105 &lt;span class="c"&gt;#rke05&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criação das regras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2379/tcp  &lt;span class="c"&gt;# etcd client port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2380/tcp  &lt;span class="c"&gt;# etcd peer port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2381/tcp  &lt;span class="c"&gt;# etcd metrics&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6443/tcp  &lt;span class="c"&gt;# Kubernetes API&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9345/tcp  &lt;span class="c"&gt;# RKE2 Supervisor API&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8472/udp  &lt;span class="c"&gt;# Canal VXLAN&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9099/tcp  &lt;span class="c"&gt;# Canal CNI health checks&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10250/tcp &lt;span class="c"&gt;# Kubelet metrics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras para zone public:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30000-32767/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicando a configuração de forma efetiva com um reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;c. Configuração no node rke03 (control-plane):&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Associe os IPs dos outros nodes como origens (sources) à zona criada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.101 &lt;span class="c"&gt;#rke01&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.102 &lt;span class="c"&gt;#rke02&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.104 &lt;span class="c"&gt;#rke04&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.105 &lt;span class="c"&gt;#rke05&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criação das regras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2379/tcp  &lt;span class="c"&gt;# etcd client port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2380/tcp  &lt;span class="c"&gt;# etcd peer port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2381/tcp  &lt;span class="c"&gt;# etcd metrics&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6443/tcp  &lt;span class="c"&gt;# Kubernetes API&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9345/tcp  &lt;span class="c"&gt;# RKE2 Supervisor API&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8472/udp  &lt;span class="c"&gt;# Canal VXLAN&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9099/tcp  &lt;span class="c"&gt;# Canal CNI health checks&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10250/tcp &lt;span class="c"&gt;# Kubelet metrics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras para zone public:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30000-32767/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicando a configuração de forma efetiva com um reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;d. Configuração no node rke04 (worker):&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Associe os IPs dos outros nodes como origens (sources) à zona criada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.101 &lt;span class="c"&gt;#rke01&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.102 &lt;span class="c"&gt;#rke02&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.103 &lt;span class="c"&gt;#rke03&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.105 &lt;span class="c"&gt;#rke05&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criação das regras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8472/udp &lt;span class="c"&gt;#Canal VXLAN&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9099/tcp &lt;span class="c"&gt;#Canal CNI health checks&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10250/tcp &lt;span class="c"&gt;#Kubelet metrics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras para zone public:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30000-32767/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicando a configuração de forma efetiva com um reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;e. Configuração no node rke05 (worker):&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Associe os IPs dos outros nodes como origens (sources) à zona criada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.101 &lt;span class="c"&gt;#rke01&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.102 &lt;span class="c"&gt;#rke02&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.103 &lt;span class="c"&gt;#rke03&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.100.104 &lt;span class="c"&gt;#rke04&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criação das regras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8472/udp  &lt;span class="c"&gt;# Canal VXLAN&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9099/tcp  &lt;span class="c"&gt;# Canal CNI health checks&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10250/tcp &lt;span class="c"&gt;# Kubelet metrics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras para zone public:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30000-32767/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicando a configuração de forma efetiva com um reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embora este processo possa ser automatizado com um shell script ou uma playbook Ansible, executá-lo manualmente ajuda a compreender melhor cada etapa antes de criar automações.&lt;/p&gt;

&lt;p&gt;Para visualizar a configuração em cada zona:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--list-all&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rke2-zone
firewall-cmd &lt;span class="nt"&gt;--list-all&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4. Instalação do RKE2 - Cluster em HA&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Agora, finalmente, chegou o momento de subir o cluster RKE2. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.1. Primeiro control-plane (rke01)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;É necessário subir primeiro um node control-plane. Aqui no cenário, o node rke01 será o primeiro.&lt;/p&gt;

&lt;p&gt;Passos:&lt;br&gt;
&lt;em&gt;&lt;strong&gt;a. Criação de diretórios necessários:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/rancher/rke2/
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;  /var/lib/rancher/rke2/server/manifests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;b. Criação do arquivo de configuração config.yaml:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;|tee /etc/rancher/rke2/config.yaml
tls-san:
  - rke01.devsecops.local.in
  - 192.168.100.101
  - rke02.devsecops.local.in
  - 192.168.100.102
  - rke03.devsecops.local.in
  - 192.168.100.103
  - rke04.devsecops.local.in
  - 192.168.100.104
  - rke05.devsecops.local.in
  - 192.168.100.105
write-kubeconfig-mode: "0600"
etcd-expose-metrics: true
selinux: true
cni:
  - canal
&lt;/span&gt;&lt;span class="no"&gt;
EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais detalhes sobre os parâmetros e configuração para servers &lt;a href="https://docs.rke2.io/reference/server_config" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;c. Criação de manifest para implantação de um Ingress Controller baseado no Nginx:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;| tee /var/lib/rancher/rke2/server/manifests/rke2-ingress-nginx-config.yaml
---
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-ingress-nginx
  namespace: kube-system
spec:
  valuesContent: |-
    controller:
      metrics:
        service:
          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/port: "10254"
      config:
        use-forwarded-headers: "true"
      allowSnippetAnnotations: "true"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;d. Inciar a instalação:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.rke2.io | &lt;span class="nv"&gt;INSTALL_RKE2_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;server sh -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A execução do script oficial instalará o RKE2 em modo server. Configurará os repositórios de pacotes RPM e a instalação será via gerenciador de pacotes padrão do S.O.&lt;/p&gt;

&lt;p&gt;Também será instalado o kubectl, assim será possível interagir com o cluster kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;e. Iniciar o serviço rke2-server:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start rke2-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse processo de subir o serviço pode demorar um pouco, é normal. Aguarde terminar.&lt;/p&gt;

&lt;p&gt;Depois, consulte o status do serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status rke2-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não ocorrendo nenhum erro, pode-se prosseguir.&lt;/p&gt;

&lt;p&gt;Deve-se habilitar o serviço, assim, ao reiniciar o sistema operacional, o rke2-server iniciará automaticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;rke2-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;f. Adicionando algumas variáveis de ambiente&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Por padrão, os binários do RKE2 ficam em /var/lib/rancher/rke2/bin. Então, é necessário adicionar esse caminho ao PATH do sistema, a fim de facilidar a execução dos comandos, sem precisar indicar o caminho todo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/var/lib/rancher/rke2/bin
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/rancher/rke2/rke2.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além dos binários em si, também foi criada a variável KUBECONFIG apontando para o arquivo de configuração, assim será possível usar o kubectl dentro do node&lt;/p&gt;

&lt;p&gt;Para tornar essas variáveis persistentes no ambiente, pode-se adicioná-las no .bashrc do usuário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"export PATH=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;:/var/lib/rancher/rke2/bin"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"export KUBECONFIG=/etc/rancher/rke2/rke2.yaml"&lt;/span&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.bashrc 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode-se executar um kubectl no node para confirmar o status do node no cluster kubernetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;g. Coletar o token de instalação&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Para adicionar outros nodes, é necessário coletar o token que foi gerado na instalação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /var/lib/rancher/rke2/server/node-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4.2. Demais nodes control-plane (rke02 e rke03)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Os passos são praticamente os mesmos. A diferença está no arquivo de configuração config.yaml e no fato de não ser necessário coletar o token de instalação nesses nodes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;a. Criação do arquivo config.yaml:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;|tee /etc/rancher/rke2/config.yaml
server: https://192.168.100.101:9345
token: &amp;lt;TOKEN_COLETADO_NO_NODE_01_AQUI&amp;gt;
write-kubeconfig-mode: "0644"
tls-san:
  - rke01.devsecops.local.in
  - 192.168.100.101
  - rke02.devsecops.local.in
  - 192.168.100.102
  - rke03.devsecops.local.in
  - 192.168.100.103
  - rke04.devsecops.local.in
  - 192.168.100.104
  - rke05.devsecops.local.in
  - 192.168.100.105
write-kubeconfig-mode: "0644"
selinux: true
etcd-expose-metrics: true
cni:
  - canal
&lt;/span&gt;&lt;span class="no"&gt;
EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que a diferença no arquivo de configuração está na adição da linha que deve conter o token que foi coletado no node 01 (rke01).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.3. Instalação de Worker node (rke04 e rke05)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Agora vamos a etapa de instalação dos nodes workers (agent). Os passos a seguir devem ser executados nos dois nodes workers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;a. Criação de diretório necessário:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/rancher/rke2/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;b. Criação do arquivo de configuração config.yaml&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;|tee /etc/rancher/rke2/config.yaml
server: https://192.168.100.101:9345
token: &amp;lt;TOKEN_COLETADO_NO_NODE_01_AQUI&amp;gt;
write-kubeconfig-mode: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="sh"&gt;0644&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="sh"&gt;
selinux: true
&lt;/span&gt;&lt;span class="no"&gt;
EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;c. Iniciar a instalação&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.rke2.io | &lt;span class="nv"&gt;INSTALL_RKE2_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;agent sh -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;d. Iniciar o serviço rke2-agent&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Após a execução do passo c, basta inciar o serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start rke2-agent.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O processo de start pode demorar um pouco, aguarde finalizar.&lt;/p&gt;

&lt;p&gt;Para consultar o status e verificar se está tudo certo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status rke2-agent.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deve-se habilitar o serviço, assim, ao reiniciar o sistema operacional, o rke2-agent iniciará automaticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;rke2-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, se tudo foi feito corretamente, nesse momento temos um cluster kubernetes implantado com a distribuição RKE2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referência
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.rke2.io/install/ha" rel="noopener noreferrer"&gt;https://docs.rke2.io/install/ha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rke2</category>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>Kind: uma jornada empolgante com k8s em seu GNU/Linux!</title>
      <dc:creator>Guto Ribeiro</dc:creator>
      <pubDate>Sun, 28 Apr 2024 20:40:29 +0000</pubDate>
      <link>https://dev.to/gutobrutus/kind-uma-jornada-empolgante-com-k8s-em-seu-gnulinux-3joa</link>
      <guid>https://dev.to/gutobrutus/kind-uma-jornada-empolgante-com-k8s-em-seu-gnulinux-3joa</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Durante o desenvolvimento e/ou testes de aplicações desenhadas para execução em ambientes baseados no orquestrador &lt;em&gt;Kubernetes&lt;/em&gt;, surge a necessidade de se ter um &lt;em&gt;cluster&lt;/em&gt; disponível. Nem sempre isso está acessível de forma prática e rápida.&lt;/p&gt;

&lt;p&gt;Existem várias formas e ferramentas que possibilitam executar um cluster k8s localmente. Aqui vou falar um pouco sobre o &lt;a href="https://kind.sigs.k8s.io/"&gt;&lt;em&gt;&lt;strong&gt;Kind&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; (&lt;em&gt;Kubernetes in Docker&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;&lt;strong&gt;kind&lt;/strong&gt;&lt;/em&gt; de forma resumida é uma forma de executar nodes kubernetes dentro de contêineres docker. Os nodes do &lt;em&gt;cluster&lt;/em&gt;, na prática são &lt;em&gt;containers docker&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cenário
&lt;/h2&gt;

&lt;p&gt;Para deixar tudo alinhado, meu ambiente de trabalho é baseado em &lt;em&gt;GNU/Linux&lt;/em&gt;, distribuição &lt;em&gt;Dedian Like&lt;/em&gt;. Entretanto, o &lt;em&gt;Kind&lt;/em&gt; também tem suporte para Windows e Mac. Assim, apesar de aqui ser demonstrado tudo baseado no meu cenário, isso pode perfeitamente ser adaptado para a sua realidade, basta seguir a documentação oficial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pré-requisitos:
&lt;/h3&gt;

&lt;p&gt;Para execução desse tutorial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribuição Linux (Debian Like, Ubuntu, por exemplo).&lt;/li&gt;
&lt;li&gt;Docker (é compatível também com Podman).
Para melhor entendimento, recomenda-se ter conhecimento básico prévio sobre:&lt;/li&gt;
&lt;li&gt;Contêineres de aplicação&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Para instalar o &lt;em&gt;kind&lt;/em&gt; existem várias maneiras. Aqui será demonstrado conforme a &lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start#installation"&gt;documentação oficial&lt;/a&gt;, mais especificamente através do método &lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start#installation"&gt;&lt;em&gt;&lt;strong&gt;Installing from Release Binaries&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Etapas&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download do binário (Aqui demonstrado para arquitetura AMD64/x86_64)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; x86_64 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class="nt"&gt;-Lo&lt;/span&gt; ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Adicionando permissão de execução ao binário
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./kind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Movendo o binário para um path que esteja na variável path do S.O.:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mv&lt;/span&gt; ./kind /usr/local/bin/kind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fja3o1snegg7es5yda49w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fja3o1snegg7es5yda49w.gif" alt="Instalação do Kind" width="801" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alguns esclarecimentos&lt;/strong&gt;:&lt;br&gt;
No primeiro comando, o trecho &lt;strong&gt;[ $(uname -m) = x86_64 ]&lt;/strong&gt; é uma condição que está validando se a arquitetura do sistema operacional é x86_64. Ou seja, ele valida se a saída do &lt;strong&gt;uname -m&lt;/strong&gt; que está dentro de um subshell "&lt;strong&gt;$()&lt;/strong&gt;" é igual a "x86_64", sendo igual, retornará sucesso.&lt;/p&gt;

&lt;p&gt;Como após a condição, temos um "&amp;amp;&amp;amp;", a segunda parte só executada se a primeira teve como saída sucesso. É isso que significa o "&amp;amp;&amp;amp;" em uma linha de comando shell, explicando:  &lt;strong&gt;comando1 &amp;amp;&amp;amp; comando2&lt;/strong&gt;, só será executado o comando2 se o comando1 teve sucesso. No caso aqui, se arquitetura do S.O. for diferente do esperado, nem será realizado o download do binário.&lt;/p&gt;

&lt;p&gt;No terceiro comando, caso queira consultar o path do seu S.O. para entender melhor para onde mover, basta digitar no terminal &lt;strong&gt;echo $PATH&lt;/strong&gt;. No caso do Ubuntu, pode-se mover para &lt;strong&gt;/usr/local/bin&lt;/strong&gt; que é um caminho padrão para instalação de binários adicionais no sistema.&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando o primeiro cluster
&lt;/h2&gt;

&lt;p&gt;Para criar um cluster é trivial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind create cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou passando um name para o cluster, sim você consegue criar mais de um cluster inclusive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind create cluser &lt;span class="nt"&gt;--name&lt;/span&gt; euterpe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando o nome não é passado como parâmetro, será criado um cluster com o nome kind.&lt;/p&gt;

&lt;p&gt;O nome é importante, pois será o &lt;em&gt;&lt;strong&gt;context&lt;/strong&gt;&lt;/em&gt; usado no config que é usado pelo comando &lt;strong&gt;&lt;em&gt;kubectl&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Caso queira listar os clusters criados com o kind:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind get clusters
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando tiver mais de um cluster, é necessário indicar ao kubectl o context. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl cluster-info &lt;span class="nt"&gt;--context&lt;/span&gt; kind
kubectl cluster-info &lt;span class="nt"&gt;--context&lt;/span&gt; euterpe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para excluir um cluster criado pelo kind:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind delete cluster &lt;span class="nt"&gt;-n&lt;/span&gt; euterpe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deve-se indicar o nome do cluster que quer excluir com a opção "-n" caso tenha mais de um cluster criado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agora a coisa vai ficar séria!
&lt;/h2&gt;

&lt;p&gt;Está tudo muito bem, mas nada demais até aqui. Agora, vamos criar um cluster com algumas customizações. &lt;/p&gt;

&lt;p&gt;Usando o kind, a forma de fazer isso é via um arquivo de configuração que é passado no momento da criação do cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Etapas&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar um arquivo de configuração do cluster no formato yaml (config.yaml):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cluster&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kind.x-k8s.io/v1alpha4&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;euterpe&lt;/span&gt;
&lt;span class="na"&gt;nodes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;control-plane&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kindest/node:v1.27.11@sha256:681253009e68069b8e01aad36a1e0fa8cf18bb0ab3e5c4069b2e65cafdd70843&lt;/span&gt;
  &lt;span class="na"&gt;kubeadmConfigPatches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;kind: InitConfiguration&lt;/span&gt;
    &lt;span class="s"&gt;nodeRegistration:&lt;/span&gt;
      &lt;span class="s"&gt;kubeletExtraArgs:&lt;/span&gt;
        &lt;span class="s"&gt;node-labels: "ingress-ready=true"&lt;/span&gt;
  &lt;span class="na"&gt;extraPortMappings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;hostPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
    &lt;span class="na"&gt;hostPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;worker&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kindest/node:v1.27.11@sha256:681253009e68069b8e01aad36a1e0fa8cf18bb0ab3e5c4069b2e65cafdd70843&lt;/span&gt;
  &lt;span class="na"&gt;extraMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hostPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/kind-data/worker01&lt;/span&gt;
    &lt;span class="na"&gt;containerPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/data&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;worker&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kindest/node:v1.27.11@sha256:681253009e68069b8e01aad36a1e0fa8cf18bb0ab3e5c4069b2e65cafdd70843&lt;/span&gt;
  &lt;span class="na"&gt;extraMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hostPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/kind-data/worker02&lt;/span&gt;
    &lt;span class="na"&gt;containerPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Alguns pontos sobre o arquivo&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Está sendo definido um cluster com 3 &lt;em&gt;nodes&lt;/em&gt;, um &lt;em&gt;control-plane&lt;/em&gt; e 2 &lt;em&gt;workers&lt;/em&gt;. Isso é definido nas linhas que contém "&lt;strong&gt;- role:&lt;/strong&gt; ";&lt;/li&gt;
&lt;li&gt;Está sendo definida uma versão específica de k8s, através do que é definido em "&lt;strong&gt;image:&lt;/strong&gt; ". Ou seja, através da imagem do container que será usado, é definida a versão do k8s. Mais informações &lt;a href="https://github.com/kubernetes-sigs/kind/releases"&gt;aqui&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Através dos trechos "&lt;strong&gt;kubeadmConfigPatches&lt;/strong&gt;" e "&lt;strong&gt;extraPortMappings&lt;/strong&gt;", possibilita-se o uso de &lt;em&gt;ingress&lt;/em&gt; &lt;em&gt;controller&lt;/em&gt; no cluster local, como por exemplo, o &lt;em&gt;Nginx Ingress Controller&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Nos &lt;em&gt;nodes workers&lt;/em&gt;, foi definida uma opção "&lt;strong&gt;extraMounts&lt;/strong&gt;", que permite montagem de volume entre os &lt;em&gt;nodes&lt;/em&gt; e o &lt;em&gt;host&lt;/em&gt; hospedeiro (seu computador). Isso ajuda em alguns cenários de persistência e transferência de dados.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Criando o cluster a partir do arquivo de configuração criado, por exemplo, &lt;em&gt;&lt;strong&gt;config.yaml&lt;/strong&gt;&lt;/em&gt; (o nome pode ser qualquer um):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind create cluster &lt;span class="nt"&gt;--config&lt;/span&gt; config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembre-se que, para que o comando acima funcione, no terminal deverás estar dentro do diretório que contém o arquivo &lt;em&gt;config.yaml&lt;/em&gt;. Se não, poderá ser passado o caminho completo do arquivo.&lt;/p&gt;

&lt;p&gt;Se tudo deu certo, a saída no terminal será:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx5j9xvkzg6x9dwtqeyr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx5j9xvkzg6x9dwtqeyr.png" alt="Kind - Cluster criado" width="604" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checando os &lt;em&gt;nodes&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NAME                    STATUS   ROLES           AGE   VERSION
euterpe-control-plane   Ready    control-plane   32s   v1.27.11
euterpe-worker          Ready    &amp;lt;none&amp;gt;          9s    v1.27.11
euterpe-worker2         Ready    &amp;lt;none&amp;gt;          15s   v1.27.11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, seu cluster local está pronto!&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações
&lt;/h2&gt;

&lt;p&gt;Mas por que usar o kind?&lt;/p&gt;

&lt;p&gt;Algumas razões para eu preferir o kind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;suporte a clusters de vários nós (incluindo HA);&lt;/li&gt;
&lt;li&gt;suporte a construção de versões de lançamento do Kubernetes;&lt;/li&gt;
&lt;li&gt;suporte para Linux, macOS e Windows;&lt;/li&gt;
&lt;li&gt;é um instalador Kubernetes em conformidade com certificação &lt;a href="https://landscape.cncf.io/?selected=kind&amp;amp;item=platform--certified-kubernetes-installer--kind"&gt;CNCF&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;facilidade de uso, visto que é tudo via container, pode facilmente criar e excluir. Ideal para testes rápidos em ambiente de desenvolvimento local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O kind oferece uma experiência excelente para iniciar clusters mais próximos de ambientes "reais" com kubernetes. &lt;/p&gt;

&lt;p&gt;É possível usar o kind em esteiras de CI/CD para ainda na pipeline subir um cluster com kind e fazer testes em seus manifestos ou charts helm. Assim, é possível validar QA e também testes de segurança, com a aplicação implantada inicialmente em um kind dentro de sua pipeline (github actions, gitlab ci/cd, etc).&lt;/p&gt;

&lt;p&gt;Há mais aplicações e utilidades do kind em seu ambiente, tenho certeza.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>kind</category>
      <category>devops</category>
    </item>
    <item>
      <title>Exploração de Vulnerabilidade</title>
      <dc:creator>Guto Ribeiro</dc:creator>
      <pubDate>Tue, 23 Apr 2024 23:45:23 +0000</pubDate>
      <link>https://dev.to/gutobrutus/exploracao-de-vulnerabilidade-4bh1</link>
      <guid>https://dev.to/gutobrutus/exploracao-de-vulnerabilidade-4bh1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Aviso&lt;/strong&gt;: &lt;em&gt;Este artigo tem objetivo educacional, servindo de base para compreender como funciona a exploração de serviço vulnerável, dentro de um escopo de um pentest, utilizando ambiente controlado, sem exploração de um ambiente real.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Artigo postado originalmente no Linkedin em 20/04/2022. Aqui com algumas modificações.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Introdução&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A área de segurança da informação vem ganhando maior visibilidade atualmente, mas os riscos e vulnerabilidades sempre existiram.&lt;/p&gt;

&lt;p&gt;O objetivo deste texto é demonstrar uma prova de conceito (POC) de exploração de vulnerabilidade no serviço webmin, utilizano-se uma abordagem de pentest.&lt;/p&gt;

&lt;p&gt;Um pentest (teste de intrusão em sistemas, em resumo) pode ser dividido em várias etapas, segundo alguns frameworks própios como o &lt;em&gt;&lt;strong&gt;Information System Assessment Framework - ISSAF&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;Open Source Security Testing Methodology Manual - OSSTMM&lt;/strong&gt;&lt;/em&gt;, O &lt;em&gt;&lt;strong&gt;Testing Guide (OTG) da Open Web Application Security Project - OWASP&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;Penetration Testing Execution Standard - PTES&lt;/strong&gt;&lt;/em&gt; e o &lt;em&gt;&lt;strong&gt;NIST Thecnical Guide to Information Security Testing and Assessment 800-115&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pode-se ilustrar etapas, de forma simplificada, conforme o diagrama abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflznk3i7y73c79u2fiam.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflznk3i7y73c79u2fiam.png" alt="Etapas de um Pentest" width="681" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na POC aqui demonstrada, será abordado até a etapa de exploração.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Execução da POC&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O que foi utilizado para a realização da POC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sistema Operacional Hospedeiro Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;VirtualBox versão 6.1.32&lt;/li&gt;
&lt;li&gt;Uma VM vulnerável, disponível em: &lt;a href="https://www.vulnhub.com/entry/hacker-fest-2019,378/"&gt;https://www.vulnhub.com/entry/hacker-fest-2019,378/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Uma VM com Kali Linux 2022.1, disponível para download em: &lt;a href="https://www.kali.org/get-kali/"&gt;https://www.kali.org/get-kali/&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;strong&gt;&lt;em&gt;vulnhub&lt;/em&gt;&lt;/strong&gt; é um site onde é possível realizar o download de Virtual Machines (VMs) que possuem vulnerabilidades. Isso é útil para estudo em ambiente controlado.&lt;/p&gt;

&lt;p&gt;Após configurar as VMs, vamos à execução.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.1. Obtendo informações&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Antes de mais nada, pode-se testar a VM vulnerárel. Essa VM contém um site, para simular uma situação real, como se fosse de fato um servidor disponibilizando um site. Para validar, pode-se acessar em um navegador o endereço IP da VM para ver se aparece algo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn25ixf4dfiy9obkxrn38.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn25ixf4dfiy9obkxrn38.gif" alt="Abrindo o site da VM vulnerável" width="1072" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No lab da POC, a VM vulnerável está configurada com o &lt;strong&gt;IP 192.168.56.125&lt;/strong&gt;. Logo, basta acessar no navegador o endereço &lt;strong&gt;&lt;a href="http://192.168.56.125"&gt;http://192.168.56.125&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ATENÇÃO&lt;/strong&gt;: Aqui cabe um alerta, sempre que for executar uma VM sabidamente vulnerável, nunca execute-a com configurações de rede que permitam a comunicação com sua rede real. No caso do Virtual Box, é bom consultar a &lt;a href="https://www.virtualbox.org/manual/ch06.html"&gt;documentação&lt;/a&gt; sobre as configurações de redes possíveis em uma VM.&lt;/p&gt;

&lt;p&gt;Para quem já tem um pouco mais de experiência, de pronto já reconhece que o site é feito utilizando o Wordpress. Mas mesmo quem não tem essa percepção, pelo próprio inspecionador do Browser, pode-se obter alguma pista. Mas vamos partir do entendimento que não se saiba, uma das formas de descobrir é pelo próprio Kali, utilizando a ferramenta whatweb:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnypyr9asn10p1wmu0vb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnypyr9asn10p1wmu0vb4.png" alt="Saída do comando whatweb" width="800" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na saída do comando whatweb, são exibidas algumas informações úteis, por exemplo, "Worpress[5.2.3]". Adicionalmente, pode-se verificar o alvo com a ferramenta wpscan, que é um scanner de vulnerabilidades específico para Wordpress, mas não é o foco dessa POC.&lt;/p&gt;

&lt;p&gt;Ainda como obtenção de informações, podemos utilizar o &lt;a href="https://nmap.org"&gt;Nmap&lt;/a&gt; para identificar portas abertas e serviços no host alvo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;sudo nmap -sV -p- -v -Pn 192.168.56.125&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em que:&lt;br&gt;
&lt;strong&gt;-sV&lt;/strong&gt; -&amp;gt; Identificar os serviços e versões que estão com portas abertas;&lt;br&gt;
&lt;strong&gt;-p-&lt;/strong&gt; -&amp;gt; Escanear todas as 65536 portas&lt;br&gt;
&lt;strong&gt;-v&lt;/strong&gt; -&amp;gt; Modo verboso, mostrar mais informações no terminal&lt;br&gt;
&lt;strong&gt;-Pn&lt;/strong&gt; -&amp;gt; Não utilizar o ICMP (ping)&lt;/p&gt;

&lt;p&gt;A saída do comando nmap:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsr1mt3nqqfoj5am30jvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsr1mt3nqqfoj5am30jvl.png" alt="Saída do comando nmap" width="781" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Observam-se algumas portas abertas, dentre elas a 10000/tcp, sendo identificado o serviço Webmin executando nesta porta, que é o serviço a ser explorado no escopo desta POC. Percebe-se, também, que a versão do Webmin é a 1.890.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção&lt;/strong&gt;: O Nmap é uma ferramenta que causa muito "ruído" na rede, tornando-o facilmente detectável em um ambiente que tenha o mínimo de maturidade em segurança da informação. Existem formas de tentar torná-lo mais discreto (&lt;strong&gt;&lt;em&gt;Stealthy&lt;/em&gt;&lt;/strong&gt;, na linguagem técnica da área), mas como aqui demonstrato, trata-se de um ambiente controlado, não se teve tal preocupação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resultados da etapa de Obtenção de Informações&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site utilizando Wordpress 5.2.3;&lt;/li&gt;
&lt;li&gt;Apache Web Server 2.4.25;&lt;/li&gt;
&lt;li&gt;vsftpd 3.0.3&lt;/li&gt;
&lt;li&gt;OpenSSH 7.4&lt;/li&gt;
&lt;li&gt;Sistema Operacional Linux (possivelmente um GNU/Debian);&lt;/li&gt;
&lt;li&gt;Portas abertas: 21/tcp - ftp, 22/tcp - ssh, 80/tcp - http e 10000/tcp - ssl/http.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o executado até aqui, ressalta-se que as operações executadas, não são a única forma de se obter as informações, existem outras maneiras, como: uso de comandos nativos de qualquer GNU/Linux, ferramentas web, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Identificação e Verificação de Vulnerabilidades&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Na etapa anterior, foram identificados vários serviços que podem ou não ter uma vulnerabilidade, proporcionando uma exploração/ataque. Para essa demonstração, será mantido apenas o escopo de exploração do Webmin. Entretanto, o que será demonstrado pode facilmente ser aplicado para os demais serviços, com as devidas proporções e ajustes.&lt;/p&gt;

&lt;p&gt;De posse das informações obtidas, pode-se facilmente realizar uma pesquisa no próprio google por "&lt;em&gt;webmin exploit&lt;/em&gt;" ou em ferramentas e sites especializados. Um site bem utilizado é o &lt;a href="https://www.exploit-db.com"&gt;Exploit DB&lt;/a&gt;. Através dele é possível verificar a existência de um exploit para determinada versão de um serviço, no nosso caso, o Webmin 1.890.&lt;/p&gt;

&lt;p&gt;Para quem ainda não conhece o termo, um &lt;em&gt;exploit&lt;/em&gt; é uma aplicação, uma quantidade de dados ou mesmo uma sequência de comandos que exploram uma determinada vulnerabilidade. É possível desenvolver um exploit ou mesmo consultar nas bases de dados especializadas, como citdado anteriormente.&lt;/p&gt;

&lt;p&gt;Após algumas pesquisas na internet, constata-se que existe uma a &lt;a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15107"&gt;CVE-2019-15107&lt;/a&gt;, conforme o próprio link,  "An issue was discovered in Webmin &amp;lt;=1.920. The parameter old in password_change.cgi contains a command injection vulnerability.". Será essa a CVE a ser explorada na POC.&lt;/p&gt;

&lt;p&gt;O interessante é que não foi necessário executar nenhuma ferramenta de verificação de vulnerabilidades, a exemplo, &lt;a href="https://www.openvas.org/"&gt;OpenVAS&lt;/a&gt;. Apenas com informações obtidas na primeira etapa, foi possível localicar vulnerabilidade e exploit na própia internet.&lt;/p&gt;

&lt;p&gt;Uma outra forma de procurar exploits é através do próprio Kali, usando o comando searchsploit, conforme a figura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg30ml3zizhvtq8asrsxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg30ml3zizhvtq8asrsxj.png" alt="Saída do comando searchsploit webmin" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Exploração&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Há algumas formas e técnicas para exploração. Será utilizado na demonstração, o framework &lt;a href="https://docs.rapid7.com/metasploit/msf-overview/"&gt;Metasploit&lt;/a&gt;. Através deste framework, pode-se desenvolver e utilizar exploits. Ele é uma ferramenta bastante utilizada em testes de invasão.&lt;/p&gt;

&lt;p&gt;Será realizada na demonstração, a tentativa de exploração usando o exploit listado na linha "Webmin 1.900 - Remote Command Execution (Metasploit) | cgi/remote/46201.rb", conforme a imagem da saída do comando &lt;em&gt;searchsploit webmin&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.1. Abrindo o Metasploit no Kali&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Basta digitar o comando msfconsole, estando como usuário root. Após executar o comando, o terminal terá a saída, conforme imagem abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.2. Buscando dentro do Metasploit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Através do próprio prompt do Metasploit é possível realizar uma busca por webmin, através do comando search webmin:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpax0je7jrp9dguiqviv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpax0je7jrp9dguiqviv.gif" alt="Buscando por exploit no msfconsole" width="1021" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Será utilizado: &lt;br&gt;
"&lt;em&gt;&lt;strong&gt;5 exploit/linux http/webmin_backdoor    2019-08-10      excellent Yes   Webmin password_change.cgi  Backdoor&lt;/strong&gt;&lt;/em&gt;"&lt;br&gt;
Pois, foi a vulnerabilidade encontrada está relacionada ao CGI (CVE-2019-15107).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.3. Ativando o exploit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para ativar, basta usar o comando &lt;em&gt;&lt;strong&gt;use 5&lt;/strong&gt;&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl8n3g7qp4lf1p37osa2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl8n3g7qp4lf1p37osa2.png" alt="Definindo o payload" width="459" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a ativação do exploit, para exibir as opções basta digitar &lt;em&gt;&lt;strong&gt;options&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5s01vz70ehmrh9rqqsj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5s01vz70ehmrh9rqqsj0.png" alt="Options do exploit" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o comando &lt;em&gt;&lt;strong&gt;info&lt;/strong&gt;&lt;/em&gt;, é possível listar informações adicionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.4. Configurando o exploit para inicar o ataque&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O payload já veio configurado, conforme a linha &lt;em&gt;&lt;strong&gt;Payload options (cmd/unix/reverse_perl)&lt;/strong&gt;&lt;/em&gt;, exibido na imagem anterior. Em alguns caso, é necessário configurar isso.&lt;/p&gt;

&lt;p&gt;Para evitar uma eventual inconsitência na execução do &lt;em&gt;exploit&lt;/em&gt;, devido a versão do webmin, visto que o alvo tem uma versão um pouco diferente da que o exploit foi desenvolvido para explorar, configura-se o force exploit. Assim, basta executar o comando &lt;em&gt;set _forceexploit true&lt;/em&gt;_.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Few74nm4cqrnz0bqlh4t2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Few74nm4cqrnz0bqlh4t2.png" alt="Definindo forceexploit como true" width="537" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, precisa-se configurar o remote host (o alvo), através do comando &lt;em&gt;set rhost IP_DO_ALVO&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr93qq1kps8lbmnd2tkkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr93qq1kps8lbmnd2tkkr.png" alt="Definindo o rhosts" width="557" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembre-se que as opções do que pode ou não ser configurado, são exibidas através do comando &lt;em&gt;options&lt;/em&gt; do msfconsole.&lt;/p&gt;

&lt;p&gt;Agora, configura-se o local host (o atacante), através do comando &lt;em&gt;set lhost IP_DO_ATACANTE&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo7tb4s395dk6vlbhgwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo7tb4s395dk6vlbhgwv.png" alt="Definindo o lhost" width="559" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;IP 192.168.56.127&lt;/strong&gt; é o ip configurado no host atacante, Kali.&lt;/p&gt;

&lt;p&gt;Para confirmar o que já está configurado, basta digitar o comando &lt;em&gt;options&lt;/em&gt; novamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F354oytgj3ww012pmp1dx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F354oytgj3ww012pmp1dx.png" alt="Exibindo as opções todas configuradas" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como RPORT já está a porta correta (10000), não precisamos configurar a porta remota (alvo).&lt;/p&gt;

&lt;p&gt;A LPORT (porta local, atacante) está configurada como 4444. Pode-se configurar uma porta mais baixa para tentar não ser bloqueado por um firewall, utilizando uma porta 443/tcp - https (&lt;em&gt;set lport 443&lt;/em&gt;), por exemplo. Além disso, é necessário habilitar o ssl com o comando set ssl true.&lt;/p&gt;

&lt;p&gt;Como foi utilizada a porta 443/tcp no lport (porta no host atacante), é importante confirmar se não existe nenhum serviço "up" usando essa porta no host atacante.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.5. Efetivando a exploração&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O que será executado é um &lt;em&gt;shell reverso&lt;/em&gt;, ou seja, ao invés do atacante abrir uma conexão com o alvo, o alvo abrirá uma conexão com o atacante, fornecendo um shell (terminal), por isso o nome shell reverso (&lt;em&gt;reverse shell&lt;/em&gt;). Esta é uma técnica muito utilizada, pois, eventualmente, um firewall pode está configurado de modo a ser mais permissivo para saída.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0l9v46pqv7mnru4vsod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0l9v46pqv7mnru4vsod.png" alt="Revere Shell" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para executar, basta digitar o comando run:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dnpovpfifoy1czi38nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dnpovpfifoy1czi38nx.png" alt="Run exploit" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima, já é percebido que o alvo conectou no atacante, abrindo um shell reverso. Foram executados os comandos: &lt;em&gt;id&lt;/em&gt;, &lt;em&gt;whoami&lt;/em&gt; e &lt;em&gt;ls -l /etc/passwd&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Exploração feita com sucesso!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. Considerações finais&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Essa exploração é considerada básica e fácil, até mesmo pelo fato do shell reverso já ser aberto com o usuário root, o que indica uma má configuração no servidor alvo. Se tivesse sido usado um usuário de serviço com permissões limitadas (princípio do menor privilégio possível) e sem shell habilitado, a exploração poderia oferecer maior esforço, pois teria de se buscar outra vulnerabilidade que permitisse a abertura de uma sessão de shell reverso assim como necessidade de a escalação de privilégios para o usuário root.&lt;/p&gt;

&lt;p&gt;Ficou evidenciado, também, uma falha que foi a de permitir saída para internet no host alvo. Isso não é recomendado, porém em alguns casos, existem regras permissivas de saída, por necessidade do negócio. Como o ataque usou uma porta baixa (443/tcp), que é a porta https, isso pode ter facilidado a exploração. Inclusive, os atacantes mais experientes não usam portas altas para receber conexões reversas, pois sabem que normalmente a porta 443 ou mesmo a 80, costumam está com a saída liberada.&lt;/p&gt;

&lt;p&gt;Mesmo sendo um ambiente controlado, é provável que existam ambientes em produção configurados dessa forma e com a vulnerabilidade que teve a exploração demonstrada aqui.&lt;/p&gt;

&lt;p&gt;Claro que se pode, perfeitamente, questionar: Mas alguém colocaria um webmin aberto pra internet? Mesmo que não, um servidor rodando o webmin com essa vulnerabilidade pode ser explorado em um ataque lateral, em que, por exemplo, se "ganha" um outro servidor e por uma falta de segregação de redes, consegue-se explorar o host que tem o webmin vulnerável.&lt;/p&gt;

&lt;p&gt;Cabe destacar, também, que foram utilizadas ferramentas com o intuito de automatizar e facilitar a análise do alvo e posterior exploração. Entretanto, um profissional deve ter conhecimento do que está sendo feito, afinal, ferramentas se aprendem ou se desenvolvem, mas o conhecimento que se tem sobre a área é o que diferencia o profissional no mercado. Assim, recomenda-se aprofundar os estudos, estudar o código do exploit usado, ler sobre a CVE explorada, etc. Antes de qualquer ferramenta, vem o conhecimento.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>pentest</category>
      <category>web</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
