<?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: Nicolas Evangelista </title>
    <description>The latest articles on DEV Community by Nicolas Evangelista  (@nikolai1312).</description>
    <link>https://dev.to/nikolai1312</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%2F1142012%2Fb1e259c6-b046-423e-b5f6-e343a82252cd.jpeg</url>
      <title>DEV Community: Nicolas Evangelista </title>
      <link>https://dev.to/nikolai1312</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nikolai1312"/>
    <language>en</language>
    <item>
      <title>Suas imagens de container não estão seguras!</title>
      <dc:creator>Nicolas Evangelista </dc:creator>
      <pubDate>Wed, 20 Mar 2024 21:53:30 +0000</pubDate>
      <link>https://dev.to/nikolai1312/suas-imagens-de-container-nao-estao-seguras-4lg3</link>
      <guid>https://dev.to/nikolai1312/suas-imagens-de-container-nao-estao-seguras-4lg3</guid>
      <description>&lt;p&gt;Não vale a pena chover no molhado, então não vou perguntar se você já sabe o que é um container, a pergunta agora é outra: Você sabe se o seu container está seguro? NÃO?!? Então chega junto que eu vou te mostrar uma parada. &lt;/p&gt;

&lt;p&gt;Antes de começar precisamos passar por conceitos importantes, porque assim poderemos enxergar o valor real de ferramentas open source focadas em segurança, como as imagens da Chainguard.&lt;/p&gt;

&lt;h3&gt;O que é uma vulnerabilidade de software?&lt;/h3&gt;

&lt;p&gt;Uma vulnerabilidade de software pode ser descrita como uma brecha de segurança contida dentro de um código fonte. Essa brecha pode ser aproveitada por pessoas mal intencionadas para acessar e manipular o software de uma forma nociva, causando um impacto negativo em empresas e/ou nos usuários que façam o uso desse software.&lt;/p&gt;

&lt;p&gt;Essas vulnerabilidades não podem ser postas como responsabilidade de um único indíviduo dentro de uma equipe de desenvolvimento, até porque podem surgir em diferentes etapas do desenvolvimento, desde a sua concepção, passando pelo desenvolvimento do código até chegar ao deploy e a sustenção do software. E como você deve ter imaginado, existem diversas vulnerabilidades conhecidas no mercado atualmente, porém nem todas são iguais. &lt;/p&gt;

&lt;h3&gt;O que são CVEs e CVSSs?&lt;/h3&gt;

&lt;p&gt;Para saber mais sobre as vulnerabilidades existentes e como metrificá-las utilizamos esses dois "queridões", o CVE &lt;em&gt;(Common Vulnerabilities and Exposures)&lt;/em&gt; e o CVSS &lt;em&gt;(Common Vulnerability Scoring System)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O CVE é um sistema público que nos ajuda a padronizar a documentação das vulnerabilidades que podemos nos deparar ao longo da nossa carreira, como lidar com novas vulnerabilidades não é do escopo do CVE, porém caso seja encontrada uma solução e ela se torne pública, essa vulnerabilidade terá uma documentação mais ampla, contando com formas de mitigar essa vulnerabilidade, quais foram os vetores e quais foram os danos causados. &lt;/p&gt;

&lt;p&gt;O CVE possui um processo para que as vulnerabilidades sejam documentadas, e consequentemente se tornem públicas, ele funciona da seguinte maneira: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma pessoa, ou organização, descobre uma vulnerabilidade; &lt;/li&gt;
&lt;li&gt;A vulnerabilidade é reportada para uma empresa participante do programa CVE; &lt;/li&gt;
&lt;li&gt;A empresa solicita uma identificação para essa vulnerabilidade, essa identificação segue um padrão de nomeclatura, CVE + ano de publicação da vulnerabilidade + Identificador único, por exemplo, CVE-2021-25276;&lt;/li&gt;
&lt;li&gt;O ID é reservado e será tratado internamente, porque nessa etapa a agência que cuida dos registros numéricos ainda não está preparada para publicar essa nova CVE, essa agências são chamadas de CNAs (CVE Numbering Authorities);&lt;/li&gt;
&lt;li&gt;A empresa publica os detalhes da vulnerabilidade, como a causa do problema, o tipo de vulnerabilidade, o impacto etc.;&lt;/li&gt;
&lt;li&gt;Por fim, a CVE é publicada assim que contém os requisitos mínimos para que possa se tornar pública, esse registro público é feito por uma CNA.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O CVSS utiliza algumas métricas para calcular o grau de severidade, como as métricas B &lt;em&gt;(Base metrics)&lt;/em&gt;, BE &lt;em&gt;(Base and Environmental metrics)&lt;/em&gt;, BT &lt;em&gt;(Base and Threat metrics)&lt;/em&gt; e a BTE que combina todas as métricas, essas diferentes métricas servem para propósitos diferentes, que são os seguintes:&lt;/p&gt;

&lt;p&gt;B -&amp;gt; São métricas que representam as características intrínsecas de uma vulnerabilidade que são classificadas como constantes, seja ao longo do tempo e independente do ambiente;&lt;/p&gt;

&lt;p&gt;T -&amp;gt; São as características de uma ameaça que podem variar ao longo do tempo, mas não variam necessariamente entre ambientes;&lt;/p&gt;

&lt;p&gt;E -&amp;gt; São características de vulnerabilidades que estão dentro do contexto do ambiente em que as aplicações estão sendo executadas.&lt;/p&gt;

&lt;p&gt;Essas métricas ajudam a computar um score melhor e mais assertivo quando se trata de vulnerabilidades, aliás, vamos falar sobre o score das vulnerabilidades.&lt;/p&gt;

&lt;p&gt;O score (ou pontuação) de cada vulnerabilidade é o que a define como uma vulnerabilidade crítica ou de baixo risco. Para que isso seja possível temos métricas que estão dentro de cada base que citei acima, passando por diversos contextos como vetor do ataque, a complexidade do ataque, se já existem técnicas maduras o suficiente para ajudar nesse ataque, e até mesmo métricas para indicar se o ambiente atacado possui dados sensíveis que não podem ser perdidos ou danificados, além de outras métricas que também são muito importantes para justificar o score. &lt;/p&gt;

&lt;p&gt;A junção de várias métricas e seus resultados é o que constitui o score final da vulnerabilidade, atualmente o score atualizado do CVSS 4.0 é o seguinte:&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%2F72dnb2wskcrhkusrfl7j.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%2F72dnb2wskcrhkusrfl7j.png" alt="Tabela de scores CVSS" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Como eu posso identificar essas vulnerabilidades?&lt;/h3&gt;

&lt;p&gt;Agora que passamos pelas vulnerabilidades, é normal se questionar sobre como podemos encontrá-las em nossos projetos pessoais, ou até mesmo em sistemas empresariais. Para isso contamos com a ajuda de diversas ferramentas de scan de vulnerabilidades, como o &lt;a href="https://trivy.dev/"&gt;trivy&lt;/a&gt; e o &lt;a href="https://github.com/anchore/grype?tab=readme-ov-file"&gt;grype&lt;/a&gt;, eles podem nos ajudar a buscar vulnerabilidades em uma imagem de um container, em um repositório, um filesystem, imagens de máquinas virtuais etc., ambos servem para o mesmo propósito, porém existem algumas particularidades entre as duas ferramentas que não cabem no assunto do texto, sugiro que deem uma olhada nas documentações para encontrar o que melhor satisfaz sua demanda. &lt;/p&gt;

&lt;p&gt;Um exemplo de como utilizar o trivy pode ser encontrado em sua &lt;a href="https://github.com/aquasecurity/trivy"&gt;documentação&lt;/a&gt;, o mesmo existe para o &lt;a href="https://github.com/anchore/grype"&gt;grype&lt;/a&gt;, mas gostaria de trazer aqui um exemplo do trivy e como essas vulnerabilidades são apresentadas para nós. &lt;/p&gt;

&lt;p&gt;O trivy faz o scan dos pacotes que são utilizados dentro dos softwares, esses são conhecidos como SBOMs &lt;em&gt;(Software Bill of Materials)&lt;/em&gt; e servem como uma "receita de bolo" para se criar um software, portanto lista todos os pacotes e dependências do projeto, isso será analisado pelo trivy; o trivy pode scanear o objeto buscando CVEs conhecidas através da leitura de bancos de dados que contém essas informações sobre as CVEs.  &lt;/p&gt;

&lt;p&gt;O exemplo mais simples que podemos demonstrar é o scan de uma imagem que está contida no registry do Docker, o famoso docker hub. Para isso vamos pegar uma imagem muito utilizada, a do servidor NGINX, podemos executar essa ação com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;trivy image nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando faz um scan de uma imagem de container para checar todas as vulnerabilidades, a saída do comando padrão é uma tabela contendo as informações da imagem que foi identificada, o número total de vulnerabilidades e quais os graus de risco de cada:&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%2Fslxexilgjrha0iq26v20.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%2Fslxexilgjrha0iq26v20.png" alt="Output do trivy" width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo dessa saída, a ferramenta nos oferece uma tabela com todas as CVEs detalhadas e o status de cada, se já foram solucionadas ou não, o grau de risco, os pacotes que são afetados por essa CVE, e outras informações referentes a esse contexto. &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%2F1hb8upfg79i7geg5adf6.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%2F1hb8upfg79i7geg5adf6.png" alt="Tabela do output do trivy" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui podemos ter uma ideia da quantidade de vulnerabilidades que uma imagem "padrão" pode conter, são 149 vulnerabilidades conhecidas, contendo  28 de alto risco e 2 críticas, imagina a bagaceira que pode acontecer em um possível ataque. Complicado, né?&lt;/p&gt;

&lt;h3&gt;Cortando o mal pela raiz&lt;/h3&gt;

&lt;p&gt;Agora que chegamos no final do caminho (será?) temos uma questão a ser resolvida: Como podemos diminuir as vulnerabilidades das nossas imagens de container? &lt;/p&gt;

&lt;p&gt;A resposta é simples: Usando imagens confiáveis (durrrr)!&lt;/p&gt;

&lt;p&gt;Brincadeiras à parte, hoje temos algumas soluções no mercado que se propõe a criar imagens distroless, que são imagens que não possuem um distribuição Linux convencional por trás da imagem, diminuindo significativamente a quantidade de possível vulnerabilidades que uma imagem pode conter, visto que diversos CVEs apontam que a causa do problema são pacotes de software contidos dentro de um SO que serve como base para nossas imagens, e o pior de tudo, esses pacotes muitas vezes não são necessários para a nossa aplicação em si. &lt;/p&gt;

&lt;p&gt;Uma dessas opções é oferecida pela &lt;a href="https://www.chainguard.dev/"&gt;Chainguard&lt;/a&gt;, uma empresa que tem como objetivo a segurança do open source, oferecendo imagens seguras para que possamos trabalhar com containers sem termos que nos preocupar tanto com a parte da segurança, por exemplo.&lt;/p&gt;

&lt;p&gt;As imagens da chainguard são baseadas no Wolfi, um sistema operacional que é desenvolvido pela própria Chainguard. O Wolfi é uma (não)distro de Linux usada para servir de base para imagens seguras, porque não conta com a presença de pacotes "desnecessários" para que uma aplicação possa rodar. &lt;/p&gt;

&lt;p&gt;Todas as imagens da chainguard estão disponíveis no repositório deles no github, exatamente neste repositório aqui -&amp;gt; &lt;a href="https://github.com/chainguard-images/images/tree/main"&gt;Images&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;"Nicolas, fala logo das vulnerabilidades da imagem, pelo amor de Deus!! Tem criança chorando aqui!!!", e eu te digo: Calma, mussarelo! Vamos ao que interessa então, vamos passar o trivy na imagem do NGINX da chainguard para checar as vulnerabilidades.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;trivy image cgr.dev/chainguard/nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de mostrar o resultado, peço que segure o queixo para não cair, de novo. Segurou? Então se liga no resultado:&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%2F5akbplhcfqll1oywfais.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%2F5akbplhcfqll1oywfais.png" alt="Vulnerabilidades da imagem do NGINX da Chainguard" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sim, nenhuma vulnerabilidade! &lt;/p&gt;

&lt;p&gt;Pronto! Agora você conhece uma alternativa para as suas imagens padrão, uma alternativa segura, performática e enxuta. Lembrando que os projetos da Chainguard são open source, portanto se você quiser e puder contribuir com os projetos, sinta-se livre para checar o repositório deles no github, seja para ajudar em uma issue, abrir uma discussão sobre melhorias, apontar bugs encontrados etc., faça sua parte para que possamos construir um futuro mais seguro e open source. &lt;/p&gt;

&lt;p&gt;Por fim, gostaria de indicar o hub de imagens da chainguard e o site com as documentações pros produtos que eles oferecem. Esse texto foi muito introdutório e mostrou apenas a ponta do iceberg quando se trata de imagens seguras, mas acho que a mensagem foi passada de forma clara: Cuide da segurança das suas imagens! &lt;/p&gt;

&lt;p&gt;Aqui temos o hub das imagens da Chainguard -&amp;gt; &lt;a href="https://images.chainguard.dev/?category=featured"&gt;Hub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui temos a documentação das imagens oferecidas pela Chainguard -&amp;gt; &lt;a href="https://edu.chainguard.dev/"&gt;Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Infelizmente os conteúdos relacionados às imagens da Chainguard, seguindo a documentação oficial, estão todos em inglês, mas prometo fazer um esforço para trazer mais conteúdo sobre elas em português.  &lt;/p&gt;

&lt;p&gt;Agradeço a atenção e a leitura! Estou disponível para conversar mais sobre o assunto e receber feedbacks sobre o conteúdo deste texto, muito obrigado!&lt;/p&gt;

&lt;h3&gt;Bibliografia&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://edu.chainguard.dev/"&gt;https://edu.chainguard.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wolfi-dev"&gt;https://github.com/wolfi-dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aquasecurity/trivy"&gt;https://github.com/aquasecurity/trivy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://juniorjbn.medium.com/o-que-%C3%A9-esse-tal-de-distroless-d1cc5dcd070e"&gt;https://juniorjbn.medium.com/o-que-%C3%A9-esse-tal-de-distroless-d1cc5dcd070e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gomex.me/blog/distroless/"&gt;https://gomex.me/blog/distroless/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.akamai.com/blog/security/cves-what-they-are-ways-to-mitigate-their-impact"&gt;https://www.akamai.com/blog/security/cves-what-they-are-ways-to-mitigate-their-impact&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.first.org/cvss/specification-document#CVSS-v4-0-Scoring"&gt;https://www.first.org/cvss/specification-document#CVSS-v4-0-Scoring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cve.org/About/Process#CVERecordLifecycle"&gt;https://www.cve.org/About/Process#CVERecordLifecycle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>docker</category>
      <category>containers</category>
      <category>devops</category>
    </item>
    <item>
      <title>Protocols and how they work</title>
      <dc:creator>Nicolas Evangelista </dc:creator>
      <pubDate>Tue, 05 Mar 2024 14:15:14 +0000</pubDate>
      <link>https://dev.to/basementdevs/protocols-and-how-they-work-46cd</link>
      <guid>https://dev.to/basementdevs/protocols-and-how-they-work-46cd</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclaimer: This is an introductory article made by someone who's studying this subject, if you have some advice about the topics that are covered in here, DM me! We can have a chat and i'll be pleased to change this article. Thanks for reading!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After my last article about deploys and how they work (only an introduction about that topic), i started to study more about network and how we can connect our devices with another devices, and exchange data between them, of course.&lt;/p&gt;

&lt;p&gt;I intend to do a series (don't know how many articles it will be) of articles about protocols and how they work individually, by the end of the series you might have a good understanding about how the internet works with all of these protocols working together, making a deploy look like child's play.&lt;/p&gt;

&lt;p&gt;For this matter i'll be using the two most used models, the TCP/IP and OSI model, as both of them can be used as reference models, it'll help us understand the data flow within any type of network. &lt;/p&gt;

&lt;p&gt;I've already knew OSI model from previous studies but it wasn't something that caught my attention, even TCP/IP, which is the backbone of our network communication didn't grab my attention, until now. Thus, i have decided to make some articles about some protocols that we already know, but showing - or trying to - how things work within the OSI and TCP/IP model.&lt;/p&gt;

&lt;h2&gt;
  
  
  OSI and TCP/IP stack
&lt;/h2&gt;

&lt;p&gt;Both models are structured with layers, the OSI has 7 layers that correlates with the 4 layers of TCP/IP model, because both of them can be used as reference models. &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%2Flnom5pewjtf4mfi51gqv.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%2Flnom5pewjtf4mfi51gqv.png" alt="OSI and TCP/IP models" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, let's go through what protocols actually do and why we call them a stack.&lt;/p&gt;

&lt;p&gt;Protocols are basically an agreement between two or more hosts to establish some standards for this communication to happen, the stack is created so we can have a reference for the multiple stages in this conversation, and troubleshoot any issues that might show up. We can say that a protocol stack is the one that contains all the protocols, or services, that are needed for hosts to communicate with each other.  &lt;/p&gt;

&lt;p&gt;Furthermore the stack also represents the isolation between layers, so each layer will communicate with the same layer in the other host and will pass through the same stages using the same protocols, the isolation between layers is used so that the upper layers don´t have to occupy themselves with some services that are being executed on the lower layers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Ok, but what these layers actually do?
&lt;/h2&gt;

&lt;p&gt;The 1st layer of the stack is the physical layer and at this point i think that everyone knows how data is physically transmitted, doesn't matter what is the medium used, the computer will always see bits flowing.&lt;/p&gt;

&lt;p&gt;The 2nd layer is responsible for transforming the transmission received, break into smaller pieces making data frames (hundreds or thousands of bytes) and transmitting the frames sequentially, the receiver can send back an acknowledgement frame to confirm that he has received the data frame correctly.&lt;/p&gt;

&lt;p&gt;3rd layer might be the most famous one, it is the layer responsible for routing data through networks, besides that, it is responsible for dealing with congestion and the quality of the service offered by other layers, the network layer must assure that the correct protocols are being used. The data in this layer is called packets.&lt;/p&gt;

&lt;p&gt;4th layers is the most challenging for me, specially because it's here where the magic - or the isolation - happens, this layer is responsible for isolating the communication process between the upper and lower layers, therefore it needs to put everything in order, so it must reorder every data received and handle the communication with care. This is a layer that must establish a connection that aims directly to the other machine, so it is a "direct" connection between two hosts, because the lower layers will handle the communication between the host and the next immediate host, so it could be a router, a switch or an access point, but the 4th layer will handle the communication between the host and the final destination.&lt;/p&gt;

&lt;p&gt;The last 3 layers represents just 1 layer of the TCP/IP stack, and why is that? Well, that's an interesting topic, but we'll not deal with that right now, so let's keep moving. &lt;/p&gt;

&lt;p&gt;The session layer is mainly responsible for taking care of the session tokens, like keeping track of whose turn it is to transmit data, will also manage this tokens so the two parties won't even attempt to send data without the token, and last but not least, making sure that the data that has been transmitted is in order even if a crash occurs during the data transmission.   &lt;/p&gt;

&lt;p&gt;Almost reaching the peak of the model we have the presentation layer, this layer we can look at him more like a support role, because it will help the application layer to communicate with some services offered by the session layer, it is through this layer that the session layer knows which services it needs to provide to keep the data flowing. &lt;/p&gt;

&lt;p&gt;Last, but definitely not least, we have the application layer that have the duty of provide access to other services within the OSI model, it does that by using an interface that allows the end user to communicate with other services, all of the data generated with this input will be used by some other tools that will establish a connection with the layer below, then follow the process until it reach the other host.  &lt;/p&gt;

&lt;h2&gt;
  
  
  To be continued...
&lt;/h2&gt;

&lt;p&gt;This may sound confusing right now, but i'm sure that will help a lot with the understanding of the protocols that will be presented to you throughout your career as IT professional, because this layers can be seen by every communication process in a network, as i said at the beginning of this article, these are reference models, so it won't show you the answers about how an specific protocol work, but will definitely show you which rules the protocol has to follow to be part of some layer, or what functionalities some protocol have just for being part of any of these layers. &lt;/p&gt;

&lt;p&gt;The next article will treat the communication process within a LAN, which is a local area network, how the data flow works and the responsibilities for every component, it'll give a better understanding about how reference models can be applied to real scenarios. &lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Tanenbaum, Andrew S. Computer Networks. 5th ed. Upper Saddle River, NJ: Prentice Hall, 2010.&lt;/p&gt;

&lt;p&gt;Piscitello, David M., and Chapin, A. Lyman. Open Systems Networking: TCP/IP and OSI. Upper Saddle River, NJ: Addison-Wesley, 1993. &lt;/p&gt;

</description>
      <category>network</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>devops</category>
    </item>
    <item>
      <title>O que é um deploy?</title>
      <dc:creator>Nicolas Evangelista </dc:creator>
      <pubDate>Wed, 04 Oct 2023 15:07:28 +0000</pubDate>
      <link>https://dev.to/nikolai1312/o-que-e-um-deploy-nen</link>
      <guid>https://dev.to/nikolai1312/o-que-e-um-deploy-nen</guid>
      <description>&lt;p&gt;&lt;em&gt;O que é? De onde vieram? O que comem?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esse texto foi escrito após um período de grande decepção, muitas incertezas sobre a carreira em tech, bem no vale da auto-estima entre a inteligência de Alan Turing e a certeza de nunca ser um bom desenvolvedor. Tudo isso por conta do tema de hoje: Deploy de aplicações.&lt;/p&gt;

&lt;p&gt;Como disse Marx no prefácio de sua &lt;em&gt;magnum opus&lt;/em&gt;, O Capital: &lt;em&gt;"Todo o começo é difícil — isto vale em qualquer ciência."&lt;/em&gt;&lt;br&gt;
Não foi diferente para mim, começando a me aventurar no mundo de DevOps após ter sido instigado por uma dúvida muito trivial: "Como meu código vai sair do local host e ir parar na internet?", foi assim que eu me dei mal. Ou quase. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Tudo é físico&lt;/li&gt;
&lt;li&gt;Por que meu código está preso ao localhost?&lt;/li&gt;
&lt;li&gt;&lt;a href="//##-Final%20boss:%20A%20internet."&gt;Final boss: A internet.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agradecimentos&lt;/li&gt;
&lt;li&gt;Bibliografia&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Tudo é físico
&lt;/h2&gt;

&lt;p&gt;A maior dificuldade que tive para entender esse processo foi exatamente o marco zero da computação, o motivo pelo qual todos podemos ler textos online, ver conteúdos divertidos e ajudar outras pessoas ao redor do mundo: Tudo é físico!&lt;br&gt;
Em algum lugar do mundo, o nosso código existe na forma de bits, eletricidade, incomodando um hardware etc., ele está lá dando uma baita canseira em algum servidor físico.&lt;/p&gt;

&lt;p&gt;Mas isso não diz nada a respeito - até o presente momento - sobre o que é um deploy, então vamos por partes!&lt;/p&gt;
&lt;h2&gt;
  
  
  Por que meu código está preso ao localhost?
&lt;/h2&gt;

&lt;p&gt;A associação ainda não tinha sido feita, esse conceito estava órfão em minha mente.&lt;br&gt;
Pensei nisso por muito tempo, de verdade, passei noites em claro pensando em formas mirabolantes de resgatar meu querido código de dentro dessa prisão chamada "localhost", mas afinal o que é o localhost?&lt;/p&gt;

&lt;p&gt;Espera um pouco... O localhost possui um nome muito sugestivo: É um host (server) local! &lt;br&gt;
Poxa! Como eu nunca havia pensado nisso?!?&lt;/p&gt;

&lt;p&gt;O localhost nada mais é do que hostname, equivalente ao DNS para a internet e os IPs públicos, onde seu computador irá fazer uma requisição para ele mesmo, o IP do localhost sempre será o IP de sua máquina, portanto podemos acessar nossa aplicação da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(Nosso localhost) -&amp;gt; 127.0.0.1 : (Porta local) -&amp;gt; 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que estamos acessando nosso IP, um host local, na porta de número 3000 onde estará rodando nossa aplicação, aqui deve-se atentar ao fato de que o IP será diferente e a porta também, deverá seguir seu próprio código para realizar este experimento.&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%2Fl7bre9gh2pt51hhuwsam.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%2Fl7bre9gh2pt51hhuwsam.png" alt="Diagrama representando o localhost" width="615" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O DNS, ou Domain Name Service, nos ajuda a nomear os IPs, tal qual nossos documentos que contam com um nome e um Registro Geral, o famoso RG. Ainda não somos máquinas, mas temos algumas semelhanças.&lt;/p&gt;

&lt;p&gt;Se ligarmos o tico com o teco veremos que o passo inicial foi dado, nosso código está rodando em algum lugar. &lt;/p&gt;

&lt;h2&gt;
  
  
  Final boss: A internet.
&lt;/h2&gt;

&lt;p&gt;Até aqui já sabemos que o nosso código não é uma alucinação coletiva, e nem está tão aprisionado assim, mas então como podemos jogá-lo para dentro desse oceano chamado internet?&lt;/p&gt;

&lt;p&gt;A resposta é simples: Além de possuirmos um IP local, também possuímos um IP público, para que outros computadores possam nos enxergar na internet. Ok, estamos chegando à algum lugar. &lt;/p&gt;

&lt;p&gt;A ideia é boa e está tudo uma maravilha mas aqui temos outro problema, um problema físico!&lt;/p&gt;

&lt;p&gt;Físico?! Como assim!?! &lt;/p&gt;

&lt;p&gt;Pois é, pequeno gafanhoto. Nesse cenário ideal nós já nos esquecemos do marco zero da computação, a eletricidade! &lt;br&gt;
Aqui basta pensar no seguinte cenário: Colocamos nossa aplicação para rodar em nosso computador e conseguimos mergulhar nosso código nas águas do oceano da web, mas e se desligarmos nosso computador? Aí é que mora o perigo, porque nosso código será "desligado" também. &lt;/p&gt;

&lt;p&gt;Ok, então qual a solução?&lt;/p&gt;

&lt;p&gt;A solução é colocar nosso código em uma máquina que não desliga, literalmente. &lt;/p&gt;

&lt;p&gt;Devemos enviar nosso código para um servidor e executá-lo dentro do mesmo servidor, que terá um IP privado, o tal do localhost, e um IP público que poderá ser acessado por outros computadores que estão conectados na internet. &lt;/p&gt;

&lt;p&gt;Isso, por definição, seria um deploy feito da forma mais primitiva possível, mas pense positivo, esse conceito já não é mais um mistério.&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%2F8t6jqxdidxa3fhcpc4c5.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%2F8t6jqxdidxa3fhcpc4c5.png" alt="Diagrama representando o acesso ao servidor" width="800" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na data presente, em Outubro de 2023, existem diversas formas de fazer esse bendito deploy, porém esses foram os conceitos fundamentais que me ajudaram a entender um pouco mais sobre esse processo que parecia tão impossível. &lt;/p&gt;

&lt;p&gt;No próximo artigo irei abordar as diferentes formas de fazer um deploy e como isso foi realizado ao longo dos anos, então fiquem ligados para mais novidades não tão novas assim. &lt;/p&gt;

&lt;h3&gt;
  
  
  Agradecimentos
&lt;/h3&gt;

&lt;p&gt;Graças à comunidade Heart Developers pude entrar em contato com outro profissional da área de DevOps que abriu meus caminhos sobre este tema, esse artigo é apenas uma forma de agradecimento pelo tempo cedido. Valeu, He4rt! Valeu, Felipe Schossler!  &lt;/p&gt;

&lt;h3&gt;
  
  
  Bibliografia
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://kubernetes.io/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do"&gt;https://kubernetes.io/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/Publishing_your_website"&gt;https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/Publishing_your_website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.hostinger.com/tutorials/what-is-localhost"&gt;https://www.hostinger.com/tutorials/what-is-localhost&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Fiz um push sem checar as alterações do repositório, e agora?</title>
      <dc:creator>Nicolas Evangelista </dc:creator>
      <pubDate>Thu, 14 Sep 2023 01:04:55 +0000</pubDate>
      <link>https://dev.to/nikolai1312/fiz-um-push-sem-checar-as-alteracoes-do-repositorio-e-agora-f7k</link>
      <guid>https://dev.to/nikolai1312/fiz-um-push-sem-checar-as-alteracoes-do-repositorio-e-agora-f7k</guid>
      <description>&lt;h4&gt;
  
  
  *&lt;em&gt;Este artigo foi escrito em conjunto com &lt;a class="mentioned-user" href="https://dev.to/donadonf"&gt;@donadonf&lt;/a&gt; *&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Dentro de uma equipe de desenvolvimento nos deparamos com algumas demandas que são desenvolvidas por pares, alguns casos utilizam até a mesma branch para desenvolver a tarefa e fazem com que os desenvolvedores trabalhem 2 habilidades muito importantes: A comunicação e o versionamento de código. Neste artigo iremos tratar de uma situação que pode ser comum, podemos chamá-la de “Fiz um push e não sabia que a branch havia mudado, e agora?”. &lt;/p&gt;

&lt;p&gt;Ao tentar fazer um push, provavelmente recebeu de volta uma mensagem indicando um conflito de branches, sendo a branch local em que está trabalhando e a branch remota, para onde irá o commit feito.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[rejected] master -&amp;gt; master (fetch first)
error: failed to push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bom, teremos um longo caminho pela frente, mas fique tranquilo porque há uma solução! &lt;/p&gt;

&lt;p&gt;Primeiramente, devemos verificar os commits que já estão na branch remota e qual o nosso status em relação a ela, para isso podemos executar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Receberá uma informação sobre o status das branch em que está trabalhando, dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On branch nome-da-branch
Your branch and 'origin/nome-da-branch' have diverged,
and have 1 and 1 different commits each, respectively.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso indica que sua branch local está com um commit a ser enviado, mas está com um commit atrasado em relação a branch remota, nesse cenário é necessário puxar os dados da branch remota antes de realizar o push para que não tenha um conflito de versões de código. &lt;/p&gt;

&lt;p&gt;Começaremos a solução do conflito entre as branches checando os logs dos commits feitos com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos pegar o ID do último commit feito, porque aqui estaremos visualizando um histórico dos commits feitos. Com esse ID iremos executar um hard reset na branch atual e retirar o commit do HEAD com outro comando, então a sequência de comandos será a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reset --hard ID-do-commit

git reset HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Novamente, vamos checar o status das versões que estamos trabalhando com comando &lt;code&gt;git status&lt;/code&gt;, veremos que alguns arquivos estão marcados como &lt;code&gt;Changes not staged for commit&lt;/code&gt;, isso significa que o commit foi resetado corretamente e as alterações feitas não foram perdidas. Devemos então armazenar essas mudanças dentro do stash para que possamos fazer o commit mais tarde com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso a operação ocorra bem, a mensagem será a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Saved working directory and index state WIP on nome-da-branch: ID-do-commit-atual-da-branch 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Devemos então executar o comando que irá mostrar a quantidade de arquivos que estão salvos no último stash feito.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como os arquivos estarão salvos no stash e branch terá voltado ao mesmo estágio da branch remota, podemos dar sequência ao procedimento padrão de um commit. Iremos checar o status da branch remota com o &lt;code&gt;git status&lt;/code&gt; e depois executar um &lt;code&gt;git pull&lt;/code&gt; para receber as alterações feitas na branch remota.&lt;/p&gt;

&lt;p&gt;Por fim, podemos retirar os arquivos do stash porque iremos utilizá-los agora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso irá trazer de volta as alterações feitas no commit que não conseguimos realizar o push. Caso esteja apavorado com a situação, poderá repetir o fluxo de visualizar o status da branch remota com &lt;code&gt;git status&lt;/code&gt; e ver se há mais atualizações, poupando uma possível dor de cabeça. Caso não tenha nenhuma alteração, podemos seguir com o commit normalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m "feat: texto-do-commit"

git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, podemos solucionar os conflitos de versões de uma forma simples e objetiva utilizando apenas o terminal do git. &lt;br&gt;
É chegado o grande momento, podemos dormir tranquilos com as versões atualizadas e organizadas em nossas respectivas branches.&lt;/p&gt;

</description>
      <category>git</category>
      <category>development</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
