<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://techlab.alugafacil.org/es/blog</id>
    <title>TechLab Blog</title>
    <updated>2025-11-08T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://techlab.alugafacil.org/es/blog"/>
    <subtitle>TechLab Blog</subtitle>
    <icon>https://techlab.alugafacil.org/es/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[🎗️ Microsoft Entra ID vs Tokens Pessoais vs Azure DevOps OAuth]]></title>
        <id>https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth</id>
        <link href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth"/>
        <updated>2025-11-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 🎗️ microsoft entra id vs tokens pessoais vs azure devops oauth.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-comparativo-de-autenticação-no-ecossistema-microsoft">💻 Comparativo de Autenticação no Ecossistema Microsoft<a href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth#-comparativo-de-autentica%C3%A7%C3%A3o-no-ecossistema-microsoft" class="hash-link" aria-label="Enlace directo al 💻 Comparativo de Autenticação no Ecossistema Microsoft" title="Enlace directo al 💻 Comparativo de Autenticação no Ecossistema Microsoft" translate="no">​</a></h2>
<div class="card__owf p-6 my-4 bg-gradient-to-r from-slate-50 to-white border border-gray-200 shadow-md"><div class="content_CUpA"><p></p><p>O <strong>Microsoft Entra ID</strong> (antigo Azure AD) vem substituindo
gradualmente os métodos tradicionais de autenticação usados no Azure DevOps,
como
<strong>Tokens de Acesso Pessoal (PAT)</strong> e<!-- --> <!-- -->
<strong>OAuth tradicional</strong>.</p><p></p><p class="mt-2"></p><p>Abaixo está uma comparação detalhada entre os três mecanismos, destacando
segurança, suporte e perspectiva de futuro.</p><p></p></div></div>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tabela-comparativa">📊 Tabela Comparativa<a href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth#-tabela-comparativa" class="hash-link" aria-label="Enlace directo al 📊 Tabela Comparativa" title="Enlace directo al 📊 Tabela Comparativa" translate="no">​</a></h2>
<table><thead><tr><th><strong>Característica</strong></th><th><strong>Microsoft Entra ID</strong></th><th><strong>Tokens de Acesso Pessoal</strong></th><th><strong>Azure DevOps OAuth</strong></th></tr></thead><tbody><tr><td><strong>Tempo de vida do token</strong></td><td>⏱️ Uma hora (autorefresh)</td><td>📅 Até um ano</td><td>⚙️ Configurável</td></tr><tr><td><strong>Autenticação multifator</strong></td><td>✅ Suporte nativo</td><td>❌ Sem suporte</td><td>❌ Sem suporte</td></tr><tr><td><strong>Acesso condicional</strong></td><td>✅ Suporte completo</td><td>❌ Sem suporte</td><td>❌ Sem suporte</td></tr><tr><td><strong>Políticas empresariais</strong></td><td>✅ Imposição</td><td>⚠️ Limitado</td><td>⚠️ Limitado</td></tr><tr><td><strong>Log de auditoria</strong></td><td>✅ Abrangente</td><td>⚠️ Básico</td><td>⚠️ Básico</td></tr><tr><td><strong>Investimento futuro</strong></td><td>✅ Desenvolvimento ativo</td><td>⚠️ Modo de manutenção</td><td>❌ Deprecado</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-interpretação-dos-resultados">💡 Interpretação dos Resultados<a href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth#-interpreta%C3%A7%C3%A3o-dos-resultados" class="hash-link" aria-label="Enlace directo al 💡 Interpretação dos Resultados" title="Enlace directo al 💡 Interpretação dos Resultados" translate="no">​</a></h2>
<div class="alert_DgrF info_ED0Q"><div class="content_jSH8"><p><strong>Microsoft Entra ID</strong> é a opção mais segura e moderna,
oferecendo:</p><ul class="list-disc list-inside mt-2"><li>Tokens de curta duração com renovação automática.</li><li>Suporte a autenticação multifator (MFA) e acesso condicional.</li><li>Integração nativa com políticas de segurança corporativa.</li></ul></div></div>
<div class="alert_DgrF warning_BsHV"><div class="content_jSH8"><p><strong>Tokens de acesso pessoal (PATs)</strong> continuam disponíveis, mas
estão em modo de manutenção. São úteis apenas para automações simples e
scripts locais sem requisitos de MFA.</p></div></div>
<div class="alert_DgrF error_nuCK"><div class="content_jSH8"><p><strong>Azure DevOps OAuth</strong> está sendo gradualmente descontinuado. O
uso em novos projetos não é recomendado.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-recomendações-práticas">🚀 Recomendações Práticas<a href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth#-recomenda%C3%A7%C3%B5es-pr%C3%A1ticas" class="hash-link" aria-label="Enlace directo al 🚀 Recomendações Práticas" title="Enlace directo al 🚀 Recomendações Práticas" translate="no">​</a></h2>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">✅ Recomendado</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">⚠️ Evitar</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><ul class="list-disc list-inside"><li>Adotar <strong>Microsoft Entra ID</strong> para todas as integrações e pipelines.</li><li>Habilitar <strong>autenticação multifator</strong> e <strong>acesso condicional</strong>.</li><li>Usar <code>Service Principals</code> e <code>Managed Identities</code> para automação.</li></ul></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><ul class="list-disc list-inside"><li>Evitar criar novos <strong>Tokens Pessoais</strong> — use apenas temporariamente.</li><li>Não basear integrações em <strong>OAuth legado</strong>.</li></ul></div></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão">🧠 Conclusão<a href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth#-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧠 Conclusão" title="Enlace directo al 🧠 Conclusão" translate="no">​</a></h2>
<div class="card__owf p-6 my-6 border border-gray-300 shadow-sm"><div class="content_CUpA"><p></p><p>A transição para o <strong>Microsoft Entra ID</strong> é um passo
fundamental rumo a uma arquitetura de segurança moderna baseada em
identidade e políticas inteligentes. Tokens de acesso pessoal e OAuth
legados devem ser considerados temporários ou de compatibilidade.</p><p></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-referências">📚 Referências<a href="https://techlab.alugafacil.org/es/blog/-microsoft-entra-id-vs-tokens-pessoais-vs-azure-devops-oauth#-refer%C3%AAncias" class="hash-link" aria-label="Enlace directo al 📚 Referências" title="Enlace directo al 📚 Referências" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://learn.microsoft.com/entra/" target="_blank" rel="noopener noreferrer" class="">Documentação oficial — Microsoft Entra ID</a></li>
<li class=""><a href="https://learn.microsoft.com/azure/devops/" target="_blank" rel="noopener noreferrer" class="">Azure DevOps — Gerenciamento de Tokens</a></li>
<li class=""><a href="https://learn.microsoft.com/azure/devops/organizations/accounts/use-entra-id" target="_blank" rel="noopener noreferrer" class="">Guia de segurança — Autenticação moderna no Azure DevOps</a></li>
</ul>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="AzureDevOps" term="AzureDevOps"/>
        <category label="EntraID" term="EntraID"/>
        <category label="Oauth" term="Oauth"/>
        <category label="SegurançA" term="SegurançA"/>
        <category label="AutenticaçãO" term="AutenticaçãO"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Visualizando o Código com Gource: Qualidade, Motivação e Colaboração]]></title>
        <id>https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao</id>
        <link href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre visualizando o código com gource: qualidade, motivação e colaboração.]]></summary>
        <content type="html"><![CDATA[<p>O <strong>Gource</strong> é uma ferramenta de visualização que transforma o histórico do seu repositório Git em uma animação.<br>
<!-- -->Cada <strong>arquivo</strong> aparece como um <strong>nó na árvore do projeto</strong>, e cada <strong>contribuidor</strong> é representado por uma “partícula” que cria ou modifica esses nós ao longo do tempo.</p>
<!-- -->
<p>Essa visualização permite <strong>ver o crescimento do código</strong>, o <strong>envolvimento da equipe</strong> e a <strong>evolução do projeto</strong> de maneira viva e envolvente.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-benefícios-para-a-equipe">🌱 Benefícios para a Equipe<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-benef%C3%ADcios-para-a-equipe" class="hash-link" aria-label="Enlace directo al 🌱 Benefícios para a Equipe" title="Enlace directo al 🌱 Benefícios para a Equipe" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-1-clareza-visual-do-progresso">👁️ 1. Clareza Visual do Progresso<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#%EF%B8%8F-1-clareza-visual-do-progresso" class="hash-link" aria-label="Enlace directo al 👁️ 1. Clareza Visual do Progresso" title="Enlace directo al 👁️ 1. Clareza Visual do Progresso" translate="no">​</a></h3>
<ul>
<li class="">Mostra a <strong>evolução do repositório</strong> de forma imediata e compreensível.</li>
<li class="">Ajuda a identificar <strong>padrões de trabalho</strong>, como módulos mais ativos ou períodos de alta produtividade.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-2-engajamento-e-reconhecimento">🤝 2. Engajamento e Reconhecimento<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-2-engajamento-e-reconhecimento" class="hash-link" aria-label="Enlace directo al 🤝 2. Engajamento e Reconhecimento" title="Enlace directo al 🤝 2. Engajamento e Reconhecimento" translate="no">​</a></h3>
<ul>
<li class="">Cada desenvolvedor vê seu <strong>impacto visualmente</strong>, o que reforça o senso de contribuição.</li>
<li class="">É ótimo para <strong>apresentações internas</strong>, <strong>onboardings</strong> e <strong>celebrações de entregas</strong>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-3-contexto-histórico">🧭 3. Contexto Histórico<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-3-contexto-hist%C3%B3rico" class="hash-link" aria-label="Enlace directo al 🧭 3. Contexto Histórico" title="Enlace directo al 🧭 3. Contexto Histórico" translate="no">​</a></h3>
<ul>
<li class="">Permite visualizar <strong>como o projeto nasceu e se expandiu</strong>.</li>
<li class="">Facilita retrospectivas e análises de <strong>crescimento técnico e organizacional</strong>.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-aplicações-práticas">🧩 Aplicações Práticas<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-aplica%C3%A7%C3%B5es-pr%C3%A1ticas" class="hash-link" aria-label="Enlace directo al 🧩 Aplicações Práticas" title="Enlace directo al 🧩 Aplicações Práticas" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-apresentações-de-projeto">💼 Apresentações de Projeto<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-apresenta%C3%A7%C3%B5es-de-projeto" class="hash-link" aria-label="Enlace directo al 💼 Apresentações de Projeto" title="Enlace directo al 💼 Apresentações de Projeto" translate="no">​</a></h3>
<ul>
<li class="">Mostre a evolução do código em <strong>eventos de entrega</strong>, <strong>demo days</strong>, <strong>reuniões executivas</strong> ou <strong>pitchs técnicos</strong>.</li>
<li class="">Demonstra o <strong>esforço coletivo</strong> e a <strong>maturidade da base de código</strong>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-onboarding-de-novos-membros">👨‍💻 Onboarding de Novos Membros<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-onboarding-de-novos-membros" class="hash-link" aria-label="Enlace directo al 👨‍💻 Onboarding de Novos Membros" title="Enlace directo al 👨‍💻 Onboarding de Novos Membros" translate="no">​</a></h3>
<ul>
<li class="">Use o Gource para apresentar <strong>a estrutura do projeto</strong> e <strong>principais áreas de contribuição</strong>.</li>
<li class="">Ajuda novos devs a entenderem <strong>a dinâmica do time</strong> e a <strong>arquitetura viva</strong> do sistema.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-indicadores-de-qualidade-e-atividade">📊 Indicadores de Qualidade e Atividade<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-indicadores-de-qualidade-e-atividade" class="hash-link" aria-label="Enlace directo al 📊 Indicadores de Qualidade e Atividade" title="Enlace directo al 📊 Indicadores de Qualidade e Atividade" translate="no">​</a></h3>
<ul>
<li class="">Ao cruzar o Gource com dados de commits e revisões, é possível <strong>identificar áreas críticas</strong> ou <strong>focos de retrabalho</strong>.</li>
<li class="">Serve como complemento visual a ferramentas de <strong>Code Quality</strong> e <strong>Analytics</strong>.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-como-usar">🛠️ Como Usar<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#%EF%B8%8F-como-usar" class="hash-link" aria-label="Enlace directo al 🛠️ Como Usar" title="Enlace directo al 🛠️ Como Usar" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-instalação">🔹 Instalação<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-instala%C3%A7%C3%A3o" class="hash-link" aria-label="Enlace directo al 🔹 Instalação" title="Enlace directo al 🔹 Instalação" translate="no">​</a></h3>
<p>Baixe o Gource:</p>
<ul>
<li class=""><a href="https://gource.io/" target="_blank" rel="noopener noreferrer" class="">https://gource.io/</a></li>
<li class="">Disponível para Windows, Linux e macOS.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-executando-no-windows">🔹 Executando no Windows<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-executando-no-windows" class="hash-link" aria-label="Enlace directo al 🔹 Executando no Windows" title="Enlace directo al 🔹 Executando no Windows" translate="no">​</a></h3>
<p>No campo <strong>Arguments</strong> do Gource GUI, cole:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">--seconds-per-day </span><span class="token number" style="color:#36acaa">0.3</span><span class="token plain"> --auto-skip-seconds </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--hide</span><span class="token plain"> filenames,dirnames,progress --camera-mode overview </span><span class="token parameter variable" style="color:#36acaa">--title</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Projeto AlugaFacil"</span><span class="token plain"> --background-colour 000000 --font-colour FFFFFF --bloom-intensity </span><span class="token number" style="color:#36acaa">0.4</span><span class="token plain"> --highlight-users --multi-sampling --max-files </span><span class="token number" style="color:#36acaa">3000</span><span class="token plain"> --file-idle-time </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> --stop-at-end</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exportando-vídeo">🔹 Exportando Vídeo<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-exportando-v%C3%ADdeo" class="hash-link" aria-label="Enlace directo al 🔹 Exportando Vídeo" title="Enlace directo al 🔹 Exportando Vídeo" translate="no">​</a></h3>
<p>Use o terminal com o comando:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">gource D:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Projects</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">-Solution</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">af</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">techlab.alugafacil.org --seconds-per-day </span><span class="token number" style="color:#36acaa">0.3</span><span class="token plain"> --auto-skip-seconds </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--hide</span><span class="token plain"> filenames,dirnames,progress --camera-mode overview </span><span class="token parameter variable" style="color:#36acaa">--title</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Projeto AlugaFacil"</span><span class="token plain"> --background-colour 000000 --font-colour FFFFFF --bloom-intensity </span><span class="token number" style="color:#36acaa">0.4</span><span class="token plain"> --multi-sampling --stop-at-end --output-framerate </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"> --output-ppm-stream - </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> ffmpeg </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> image2pipe </span><span class="token parameter variable" style="color:#36acaa">-vcodec</span><span class="token plain"> ppm </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> - </span><span class="token parameter variable" style="color:#36acaa">-b</span><span class="token plain"> 8000K AlugaFacil.mp4</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-integração-com-gitlab-cicd">⚙️ Integração com GitLab CI/CD<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#%EF%B8%8F-integra%C3%A7%C3%A3o-com-gitlab-cicd" class="hash-link" aria-label="Enlace directo al ⚙️ Integração com GitLab CI/CD" title="Enlace directo al ⚙️ Integração com GitLab CI/CD" translate="no">​</a></h2>
<p>Você pode automatizar a geração do vídeo do Gource em cada <strong>release</strong> do seu projeto.<br>
<!-- -->Adicione o seguinte job ao seu <code>.gitlab-ci.yml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">gource-visualization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> alpine</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">stage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deploy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">before_script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> apk add </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">no</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cache gource ffmpeg git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> gource </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">per</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">day 0.3 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">skip</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">seconds 1 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hide filenames</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">dirnames</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">progress </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">camera</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mode overview </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">title "$CI_PROJECT_TITLE" </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">background</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">colour 000000 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">font</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">colour FFFFFF </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">bloom</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">intensity 0.4 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">multi</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sampling </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stop</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">at</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">end </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">output</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">framerate 60 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">output</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ppm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stream </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> ffmpeg </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">y </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">r 60 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">f image2pipe </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcodec ppm </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">i </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">b 8000K gource</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">visual.mp4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">artifacts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> gource</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">visual.mp4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">expire_in</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1 week</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">only</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> release/*</span><br></span></code></pre></div></div>
<p>Isso cria automaticamente um vídeo <code>.mp4</code> mostrando a evolução do código no pipeline de CI/CD.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-estratégia-de-uso-na-equipe">🧠 Estratégia de Uso na Equipe<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-estrat%C3%A9gia-de-uso-na-equipe" class="hash-link" aria-label="Enlace directo al 🧠 Estratégia de Uso na Equipe" title="Enlace directo al 🧠 Estratégia de Uso na Equipe" translate="no">​</a></h2>
<table><thead><tr><th>Objetivo</th><th>Como aplicar</th><th>Resultado esperado</th></tr></thead><tbody><tr><td><strong>Motivar o time</strong></td><td>Mostre o vídeo Gource nas entregas de sprint</td><td>Aumento no engajamento e senso de pertencimento</td></tr><tr><td><strong>Revisar qualidade</strong></td><td>Compare a evolução do código com métricas de bugs</td><td>Identifica gargalos e hotspots</td></tr><tr><td><strong>Onboarding</strong></td><td>Exiba a animação a novos devs</td><td>Rápido entendimento da estrutura e história do projeto</td></tr><tr><td><strong>Documentação visual</strong></td><td>Anexe o vídeo ao README ou Confluence</td><td>Registro histórico das releases e marcos técnicos</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-cultura-e-motivação">🚀 Cultura e Motivação<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-cultura-e-motiva%C3%A7%C3%A3o" class="hash-link" aria-label="Enlace directo al 🚀 Cultura e Motivação" title="Enlace directo al 🚀 Cultura e Motivação" translate="no">​</a></h2>
<blockquote>
<p>"Cada commit conta uma história — o Gource mostra todas elas juntas."</p>
</blockquote>
<p>Ver a linha do tempo do código é uma forma de <strong>celebrar o progresso coletivo</strong>.<br>
<!-- -->Ele transforma o histórico técnico em <strong>narrativa visual</strong>, onde cada membro do time aparece contribuindo para um todo maior.</p>
<p>Essa experiência ajuda a:</p>
<ul>
<li class=""><strong>Reforçar a cultura de colaboração</strong></li>
<li class=""><strong>Valorizar o trabalho técnico</strong></li>
<li class=""><strong>Incentivar boas práticas de versionamento</strong></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-extras">🎁 Extras<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-extras" class="hash-link" aria-label="Enlace directo al 🎁 Extras" title="Enlace directo al 🎁 Extras" translate="no">​</a></h2>
<ul>
<li class="">Combine com <strong>GitLab CI/CD</strong> para gerar o vídeo a cada release.</li>
<li class="">Integre com <strong>Docusaurus</strong> ou <strong>Storybook</strong> para exibir a história do produto visualmente.</li>
<li class="">Use como abertura em <strong>apresentações de projetos internos ou clientes</strong>.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão">🧩 Conclusão<a href="https://techlab.alugafacil.org/es/blog/visualizando-o-codigo-com-gource-qualidade-motivacao-e-colaboracao#-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧩 Conclusão" title="Enlace directo al 🧩 Conclusão" translate="no">​</a></h2>
<p>O Gource é mais do que uma ferramenta de visualização —<br>
<!-- -->é uma <strong>forma artística de contar a história de um projeto</strong> e <strong>reconhecer o esforço humano</strong> por trás do código.</p>
<p>Ele conecta técnica e emoção, e ajuda equipes a enxergar <strong>qualidade, crescimento e colaboração</strong> de um jeito que números e dashboards não mostram.</p>
<hr>
<blockquote>
<p>✨ “Visualize. Celebre. Compartilhe a jornada do seu código.” — Equipe TechLab</p>
</blockquote>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="DevTools" term="DevTools"/>
        <category label="VisualizaçãO" term="VisualizaçãO"/>
        <category label="ColaboraçãO" term="ColaboraçãO"/>
        <category label="Qualidade" term="Qualidade"/>
        <category label="Git" term="Git"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[🧩 Estrutura Base dos Servidores MCP]]></title>
        <id>https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp</id>
        <link href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 🧩 estrutura base dos servidores mcp.]]></summary>
        <content type="html"><![CDATA[<p>Todo servidor <strong>MCP (Model Context Protocol)</strong> segue a mesma <strong>especificação de protocolo</strong>:</p>
<ul>
<li class="">Implementa métodos <strong>JSON-RPC 2.0</strong> (ou equivalente HTTP/SSE).</li>
<li class="">Expõe três tipos de artefatos fundamentais:</li>
</ul>
<table><thead><tr><th>Tipo</th><th>Função</th><th>Exemplo</th></tr></thead><tbody><tr><td>🛠️ <strong>Tools</strong></td><td>Ações executáveis</td><td>Funções, APIs, automações</td></tr><tr><td>📦 <strong>Resources</strong></td><td>Dados estáticos ou dinâmicos</td><td>Arquivos, registros, datasets</td></tr><tr><td>💬 <strong>Prompts</strong></td><td>Templates e instruções reutilizáveis</td><td>Estruturas de prompt e guias</td></tr></tbody></table>
<p>Cada servidor mantém um <strong>schema de capabilities</strong>, informando ao cliente <strong>o que ele oferece e como</strong>.<br>
<!-- -->A diferença entre tipos de servidor está <strong>em como esses artefatos são preenchidos e executados</strong>, e <strong>quais dependências externas</strong> são utilizadas.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-1-data--content-servers">⚙️ 1. Data &amp; Content Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#%EF%B8%8F-1-data--content-servers" class="hash-link" aria-label="Enlace directo al ⚙️ 1. Data &amp; Content Servers" title="Enlace directo al ⚙️ 1. Data &amp; Content Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> fornecer acesso a dados estruturados, arquivos, documentos ou fontes de conhecimento.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Resources:</strong> expostos via <code>listResources</code> e <code>readResource</code>, conectados a bancos SQL/NoSQL, APIs REST ou mecanismos de busca.</li>
<li class=""><strong>Tools:</strong> filtros, queries e buscas semânticas.</li>
<li class=""><strong>Infraestrutura:</strong> integração com bancos e indexadores (ElasticSearch, Qdrant, etc.).</li>
</ul>
<p><strong>Exemplo:</strong> <code>DataWarehouseMCP</code> → lê tabelas SQL e retorna JSONs interpretáveis pela IA.</p>
<blockquote>
<p>🧠 <strong>Foco:</strong> consulta e contexto, não execução.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-2-automation--action-servers">🔧 2. Automation &amp; Action Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#-2-automation--action-servers" class="hash-link" aria-label="Enlace directo al 🔧 2. Automation &amp; Action Servers" title="Enlace directo al 🔧 2. Automation &amp; Action Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> permitir que a IA execute <strong>comandos e automações externas</strong>.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Tools:</strong> são o núcleo — cada tool representa uma ação (ex: <code>createTicket</code>, <code>deployApp</code>).</li>
<li class=""><strong>Resources:</strong> opcionais — podem fornecer logs ou status de execução.</li>
<li class=""><strong>Infraestrutura:</strong> APIs, CLIs, CI/CD.</li>
<li class=""><strong>Segurança:</strong> controle de permissões e <em>audit trails</em>.</li>
</ul>
<blockquote>
<p>⚙️ <strong>Foco:</strong> execução de efeitos no mundo real (ações, automações).</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-3-domain--knowledge--memory-servers">🧠 3. Domain / Knowledge / Memory Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#-3-domain--knowledge--memory-servers" class="hash-link" aria-label="Enlace directo al 🧠 3. Domain / Knowledge / Memory Servers" title="Enlace directo al 🧠 3. Domain / Knowledge / Memory Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> manter conhecimento persistente, histórico e semântico.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Resources:</strong> dados de contexto longo — vetores, embeddings, ontologias.</li>
<li class=""><strong>Tools:</strong> busca contextual, sumarização, armazenamento de memória.</li>
<li class=""><strong>Infraestrutura:</strong> RAG, vector DBs (Pinecone, Chroma, FAISS), cache semântico.</li>
<li class=""><strong>Integração:</strong> com LLMs adicionais.</li>
</ul>
<blockquote>
<p>📚 <strong>Foco:</strong> recuperação e raciocínio contextual.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-4-software-engineering--devops-servers">💻 4. Software Engineering / DevOps Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#-4-software-engineering--devops-servers" class="hash-link" aria-label="Enlace directo al 💻 4. Software Engineering / DevOps Servers" title="Enlace directo al 💻 4. Software Engineering / DevOps Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> dar à IA acesso a código, repositórios, builds e ambientes de execução.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Resources:</strong> código-fonte, estrutura de diretórios, histórico Git.</li>
<li class=""><strong>Tools:</strong> <code>runTests</code>, <code>createBranch</code>, <code>lintCode</code>, <code>buildProject</code>.</li>
<li class=""><strong>Infraestrutura:</strong> Git, Docker, Terraform, Kubernetes.</li>
<li class=""><strong>Execução:</strong> local (via StdIO) ou em contêiner isolado.</li>
</ul>
<blockquote>
<p>⚡ <strong>Foco:</strong> assistência em engenharia de software e automação CI/CD.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-5-cloud--infra-servers">☁️ 5. Cloud &amp; Infra Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#%EF%B8%8F-5-cloud--infra-servers" class="hash-link" aria-label="Enlace directo al ☁️ 5. Cloud &amp; Infra Servers" title="Enlace directo al ☁️ 5. Cloud &amp; Infra Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> monitorar, gerenciar e orquestrar recursos de nuvem ou sistemas distribuídos.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Tools:</strong> comandos administrativos (<code>scalePod</code>, <code>restartService</code>).</li>
<li class=""><strong>Resources:</strong> métricas, logs, YAMLs de configuração.</li>
<li class=""><strong>Infraestrutura:</strong> SDKs (AWS, GCP, Azure), APIs Kubernetes.</li>
<li class=""><strong>Segurança:</strong> autenticação forte e tokens de curta duração.</li>
</ul>
<blockquote>
<p>🌐 <strong>Foco:</strong> controle operacional e observabilidade.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-6-productivity--collaboration-servers">🧩 6. Productivity / Collaboration Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#-6-productivity--collaboration-servers" class="hash-link" aria-label="Enlace directo al 🧩 6. Productivity / Collaboration Servers" title="Enlace directo al 🧩 6. Productivity / Collaboration Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> integrar a IA a ferramentas de produtividade e colaboração.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Tools:</strong> <code>sendMessage</code>, <code>updateTask</code>, <code>readCalendar</code>.</li>
<li class=""><strong>Resources:</strong> mensagens, arquivos, tarefas, eventos.</li>
<li class=""><strong>Infraestrutura:</strong> APIs SaaS e autenticação OAuth.</li>
</ul>
<p><strong>Exemplos:</strong> <code>SlackMCP</code>, <code>NotionMCP</code>, <code>GoogleWorkspaceMCP</code>.</p>
<blockquote>
<p>🗂️ <strong>Foco:</strong> integração leve e fluxo de trabalho humano-IA.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-7-security--compliance-servers">🛡️ 7. Security / Compliance Servers<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#%EF%B8%8F-7-security--compliance-servers" class="hash-link" aria-label="Enlace directo al 🛡️ 7. Security / Compliance Servers" title="Enlace directo al 🛡️ 7. Security / Compliance Servers" translate="no">​</a></h2>
<p><strong>Função:</strong> prover observabilidade, auditoria e segurança do ambiente de IA.</p>
<p><strong>Implementação típica:</strong></p>
<ul>
<li class=""><strong>Tools:</strong> <code>scanVulnerabilities</code>, <code>analyzeLogs</code>.</li>
<li class=""><strong>Resources:</strong> logs, alertas, políticas.</li>
<li class=""><strong>Infraestrutura:</strong> scanners (Trivy, OpenSCAP), SIEMs, APIs SOC.</li>
<li class=""><strong>Execução:</strong> em sandbox com logs detalhados.</li>
</ul>
<blockquote>
<p>🔒 <strong>Foco:</strong> governança e confiança do ecossistema.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-resumo-visual">🔍 Resumo Visual<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#-resumo-visual" class="hash-link" aria-label="Enlace directo al 🔍 Resumo Visual" title="Enlace directo al 🔍 Resumo Visual" translate="no">​</a></h2>
<table><thead><tr><th>Categoria</th><th>Tools</th><th>Resources</th><th>Infraestrutura</th><th>Foco</th></tr></thead><tbody><tr><td><strong>Data &amp; Content</strong></td><td>🔹 Baixa</td><td>🔹 Alta</td><td>DBs, Indexadores</td><td>Consultas</td></tr><tr><td><strong>Automation</strong></td><td>🔹 Alta</td><td>🔸 Média</td><td>APIs, Scripts</td><td>Execução</td></tr><tr><td><strong>Knowledge</strong></td><td>🔸 Média</td><td>🔹 Alta</td><td>Vector DB</td><td>Contexto</td></tr><tr><td><strong>DevOps</strong></td><td>🔹 Alta</td><td>🔸 Média</td><td>Git, Docker</td><td>Engenharia</td></tr><tr><td><strong>Cloud</strong></td><td>🔹 Alta</td><td>🔸 Média</td><td>Cloud SDKs</td><td>Orquestração</td></tr><tr><td><strong>Productivity</strong></td><td>🔸 Média</td><td>🔹 Alta</td><td>SaaS APIs</td><td>Integração</td></tr><tr><td><strong>Security</strong></td><td>🔹 Alta</td><td>🔸 Média</td><td>SIEM, Scanners</td><td>Compliance</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-diagrama-de-relações">🧭 Diagrama de Relações<a href="https://techlab.alugafacil.org/es/blog/-estrutura-base-dos-servidores-mcp#-diagrama-de-rela%C3%A7%C3%B5es" class="hash-link" aria-label="Enlace directo al 🧭 Diagrama de Relações" title="Enlace directo al 🧭 Diagrama de Relações" translate="no">​</a></h2>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<p>💡 <strong>Dica:</strong><br>
<!-- -->A modularidade dos servidores MCP permite combinar diferentes tipos — por exemplo, um <strong>Knowledge Server</strong> pode usar dados de um <strong>Data Server</strong> e acionar automações em um <strong>DevOps Server</strong> via capabilities integradas.</p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="MCP" term="MCP"/>
        <category label="Arquitetura" term="Arquitetura"/>
        <category label="Servidores" term="Servidores"/>
        <category label="AI" term="AI"/>
        <category label="AutomaçãO" term="AutomaçãO"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Entendendo Tools e MCP no VS Code Chat]]></title>
        <id>https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat</id>
        <link href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre entendendo tools e mcp no vs code chat.]]></summary>
        <content type="html"><![CDATA[<p>O <strong>VS Code Chat</strong> (ou <strong>Copilot Chat</strong>) permite criar <strong>agentes personalizados</strong> capazes de ler, editar e executar comandos dentro do seu ambiente de desenvolvimento.<br>
<!-- -->Esses agentes usam o campo <code>tools:</code> no arquivo <code>.prompt.md</code> para definir <strong>quais ferramentas</strong> eles podem usar.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-1-o-que-são-tools">⚙️ 1. O que são <code>tools:</code><a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#%EF%B8%8F-1-o-que-s%C3%A3o-tools" class="hash-link" aria-label="Enlace directo al ️-1-o-que-são-tools" title="Enlace directo al ️-1-o-que-são-tools" translate="no">​</a></h2>
<p>Cada agente no VS Code Chat tem uma configuração assim:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Agente DevSecOps — segurança, automação e IaC."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> search</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> problems</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><br></span></code></pre></div></div>
<p>As ferramentas listadas em <code>tools:</code> determinam <strong>o que o agente pode fazer</strong> — por exemplo, editar arquivos, rodar comandos de terminal, buscar código, ou analisar erros.</p>
<hr>
<p>title: "Entendendo Tools e MCP no VS Code Chat"
description: "Guia prático sobre ferramentas nativas e integrações via Model Context Protocol (MCP)"</p>
<hr>
<h1>🧩 Entendendo as Tools e o Model Context Protocol (MCP) no VS Code Chat</h1>
<p>O <strong>VS Code Chat</strong> (ou <strong>Copilot Chat</strong>) permite criar <strong>agentes personalizados</strong> capazes de ler, editar e executar comandos dentro do seu ambiente de desenvolvimento.<br>
<!-- -->Esses agentes usam o campo <code>tools:</code> no arquivo <code>.prompt.md</code> para definir <strong>quais ferramentas</strong> eles podem usar.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-1-o-que-são-tools-1">⚙️ 1. O que são <code>tools:</code><a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#%EF%B8%8F-1-o-que-s%C3%A3o-tools-1" class="hash-link" aria-label="Enlace directo al ️-1-o-que-são-tools-1" title="Enlace directo al ️-1-o-que-são-tools-1" translate="no">​</a></h2>
<p>Cada agente no VS Code Chat tem uma configuração assim:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Agente DevSecOps — segurança, automação e IaC."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> search</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> problems</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><br></span></code></pre></div></div>
<p>As ferramentas listadas em <code>tools:</code> determinam <strong>o que o agente pode fazer</strong> — por exemplo, editar arquivos, rodar comandos de terminal, buscar código, ou analisar erros.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-2-ferramentas-nativas-built-in-tools">🧰 2. Ferramentas nativas (Built-in Tools)<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-2-ferramentas-nativas-built-in-tools" class="hash-link" aria-label="Enlace directo al 🧰 2. Ferramentas nativas (Built-in Tools)" title="Enlace directo al 🧰 2. Ferramentas nativas (Built-in Tools)" translate="no">​</a></h2>
<p>Essas ferramentas são <strong>nativas do VS Code</strong> e <strong>não exigem configuração extra</strong>.<br>
<!-- -->Você pode usá-las em qualquer agente.</p>
<table><thead><tr><th>Tool</th><th>Função principal</th><th>Quando usar</th></tr></thead><tbody><tr><td><code>changes</code></td><td>Mostra diffs de arquivos modificados</td><td>Revisar alterações recentes</td></tr><tr><td><code>edit</code></td><td>Lê e edita arquivos do workspace</td><td>Corrigir YAML, Dockerfile, código etc</td></tr><tr><td><code>extensions</code></td><td>Busca extensões no Marketplace</td><td>Recomendar ou instalar plugins</td></tr><tr><td><code>fetch</code></td><td>Faz requisições HTTP simples</td><td>Buscar dados ou exemplos da web</td></tr><tr><td><code>githubRepo</code></td><td>Pesquisa código em repositórios GitHub</td><td>Encontrar padrões ou vulnerabilidades</td></tr><tr><td><code>new</code></td><td>Cria um novo workspace/projeto</td><td>Scaffold de apps</td></tr><tr><td><code>openSimpleBrowser</code></td><td>Abre uma página local no VS Code</td><td>Visualizar UI local ou documentação</td></tr><tr><td><code>problems</code></td><td>Lê e analisa erros e warnings</td><td>Revisar lint, build e erros de código</td></tr><tr><td><code>runCommands</code></td><td>Executa comandos no terminal</td><td>Rodar <code>docker</code>, <code>git</code>, <code>terraform</code> etc</td></tr><tr><td><code>runNotebooks</code></td><td>Executa células de notebooks</td><td>Data science e ML</td></tr><tr><td><code>runTasks</code></td><td>Executa tarefas do <code>.vscode/tasks.json</code></td><td>Automatização</td></tr><tr><td><code>search</code></td><td>Pesquisa e lê conteúdo em arquivos</td><td>Localizar código e configurações</td></tr><tr><td><code>testFailure</code></td><td>Mostra falhas de testes</td><td>Analisar testes quebrados</td></tr><tr><td><code>todos</code></td><td>Gerencia TODOs e FIXMEs</td><td>Revisar pendências</td></tr><tr><td><code>usages</code></td><td>Mostra referências e usos de símbolos</td><td>Refatoração e análise</td></tr><tr><td><code>vscodeAPI</code></td><td>Usa a API interna do VS Code</td><td>Criação de extensões</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-3-exemplo-de-agente-devsecops-somente-com-tools-nativas">🧑‍💻 3. Exemplo de agente DevSecOps (somente com tools nativas)<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-3-exemplo-de-agente-devsecops-somente-com-tools-nativas" class="hash-link" aria-label="Enlace directo al 🧑‍💻 3. Exemplo de agente DevSecOps (somente com tools nativas)" title="Enlace directo al 🧑‍💻 3. Exemplo de agente DevSecOps (somente com tools nativas)" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Agente DevSecOps — segurança, automação e boas práticas."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> search</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> problems</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Você é um engenheiro </span><span class="token important">**DevSecOps**.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Use o terminal e o editor para revisar arquivos YAML e Dockerfile</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rodar verificações de segurança e sugerir hardening.</span><br></span></code></pre></div></div>
<p>Esse agente consegue:</p>
<ul>
<li class="">Analisar <code>docker-compose.yml</code></li>
<li class="">Executar comandos como <code>docker-compose config</code></li>
<li class="">Editar arquivos inseguros</li>
<li class="">Relatar problemas do VS Code (lint, build etc.)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-4-quando-usar-mcp-model-context-protocol">🌐 4. Quando usar <strong>MCP (Model Context Protocol)</strong><a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-4-quando-usar-mcp-model-context-protocol" class="hash-link" aria-label="Enlace directo al -4-quando-usar-mcp-model-context-protocol" title="Enlace directo al -4-quando-usar-mcp-model-context-protocol" translate="no">​</a></h2>
<p>O <strong>MCP</strong> é um protocolo que permite conectar <strong>ferramentas externas reais</strong> ao VS Code Chat.<br>
<!-- -->Isso é necessário quando você quer usar:</p>
<ul>
<li class="">Docker 🐳</li>
<li class="">Kubernetes ☸️</li>
<li class="">Terraform 🪴</li>
<li class="">Trivy 🔍</li>
<li class="">Git avançado 🧩</li>
</ul>
<p>Essas ferramentas <strong>não são nativas</strong>, então precisam ser adicionadas via <strong>MCP Server</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-5-como-funcionam-os-mcp-servers">🔌 5. Como funcionam os MCP Servers<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-5-como-funcionam-os-mcp-servers" class="hash-link" aria-label="Enlace directo al 🔌 5. Como funcionam os MCP Servers" title="Enlace directo al 🔌 5. Como funcionam os MCP Servers" translate="no">​</a></h2>
<p>Um <strong>MCP Server</strong> é um serviço local (ou remoto) que “expõe” comandos e APIs como ferramentas para o Copilot Chat.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="estrutura-básica">Estrutura básica<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#estrutura-b%C3%A1sica" class="hash-link" aria-label="Enlace directo al Estrutura básica" title="Enlace directo al Estrutura básica" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mcp.json   → manifesto descrevendo as ferramentas</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">server.js  → implementação das tools (Node.js, Python, etc.)</span><br></span></code></pre></div></div>
<p>Exemplo de manifesto:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker-mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tools"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker.ps"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Lista containers"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker.logs"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Exibe logs de um container"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-6-configurando-mcp-no-vs-code">⚙️ 6. Configurando MCP no VS Code<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#%EF%B8%8F-6-configurando-mcp-no-vs-code" class="hash-link" aria-label="Enlace directo al ⚙️ 6. Configurando MCP no VS Code" title="Enlace directo al ⚙️ 6. Configurando MCP no VS Code" translate="no">​</a></h2>
<ol>
<li class="">Vá em ⚙️ → <strong>MCP Servers</strong></li>
<li class="">Clique em <strong>Add Server</strong></li>
<li class="">Adicione algo como:</li>
</ol>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"npx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"@modelcontext/docker-mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"serve"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">Salve e reinicie o VS Code Chat.</li>
<li class="">Agora, no seu <code>.prompt.md</code>, adicione:</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> docker</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> kubernetes</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-7-exemplo-completo--devsecops-com-mcp">🧱 7. Exemplo completo — DevSecOps com MCP<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-7-exemplo-completo--devsecops-com-mcp" class="hash-link" aria-label="Enlace directo al 🧱 7. Exemplo completo — DevSecOps com MCP" title="Enlace directo al 🧱 7. Exemplo completo — DevSecOps com MCP" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Agente DevSecOps — segurança, automação e IaC."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> docker</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> kubernetes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> terraform</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> trivy</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Você é um engenheiro </span><span class="token important">**DevSecOps**</span><span class="token plain"> com foco em segurança de containers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> infraestrutura e código.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">### Objetivos</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Rodar `docker ps` e analisar containers vulneráveis.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Executar `trivy image` e reportar vulnerabilidades.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Auditar `terraform plan` e propor correções seguras.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Revisar configurações de `kubernetes` com boas práticas.</span><br></span></code></pre></div></div>
<p>Com os MCPs conectados, o agente pode realmente:</p>
<ul>
<li class="">Executar comandos Docker e K8s,</li>
<li class="">Ler os resultados,</li>
<li class="">Corrigir arquivos,</li>
<li class="">E sugerir melhorias de segurança.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-8-resumo-rápido">🧠 8. Resumo rápido<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-8-resumo-r%C3%A1pido" class="hash-link" aria-label="Enlace directo al 🧠 8. Resumo rápido" title="Enlace directo al 🧠 8. Resumo rápido" translate="no">​</a></h2>
<table><thead><tr><th>Categoria</th><th>Ferramentas</th><th>Configuração</th></tr></thead><tbody><tr><td><strong>Nativas (Built-in)</strong></td><td><code>edit</code>, <code>runCommands</code>, <code>search</code>, <code>problems</code>, <code>todos</code>, <code>changes</code>, <code>fetch</code>...</td><td>Nenhuma — já disponíveis</td></tr><tr><td><strong>Externas (via MCP)</strong></td><td><code>docker</code>, <code>kubernetes</code>, <code>terraform</code>, <code>trivy</code>, <code>git</code> (avançado)</td><td>Precisa registrar MCP Server</td></tr><tr><td><strong>Modo de uso</strong></td><td>Campo <code>tools:</code> no <code>.prompt.md</code></td><td>Define o que o agente pode usar</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão">🧭 Conclusão<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧭 Conclusão" title="Enlace directo al 🧭 Conclusão" translate="no">​</a></h2>
<p>O campo <code>tools:</code> é o que define o “alcance” do seu agente.<br>
<!-- -->Use as <strong>built-in tools</strong> para tarefas locais de código, e <strong>MCPs</strong> para conectar o agente a ferramentas do mundo real — como Docker, Kubernetes e scanners de segurança.</p>
<p>Com isso, o <strong>VS Code Chat</strong> se transforma em um <strong>assistente DevSecOps completo</strong>, capaz de entender, auditar e automatizar todo o ciclo de desenvolvimento.</p>
<hr>
<p>💡 <strong>Dica final:</strong><br>
<!-- -->Comece com <code>tools: [edit, runCommands, search]</code>, depois adicione MCPs gradualmente para estender o poder do seu agente.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-2-ferramentas-nativas-built-in-tools-1">🧰 2. Ferramentas nativas (Built-in Tools)<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-2-ferramentas-nativas-built-in-tools-1" class="hash-link" aria-label="Enlace directo al 🧰 2. Ferramentas nativas (Built-in Tools)" title="Enlace directo al 🧰 2. Ferramentas nativas (Built-in Tools)" translate="no">​</a></h2>
<p>Essas ferramentas são <strong>nativas do VS Code</strong> e <strong>não exigem configuração extra</strong>.<br>
<!-- -->Você pode usá-las em qualquer agente.</p>
<table><thead><tr><th>Tool</th><th>Função principal</th><th>Quando usar</th></tr></thead><tbody><tr><td><code>changes</code></td><td>Mostra diffs de arquivos modificados</td><td>Revisar alterações recentes</td></tr><tr><td><code>edit</code></td><td>Lê e edita arquivos do workspace</td><td>Corrigir YAML, Dockerfile, código etc</td></tr><tr><td><code>extensions</code></td><td>Busca extensões no Marketplace</td><td>Recomendar ou instalar plugins</td></tr><tr><td><code>fetch</code></td><td>Faz requisições HTTP simples</td><td>Buscar dados ou exemplos da web</td></tr><tr><td><code>githubRepo</code></td><td>Pesquisa código em repositórios GitHub</td><td>Encontrar padrões ou vulnerabilidades</td></tr><tr><td><code>new</code></td><td>Cria um novo workspace/projeto</td><td>Scaffold de apps</td></tr><tr><td><code>openSimpleBrowser</code></td><td>Abre uma página local no VS Code</td><td>Visualizar UI local ou documentação</td></tr><tr><td><code>problems</code></td><td>Lê e analisa erros e warnings</td><td>Revisar lint, build e erros de código</td></tr><tr><td><code>runCommands</code></td><td>Executa comandos no terminal</td><td>Rodar <code>docker</code>, <code>git</code>, <code>terraform</code> etc</td></tr><tr><td><code>runNotebooks</code></td><td>Executa células de notebooks</td><td>Data science e ML</td></tr><tr><td><code>runTasks</code></td><td>Executa tarefas do <code>.vscode/tasks.json</code></td><td>Automatização</td></tr><tr><td><code>search</code></td><td>Pesquisa e lê conteúdo em arquivos</td><td>Localizar código e configurações</td></tr><tr><td><code>testFailure</code></td><td>Mostra falhas de testes</td><td>Analisar testes quebrados</td></tr><tr><td><code>todos</code></td><td>Gerencia TODOs e FIXMEs</td><td>Revisar pendências</td></tr><tr><td><code>usages</code></td><td>Mostra referências e usos de símbolos</td><td>Refatoração e análise</td></tr><tr><td><code>vscodeAPI</code></td><td>Usa a API interna do VS Code</td><td>Criação de extensões</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-3-exemplo-de-agente-devsecops-somente-com-tools-nativas-1">🧑‍💻 3. Exemplo de agente DevSecOps (somente com tools nativas)<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-3-exemplo-de-agente-devsecops-somente-com-tools-nativas-1" class="hash-link" aria-label="Enlace directo al 🧑‍💻 3. Exemplo de agente DevSecOps (somente com tools nativas)" title="Enlace directo al 🧑‍💻 3. Exemplo de agente DevSecOps (somente com tools nativas)" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Agente DevSecOps — segurança, automação e boas práticas."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> search</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> problems</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Você é um engenheiro </span><span class="token important">**DevSecOps**.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Use o terminal e o editor para revisar arquivos YAML e Dockerfile</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rodar verificações de segurança e sugerir hardening.</span><br></span></code></pre></div></div>
<p>Esse agente consegue:</p>
<ul>
<li class="">Analisar <code>docker-compose.yml</code></li>
<li class="">Executar comandos como <code>docker-compose config</code></li>
<li class="">Editar arquivos inseguros</li>
<li class="">Relatar problemas do VS Code (lint, build etc.)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-4-quando-usar-mcp-model-context-protocol-1">🌐 4. Quando usar <strong>MCP (Model Context Protocol)</strong><a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-4-quando-usar-mcp-model-context-protocol-1" class="hash-link" aria-label="Enlace directo al -4-quando-usar-mcp-model-context-protocol-1" title="Enlace directo al -4-quando-usar-mcp-model-context-protocol-1" translate="no">​</a></h2>
<p>O <strong>MCP</strong> é um protocolo que permite conectar <strong>ferramentas externas reais</strong> ao VS Code Chat.<br>
<!-- -->Isso é necessário quando você quer usar:</p>
<ul>
<li class="">Docker 🐳</li>
<li class="">Kubernetes ☸️</li>
<li class="">Terraform 🪴</li>
<li class="">Trivy 🔍</li>
<li class="">Git avançado 🧩</li>
</ul>
<p>Essas ferramentas <strong>não são nativas</strong>, então precisam ser adicionadas via <strong>MCP Server</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-5-como-funcionam-os-mcp-servers-1">🔌 5. Como funcionam os MCP Servers<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-5-como-funcionam-os-mcp-servers-1" class="hash-link" aria-label="Enlace directo al 🔌 5. Como funcionam os MCP Servers" title="Enlace directo al 🔌 5. Como funcionam os MCP Servers" translate="no">​</a></h2>
<p>Um <strong>MCP Server</strong> é um serviço local (ou remoto) que “expõe” comandos e APIs como ferramentas para o Copilot Chat.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="estrutura-básica-1">Estrutura básica<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#estrutura-b%C3%A1sica-1" class="hash-link" aria-label="Enlace directo al Estrutura básica" title="Enlace directo al Estrutura básica" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mcp.json   → manifesto descrevendo as ferramentas</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">server.js  → implementação das tools (Node.js, Python, etc.)</span><br></span></code></pre></div></div>
<p>Exemplo de manifesto:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker-mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tools"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker.ps"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Lista containers"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker.logs"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Exibe logs de um container"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-6-configurando-mcp-no-vs-code-1">⚙️ 6. Configurando MCP no VS Code<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#%EF%B8%8F-6-configurando-mcp-no-vs-code-1" class="hash-link" aria-label="Enlace directo al ⚙️ 6. Configurando MCP no VS Code" title="Enlace directo al ⚙️ 6. Configurando MCP no VS Code" translate="no">​</a></h2>
<ol>
<li class="">Vá em ⚙️ → <strong>MCP Servers</strong></li>
<li class="">Clique em <strong>Add Server</strong></li>
<li class="">Adicione algo como:</li>
</ol>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"npx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"@modelcontext/docker-mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"serve"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">Salve e reinicie o VS Code Chat.</li>
<li class="">Agora, no seu <code>.prompt.md</code>, adicione:</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> docker</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> kubernetes</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-7-exemplo-completo--devsecops-com-mcp-1">🧱 7. Exemplo completo — DevSecOps com MCP<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-7-exemplo-completo--devsecops-com-mcp-1" class="hash-link" aria-label="Enlace directo al 🧱 7. Exemplo completo — DevSecOps com MCP" title="Enlace directo al 🧱 7. Exemplo completo — DevSecOps com MCP" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Agente DevSecOps — segurança, automação e IaC."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> runCommands</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> docker</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> kubernetes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> terraform</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> trivy</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Você é um engenheiro </span><span class="token important">**DevSecOps**</span><span class="token plain"> com foco em segurança de containers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> infraestrutura e código.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">### Objetivos</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Rodar `docker ps` e analisar containers vulneráveis.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Executar `trivy image` e reportar vulnerabilidades.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Auditar `terraform plan` e propor correções seguras.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Revisar configurações de `kubernetes` com boas práticas.</span><br></span></code></pre></div></div>
<p>Com os MCPs conectados, o agente pode realmente:</p>
<ul>
<li class="">Executar comandos Docker e K8s,</li>
<li class="">Ler os resultados,</li>
<li class="">Corrigir arquivos,</li>
<li class="">E sugerir melhorias de segurança.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-8-resumo-rápido-1">🧠 8. Resumo rápido<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-8-resumo-r%C3%A1pido-1" class="hash-link" aria-label="Enlace directo al 🧠 8. Resumo rápido" title="Enlace directo al 🧠 8. Resumo rápido" translate="no">​</a></h2>
<table><thead><tr><th>Categoria</th><th>Ferramentas</th><th>Configuração</th></tr></thead><tbody><tr><td><strong>Nativas (Built-in)</strong></td><td><code>edit</code>, <code>runCommands</code>, <code>search</code>, <code>problems</code>, <code>todos</code>, <code>changes</code>, <code>fetch</code>...</td><td>Nenhuma — já disponíveis</td></tr><tr><td><strong>Externas (via MCP)</strong></td><td><code>docker</code>, <code>kubernetes</code>, <code>terraform</code>, <code>trivy</code>, <code>git</code> (avançado)</td><td>Precisa registrar MCP Server</td></tr><tr><td><strong>Modo de uso</strong></td><td>Campo <code>tools:</code> no <code>.prompt.md</code></td><td>Define o que o agente pode usar</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão-1">🧭 Conclusão<a href="https://techlab.alugafacil.org/es/blog/entendendo-tools-e-mcp-no-vs-code-chat#-conclus%C3%A3o-1" class="hash-link" aria-label="Enlace directo al 🧭 Conclusão" title="Enlace directo al 🧭 Conclusão" translate="no">​</a></h2>
<p>O campo <code>tools:</code> é o que define o “alcance” do seu agente.<br>
<!-- -->Use as <strong>built-in tools</strong> para tarefas locais de código, e <strong>MCPs</strong> para conectar o agente a ferramentas do mundo real — como Docker, Kubernetes e scanners de segurança.</p>
<p>Com isso, o <strong>VS Code Chat</strong> se transforma em um <strong>assistente DevSecOps completo</strong>, capaz de entender, auditar e automatizar todo o ciclo de desenvolvimento.</p>
<hr>
<p>💡 <strong>Dica final:</strong><br>
<!-- -->Comece com <code>tools: [edit, runCommands, search]</code>, depois adicione MCPs gradualmente para estender o poder do seu agente.</p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Entendendo" term="Entendendo"/>
        <category label="Tools" term="Tools"/>
        <category label="Code" term="Code"/>
        <category label="Chat" term="Chat"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[⚠️ Log4Shell: O Caso Que Mudou a Segurança de Software e Seu Custo no Brasil]]></title>
        <id>https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil</id>
        <link href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre ⚠️ log4shell: o caso que mudou a segurança de software e seu custo no brasil.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-foi-a-log4shell">🧩 O Que Foi a Log4Shell<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-o-que-foi-a-log4shell" class="hash-link" aria-label="Enlace directo al 🧩 O Que Foi a Log4Shell" title="Enlace directo al 🧩 O Que Foi a Log4Shell" translate="no">​</a></h2>
<p>Em dezembro de 2021, foi descoberta uma vulnerabilidade crítica na biblioteca <strong>Apache Log4j</strong> — um componente amplamente utilizado em aplicações Java para registro de logs.</p>
<p>Essa falha, identificada como <strong>Log4Shell</strong>, permitia <strong>execução remota de código (RCE)</strong> e foi classificada como uma das <strong>maiores vulnerabilidades da década</strong>.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-identificadores-oficiais">🔢 Identificadores oficiais<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-identificadores-oficiais" class="hash-link" aria-label="Enlace directo al 🔢 Identificadores oficiais" title="Enlace directo al 🔢 Identificadores oficiais" translate="no">​</a></h3>
<ul>
<li class=""><strong>CVE-2021-44228</strong> — execução remota de código (RCE)</li>
<li class=""><strong>CVE-2021-45046</strong> — bypass de mitigação inicial</li>
<li class=""><strong>CVE-2021-45105</strong> — negação de serviço (DoS)</li>
</ul>
<p>Esses códigos fazem parte do sistema internacional <strong>CVE (Common Vulnerabilities and Exposures)</strong>, que padroniza e indexa falhas de segurança.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-como-funcionam-as-instituições-de-referência">🏛️ Como Funcionam as Instituições de Referência<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#%EF%B8%8F-como-funcionam-as-institui%C3%A7%C3%B5es-de-refer%C3%AAncia" class="hash-link" aria-label="Enlace directo al 🏛️ Como Funcionam as Instituições de Referência" title="Enlace directo al 🏛️ Como Funcionam as Instituições de Referência" translate="no">​</a></h2>
<table><thead><tr><th>Nível</th><th>Organização</th><th>Responsabilidade</th></tr></thead><tbody><tr><td>1️⃣</td><td><strong>MITRE Corporation</strong></td><td>Cria e mantém o sistema CVE. Define o identificador e a descrição base da vulnerabilidade.</td></tr><tr><td>2️⃣</td><td><strong>NIST / NVD (National Vulnerability Database)</strong></td><td>Avalia severidade (CVSS), impacto e metadados técnicos.</td></tr><tr><td>3️⃣</td><td><strong>Apache Software Foundation (Vendor)</strong></td><td>Publica os patches e as orientações de mitigação específicas.</td></tr><tr><td>4️⃣</td><td><strong>CISA / CERTs (Globais e Nacionais)</strong></td><td>Emitem alertas e guias de mitigação para governos e empresas.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-fluxo-de-interação-entre-as-instituições">🔄 Fluxo de Interação Entre as Instituições<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-fluxo-de-intera%C3%A7%C3%A3o-entre-as-institui%C3%A7%C3%B5es" class="hash-link" aria-label="Enlace directo al 🔄 Fluxo de Interação Entre as Instituições" title="Enlace directo al 🔄 Fluxo de Interação Entre as Instituições" translate="no">​</a></h2>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-custo-global-da-log4shell">💰 O Custo Global da Log4Shell<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-o-custo-global-da-log4shell" class="hash-link" aria-label="Enlace directo al 💰 O Custo Global da Log4Shell" title="Enlace directo al 💰 O Custo Global da Log4Shell" translate="no">​</a></h2>
<ul>
<li class="">Estima-se que o custo global de resposta, mitigação e retrabalho tenha ultrapassado <strong>US$ 2 bilhões</strong>.<br>
<!-- -->🔗 <a href="https://iaeme.com/MasterAdmin/Journal_uploads/IJCET/VOLUME_16_ISSUE_3/IJCET_16_03_032.pdf" target="_blank" rel="noopener noreferrer" class="">IAEME Journal, 2023</a></li>
<li class="">Cada incidente custou em média <strong>US$ 90 mil</strong> por empresa afetada.<br>
<!-- -->🔗 <a href="https://arcticwolf.com/resources/blog/log4j-retrospective/" target="_blank" rel="noopener noreferrer" class="">Arctic Wolf Labs, 2022</a></li>
<li class="">O custo médio estimado de correção completa em grandes empresas ultrapassou <strong>US$ 100 mil por engenheiro</strong>.<br>
<!-- -->🔗 <a href="https://waratek.com/resources/how-to-exploit-log4j-and-3-ways-to-fix-it/" target="_blank" rel="noopener noreferrer" class="">Waratek Security Analysis, 2023</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-impacto-e-custo-no-brasil">🇧🇷 Impacto e Custo no Brasil<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-impacto-e-custo-no-brasil" class="hash-link" aria-label="Enlace directo al 🇧🇷 Impacto e Custo no Brasil" title="Enlace directo al 🇧🇷 Impacto e Custo no Brasil" translate="no">​</a></h2>
<p>Segundo o <strong>Relatório de Custo de Violação de Dados 2025 da IBM</strong>, o Brasil registrou:</p>
<ul>
<li class="">💸 <strong>R$ 7,19 milhões</strong> — custo médio por incidente.</li>
<li class="">💥 <strong>R$ 7,61 milhões</strong> — custo médio quando o vetor foi <strong>exploração de vulnerabilidades</strong>.<br>
<!-- -->🔗 <a href="https://tiinside.com.br/30/07/2025/custo-medio-de-uma-violacao-de-dados-no-brasil-atinge-r-719-milhoes-aponta-relatorio/" target="_blank" rel="noopener noreferrer" class="">TI Inside, 2025</a></li>
</ul>
<p>A <strong>Tenable</strong> revelou que apenas <strong>21% das empresas latino-americanas</strong> haviam corrigido totalmente o Log4Shell meses após sua descoberta.<br>
<!-- -->🔗 <a href="https://startupi.com.br/ciberseguranca-log4j/" target="_blank" rel="noopener noreferrer" class="">Startupi, 2022</a></p>
<p>A <strong>Fortinet</strong> apontou que o Brasil foi <strong>o segundo país que mais sofreu ataques cibernéticos</strong> em 2022.<br>
<!-- -->🔗 <a href="https://www.fortinet.com/br/corporate/about-us/newsroom/press-releases/2022/brasil-e-o-segundo-pais-que-mais-sofre-ataques-ciberneticos-na-a" target="_blank" rel="noopener noreferrer" class="">Fortinet Brasil, 2022</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-lições-aprendidas">🔐 Lições Aprendidas<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-li%C3%A7%C3%B5es-aprendidas" class="hash-link" aria-label="Enlace directo al 🔐 Lições Aprendidas" title="Enlace directo al 🔐 Lições Aprendidas" translate="no">​</a></h2>
<ol>
<li class=""><strong>Dependências abertas não são “gratuitas”</strong> — o custo da correção pode superar anos de licenciamento comercial.</li>
<li class=""><strong>Mapeamento de SBOM (Software Bill of Materials)</strong> é essencial.</li>
<li class=""><strong>Respostas coordenadas</strong> salvam tempo e reduzem impacto.</li>
<li class=""><strong>Governança de supply chain</strong> precisa incluir auditoria contínua.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-referências-oficiais">📚 Referências Oficiais<a href="https://techlab.alugafacil.org/es/blog/log4shell-impacto-no-brasil#-refer%C3%AAncias-oficiais" class="hash-link" aria-label="Enlace directo al 📚 Referências Oficiais" title="Enlace directo al 📚 Referências Oficiais" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228" target="_blank" rel="noopener noreferrer" class="">MITRE CVE - CVE-2021-44228</a></li>
<li class=""><a href="https://nvd.nist.gov/vuln/detail/CVE-2021-44228" target="_blank" rel="noopener noreferrer" class="">NIST NVD - CVE-2021-44228</a></li>
<li class=""><a href="https://logging.apache.org/log4j/2.x/security.html" target="_blank" rel="noopener noreferrer" class="">Apache Software Foundation - Log4j Security Advisories</a></li>
<li class=""><a href="https://www.cisa.gov/news-events/cybersecurity-advisories/aa21-356a" target="_blank" rel="noopener noreferrer" class="">CISA Guidance - Log4Shell</a></li>
<li class=""><a href="https://www.cert.br/docs/alertas/" target="_blank" rel="noopener noreferrer" class="">CERT.br - Alertas e Vulnerabilidades</a></li>
<li class=""><a href="https://tiinside.com.br/30/07/2025/custo-medio-de-uma-violacao-de-dados-no-brasil-atinge-r-719-milhoes-aponta-relatorio/" target="_blank" rel="noopener noreferrer" class="">IBM Security Report 2025 - Brasil</a></li>
<li class=""><a href="https://www.fortinet.com/br/corporate/about-us/newsroom/press-releases/2022/brasil-e-o-segundo-pais-que-mais-sofre-ataques-ciberneticos-na-a" target="_blank" rel="noopener noreferrer" class="">Fortinet Brasil - Ataques Cibernéticos 2022</a></li>
<li class=""><a href="https://startupi.com.br/ciberseguranca-log4j/" target="_blank" rel="noopener noreferrer" class="">Tenable Latin America Study - Log4j</a></li>
<li class=""><a href="https://arcticwolf.com/resources/blog/log4j-retrospective/" target="_blank" rel="noopener noreferrer" class="">Arctic Wolf Labs Retrospective - Log4j</a></li>
<li class=""><a href="https://waratek.com/resources/how-to-exploit-log4j-and-3-ways-to-fix-it/" target="_blank" rel="noopener noreferrer" class="">Waratek - How to Exploit Log4j and Fix It</a></li>
<li class=""><a href="https://iaeme.com/MasterAdmin/Journal_uploads/IJCET/VOLUME_16_ISSUE_3/IJCET_16_03_032.pdf" target="_blank" rel="noopener noreferrer" class="">IAEME Journal - Global Economic Impact of Log4Shell</a></li>
</ul>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="SegurançA" term="SegurançA"/>
        <category label="Vulnerabilidade" term="Vulnerabilidade"/>
        <category label="Devsecops" term="Devsecops"/>
        <category label="Compliance" term="Compliance"/>
        <category label="Supply Chain" term="Supply Chain"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[🧩 Instalação Recomendada do Git for Windows]]></title>
        <id>https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows</id>
        <link href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 🧩 instalação recomendada do git for windows.]]></summary>
        <content type="html"><![CDATA[<p>A seguir, você encontrará <strong>as telas principais do instalador do Git for Windows</strong>, com <strong>recomendações de configuração</strong> ideais para uso profissional, especialmente em ambientes <strong>cross-platform (Windows/Linux/macOS)</strong> e de <strong>desenvolvimento colaborativo</strong>.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-1-configuração-de-line-endings">⚙️ 1. Configuração de Line Endings<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#%EF%B8%8F-1-configura%C3%A7%C3%A3o-de-line-endings" class="hash-link" aria-label="Enlace directo al ⚙️ 1. Configuração de Line Endings" title="Enlace directo al ⚙️ 1. Configuração de Line Endings" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Configuração de line endings" src="https://techlab.alugafacil.org/es/assets/images/033946a7-5253-43b6-adb5-c144fe81d890-979ee6117d9608231b2d279d78e5804b.png" width="736" height="561" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-opção-recomendada">✅ Opção recomendada:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-op%C3%A7%C3%A3o-recomendada" class="hash-link" aria-label="Enlace directo al ✅ Opção recomendada:" title="Enlace directo al ✅ Opção recomendada:" translate="no">​</a></h3>
<p><strong>Checkout Windows-style, commit Unix-style line endings</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-explicação">🔍 Explicação:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-explica%C3%A7%C3%A3o" class="hash-link" aria-label="Enlace directo al 🔍 Explicação:" title="Enlace directo al 🔍 Explicação:" translate="no">​</a></h3>
<ul>
<li class="">O Git converterá <strong>LF → CRLF</strong> ao fazer checkout (abrir arquivos no Windows).</li>
<li class="">E converterá <strong>CRLF → LF</strong> ao fazer commit (salvar no repositório).</li>
<li class="">Essa opção evita erros de quebra de linha entre sistemas diferentes.</li>
</ul>
<p>💡 <strong>Motivo:</strong><br>
<!-- -->Ideal para quem trabalha em Windows, mas colabora com times usando Linux ou macOS — evita conflitos de formatação em arquivos de texto e código.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-2-comportamento-do-git-pull">🔄 2. Comportamento do <code>git pull</code><a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-2-comportamento-do-git-pull" class="hash-link" aria-label="Enlace directo al -2-comportamento-do-git-pull" title="Enlace directo al -2-comportamento-do-git-pull" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Comportamento do git pull" src="https://techlab.alugafacil.org/es/assets/images/a7246207-7887-48d5-b9fb-13998ec05079-0dfec37be9f595240d96125c0210ad4e.png" width="732" height="565" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-opção-recomendada-1">✅ Opção recomendada:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-op%C3%A7%C3%A3o-recomendada-1" class="hash-link" aria-label="Enlace directo al ✅ Opção recomendada:" title="Enlace directo al ✅ Opção recomendada:" translate="no">​</a></h3>
<p><strong>Fast-forward or merge</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-explicação-1">🔍 Explicação:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-explica%C3%A7%C3%A3o-1" class="hash-link" aria-label="Enlace directo al 🔍 Explicação:" title="Enlace directo al 🔍 Explicação:" translate="no">​</a></h3>
<ul>
<li class="">O Git tenta aplicar <strong>fast-forward</strong> (sem criar merge commit) quando possível.</li>
<li class="">Caso existam divergências, cria automaticamente um <strong>merge commit</strong>.</li>
<li class="">Permite um histórico mais claro e previsível.</li>
</ul>
<p>💡 <strong>Motivo:</strong><br>
<!-- -->É a configuração mais segura e compatível com fluxos Git comuns, como <em>Git Flow</em> ou <em>Feature Branches</em>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-3-gerenciador-de-credenciais">🔐 3. Gerenciador de Credenciais<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-3-gerenciador-de-credenciais" class="hash-link" aria-label="Enlace directo al 🔐 3. Gerenciador de Credenciais" title="Enlace directo al 🔐 3. Gerenciador de Credenciais" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Git Credential Manager" src="https://techlab.alugafacil.org/es/assets/images/95dbad66-1468-4ccc-87f1-e702716fdc09-b745a83ae55bb4d71ac9ea2f0a47e716.png" width="750" height="562" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-opção-recomendada-2">✅ Opção recomendada:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-op%C3%A7%C3%A3o-recomendada-2" class="hash-link" aria-label="Enlace directo al ✅ Opção recomendada:" title="Enlace directo al ✅ Opção recomendada:" translate="no">​</a></h3>
<p><strong>Git Credential Manager</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-explicação-2">🔍 Explicação:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-explica%C3%A7%C3%A3o-2" class="hash-link" aria-label="Enlace directo al 🔍 Explicação:" title="Enlace directo al 🔍 Explicação:" translate="no">​</a></h3>
<ul>
<li class="">Salva tokens e senhas de forma segura usando o <strong>Gerenciador de Credenciais do Windows</strong>.</li>
<li class="">É compatível com <strong>GitHub, GitLab, Bitbucket, Azure DevOps</strong> e outros.</li>
<li class="">Evita ter que digitar login e senha em cada <code>git push</code>.</li>
</ul>
<p>💡 <strong>Motivo:</strong><br>
<!-- -->Recomendado para segurança e praticidade, além de ser o padrão mais moderno e multiplataforma.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-4-opções-extras-de-desempenho">🚀 4. Opções Extras de Desempenho<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-4-op%C3%A7%C3%B5es-extras-de-desempenho" class="hash-link" aria-label="Enlace directo al 🚀 4. Opções Extras de Desempenho" title="Enlace directo al 🚀 4. Opções Extras de Desempenho" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Configuração extra" src="https://techlab.alugafacil.org/es/assets/images/f9befd78-6c04-4dee-898c-7164c077260f-a9e64c86a6857e73f3457dc29a407c59.png" width="744" height="584" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-opção-recomendada-3">✅ Opção recomendada:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-op%C3%A7%C3%A3o-recomendada-3" class="hash-link" aria-label="Enlace directo al ✅ Opção recomendada:" title="Enlace directo al ✅ Opção recomendada:" translate="no">​</a></h3>
<ul>
<li class="">☑️ <strong>Enable file system caching</strong></li>
<li class="">☐ <strong>Enable symbolic links</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-explicação-3">🔍 Explicação:<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-explica%C3%A7%C3%A3o-3" class="hash-link" aria-label="Enlace directo al 🔍 Explicação:" title="Enlace directo al 🔍 Explicação:" translate="no">​</a></h3>
<ul>
<li class=""><strong>File System Caching:</strong><br>
<!-- -->Melhora a performance em operações do Git ao armazenar metadados em cache.<br>
<!-- -->(<code>core.fscache = true</code>)</li>
<li class=""><strong>Symbolic Links:</strong><br>
<!-- -->Só é necessário se você trabalha com projetos que usam <em>symlinks</em> e possui permissões administrativas.</li>
</ul>
<p>💡 <strong>Motivo:</strong><br>
<!-- -->Habilitar o cache melhora a velocidade do Git, enquanto deixar os <em>symlinks</em> desativados evita problemas de permissão no Windows.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão">🧭 Conclusão<a href="https://techlab.alugafacil.org/es/blog/-instalao-recomendada-do-git-for-windows#-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧭 Conclusão" title="Enlace directo al 🧭 Conclusão" translate="no">​</a></h2>
<p>Essas configurações equilibram <strong>desempenho, compatibilidade e segurança</strong>, tornando o Git mais confiável no Windows e mais alinhado com equipes que trabalham em múltiplas plataformas.</p>
<p>✅ <strong>Resumo das escolhas recomendadas:</strong></p>
<table><thead><tr><th>Etapa</th><th>Opção Recomendada</th><th>Motivo Principal</th></tr></thead><tbody><tr><td>Line Endings</td><td>Checkout Windows-style, commit Unix-style</td><td>Compatibilidade entre sistemas</td></tr><tr><td>Git Pull</td><td>Fast-forward or merge</td><td>Histórico limpo e flexível</td></tr><tr><td>Credenciais</td><td>Git Credential Manager</td><td>Segurança e praticidade</td></tr><tr><td>Opções Extras</td><td>Enable File System Caching</td><td>Melhor desempenho</td></tr></tbody></table>
<hr>
<p>📘 <strong>Dica final:</strong><br>
<!-- -->Após a instalação, confirme suas configurações executando:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--list</span><br></span></code></pre></div></div>
<p>E se quiser revisar uma opção específica:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> core.autocrlf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> pull.rebase</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> credential.helper</span><br></span></code></pre></div></div>
<hr>
<p>💡 <em>Esse guia faz parte da série “Ambiente Dev Moderno no Windows” e ajuda a configurar um ambiente consistente para uso com Docker, VSCode, WSL e Copilot.</em></p>
<p>Ferramentas mencionadas neste guia:
<a href="https://github.com/gitextensions/gitextensions/releases/tag/v6.0.2" target="_blank" rel="noopener noreferrer" class="">Git Extensions</a></p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Git" term="Git"/>
        <category label="Windows" term="Windows"/>
        <category label="ConfiguraçãO" term="ConfiguraçãO"/>
        <category label="Dev Setup" term="Dev Setup"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[💸 O Custo Oculto do Gratuito: Por Que Imagens de Contêiner 'Free' Podem Ser Caras]]></title>
        <id>https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras</id>
        <link href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 💸 o custo oculto do gratuito: por que imagens de contêiner 'free' podem ser caras.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-sedução-do-gratuito">💸 A Sedução do “Gratuito”<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-a-sedu%C3%A7%C3%A3o-do-gratuito" class="hash-link" aria-label="Enlace directo al 💸 A Sedução do “Gratuito”" title="Enlace directo al 💸 A Sedução do “Gratuito”" translate="no">​</a></h2>
<p>No mundo moderno de desenvolvimento e entrega contínua, os <strong>contêineres</strong> se tornaram a espinha dorsal da implantação e da escalabilidade.<br>
<!-- -->O <strong>Docker Hub</strong>, em especial, oferece milhões de imagens prontas para uso — uma promessa irresistível de rapidez e economia.</p>
<p>Mas há um custo escondido sob essa gratuidade.</p>
<p>A facilidade de uso e o amplo acesso mascaram um risco real:<br>
<strong>a exposição a vulnerabilidades e a complexidade da conformidade regulatória.</strong></p>
<blockquote>
<p>A economia inicial pode se transformar em um preço muito mais alto — pago em tempo, segurança e reputação.</p>
</blockquote>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-realidade-das-vulnerabilidades">🔍 A Realidade das Vulnerabilidades<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-a-realidade-das-vulnerabilidades" class="hash-link" aria-label="Enlace directo al 🔍 A Realidade das Vulnerabilidades" title="Enlace directo al 🔍 A Realidade das Vulnerabilidades" translate="no">​</a></h2>
<p>Mesmo as imagens <strong>“oficiais”</strong> e amplamente utilizadas no Docker Hub frequentemente contêm <strong>centenas de vulnerabilidades conhecidas</strong>, muitas de severidade <strong>alta ou crítica</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exemplo-prático-imagem-python-gratuita">📷 Exemplo prático: imagem Python gratuita<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-exemplo-pr%C3%A1tico-imagem-python-gratuita" class="hash-link" aria-label="Enlace directo al 📷 Exemplo prático: imagem Python gratuita" title="Enlace directo al 📷 Exemplo prático: imagem Python gratuita" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Imagem de container Python Hardened" src="https://techlab.alugafacil.org/es/assets/images/docker-imagem-gratuita-4ff9ab348ed74eb7e2ec52f8a6fffb90.png" width="2048" height="1290" class="img_ev3q"></p>
<p>Na imagem acima (<code>python:trixie</code>), observamos:</p>
<ul>
<li class=""><strong>1 Crítica (vermelho)</strong></li>
<li class=""><strong>5 Altas (laranja)</strong></li>
<li class=""><strong>142 Médias (amarelo)</strong></li>
<li class=""><strong>2 Baixas (azul)</strong></li>
</ul>
<p>Essas falhas representam <strong>portas abertas para exploração</strong>.<br>
<!-- -->Rodar uma imagem assim em produção — especialmente em ambientes sensíveis — é um <strong>risco inaceitável</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-solução-paga-imagens-endurecidas-hardened-images">🧱 A Solução 'Paga': Imagens Endurecidas (Hardened Images)<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-a-solu%C3%A7%C3%A3o-paga-imagens-endurecidas-hardened-images" class="hash-link" aria-label="Enlace directo al 🧱 A Solução 'Paga': Imagens Endurecidas (Hardened Images)" title="Enlace directo al 🧱 A Solução 'Paga': Imagens Endurecidas (Hardened Images)" translate="no">​</a></h2>
<p>Em contrapartida, surgem as <strong>Docker Hardened Images (DHIs)</strong> — versões <strong>reforçadas e certificadas</strong> de imagens populares.<br>
<!-- -->Essas versões passam por um processo rigoroso de <strong>hardening</strong>, que inclui:</p>
<ul>
<li class="">Remoção de pacotes desnecessários</li>
<li class="">Aplicação de benchmarks de segurança (CIS, STIG, FIPS)</li>
<li class="">Correção contínua de vulnerabilidades</li>
<li class="">Uso de usuários <strong>não-root</strong> por padrão</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exemplo-prático-imagem-python-hardened">📷 Exemplo prático: imagem Python Hardened<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-exemplo-pr%C3%A1tico-imagem-python-hardened" class="hash-link" aria-label="Enlace directo al 📷 Exemplo prático: imagem Python Hardened" title="Enlace directo al 📷 Exemplo prático: imagem Python Hardened" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Imagem de container Python Hardened" src="https://techlab.alugafacil.org/es/assets/images/docker-imagem-hardened-53be2f13177f6fb8e65bb3293d130940.png" width="2048" height="1235" class="img_ev3q"></p>
<p>Nesta imagem paga (<code>python:3.13.x-fips-dev</code>), vemos um contraste notável:</p>
<p>✅ <strong>0 Críticas</strong><br>
<!-- -->✅ <strong>0 Altas</strong><br>
<!-- -->✅ <strong>0 Médias</strong><br>
<!-- -->✅ <strong>0 Baixas</strong></p>
<p>Ou seja, <strong>nenhuma vulnerabilidade aparente</strong>.</p>
<p>Enquanto a imagem gratuita exige tempo e esforço de triagem, a imagem hardened oferece <strong>segurança pronta para produção</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-a-importância-em-ambientes-regulatórios">🏛️ A Importância em Ambientes Regulatórios<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#%EF%B8%8F-a-import%C3%A2ncia-em-ambientes-regulat%C3%B3rios" class="hash-link" aria-label="Enlace directo al 🏛️ A Importância em Ambientes Regulatórios" title="Enlace directo al 🏛️ A Importância em Ambientes Regulatórios" translate="no">​</a></h2>
<p>Em setores como <strong>finanças, governo, saúde ou defesa</strong>, a conformidade com padrões de segurança não é opcional — é <strong>obrigatória</strong>.<br>
<!-- -->Nesses contextos, imagens endurecidas oferecem aderência a frameworks essenciais:</p>
<ol>
<li class=""><strong>CIS (Center for Internet Security)</strong> — Benchmarks de configuração segura.</li>
<li class=""><strong>FIPS (Federal Information Processing Standards)</strong> — Criptografia validada.</li>
<li class=""><strong>STIG (Security Technical Implementation Guides)</strong> — Diretrizes do Departamento de Defesa dos EUA.</li>
</ol>
<p>Na imagem hardened acima, os selos <strong>CIS / FIPS / STIG (100%)</strong> atestam conformidade total.<br>
<!-- -->Essas garantias são fundamentais para auditorias, certificações e continuidade operacional.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-usar-imagens-vulneráveis-pode-causar">🧑‍💼 Usar imagens vulneráveis pode causar:<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-usar-imagens-vulner%C3%A1veis-pode-causar" class="hash-link" aria-label="Enlace directo al 🧑‍💼 Usar imagens vulneráveis pode causar:" title="Enlace directo al 🧑‍💼 Usar imagens vulneráveis pode causar:" translate="no">​</a></h3>
<ul>
<li class="">❌ <strong>Falhas em auditorias de compliance</strong></li>
<li class="">💸 <strong>Multas e sanções</strong> (LGPD, GDPR, HIPAA, PCI-DSS, etc.)</li>
<li class="">⏱️ <strong>Retrabalho e mitigação cara</strong> por equipes de DevSecOps</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-preço-que-se-paga-depois">💰 O Preço que se Paga Depois<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-o-pre%C3%A7o-que-se-paga-depois" class="hash-link" aria-label="Enlace directo al 💰 O Preço que se Paga Depois" title="Enlace directo al 💰 O Preço que se Paga Depois" translate="no">​</a></h2>
<p>O “gratuito” se torna caro quando os custos ocultos emergem:</p>
<table><thead><tr><th>Custo Oculto</th><th>Imagem Gratuita (Vulnerável)</th><th>Imagem Hardened (Paga)</th></tr></thead><tbody><tr><td><strong>Tempo de Engenharia</strong></td><td>Alto (escanear, corrigir, reconstruir)</td><td>Baixo (uso imediato)</td></tr><tr><td><strong>Risco de Segurança</strong></td><td>Alto (vulnerabilidades severas)</td><td>Baixo (base limpa e validada)</td></tr><tr><td><strong>Conformidade Regulatória</strong></td><td>Complexa e incerta</td><td>Simplificada e certificada</td></tr><tr><td><strong>Interrupção de Negócios</strong></td><td>Alta (exposição a incidentes)</td><td>Baixa (ambiente estável)</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-custo-efetivo-total">💰 Custo Efetivo Total<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-custo-efetivo-total" class="hash-link" aria-label="Enlace directo al 💰 Custo Efetivo Total" title="Enlace directo al 💰 Custo Efetivo Total" translate="no">​</a></h2>
<p>O custo inicial de uma imagem gratuita é <strong>zero</strong> mas o custo de um incidente de segurança pode ultrapassar <strong>milhares de dólares por minuto</strong>, segundo dados do Gartner.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão-o-valor-do-endurecimento">🔐 Conclusão: O Valor do Endurecimento<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-conclus%C3%A3o-o-valor-do-endurecimento" class="hash-link" aria-label="Enlace directo al 🔐 Conclusão: O Valor do Endurecimento" title="Enlace directo al 🔐 Conclusão: O Valor do Endurecimento" translate="no">​</a></h3>
<p>Em um ecossistema onde a <strong>confiança digital</strong> é um ativo competitivo,<br>
<!-- -->usar imagens endurecidas não é luxo técnico — é <strong>decisão estratégica de governança</strong>.</p>
<blockquote>
<p>O custo de prevenir é sempre menor que o custo de remediar.</p>
</blockquote>
<p><strong>Imagens hardened</strong> pagam-se rapidamente por meio de:</p>
<ul>
<li class="">Redução de vulnerabilidades</li>
<li class="">Aceleração da conformidade</li>
<li class="">Maior previsibilidade e estabilidade operacional</li>
</ul>
<hr>
<div class="alert_DgrF info_ED0Q"><div class="content_jSH8"><p>💡 <strong>Dica de prática segura:</strong> Adote imagens hardened, preferencialmente de
provedores certificados (ex: Red Hat UBI, Iron Bank, Docker Verified
Publisher). Configure o registry interno para <strong>bloquear imagens sem
assinatura ou fora de compliance</strong>. Automatize auditorias com ferramentas como
<strong>Trivy</strong>, <strong>Dockle</strong> e <strong>Grype</strong>.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-em-resumo">📈 Em Resumo<a href="https://techlab.alugafacil.org/es/blog/-o-custo-oculto-do-gratuito-por-que-imagens-de-continer-free-podem-ser-caras#-em-resumo" class="hash-link" aria-label="Enlace directo al 📈 Em Resumo" title="Enlace directo al 📈 Em Resumo" translate="no">​</a></h2>
<blockquote>
<p>“O gratuito termina quando a primeira vulnerabilidade vira incidente.”</p>
</blockquote>
<p><strong>Escolha inteligência, não improviso.</strong><br>
<!-- -->Cada contêiner é um elo da sua cadeia de confiança — e o elo mais fraco é sempre o mais caro.</p>
<p><a href="https://www.dockerstatus.com/" target="_blank" rel="noopener noreferrer" class="">Status dos serviços do docker</a></p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Docker" term="Docker"/>
        <category label="Devsecops" term="Devsecops"/>
        <category label="SegurançA" term="SegurançA"/>
        <category label="Compliance" term="Compliance"/>
        <category label="Supply Chain" term="Supply Chain"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Implementação C#: IP Filtering + APIM/API Gateway em Azure]]></title>
        <id>https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure</id>
        <link href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure"/>
        <updated>2025-11-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre implementação c#: ip filtering + apim/api gateway em azure.]]></summary>
        <content type="html"><![CDATA[<p>Este guia mostra <strong>código completo em C#</strong> para implementar IP Filtering robusto no ASP.NET Core, com suporte a <strong>CIDR (ranges)</strong>, leitura de IP real via <strong>Forwarded Headers</strong>, e integração com <strong>listas dinâmicas</strong> (ex.: Azure App Configuration / Key Vault).</p>
<!-- -->
<blockquote>
<p>Nota: não entramos em detalhes do cliente Azure SDK aqui — assume-se que você carregue a lista confiável em <code>IConfiguration</code> ou usando um serviço que você implemente para buscar do App Configuration/Key Vault.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-helper-verificar-se-um-ip-pertence-a-um-cidr-ipv4ipv6">1) Helper: Verificar se um IP pertence a um CIDR (IPv4/IPv6)<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#1-helper-verificar-se-um-ip-pertence-a-um-cidr-ipv4ipv6" class="hash-link" aria-label="Enlace directo al 1) Helper: Verificar se um IP pertence a um CIDR (IPv4/IPv6)" title="Enlace directo al 1) Helper: Verificar se um IP pertence a um CIDR (IPv4/IPv6)" translate="no">​</a></h2>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Net</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">IpUtils</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">bool</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">IsInSubnet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IPAddress</span><span class="token plain"> address</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> cidrOrAddress</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">string</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsNullOrWhiteSpace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cidrOrAddress</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Single IP (no slash)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">cidrOrAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">IPAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryParse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cidrOrAddress</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> single</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> single</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Equals</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">address</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> parts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cidrOrAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token char">'/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">parts</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Length </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">IPAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryParse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">parts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> baseAddress</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryParse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">parts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> prefixLength</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> addrBytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> address</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetAddressBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> baseBytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> baseAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetAddressBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// IPv4 vs IPv6 mismatch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">addrBytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Length </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> baseBytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Length</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> byteCount </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> addrBytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> mask </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name keyword" style="color:#00009f">byte</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">byteCount</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> remainingBits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> prefixLength</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> byteCount</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">remainingBits </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                mask</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xFF</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                remainingBits </span><span class="token operator" style="color:#393A34">-=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">remainingBits </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                mask</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">byte</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">~</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0xFF</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> remainingBits</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                remainingBits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                mask</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> byteCount</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">addrBytes</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> mask</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">baseBytes</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> mask</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-serviço-para-prover-lista-dinâmica-de-ipsrange-pode-buscar-de-app-configuration--key-vault">2) Serviço para prover lista dinâmica de IPs/Range (pode buscar de App Configuration / Key Vault)<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#2-servi%C3%A7o-para-prover-lista-din%C3%A2mica-de-ipsrange-pode-buscar-de-app-configuration--key-vault" class="hash-link" aria-label="Enlace directo al 2) Serviço para prover lista dinâmica de IPs/Range (pode buscar de App Configuration / Key Vault)" title="Enlace directo al 2) Serviço para prover lista dinâmica de IPs/Range (pode buscar de App Configuration / Key Vault)" translate="no">​</a></h2>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Microsoft</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Extensions</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Options</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">IAllowedIpProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token return-type class-name">Task</span><span class="token return-type class-name punctuation" style="color:#393A34">&lt;</span><span class="token return-type class-name">IEnumerable</span><span class="token return-type class-name punctuation" style="color:#393A34">&lt;</span><span class="token return-type class-name keyword" style="color:#00009f">string</span><span class="token return-type class-name punctuation" style="color:#393A34">&gt;</span><span class="token return-type class-name punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetAllowedCidrsAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CancellationToken</span><span class="token plain"> ct </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ConfigurationAllowedIpProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">IAllowedIpProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token class-name">IConfiguration</span><span class="token plain"> _config</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> _configKey </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AllowedIpCidrs"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ex: comma-separated ou JSON array</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ConfigurationAllowedIpProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IConfiguration</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _config </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token return-type class-name">Task</span><span class="token return-type class-name punctuation" style="color:#393A34">&lt;</span><span class="token return-type class-name">IEnumerable</span><span class="token return-type class-name punctuation" style="color:#393A34">&lt;</span><span class="token return-type class-name keyword" style="color:#00009f">string</span><span class="token return-type class-name punctuation" style="color:#393A34">&gt;</span><span class="token return-type class-name punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetAllowedCidrsAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CancellationToken</span><span class="token plain"> ct </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> raw </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> _config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">_configKey</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Suporta CSV ou JSON array; aqui simplificamos assumindo CSV</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> items </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> raw</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token char">','</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> StringSplitOptions</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RemoveEmptyEntries</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Select</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromResult</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">IEnumerable</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">items</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<blockquote>
<p>Em produção, substitua por um provedor que use o <strong>Azure App Configuration</strong> ou <strong>Key Vault</strong>. Você pode armazenar um JSON com ranges e usar um <strong>refresh token</strong> do App Configuration para atualizar dinamicamente.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-middleware-que-verifica-ip-usando-cidr--forwarded-headers">3) Middleware que verifica IP usando CIDR + Forwarded Headers<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#3-middleware-que-verifica-ip-usando-cidr--forwarded-headers" class="hash-link" aria-label="Enlace directo al 3) Middleware que verifica IP usando CIDR + Forwarded Headers" title="Enlace directo al 3) Middleware que verifica IP usando CIDR + Forwarded Headers" translate="no">​</a></h2>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Net</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Microsoft</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">AspNetCore</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Http</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">IpFilterMiddleware</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">IMiddleware</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token class-name">IAllowedIpProvider</span><span class="token plain"> _allowedIpProvider</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">IpFilterMiddleware</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IAllowedIpProvider</span><span class="token plain"> allowedIpProvider</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _allowedIpProvider </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> allowedIpProvider</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token return-type class-name">Task</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">InvokeAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HttpContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RequestDelegate</span><span class="token plain"> next</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Obter IP real: priorize X-Forwarded-For (caso APIM / Gateway esteja na frente)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> ipString </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetRemoteIpString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">IPAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryParse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ipString</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> remoteIp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// se não conseguir resolver, seja conservador: negar ou permitir? aqui negamos.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StatusCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> StatusCodes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status403Forbidden</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Forbidden: Unable to determine client IP."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> allowedCidrs </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> _allowedIpProvider</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetAllowedCidrsAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> allowed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> allowedCidrs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Any</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cidr </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> IpUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsInSubnet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">remoteIp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cidr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">allowed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StatusCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> StatusCodes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status403Forbidden</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Forbidden: Access denied due to IP filtering."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">next</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">string</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetRemoteIpString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HttpContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Se houver X-Forwarded-For, pegue primeiro IP (mais à esquerda é o cliente original)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryGetValue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"X-Forwarded-For"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> xff</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> first </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> xff</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token char">','</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> StringSplitOptions</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RemoveEmptyEntries</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FirstOrDefault</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">string</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsNullOrEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> first</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Fallback para conexão direta</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Connection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RemoteIpAddress</span><span class="token punctuation" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">ToString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-extensão-para-registrar-o-middleware">4) Extensão para registrar o Middleware<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#4-extens%C3%A3o-para-registrar-o-middleware" class="hash-link" aria-label="Enlace directo al 4) Extensão para registrar o Middleware" title="Enlace directo al 4) Extensão para registrar o Middleware" translate="no">​</a></h2>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">IpFilterExtensions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name">IApplicationBuilder</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">UseIpFilterMiddleware</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token plain"> </span><span class="token class-name">IApplicationBuilder</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">UseMiddleware</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">IpFilterMiddleware</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-registro-no-programcs-exemplo-net-7-minimal-api">5) Registro no <code>Program.cs</code> (exemplo .NET 7+ minimal API)<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#5-registro-no-programcs-exemplo-net-7-minimal-api" class="hash-link" aria-label="Enlace directo al 5-registro-no-programcs-exemplo-net-7-minimal-api" title="Enlace directo al 5-registro-no-programcs-exemplo-net-7-minimal-api" translate="no">​</a></h2>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> builder </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> WebApplication</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateBuilder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Configuração: carregue AllowedIpCidrs via App Configuration ou settings locais</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Exemplo local appsettings.json:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// "AllowedIpCidrs": "203.0.113.0/24,198.51.100.5,10.0.0.0/24"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">AddSingleton</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">IAllowedIpProvider</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">,</span><span class="token generic-method generic class-name"> ConfigurationAllowedIpProvider</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">AddTransient</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">IpFilterMiddleware</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Muito importante: habilite Forwarded Headers se estiver por trás de Proxy/Gateway</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Microsoft</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">AspNetCore</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">HttpOverrides</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> forwardedOptions </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ForwardedHeadersOptions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ForwardedHeaders </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ForwardedHeaders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XForwardedFor </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> ForwardedHeaders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XForwardedProto</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Opcional: limite de IPs conhecidos que podem enviar forwarded headers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// forwardedOptions.KnownProxies.Add(IPAddress.Parse("IP_DO_SEU_GATEWAY"));</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">UseForwardedHeaders</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">forwardedOptions</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Registre antes de middlewares que protegem endpoints sensíveis</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">UseIpFilterMiddleware</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MapGet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello world"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<blockquote>
<p><strong>Importante</strong>: se você usa Azure API Management ou Front Door, <strong>configure <code>KnownProxies</code> ou <code>KnownNetworks</code></strong> com os IPs do gateway para evitar spoofing do cabeçalho <code>X-Forwarded-For</code>. Para APIM, consulte a documentação para obter ranges que o serviço usa (ou integre via Managed Identity para buscar a lista oficial).</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-atualização-dinâmica-opcional-hostedservice-que-recarrega-a-lista">6) Atualização dinâmica (opcional): HostedService que recarrega a lista<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#6-atualiza%C3%A7%C3%A3o-din%C3%A2mica-opcional-hostedservice-que-recarrega-a-lista" class="hash-link" aria-label="Enlace directo al 6) Atualização dinâmica (opcional): HostedService que recarrega a lista" title="Enlace directo al 6) Atualização dinâmica (opcional): HostedService que recarrega a lista" translate="no">​</a></h2>
<p>Para ambientes onde os ranges mudam, use um <strong>IHostedService</strong> que busca a lista em intervalos e atualiza um repositório em memória:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Microsoft</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Extensions</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Caching</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Memory</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AllowedIpRefreshService</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">BackgroundService</span><span class="token type-list punctuation" style="color:#393A34">,</span><span class="token type-list"> </span><span class="token type-list class-name">IAllowedIpProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token class-name">IConfiguration</span><span class="token plain"> _configuration</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token class-name">IMemoryCache</span><span class="token plain"> _cache</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token class-name">TimeSpan</span><span class="token plain"> _refreshInterval </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromMinutes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">AllowedIpRefreshService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IConfiguration</span><span class="token plain"> configuration</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IMemoryCache</span><span class="token plain"> cache</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _configuration </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> configuration</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _cache </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cache</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">override</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token return-type class-name">Task</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ExecuteAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CancellationToken</span><span class="token plain"> stoppingToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">stoppingToken</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IsCancellationRequested</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> raw </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> _configuration</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"AllowedIpCidrs"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> items </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> raw</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token char">','</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> StringSplitOptions</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RemoveEmptyEntries</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Select</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                _cache</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"allowedCidrs"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> items</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromMinutes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">// log error</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_refreshInterval</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stoppingToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token return-type class-name">Task</span><span class="token return-type class-name punctuation" style="color:#393A34">&lt;</span><span class="token return-type class-name">IEnumerable</span><span class="token return-type class-name punctuation" style="color:#393A34">&lt;</span><span class="token return-type class-name keyword" style="color:#00009f">string</span><span class="token return-type class-name punctuation" style="color:#393A34">&gt;</span><span class="token return-type class-name punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetAllowedCidrsAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CancellationToken</span><span class="token plain"> ct </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _cache</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryGetValue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"allowedCidrs"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> arr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromResult</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">IEnumerable</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arr </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">Empty</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name keyword" style="color:#00009f">string</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Registre no <code>Program.cs</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddMemoryCache</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">AddHostedService</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">AllowedIpRefreshService</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// como o AllowedIpRefreshService implementa IAllowedIpProvider, registre-o assim:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">AddSingleton</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">IAllowedIpProvider</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sp </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> sp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">GetRequiredService</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">AllowedIpRefreshService</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-observações-de-segurança-finais">7) Observações de segurança finais<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#7-observa%C3%A7%C3%B5es-de-seguran%C3%A7a-finais" class="hash-link" aria-label="Enlace directo al 7) Observações de segurança finais" title="Enlace directo al 7) Observações de segurança finais" translate="no">​</a></h2>
<ul>
<li class=""><strong>Evite spoofing</strong>: configure <code>ForwardedHeadersOptions.KnownProxies</code>/<code>KnownNetworks</code> para que apenas proxies confiáveis possam enviar <code>X-Forwarded-For</code>.</li>
<li class=""><strong>Teste em staging</strong>: valide ranges e CIDRs antes de aplicar em produção — um erro pode bloquear tráfego legítimo.</li>
<li class=""><strong>Logs e métricas</strong>: envie eventos de requisições bloqueadas para Azure Monitor / App Insights.</li>
<li class=""><strong>Integre com APIM</strong>: use políticas de APIM como primeira linha e deixe o middleware como reforço no backend.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusão">Conclusão<a href="https://techlab.alugafacil.org/es/blog/implementao-c-ip-filtering-apimapi-gateway-em-azure#conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al Conclusão" title="Enlace directo al Conclusão" translate="no">​</a></h2>
<p>Este MDX fornece a implementação prática em C# para IP Filtering com suporte a ranges e atualizações dinâmicas. Combine com APIM/WAF para máxima proteção em ambientes Azure.</p>
<hr>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Implementao" term="Implementao"/>
        <category label="Filtering" term="Filtering"/>
        <category label="Apimapi" term="Apimapi"/>
        <category label="Gateway" term="Gateway"/>
        <category label="Azure" term="Azure"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[🔍 Rastreabilidade e Auditoria de Commits no Azure DevOps]]></title>
        <id>https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops</id>
        <link href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops"/>
        <updated>2025-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 🔍 rastreabilidade e auditoria de commits no azure devops.]]></summary>
        <content type="html"><![CDATA[<p>Em ambientes colaborativos, especialmente em pipelines corporativos e DevOps, a <strong>autenticidade dos commits</strong> é essencial.<br>
<!-- -->Mas o que acontece se alguém faz um <em>commit “falso”</em> — ou seja, usa um nome/email de outro usuário no Git — e faz o <strong>push</strong> para um repositório do <strong>Azure DevOps</strong>?</p>
<p>Este artigo explica como <strong>rastrear a autoria real</strong> usando <strong>audit logging</strong>, o que o Azure registra por padrão e quais são as limitações.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-1-o-problema-commits-com-autor-falsificado">🧩 1. O problema: commits com autor falsificado<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-1-o-problema-commits-com-autor-falsificado" class="hash-link" aria-label="Enlace directo al 🧩 1. O problema: commits com autor falsificado" title="Enlace directo al 🧩 1. O problema: commits com autor falsificado" translate="no">​</a></h2>
<p>O Git permite que qualquer pessoa defina livremente o autor de um commit:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">--author</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Fulano &lt;fulano@example.com&gt;"</span><br></span></code></pre></div></div>
<p>Isso altera apenas o <strong>metadado local</strong> do commit, sem autenticação real.</p>
<p>Portanto, o <em>author</em> ou <em>committer</em> no log do Git <strong>não garante identidade</strong>.<br>
<!-- -->A identidade <strong>real</strong> está no método de <strong>autenticação usado para o push</strong> — SSH, HTTPS (token/senha) ou serviço automatizado.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-2-como-o-azure-devops-autentica-um-push">🔐 2. Como o Azure DevOps autentica um push<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-2-como-o-azure-devops-autentica-um-push" class="hash-link" aria-label="Enlace directo al 🔐 2. Como o Azure DevOps autentica um push" title="Enlace directo al 🔐 2. Como o Azure DevOps autentica um push" translate="no">​</a></h2>
<p>O Azure DevOps aceita dois principais modos de autenticação Git:</p>
<table><thead><tr><th>Método</th><th>Autenticação</th><th>Onde rastrear</th><th>Comentário</th></tr></thead><tbody><tr><td><strong>SSH</strong></td><td>Chave pública associada a uma conta do DevOps</td><td>Audit Log (eventos SSH)</td><td>Forte, identifica a conta associada</td></tr><tr><td><strong>HTTPS</strong></td><td>Usuário + Senha / Token (PAT)</td><td>Audit Log (requisições REST/Push) + Logs internos</td><td>Registra usuário autenticado, IP e timestamp</td></tr></tbody></table>
<p>👉 Mesmo que o commit tenha <code>Author: outro@email.com</code>, o push é autenticado e rastreável pela conta real que o enviou.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-3-o-que-é-o-audit-logging-do-azure-devops">🧾 3. O que é o Audit Logging do Azure DevOps<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-3-o-que-%C3%A9-o-audit-logging-do-azure-devops" class="hash-link" aria-label="Enlace directo al 🧾 3. O que é o Audit Logging do Azure DevOps" title="Enlace directo al 🧾 3. O que é o Audit Logging do Azure DevOps" translate="no">​</a></h2>
<p>O <strong>Audit Logging</strong> é o sistema de trilhas de auditoria da plataforma Azure DevOps, que registra <strong>ações administrativas e operacionais</strong> — inclusive algumas relacionadas a Git.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-onde-ativar">📍 Onde ativar<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-onde-ativar" class="hash-link" aria-label="Enlace directo al 📍 Onde ativar" title="Enlace directo al 📍 Onde ativar" translate="no">​</a></h3>
<ul>
<li class="">Vá em <strong>Organization Settings → Auditing</strong>.</li>
<li class="">Verifique se a auditoria está <strong>ativada</strong>.<br>
<!-- -->Em novas organizações, o recurso pode vir <strong>desativado por padrão</strong> e precisa ser <strong>habilitado manualmente</strong>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-requisitos">⚙️ Requisitos<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#%EF%B8%8F-requisitos" class="hash-link" aria-label="Enlace directo al ⚙️ Requisitos" title="Enlace directo al ⚙️ Requisitos" translate="no">​</a></h3>
<ul>
<li class="">A organização precisa estar <strong>associada ao Microsoft Entra ID (antigo Azure AD)</strong>.</li>
<li class="">Se não estiver, o recurso pode <strong>não aparecer</strong> no painel.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-4-quais-eventos-git-são-registrados">📊 4. Quais eventos Git são registrados<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-4-quais-eventos-git-s%C3%A3o-registrados" class="hash-link" aria-label="Enlace directo al 📊 4. Quais eventos Git são registrados" title="Enlace directo al 📊 4. Quais eventos Git são registrados" translate="no">​</a></h2>
<p>Nem todos os eventos Git aparecem na auditoria.<br>
<!-- -->Abaixo, uma visão geral dos principais tipos (conforme documentação e testes práticos):</p>
<table><thead><tr><th>Evento</th><th>Registrado na Auditoria?</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>git push</strong></td><td>✅ Sim</td><td>Mostra usuário autenticado, repositório, IP e horário.</td></tr><tr><td><strong>git clone / fetch</strong></td><td>⚠️ Parcial</td><td>Nem sempre registrado; depende da versão e plano.</td></tr><tr><td><strong>git commit (local)</strong></td><td>❌ Não</td><td>O commit é local, só o push é auditável.</td></tr><tr><td><strong>Criação de branch / tag</strong></td><td>✅ Sim</td><td>Evento de criação e exclusão são auditáveis.</td></tr><tr><td><strong>Alteração de chave SSH / Token PAT</strong></td><td>✅ Sim</td><td>Eventos de segurança são registrados.</td></tr><tr><td><strong>Criação/Exclusão de repositório</strong></td><td>✅ Sim</td><td>Eventos administrativos completos.</td></tr></tbody></table>
<p>🧠 Dica: use o <strong>Audit Stream</strong> para enviar logs em tempo real ao <strong>Azure Monitor</strong>, <strong>Event Hub</strong> ou <strong>SIEM</strong> (Splunk, Sentinel).</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️️-5-investigando-um-commit-suspeito">🕵️‍♂️ 5. Investigando um commit suspeito<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#%EF%B8%8F%EF%B8%8F-5-investigando-um-commit-suspeito" class="hash-link" aria-label="Enlace directo al 🕵️‍♂️ 5. Investigando um commit suspeito" title="Enlace directo al 🕵️‍♂️ 5. Investigando um commit suspeito" translate="no">​</a></h2>
<p>Suponha que um commit foi feito com o autor “<a href="mailto:fulano@example.com" target="_blank" rel="noopener noreferrer" class="">fulano@example.com</a>”, mas suspeita-se que outro usuário o enviou.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="passos-para-rastrear">Passos para rastrear:<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#passos-para-rastrear" class="hash-link" aria-label="Enlace directo al Passos para rastrear:" title="Enlace directo al Passos para rastrear:" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Identifique o hash e a data do commit</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--pretty</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">fuller</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>No Azure DevOps</strong>, vá em:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Organization Settings → Auditing</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Filtre por ação:</strong> <code>GitPush</code> ou <code>Repository Push</code></p>
</li>
<li class="">
<p>Verifique:</p>
<ul>
<li class="">Usuário autenticado (<code>actorDisplayName</code>)</li>
<li class="">Endereço IP (<code>ipAddress</code>)</li>
<li class="">Repositório e branch</li>
<li class="">Data e hora</li>
</ul>
</li>
<li class="">
<p>Compare o timestamp do push com o commit.</p>
</li>
</ol>
<p>Se o commit foi feito localmente por alguém e empurrado via conta <code>alugafacil-org@...</code>, o log mostrará <strong>essa conta</strong> como a origem real.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-6-limitações-e-lacunas-conhecidas">⚠️ 6. Limitações e lacunas conhecidas<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#%EF%B8%8F-6-limita%C3%A7%C3%B5es-e-lacunas-conhecidas" class="hash-link" aria-label="Enlace directo al ⚠️ 6. Limitações e lacunas conhecidas" title="Enlace directo al ⚠️ 6. Limitações e lacunas conhecidas" translate="no">​</a></h2>
<ul>
<li class=""><strong>Commits locais não são registrados</strong> — apenas o push final.</li>
<li class=""><strong>Clones e fetchs</strong> podem não gerar eventos auditáveis.</li>
<li class=""><strong>Tokens pessoais (PATs)</strong> podem ser reutilizados ou vazados, dificultando a atribuição física.</li>
<li class=""><strong>Logs são retidos por 90 dias</strong> (por padrão), a menos que você configure <strong>Audit Streaming</strong>.</li>
<li class=""><strong>Organizações não conectadas ao Entra ID</strong> podem não ter auditoria disponível.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-7-boas-práticas-de-rastreabilidade">🧰 7. Boas práticas de rastreabilidade<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-7-boas-pr%C3%A1ticas-de-rastreabilidade" class="hash-link" aria-label="Enlace directo al 🧰 7. Boas práticas de rastreabilidade" title="Enlace directo al 🧰 7. Boas práticas de rastreabilidade" translate="no">​</a></h2>
<table><thead><tr><th>Medida</th><th>Benefício</th></tr></thead><tbody><tr><td><strong>Habilitar auditoria e streaming</strong></td><td>Retém logs por longo prazo e integra com SIEM</td></tr><tr><td><strong>Exigir autenticação 2FA/SSO</strong></td><td>Evita uso indevido de senhas ou tokens</td></tr><tr><td><strong>Forçar commits assinados (GPG)</strong></td><td>Garante autoria criptográfica</td></tr><tr><td><strong>Revisar chaves SSH e PATs regularmente</strong></td><td>Minimiza risco de uso indevido</td></tr><tr><td><strong>Ativar notificações de segurança</strong></td><td>Detecta pushes inesperados rapidamente</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-8-exemplo-de-evidência-técnica">🧮 8. Exemplo de evidência técnica<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-8-exemplo-de-evid%C3%AAncia-t%C3%A9cnica" class="hash-link" aria-label="Enlace directo al 🧮 8. Exemplo de evidência técnica" title="Enlace directo al 🧮 8. Exemplo de evidência técnica" translate="no">​</a></h2>
<table><thead><tr><th>Campo</th><th>Exemplo</th></tr></thead><tbody><tr><td>Commit Hash</td><td><code>e41b9a67c6f1e3...</code></td></tr><tr><td>Author declarado</td><td><code>Fulano &lt;fulano@example.com&gt;</code></td></tr><tr><td>Usuário autenticado</td><td><code>alugafacil-org@gmail.com</code></td></tr><tr><td>IP</td><td><code>203.0.113.55</code></td></tr><tr><td>Método</td><td>HTTPS (PAT)</td></tr><tr><td>Timestamp</td><td><code>2025-10-22T14:33:21Z</code></td></tr><tr><td>Fingerprint SSH</td><td>(se aplicável) <code>SHA256:W8t2xNKl4K7...</code></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-9-conclusão">🧭 9. Conclusão<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-9-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧭 9. Conclusão" title="Enlace directo al 🧭 9. Conclusão" translate="no">​</a></h2>
<p>Mesmo que alguém tente falsificar o autor de um commit, o <strong>push ao Azure DevOps deixa rastros auditáveis</strong>, desde que:</p>
<ol>
<li class="">A <strong>auditoria esteja habilitada</strong>;</li>
<li class="">O push tenha sido autenticado via SSH, HTTPS ou token válido;</li>
<li class="">Os <strong>logs não tenham expirado</strong> (configure retenção).</li>
</ol>
<p>A combinação de <strong>audit logging + GPG signing + políticas de autenticação forte</strong> cria um ambiente <strong>auditável e juridicamente defensável</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-referências">🔒 Referências<a href="https://techlab.alugafacil.org/es/blog/-rastreabilidade-e-auditoria-de-commits-no-azure-devops#-refer%C3%AAncias" class="hash-link" aria-label="Enlace directo al 🔒 Referências" title="Enlace directo al 🔒 Referências" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://devblogs.microsoft.com/devops/introducing-azure-devops-audit-stream/" target="_blank" rel="noopener noreferrer" class="">Introducing Azure DevOps Audit Stream</a></p>
</li>
<li class="">
<p><a href="https://devblogs.microsoft.com/devops/opt-in-to-auditing-on-azure-devops/" target="_blank" rel="noopener noreferrer" class="">Opt-in to Auditing (Azure DevOps Blog)</a></p>
</li>
<li class="">
<p><a href="https://learn.microsoft.com/en-us/azure/devops/release-notes/roadmap/" target="_blank" rel="noopener noreferrer" class="">Azure DevOps Roadmap — Audit Logging Updates</a></p>
</li>
<li class="">
<p><a href="https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work" target="_blank" rel="noopener noreferrer" class="">Git Commit Signing (GPG)</a></p>
</li>
<li class="">
<p><a href="https://learn.microsoft.com/pt-br/azure/devops/integrate/get-started/authentication/entra?view=azure-devops" target="_blank" rel="noopener noreferrer" class="">tabela comporativa</a></p>
</li>
<li class="">
<p><a href="https://learn.microsoft.com/pt-br/azure/devops/repos/git/set-up-credential-managers?view=azure-devops#install-git-credential-manager" target="_blank" rel="noopener noreferrer" class="">autenticação da ID do Microsoft Entra (recomendado)</a></p>
</li>
</ul>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Azure Devops" term="Azure Devops"/>
        <category label="Git" term="Git"/>
        <category label="Audit" term="Audit"/>
        <category label="Ssh" term="Ssh"/>
        <category label="Forensics" term="Forensics"/>
        <category label="Security" term="Security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Um Guia Abrangente sobre Tipos de Bancos de Dados]]></title>
        <id>https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados</id>
        <link href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados"/>
        <updated>2025-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre um guia abrangente sobre tipos de bancos de dados.]]></summary>
        <content type="html"><![CDATA[<p>A escolha do banco de dados correto é uma das decisões de arquitetura mais críticas no desenvolvimento de software. Com uma vasta gama de opções disponíveis, cada uma otimizada para tarefas específicas, entender suas diferenças é fundamental.</p>
<p>Este guia explora nove categorias distintas de bancos de dados, detalhando suas características, exemplos populares e casos de uso ideais.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="visão-geral-dos-tipos-de-bancos-de-dados">Visão Geral dos Tipos de Bancos de Dados<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#vis%C3%A3o-geral-dos-tipos-de-bancos-de-dados" class="hash-link" aria-label="Enlace directo al Visão Geral dos Tipos de Bancos de Dados" title="Enlace directo al Visão Geral dos Tipos de Bancos de Dados" translate="no">​</a></h3>
<p>O mapa mental abaixo oferece uma visão geral de todos os tipos de bancos de dados abordados neste artigo e seus principais casos de uso.</p>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-bancos-de-dados-sql">1. Bancos de Dados SQL<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#1-bancos-de-dados-sql" class="hash-link" aria-label="Enlace directo al 1. Bancos de Dados SQL" title="Enlace directo al 1. Bancos de Dados SQL" translate="no">​</a></h2>
<p>Bancos de dados SQL, ou relacionais, são a base do armazenamento de dados há décadas. Eles organizam os dados em tabelas estruturadas com linhas e colunas, utilizando um esquema predefinido.</p>
<p><strong>Descrição:</strong> Focados em armazenamento e recuperação de dados estruturados, garantem a consistência das transações através das propriedades ACID (Atomicidade, Consistência, Isolamento e Durabilidade). Utilizam modelos de dados relacionais.<br>
<strong>Exemplos:</strong> MySQL, PostgreSQL, SQL Server, Oracle, MariaDB, SQLite.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Sistemas de Transações Bancárias</li>
<li class="">Gerenciamento de Pedidos em E-commerce</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-bancos-de-dados-colunares">2. Bancos de Dados Colunares<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#2-bancos-de-dados-colunares" class="hash-link" aria-label="Enlace directo al 2. Bancos de Dados Colunares" title="Enlace directo al 2. Bancos de Dados Colunares" translate="no">​</a></h2>
<p>Diferente dos bancos de dados relacionais que armazenam dados em linhas, os bancos de dados colunares armazenam dados em colunas. Essa abordagem oferece vantagens significativas para cargas de trabalho analíticas.</p>
<p><strong>Descrição:</strong> Otimizados para leitura e escrita eficientes de colunas de dados, ideais para consultas que agregam valores de um subconjunto de colunas. Utilizam compressão para acelerar o acesso.<br>
<strong>Exemplos:</strong> Amazon Redshift, Google BigQuery, ClickHouse, Apache HBase.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Data Warehousing</li>
<li class="">Business Intelligence (BI) e Analytics</li>
</ul>
<p><strong>Diagrama comparativo:</strong></p>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-bancos-de-dados-de-séries-temporais-time-series">3. Bancos de Dados de Séries Temporais (Time-Series)<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#3-bancos-de-dados-de-s%C3%A9ries-temporais-time-series" class="hash-link" aria-label="Enlace directo al 3. Bancos de Dados de Séries Temporais (Time-Series)" title="Enlace directo al 3. Bancos de Dados de Séries Temporais (Time-Series)" translate="no">​</a></h2>
<p>Projetados para dados que possuem carimbo de data/hora, como métricas de monitoramento e dados de sensores.</p>
<p><strong>Descrição:</strong> Suportam rastreamento de métricas e eventos ao longo do tempo. Ideais para IoT e monitoramento em tempo real.<br>
<strong>Exemplos:</strong> InfluxDB, Timescale, QuestDB, OpenTSDB.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Monitoramento de Dados de Sensores IoT</li>
<li class="">Métricas de Aplicações e Infraestrutura em Tempo Real</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-bancos-de-dados-em-memória-in-memory">4. Bancos de Dados em Memória (In-Memory)<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#4-bancos-de-dados-em-mem%C3%B3ria-in-memory" class="hash-link" aria-label="Enlace directo al 4. Bancos de Dados em Memória (In-Memory)" title="Enlace directo al 4. Bancos de Dados em Memória (In-Memory)" translate="no">​</a></h2>
<p>Armazenam dados primariamente na memória RAM, resultando em tempos de resposta extremamente baixos.</p>
<p><strong>Descrição:</strong> Oferecem armazenamento e recuperação ultrarrápidos. Persistência em disco é opcional, ideal para baixa latência.<br>
<strong>Exemplos:</strong> Redis, SAP HANA, Apache Ignite, Oracle TimesTen.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Detecção de Fraudes em Tempo Real</li>
<li class="">Camada de Cache para Aplicações Web de Alto Tráfego</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-bancos-de-dados-de-grafos">5. Bancos de Dados de Grafos<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#5-bancos-de-dados-de-grafos" class="hash-link" aria-label="Enlace directo al 5. Bancos de Dados de Grafos" title="Enlace directo al 5. Bancos de Dados de Grafos" translate="no">​</a></h2>
<p>Modelam dados como nós (entidades) e arestas (relacionamentos), perfeitos para conexões complexas.</p>
<p><strong>Descrição:</strong> Otimizados para atravessar redes complexas. Excelentes para sistemas de recomendação.<br>
<strong>Exemplos:</strong> Neo4j, Amazon Neptune, Azure Cosmos DB, JanusGraph.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Mapeamento de Relacionamentos em Redes Sociais</li>
<li class="">Grafos de Conhecimento para Raciocínio em IA</li>
</ul>
<p><strong>Diagrama de exemplo:</strong></p>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-bancos-de-dados-de-documentos">6. Bancos de Dados de Documentos<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#6-bancos-de-dados-de-documentos" class="hash-link" aria-label="Enlace directo al 6. Bancos de Dados de Documentos" title="Enlace directo al 6. Bancos de Dados de Documentos" translate="no">​</a></h2>
<p>Parte da família NoSQL, armazenam dados em documentos JSON/BSON, sem esquema fixo.</p>
<p><strong>Descrição:</strong> Permitem dados hierárquicos aninhados. Escalabilidade horizontal é uma vantagem.<br>
<strong>Exemplos:</strong> MongoDB, Couchbase, Amazon DocumentDB, Cloud Firestore.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Sistemas de Gerenciamento de Conteúdo (CMS)</li>
<li class="">Armazenamento de Perfis de Usuário</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-bancos-de-dados-vetoriais">7. Bancos de Dados Vetoriais<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#7-bancos-de-dados-vetoriais" class="hash-link" aria-label="Enlace directo al 7. Bancos de Dados Vetoriais" title="Enlace directo al 7. Bancos de Dados Vetoriais" translate="no">​</a></h2>
<p>Projetados para armazenar e consultar embeddings de IA (texto, imagens, áudio).</p>
<p><strong>Descrição:</strong> Armazenam vetores de alta dimensão e permitem busca semântica rápida. Essenciais para IA Generativa e RAG.<br>
<strong>Exemplos:</strong> Pinecone, Weaviate, Milvus, Qdrant, Chroma.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Busca Semântica Potencializada por IA</li>
<li class="">Aplicações de IA Generativa com RAG</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-bancos-de-dados-orientados-a-objetos">8. Bancos de Dados Orientados a Objetos<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#8-bancos-de-dados-orientados-a-objetos" class="hash-link" aria-label="Enlace directo al 8. Bancos de Dados Orientados a Objetos" title="Enlace directo al 8. Bancos de Dados Orientados a Objetos" translate="no">​</a></h2>
<p>Armazenam dados como objetos, eliminando necessidade de ORM.</p>
<p><strong>Descrição:</strong> Ideais para dados complexos, como sistemas CAD e multimídia.<br>
<strong>Exemplos:</strong> db4o (descontinuado), ZODB.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Sistemas CAD/CAM</li>
<li class="">Faturamento de Telecomunicações com Objetos Complexos</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-bancos-de-dados-blockchain">9. Bancos de Dados Blockchain<a href="https://techlab.alugafacil.org/es/blog/tipos-de-bancos-de-dados#9-bancos-de-dados-blockchain" class="hash-link" aria-label="Enlace directo al 9. Bancos de Dados Blockchain" title="Enlace directo al 9. Bancos de Dados Blockchain" translate="no">​</a></h2>
<p>Bancos distribuídos e imutáveis, com transações agrupadas em blocos.</p>
<p><strong>Descrição:</strong> Garantem integridade e segurança via livro-razão descentralizado.<br>
<strong>Exemplos:</strong> BigchainDB, CovenantSQL.<br>
<strong>Casos de Uso:</strong></p>
<ul>
<li class="">Rastreamento da Proveniência em Cadeias de Suprimentos</li>
<li class="">Verificação de Identidade Descentralizada</li>
</ul>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Guia" term="Guia"/>
        <category label="Abrangente" term="Abrangente"/>
        <category label="Sobre" term="Sobre"/>
        <category label="Tipos" term="Tipos"/>
        <category label="Bancos" term="Bancos"/>
        <category label="Dados" term="Dados"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[🧪 Prova Meta - Desafios e Reflexões]]></title>
        <id>https://techlab.alugafacil.org/es/blog/prova-meta---desafios-e-reflexes</id>
        <link href="https://techlab.alugafacil.org/es/blog/prova-meta---desafios-e-reflexes"/>
        <updated>2025-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 🧪 prova meta - desafios e reflexões.]]></summary>
        <content type="html"><![CDATA[<p>Depois de duas décadas atuando em tecnologia, poucas provas me desafiaram tanto quanto a da Meta. Mais do que testar conhecimento técnico, ela exigiu reflexão, contexto e equilíbrio emocional.
Percebi que nenhuma resposta é realmente ‘perfeita’.
Tudo depende do contexto — e é justamente nesse espaço entre o certo e o adequado que mora o verdadeiro desafio.</p>
<p><img decoding="async" loading="lazy" alt="Resultado final da avaliação no Codeleap – 84% de acerto" src="https://techlab.alugafacil.org/es/assets/images/Prova-Meta-Resultado-325a206d536c5b5470bca16d51b571ba.png" width="3839" height="845" class="img_ev3q"></p>
<blockquote>
<p>"A vida é 10% o que acontece comigo e 90% como eu reajo a isso." - Charles Swindoll</p>
</blockquote>
<blockquote>
<p>"Acredito que a nota de corte seria em torno de 90%, os 6% vai ser a gasolina da minha motivação."</p>
</blockquote>
<blockquote>
<p>"Esse teste foi uma roleta russa de emoções, achei que não chegaraia a 60%, quando vi 84%.. 'pensei passei... descobri que não...kkk.' "</p>
</blockquote>
<p>Cada desafio técnico é também um exercício de autoconhecimento. Se você gosta de se testar, o <a href="https://coodesh.com/jobs" target="_blank" rel="noopener noreferrer" class="">Coodesh</a> é um ótimo ponto de partida — e talvez, uma nova forma de se enxergar como profissional.</p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Prova" term="Prova"/>
        <category label="Meta" term="Meta"/>
        <category label="Desafios" term="Desafios"/>
        <category label="Reflexes" term="Reflexes"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[NOVO CNPJ A Evolução para o Alfanumérico]]></title>
        <id>https://techlab.alugafacil.org/es/blog/novo-cnpj-a-evoluo-para-o-alfanumrico</id>
        <link href="https://techlab.alugafacil.org/es/blog/novo-cnpj-a-evoluo-para-o-alfanumrico"/>
        <updated>2025-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre novo cnpj a evolução para o alfanumérico.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="novo-cnpj-a-evolução-para-o-alfanumérico">NOVO CNPJ: A Evolução para o Alfanumérico<a href="https://techlab.alugafacil.org/es/blog/novo-cnpj-a-evoluo-para-o-alfanumrico#novo-cnpj-a-evolu%C3%A7%C3%A3o-para-o-alfanum%C3%A9rico" class="hash-link" aria-label="Enlace directo al NOVO CNPJ: A Evolução para o Alfanumérico" title="Enlace directo al NOVO CNPJ: A Evolução para o Alfanumérico" translate="no">​</a></h2>
<p>Com o crescimento exponencial de empresas e organizações no Brasil, a Receita Federal anunciou uma mudança significativa no formato do Cadastro Nacional da Pessoa Jurídica (CNPJ).
A partir de 2026, o CNPJ passará a ser alfanumérico, incorporando letras ao invés de ser composto exclusivamente por números.
Esta mudança visa ampliar a capacidade de identificação das entidades, garantindo que o sistema continue eficiente e funcional diante do aumento constante de registros.</p>
<p><img decoding="async" loading="lazy" alt="alt text" src="https://techlab.alugafacil.org/es/assets/images/cnpj-alfanumerico-9c0bfe5ce803f0b9546ca5acc81b2b61.png" width="1690" height="564" class="img_ev3q"></p>
<p><a href="https://www.gov.br/receitafederal/pt-br/acesso-a-informacao/acoes-e-programas/programas-e-atividades/cnpj-alfanumerico" target="_blank" rel="noopener noreferrer" class="">esgotamento dos números de CNPJ disponíveis</a></p>
<p><a href="https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/apresentacoes/outros-eventos/cnpj-alfanumerico-escolha-tecnica.pdf" target="_blank" rel="noopener noreferrer" class="">cnpj-alfanumerico-escolha-tecnica</a></p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Novo" term="Novo"/>
        <category label="Cnpj" term="Cnpj"/>
        <category label="Evoluo" term="Evoluo"/>
        <category label="Para" term="Para"/>
        <category label="Alfanumrico" term="Alfanumrico"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[O Framework de Autorização OAuth 2.1]]></title>
        <id>https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21</id>
        <link href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21"/>
        <updated>2025-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre o framework de autorização oauth 2.1.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="o-framework-de-autorização-oauth-21">O Framework de Autorização OAuth 2.1<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#o-framework-de-autoriza%C3%A7%C3%A3o-oauth-21" class="hash-link" aria-label="Enlace directo al O Framework de Autorização OAuth 2.1" title="Enlace directo al O Framework de Autorização OAuth 2.1" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-resumo">🧩 Resumo<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-resumo" class="hash-link" aria-label="Enlace directo al 🧩 Resumo" title="Enlace directo al 🧩 Resumo" translate="no">​</a></h2>
<p>O <strong>OAuth 2.1 Authorization Framework</strong> fornece um mecanismo seguro e padronizado para que aplicações obtenham acesso limitado a recursos protegidos.<br>
<!-- -->Esse acesso pode ocorrer em nome do <strong>proprietário do recurso</strong>, mediante interação de autorização com o servidor, ou diretamente em nome da própria aplicação (cliente).</p>
<p>O OAuth 2.1 <strong>moderniza e consolida</strong> o antigo framework OAuth 2.0, aprimorando a segurança, simplificando a implementação e descontinuando fluxos obsoletos.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-introdução">1. Introdução<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#1-introdu%C3%A7%C3%A3o" class="hash-link" aria-label="Enlace directo al 1. Introdução" title="Enlace directo al 1. Introdução" translate="no">​</a></h2>
<p>O <strong>OAuth 2.1</strong> é a evolução do <strong>OAuth 2.0 (RFC 6749)</strong> — um conjunto de protocolos padronizados que permite a <strong>delegação de acesso</strong> a recursos protegidos.<br>
<!-- -->A nova versão remove fluxos inseguros, reforça as diretrizes de registro de clientes e manipulação de tokens, além de incorporar as melhores práticas atuais de segurança.</p>
<p>As principais <strong>funções (roles)</strong> do framework são:</p>
<ul>
<li class=""><strong>Proprietário do Recurso (Resource Owner):</strong> Entidade capaz de conceder acesso a um recurso protegido.</li>
<li class=""><strong>Cliente (Client):</strong> Aplicação que solicita o acesso.</li>
<li class=""><strong>Servidor de Autorização (Authorization Server):</strong> Emite tokens de acesso após autenticar o proprietário do recurso.</li>
<li class=""><strong>Servidor de Recursos (Resource Server):</strong> Hospeda o recurso protegido e valida o token recebido.</li>
</ul>
<p>O OAuth 2.1 suporta vários <strong>tipos de concessão (grants)</strong> — como <em>authorization code</em>, <em>client credentials</em> e <em>refresh tokens</em> — adequados a aplicações web, móveis e nativas.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-fluxo-do-protocolo">2. Fluxo do Protocolo<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#2-fluxo-do-protocolo" class="hash-link" aria-label="Enlace directo al 2. Fluxo do Protocolo" title="Enlace directo al 2. Fluxo do Protocolo" translate="no">​</a></h2>
<p>O fluxo de autorização segue uma sequência bem definida:</p>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<p>O framework baseia-se em <strong>redirecionamentos HTTPS</strong>, <strong>criptografia TLS</strong> e <strong>formatos padronizados de token</strong>, garantindo <strong>confidencialidade e integridade</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tipos-de-concessão-grants">3. Tipos de Concessão (Grants)<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#3-tipos-de-concess%C3%A3o-grants" class="hash-link" aria-label="Enlace directo al 3. Tipos de Concessão (Grants)" title="Enlace directo al 3. Tipos de Concessão (Grants)" translate="no">​</a></h2>
<p>O OAuth 2.1 define diferentes <strong>tipos de concessão de autorização</strong>:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-código-de-autorização-authorization-code">🔑 Código de Autorização (Authorization Code)<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-c%C3%B3digo-de-autoriza%C3%A7%C3%A3o-authorization-code" class="hash-link" aria-label="Enlace directo al 🔑 Código de Autorização (Authorization Code)" title="Enlace directo al 🔑 Código de Autorização (Authorization Code)" translate="no">​</a></h3>
<p>Fluxo seguro voltado a aplicações web e SPAs modernas.<br>
<!-- -->Utiliza <strong>PKCE (Proof Key for Code Exchange)</strong> para evitar ataques de interceptação.</p>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-token-de-atualização-refresh-token">🔄 Token de Atualização (Refresh Token)<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-token-de-atualiza%C3%A7%C3%A3o-refresh-token" class="hash-link" aria-label="Enlace directo al 🔄 Token de Atualização (Refresh Token)" title="Enlace directo al 🔄 Token de Atualização (Refresh Token)" translate="no">​</a></h3>
<p>Permite <strong>acesso contínuo</strong> sem necessidade de nova autenticação do usuário.<br>
<!-- -->O cliente troca o <em>refresh token</em> por um novo <em>access token</em>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-credenciais-do-cliente-client-credentials">🤝 Credenciais do Cliente (Client Credentials)<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-credenciais-do-cliente-client-credentials" class="hash-link" aria-label="Enlace directo al 🤝 Credenciais do Cliente (Client Credentials)" title="Enlace directo al 🤝 Credenciais do Cliente (Client Credentials)" translate="no">​</a></h3>
<p>Usado em comunicações <strong>servidor-servidor</strong>, onde a aplicação atua em nome próprio.</p>
<p>Outros tipos de <em>grants</em> personalizados podem ser definidos conforme o caso de uso.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tokens-de-acesso">4. Tokens de Acesso<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#4-tokens-de-acesso" class="hash-link" aria-label="Enlace directo al 4. Tokens de Acesso" title="Enlace directo al 4. Tokens de Acesso" translate="no">​</a></h2>
<p>Os <strong>tokens de acesso</strong> são credenciais utilizadas pelos clientes para acessar recursos protegidos:</p>
<ul>
<li class=""><strong>Bearer Tokens:</strong> Os mais comuns, enviados no cabeçalho HTTP <code>Authorization: Bearer &lt;token&gt;</code>.</li>
<li class=""><strong>Sender-Constrained Tokens:</strong> Associados a um cliente específico, reduzindo o risco de uso indevido.</li>
<li class=""><strong>Escopo (Scope):</strong> Define as permissões do token, seguindo o princípio do menor privilégio.</li>
</ul>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<p>O OAuth 2.1 reforça a importância da <strong>segurança no transporte</strong>, <strong>expiração de tokens</strong> e <strong>mitigação contra roubo e reutilização</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-registro-de-clientes">5. Registro de Clientes<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#5-registro-de-clientes" class="hash-link" aria-label="Enlace directo al 5. Registro de Clientes" title="Enlace directo al 5. Registro de Clientes" translate="no">​</a></h2>
<p>Antes de utilizar o framework, os <strong>clientes devem ser registrados</strong> junto ao servidor de autorização, fornecendo:</p>
<ul>
<li class=""><strong>Identificador do cliente (Client ID)</strong></li>
<li class=""><strong>URIs de redirecionamento</strong></li>
<li class=""><strong>Credenciais de autenticação (Client Secret ou métodos alternativos)</strong></li>
</ul>
<p>Recomendações de segurança incluem:</p>
<ul>
<li class="">Prevenir ataques <strong>CSRF</strong></li>
<li class="">Evitar <strong>open redirectors</strong></li>
<li class="">Proteger contra <strong>falsificação de identidade de clientes</strong></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-considerações-de-segurança">6. Considerações de Segurança<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#6-considera%C3%A7%C3%B5es-de-seguran%C3%A7a" class="hash-link" aria-label="Enlace directo al 6. Considerações de Segurança" title="Enlace directo al 6. Considerações de Segurança" translate="no">​</a></h2>
<p>O OAuth 2.1 aborda diversas ameaças e define recomendações claras:</p>
<ul>
<li class="">Exigir <strong>TLS</strong> para todas as comunicações</li>
<li class="">Restringir <strong>tempo de vida e escopo</strong> dos tokens</li>
<li class="">Prevenir:<!-- -->
<ul>
<li class="">Injeção de código de autorização</li>
<li class=""><strong>Phishing</strong></li>
<li class=""><strong>Clickjacking</strong></li>
<li class=""><strong>Cross-Site Request Forgery (CSRF)</strong></li>
</ul>
</li>
<li class="">Aplicar verificações de redirecionamento seguras para apps nativos e baseadas em navegador.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-aplicações-nativas-e-baseadas-em-navegador">7. Aplicações Nativas e Baseadas em Navegador<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#7-aplica%C3%A7%C3%B5es-nativas-e-baseadas-em-navegador" class="hash-link" aria-label="Enlace directo al 7. Aplicações Nativas e Baseadas em Navegador" title="Enlace directo al 7. Aplicações Nativas e Baseadas em Navegador" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-aplicações-nativas">📱 Aplicações Nativas<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-aplica%C3%A7%C3%B5es-nativas" class="hash-link" aria-label="Enlace directo al 📱 Aplicações Nativas" title="Enlace directo al 📱 Aplicações Nativas" translate="no">​</a></h3>
<p>Devem utilizar <strong>interfaces de loopback</strong> ou <strong>esquemas de URI privados</strong> para retorno seguro do token.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-aplicações-web-spa">🌐 Aplicações Web (SPA)<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-aplica%C3%A7%C3%B5es-web-spa" class="hash-link" aria-label="Enlace directo al 🌐 Aplicações Web (SPA)" title="Enlace directo al 🌐 Aplicações Web (SPA)" translate="no">​</a></h3>
<p>Devem evitar o fluxo <strong>implícito</strong>, substituindo-o pelo fluxo de <strong>Authorization Code com PKCE</strong> para maior segurança.</p>
<div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><div style="background-color:white;padding:10px;border-radius:8px"></div></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-diferenças-em-relação-ao-oauth-20">8. Diferenças em Relação ao OAuth 2.0<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#8-diferen%C3%A7as-em-rela%C3%A7%C3%A3o-ao-oauth-20" class="hash-link" aria-label="Enlace directo al 8. Diferenças em Relação ao OAuth 2.0" title="Enlace directo al 8. Diferenças em Relação ao OAuth 2.0" translate="no">​</a></h2>
<p>O <strong>OAuth 2.1</strong> simplifica e corrige falhas da versão anterior:</p>
<ul>
<li class="">🔒 <strong>Remove o fluxo Implícito (Implicit Grant)</strong></li>
<li class="">🎯 <strong>Exige validação rigorosa de URIs de redirecionamento</strong></li>
<li class="">📘 <strong>Consolida práticas de segurança no núcleo da especificação</strong></li>
<li class="">💡 <strong>Recomenda o uso obrigatório de PKCE</strong> para todos os clientes públicos</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-conclusão">9. Conclusão<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#9-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 9. Conclusão" title="Enlace directo al 9. Conclusão" translate="no">​</a></h2>
<p>O <strong>OAuth 2.1</strong> oferece um framework robusto e atualizado para autorização moderna, equilibrando <strong>usabilidade e segurança</strong>.<br>
<!-- -->Ao eliminar fluxos inseguros e consolidar as melhores práticas, ele garante <strong>delegação de acesso confiável</strong> para aplicações web, móveis e nativas.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-referências">🔗 Referências<a href="https://techlab.alugafacil.org/es/blog/o-framework-de-autorizao-oauth-21#-refer%C3%AAncias" class="hash-link" aria-label="Enlace directo al 🔗 Referências" title="Enlace directo al 🔗 Referências" translate="no">​</a></h2>
<ul>
<li class=""><strong>RFC 6749:</strong> The OAuth 2.0 Authorization Framework</li>
<li class=""><strong>RFC 6750:</strong> The OAuth 2.0 Bearer Token Usage</li>
<li class=""><strong>Internet-Draft OAuth 2.1:</strong> <a href="https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1" target="_blank" rel="noopener noreferrer" class="">https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1</a></li>
</ul>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Framework" term="Framework"/>
        <category label="Autorizao" term="Autorizao"/>
        <category label="Oauth" term="Oauth"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Configuração Git Recomendada para Projetos Docusaurus]]></title>
        <id>https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus</id>
        <link href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus"/>
        <updated>2025-10-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre configuração git recomendada para projetos docusaurus.]]></summary>
        <content type="html"><![CDATA[<p>Este documento explica como configurar corretamente o <strong>Git</strong> para evitar erros comuns durante o desenvolvimento e o deploy de projetos <strong>Docusaurus</strong> (incluindo builds no Cloudflare, Netlify e Vercel).</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-objetivo">🧩 Objetivo<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#-objetivo" class="hash-link" aria-label="Enlace directo al 🧩 Objetivo" title="Enlace directo al 🧩 Objetivo" translate="no">​</a></h2>
<p>O Docusaurus é sensível a diferenças de <strong>letras maiúsculas/minúsculas</strong>, <strong>quebras de linha</strong> e <strong>permissões de arquivo</strong>.<br>
<!-- -->Essas diferenças podem causar erros como:</p>
<ul>
<li class=""><code>Error: The docs folder does not exist for version "current"</code></li>
<li class="">Problemas de build no Linux (mas não no Windows)</li>
<li class="">Falhas no deploy por nomes de diretório incorretos (<code>Gestao</code> vs <code>gestao</code>)</li>
<li class="">Conflitos de permissões no CI/CD</li>
</ul>
<p>A configuração abaixo padroniza o comportamento do Git e evita esses erros.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-arquivo-gitconfig-para-docusaurus">🛠️ Arquivo <code>.gitconfig</code> para Docusaurus<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#%EF%B8%8F-arquivo-gitconfig-para-docusaurus" class="hash-link" aria-label="Enlace directo al ️-arquivo-gitconfig-para-docusaurus" title="Enlace directo al ️-arquivo-gitconfig-para-docusaurus" translate="no">​</a></h2>
<p>Salve este conteúdo na raiz do seu repositório como <code>.gitconfig</code>,<br>
<!-- -->ou aplique via <code>git config --local</code>.</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># ==========================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># .gitconfig para Docusaurus</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># ==========================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[user]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name = Seu Nome</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    email = seu.email@exemplo.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[core]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    autocrlf = input              # Mantém LF (evita quebras de linha problemáticas no build)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ignorecase = false            # Diferencia maiúsculas/minúsculas (importante em sistemas Linux)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    filemode = true               # Garante que permissões de execução sejam respeitadas</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    longpaths = true              # Evita erros de caminho longo no Windows</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[init]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    defaultBranch = main          # Usa 'main' como branch padrão</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[color]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ui = auto                     # Saída colorida no terminal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[diff]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    renames = true                # Detecta renomes de arquivos/pastas</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[pull]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rebase = false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[merge]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ff = only                     # Exige merges limpos (sem commits extras)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[alias]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    st = status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cm = commit -m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    br = branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    co = checkout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    df = diff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    lg = log --oneline --graph --decorate --all</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-explicação-das-principais-configurações">💡 Explicação das Principais Configurações<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#-explica%C3%A7%C3%A3o-das-principais-configura%C3%A7%C3%B5es" class="hash-link" aria-label="Enlace directo al 💡 Explicação das Principais Configurações" title="Enlace directo al 💡 Explicação das Principais Configurações" translate="no">​</a></h2>
<table><thead><tr><th>Configuração</th><th>Função</th><th>Benefício</th></tr></thead><tbody><tr><td><code>core.ignorecase = false</code></td><td>Diferencia nomes com maiúsculas/minúsculas</td><td>Evita erros de build no Linux e Cloudflare Pages</td></tr><tr><td><code>core.autocrlf = input</code></td><td>Mantém quebras de linha padrão LF</td><td>Evita falhas no Markdown e scripts Node.js</td></tr><tr><td><code>core.filemode = true</code></td><td>Habilita controle de permissões de execução</td><td>Evita conflitos de execução em CI/CD</td></tr><tr><td><code>core.longpaths = true</code></td><td>Suporte a caminhos longos</td><td>Evita erros <code>ENAMETOOLONG</code> no Windows</td></tr><tr><td><code>init.defaultBranch = main</code></td><td>Define a branch principal como <code>main</code></td><td>Compatível com templates do Docusaurus</td></tr><tr><td><code>diff.renames = true</code></td><td>Detecta renomes de arquivos/pastas</td><td>Mantém histórico limpo e preciso</td></tr><tr><td><code>merge.ff = only</code></td><td>Permite apenas merges “fast-forward”</td><td>Evita commits desnecessários no histórico</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-como-aplicar-via-terminal">🧠 Como aplicar via terminal<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#-como-aplicar-via-terminal" class="hash-link" aria-label="Enlace directo al 🧠 Como aplicar via terminal" title="Enlace directo al 🧠 Como aplicar via terminal" translate="no">​</a></h2>
<p>Você pode aplicar as configurações diretamente no repositório:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> core.ignorecase </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> core.autocrlf input</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> core.filemode </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> core.longpaths </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> init.defaultBranch main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> diff.renames </span><span class="token boolean" style="color:#36acaa">true</span><br></span></code></pre></div></div>
<blockquote>
<p>💡 Use <code>--global</code> em vez de <code>--local</code> se quiser aplicar a todos os repositórios Git do seu computador.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-verificando-a-configuração">🧾 Verificando a configuração<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#-verificando-a-configura%C3%A7%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧾 Verificando a configuração" title="Enlace directo al 🧾 Verificando a configuração" translate="no">​</a></h2>
<p>Para conferir se tudo foi aplicado corretamente:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--list</span><span class="token plain"> --show-origin</span><br></span></code></pre></div></div>
<p>Isso exibirá a origem de cada configuração e garantirá que o <code>.gitconfig</code> local está sendo respeitado.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-dica-extra-verifique-problemas-de-case">🔍 Dica extra: verifique problemas de case<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#-dica-extra-verifique-problemas-de-case" class="hash-link" aria-label="Enlace directo al 🔍 Dica extra: verifique problemas de case" title="Enlace directo al 🔍 Dica extra: verifique problemas de case" translate="no">​</a></h2>
<p>Antes de fazer o deploy, execute:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> ls-files </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-E</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[A-Z]'</span><br></span></code></pre></div></div>
<p>Isso lista todos os arquivos com letras maiúsculas no caminho — potenciais fontes de erro no build do Docusaurus (especialmente pastas como <code>Docs</code>, <code>Blog</code>, <code>Static</code>).</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão">✅ Conclusão<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/git-config-docusaurus#-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al ✅ Conclusão" title="Enlace directo al ✅ Conclusão" translate="no">​</a></h2>
<p>Essas configurações tornam o repositório Docusaurus:</p>
<ul>
<li class="">Mais <strong>consistente</strong> entre Windows, macOS e Linux</li>
<li class="">Livre de <strong>erros de case-sensitive</strong> e <strong>quebras de linha</strong></li>
<li class="">Pronto para <strong>builds estáveis em CI/CD</strong></li>
</ul>
<blockquote>
<p>Recomenda-se versionar o <code>.gitconfig</code> junto ao projeto,<br>
<!-- -->para que todos os colaboradores usem as mesmas boas práticas.</p>
</blockquote>
<hr>
<p>📘 <strong>Autor:</strong> TechLab Docs<br>
<!-- -->📅 <strong>Última atualização:</strong> Outubro de 2025</p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Git" term="Git"/>
        <category label="Docusaurus" term="Docusaurus"/>
        <category label="Configurao" term="Configurao"/>
        <category label="Boas Prticas" term="Boas Prticas"/>
        <category label="Ci Cd" term="Ci Cd"/>
        <category label="Versionamento" term="Versionamento"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Boas-vindas ao TechLab]]></title>
        <id>https://techlab.alugafacil.org/es/blog/boas-vindas</id>
        <link href="https://techlab.alugafacil.org/es/blog/boas-vindas"/>
        <updated>2025-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre boas-vindas ao techlab.]]></summary>
        <content type="html"><![CDATA[<p>Seja bem-vindo ao <strong>TechLab</strong> — o espaço onde compartilhamos artigos, automações e boas práticas de desenvolvimento e infraestrutura. 💡</p>
<p>Nosso objetivo é consolidar conhecimento técnico em áreas como <strong>DevOps</strong>, <strong>Cloud</strong>, <strong>Segurança</strong> e <strong>Desenvolvimento de Software</strong>, com foco em produtividade e qualidade.</p>
<!-- -->
<p>Neste blog, você encontrará:</p>
<ul>
<li class="">Artigos sobre <strong>automação e CI/CD</strong></li>
<li class="">Tutoriais e snippets de <strong>cloud e infraestrutura</strong></li>
<li class="">Boas práticas de <strong>desenvolvimento de software</strong></li>
</ul>
<p>Sinta-se à vontade para explorar e contribuir! 🚀</p>
<ins class="adsbygoogle" style="display:block;text-align:center" data-ad-client="ca-pub-3116949801186221" data-ad-slot="1234567890" data-ad-format="auto" data-full-width-responsive="true"></ins>
<div style="text-align:center;font-size:0.9rem;margin-top:10px;color:#555"><p>Banner.</p></div>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Techlab" term="Techlab"/>
        <category label="Devops" term="Devops"/>
        <category label="Boas Vindas" term="Boas Vindas"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[📊 Comparativo CDBs — Banco Volkswagen vs Mercado Pago]]></title>
        <id>https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago</id>
        <link href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago"/>
        <updated>2025-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre 📊 comparativo cdbs — banco volkswagen vs mercado pago.]]></summary>
        <content type="html"><![CDATA[<p>O estudo conclui que, com a Selic em 15%, o CDB pós-fixado a 107% da Selic oferece melhor rentabilidade e liquidez, sendo a opção mais vantajosa para o investidor conservador.
O CDB prefixado de 14,5% só se destaca em um cenário de forte queda futura dos juros.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-perfil-institucional">🏦 Perfil Institucional<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#-perfil-institucional" class="hash-link" aria-label="Enlace directo al 🏦 Perfil Institucional" title="Enlace directo al 🏦 Perfil Institucional" translate="no">​</a></h2>
<table><thead><tr><th>Instituição</th><th>Tipo</th><th>Lucro Líquido (12m)</th><th>Índice de Basileia</th><th>Observações</th></tr></thead><tbody><tr><td><strong>Banco Volkswagen S.A.</strong></td><td>Banco múltiplo controlado pela VW Financial Services</td><td>R$ 1,1 bi</td><td>19,7%</td><td>Alta solidez e foco em crédito automotivo, funding estável e rating máximo nacional.</td></tr><tr><td><strong>Mercado Pago (Mercado Livre)</strong></td><td>Instituição de Pagamento / Financeira Digital</td><td>R$ 530 mi</td><td>N/D</td><td>Crescimento acelerado, porém estrutura mais enxuta e dependente do fluxo de recebíveis.</td></tr></tbody></table>
<p>🔹 <strong>Resumo de solidez:</strong> O Banco Volkswagen apresenta <strong>melhor rating, capitalização e previsibilidade</strong>, sendo mais adequado para investidores conservadores.<br>
<!-- -->O Mercado Pago, embora sólido, é mais exposto ao setor de varejo e ao risco tecnológico.
Analisar a instituição utilizando alguma instituição de risco como <a href="https://www.fitchratings.com/" target="_blank" rel="noopener noreferrer" class="">fitchrating</a> é fundamental para definir com precisão qualidade do titulo.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-comparativo-técnico-dos-cdbs">📊 Comparativo Técnico dos CDBs<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#-comparativo-t%C3%A9cnico-dos-cdbs" class="hash-link" aria-label="Enlace directo al 📊 Comparativo Técnico dos CDBs" title="Enlace directo al 📊 Comparativo Técnico dos CDBs" translate="no">​</a></h2>
<table><thead><tr><th>Característica</th><th>CDB Banco Volkswagen</th><th>CDB Mercado Pago</th></tr></thead><tbody><tr><td><strong>Tipo</strong></td><td>Prefixado</td><td>Pós-fixado (107% da Selic)</td></tr><tr><td><strong>Rentabilidade Bruta</strong></td><td>14,5% a.a.</td><td>16,05% a.a. (107% × 15%)</td></tr><tr><td><strong>Liquidez</strong></td><td>Resgate após 6 meses</td><td>Liquidez diária</td></tr><tr><td><strong>Imposto de Renda</strong></td><td>Regressivo (22,5% → 15%)</td><td>Regressivo (22,5% → 15%)</td></tr><tr><td><strong>IOF</strong></td><td>Não aplicável (prazo &gt; 30 dias)</td><td>Aplicável até 30 dias</td></tr><tr><td><strong>Garantia FGC</strong></td><td>Até R$ 250 mil</td><td>Até R$ 250 mil</td></tr><tr><td><strong>Risco de Mercado</strong></td><td>Fixo (protege de queda na Selic)</td><td>Variável (rende mais se Selic alta)</td></tr><tr><td><strong>Limite aplicação</strong></td><td>Sem limites*</td><td>R$30.000,00</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-simulação-de-rendimentos-líquidos-r-100000-investidos">💰 Simulação de Rendimentos Líquidos (R$ 100.000 investidos)<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#-simula%C3%A7%C3%A3o-de-rendimentos-l%C3%ADquidos-r-100000-investidos" class="hash-link" aria-label="Enlace directo al 💰 Simulação de Rendimentos Líquidos (R$ 100.000 investidos)" title="Enlace directo al 💰 Simulação de Rendimentos Líquidos (R$ 100.000 investidos)" translate="no">​</a></h2>
<table><thead><tr><th>Prazo</th><th>CDB 14,5% a.a. (pre-fixado)</th><th>CDB 107% da Selic (16,05%)</th><th>CDB 104% da Selic (15,6%)</th></tr></thead><tbody><tr><td>3 meses (aprox. 90 dias)</td><td>R$ 103.625</td><td>R$ 103.813</td><td>R$ 103.780</td></tr><tr><td>6 meses (aprox. 180 dias)</td><td>R$ 105.700</td><td>R$ 106.350</td><td>R$ 106.200</td></tr><tr><td>12 meses (360 dias)</td><td>R$ 111.600</td><td>R$ 112.800</td><td>R$ 112.300</td></tr><tr><td>24 meses (720 dias)</td><td>R$ 124.900</td><td>R$ 127.500</td><td>R$ 126.000</td></tr></tbody></table>
<p>💡 <strong>Observações:</strong></p>
<ul>
<li class="">O rendimento do CDB 104% da Selic fica entre o CDB prefixado e o 107% da Selic.</li>
<li class="">Quanto maior o prazo, mais se percebe a diferença de rendimento líquido entre os pós-fixados, especialmente enquanto a Selic estiver elevada.</li>
<li class=""><em>A diferença de rendimento líquido cresce com o tempo, favorecendo o pós-fixado enquanto a Selic permanecer elevada.</em></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-cenários-de-juros">📈 Cenários de Juros<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#-cen%C3%A1rios-de-juros" class="hash-link" aria-label="Enlace directo al 📈 Cenários de Juros" title="Enlace directo al 📈 Cenários de Juros" translate="no">​</a></h2>
<table><thead><tr><th>Situação de Mercado</th><th>Melhor Opção</th><th>Justificativa</th></tr></thead><tbody><tr><td><strong>Juros estáveis ou altos (Selic ≥ 13%)</strong></td><td>✅ CDB 107% da Selic</td><td>Acompanha a Selic e rende mais, mantendo liquidez.</td></tr><tr><td><strong>Juros em queda forte (Selic &lt; 11%)</strong></td><td>📉 CDB Prefixado 14,5% a.a.</td><td>Trava rentabilidade acima do mercado futuro.</td></tr><tr><td><strong>Busca de liquidez e flexibilidade</strong></td><td>💸 CDB 107% da Selic</td><td>Permite saques a qualquer momento sem perda de rendimento.</td></tr><tr><td><strong>Busca de previsibilidade garantida</strong></td><td>🔒 CDB 14,5% a.a.</td><td>Ideal se o investidor não precisará do dinheiro antes de 6 meses.</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão-prática">✅ Conclusão Prática<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#-conclus%C3%A3o-pr%C3%A1tica" class="hash-link" aria-label="Enlace directo al ✅ Conclusão Prática" title="Enlace directo al ✅ Conclusão Prática" translate="no">​</a></h2>
<blockquote>
<p>💬 <strong>Com a Selic a 15% e liquidez diária, o CDB de 107% da Selic é claramente mais vantajoso no momento</strong> — rende mais e mantém liberdade para reagir a mudanças no mercado.<br>
<!-- -->O prefixado só compensa <strong>se você acreditar que a Selic cairá forte nos próximos meses (abaixo de 13%)</strong> e não precisar de liquidez antes de 6 meses.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-resumo-direto">💬 Resumo Direto<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#-resumo-direto" class="hash-link" aria-label="Enlace directo al 💬 Resumo Direto" title="Enlace directo al 💬 Resumo Direto" translate="no">​</a></h2>
<ul>
<li class="">🏦 <strong>CDB do Banco Volkswagen (brAAA):</strong> instituição sólida, ideal para prazos fixos e previsibilidade.</li>
<li class="">💳 <strong>CDB do Mercado Pago (brA+):</strong> opção moderna e líquida, mas com risco ligeiramente maior.</li>
<li class="">📊 <strong>Cenário atual (Selic 15%) favorece o pós-fixado</strong> — o CDB 107% da Selic entrega melhor rentabilidade e flexibilidade.</li>
<li class="">💰 <strong>Para investidor conservador</strong>, priorize segurança (FGC, rating) e liquidez: o pós-fixado é a escolha equilibrada agora.</li>
</ul>
<hr>
<p>🧭 <strong>Recomendação final:</strong> mantenha posição no CDB 107% da Selic enquanto a taxa básica permanecer elevada e monitore o Copom trimestralmente.
Migre parcialmente para prefixados <strong>apenas se a tendência de corte da Selic se consolidar</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reflexão-sobre-investimentos-e-controle">💡<strong>Reflexão sobre investimentos e controle</strong><a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#reflex%C3%A3o-sobre-investimentos-e-controle" class="hash-link" aria-label="Enlace directo al reflexão-sobre-investimentos-e-controle" title="Enlace directo al reflexão-sobre-investimentos-e-controle" translate="no">​</a></h2>
<p>Recentemente, assisti a um podcast que abordava o crime organizado e a forma como esses grupos diversificam seus negócios para lavagem de dinheiro
adquirindo postos de combustível, bares, padarias e outros empreendimentos.
Fiquei pensando: se até organizações criminosas preferem negócios reais e tangíveis, é porque confiam mais no que podem ver e controlar.</p>
<p>Agora imagine o investidor comum colocando seu dinheiro em COEs (Certificados de Operações Estruturadas) — produtos complexos, com risco assimétrico e retorno limitado.
Talvez o ponto não seja apenas ganhar mais, mas entender no que se está investindo.</p>
<p>COEs são “abstratos”: você só vê números, gráficos e relatórios.
Para a maioria das pessoas, o risco é aceitável em teoria, mas na prática, a complexidade torna difícil medir e controlar os resultados.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reflexão-sobre-coes-e-controle-de-risco">Reflexão sobre COEs e Controle de Risco<a href="https://techlab.alugafacil.org/es/blog/comparativo-cdb-volkswagen-mercadopago#reflex%C3%A3o-sobre-coes-e-controle-de-risco" class="hash-link" aria-label="Enlace directo al Reflexão sobre COEs e Controle de Risco" title="Enlace directo al Reflexão sobre COEs e Controle de Risco" translate="no">​</a></h3>
<p>Se até organizações criminosas evitam negócios abstratos como COEs e preferem postos de combustível, bares e padarias, é por um motivo simples: <strong>eles querem o que podem ver e controlar</strong>.</p>
<p>COEs — produtos complexos, com risco assimétrico e retorno limitado — podem parecer seguros para investidores comuns.
Mas na prática, dependem de fórmulas, derivativos e cenários que ninguém controla diretamente.</p>
<p>O ponto não é apenas “ganhar mais”, mas <strong>entender onde você está colocando seu dinheiro</strong>. Risco que parece aceitável na teoria pode ser inaceitável na prática.</p>
<p>💭 Pergunta final: se criminosos consideram o risco muito alto, por que você confiaria ou aceitaria esse tipo de risco?</p>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Comparativo" term="Comparativo"/>
        <category label="Cdbs" term="Cdbs"/>
        <category label="Banco" term="Banco"/>
        <category label="Volkswagen" term="Volkswagen"/>
        <category label="Mercado" term="Mercado"/>
        <category label="Pago" term="Pago"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[OpEx vs CapEx vs RevEx vs FinEx]]></title>
        <id>https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex</id>
        <link href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex"/>
        <updated>2025-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre opex vs capex vs revex vs finex.]]></summary>
        <content type="html"><![CDATA[<p>Compreender os diferentes tipos de <strong>expenditures (gastos)</strong> é essencial para qualquer gestor, analista financeiro ou empreendedor.<br>
<!-- -->Cada categoria — <strong>OpEx</strong>, <strong>CapEx</strong>, <strong>RevEx</strong> e <strong>FinEx</strong> — representa um tipo específico de despesa que impacta de forma diferente o <strong>fluxo de caixa, a lucratividade e o crescimento de longo prazo</strong>.</p>
<!-- -->
<hr>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">⚙️ OpEx — Operating Expenditure</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">🏗️ CapEx — Capital Expenditure</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">🛒 RevEx — Revenue Expenditure</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">💸 FinEx — Finance Expenditure</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="card__owf p-4 mt-2"><div class="content_CUpA"><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-é">💡 O que é<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-o-que-%C3%A9" class="hash-link" aria-label="Enlace directo al 💡 O que é" title="Enlace directo al 💡 O que é" translate="no">​</a></h3><p>Custos <strong>do dia a dia</strong> do negócio, totalmente reconhecidos no período em que ocorrem.</p><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-por-que-acompanhar">🎯 Por que acompanhar<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-por-que-acompanhar" class="hash-link" aria-label="Enlace directo al 🎯 Por que acompanhar" title="Enlace directo al 🎯 Por que acompanhar" translate="no">​</a></h3><ul>
<li class="">Controla a taxa de queima e o runway financeiro</li>
<li class="">Evidencia oportunidades de economia</li>
<li class="">Avalia a eficiência operacional</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-quando-rastrear">⏱️ Quando rastrear<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#%EF%B8%8F-quando-rastrear" class="hash-link" aria-label="Enlace directo al ⏱️ Quando rastrear" title="Enlace directo al ⏱️ Quando rastrear" translate="no">​</a></h3><ul>
<li class="">Revisões mensais de operação</li>
<li class="">Planejamento orçamentário</li>
<li class="">Análises de lucratividade</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-impacto-financeiro">💹 Impacto financeiro<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-impacto-financeiro" class="hash-link" aria-label="Enlace directo al 💹 Impacto financeiro" title="Enlace directo al 💹 Impacto financeiro" translate="no">​</a></h3><ul>
<li class="">Afeta diretamente o <strong>lucro e prejuízo (P&amp;L)</strong></li>
<li class="">Reduz o lucro tributável</li>
<li class=""><strong>Não</strong> cria ativos no balanço</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exemplos">📦 Exemplos<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-exemplos" class="hash-link" aria-label="Enlace directo al 📦 Exemplos" title="Enlace directo al 📦 Exemplos" translate="no">​</a></h3><ul>
<li class="">Aluguel e utilidades</li>
<li class="">Salários e benefícios</li>
<li class="">Campanhas de marketing</li>
<li class="">Licenças e assinaturas</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-boas-práticas">✅ Boas práticas<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-boas-pr%C3%A1ticas" class="hash-link" aria-label="Enlace directo al ✅ Boas práticas" title="Enlace directo al ✅ Boas práticas" translate="no">​</a></h3><ul>
<li class="">Revisões mensais de tendências</li>
<li class="">Calcular OpEx como % da receita</li>
<li class="">Monitorar custos fixos e variáveis</li>
</ul><div class="alert_DgrF info_ED0Q"><strong class="title_dbqf">Erro comum</strong><div class="content_jSH8"><p>Não separar OpEx de CapEx ou ignorar custos recorrentes pode distorcer a
análise financeira.</p></div></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="card__owf p-4 mt-2"><div class="content_CUpA"><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-é-1">💡 O que é<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-o-que-%C3%A9-1" class="hash-link" aria-label="Enlace directo al 💡 O que é" title="Enlace directo al 💡 O que é" translate="no">​</a></h3><p>Investimentos em <strong>ativos de longo prazo</strong> que geram valor por mais de um ano.</p><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-por-que-acompanhar-1">🎯 Por que acompanhar<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-por-que-acompanhar-1" class="hash-link" aria-label="Enlace directo al 🎯 Por que acompanhar" title="Enlace directo al 🎯 Por que acompanhar" translate="no">​</a></h3><ul>
<li class="">Mede retorno sobre investimentos</li>
<li class="">Facilita o planejamento de caixa</li>
<li class="">Gerencia o ciclo de vida dos ativos</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-quando-rastrear-1">⏱️ Quando rastrear<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#%EF%B8%8F-quando-rastrear-1" class="hash-link" aria-label="Enlace directo al ⏱️ Quando rastrear" title="Enlace directo al ⏱️ Quando rastrear" translate="no">​</a></h3><ul>
<li class="">Expansão e crescimento</li>
<li class="">Aquisição de ativos</li>
<li class="">Atualizações e melhorias</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-impacto-financeiro-1">💹 Impacto financeiro<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-impacto-financeiro-1" class="hash-link" aria-label="Enlace directo al 💹 Impacto financeiro" title="Enlace directo al 💹 Impacto financeiro" translate="no">​</a></h3><ul>
<li class="">Cria ativos no <strong>balanço patrimonial</strong></li>
<li class="">Depreciado ao longo do tempo</li>
<li class="">Aumenta o fluxo de caixa no início</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exemplos-1">📦 Exemplos<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-exemplos-1" class="hash-link" aria-label="Enlace directo al 📦 Exemplos" title="Enlace directo al 📦 Exemplos" translate="no">​</a></h3><ul>
<li class="">Equipamentos e maquinário</li>
<li class="">Infraestrutura e software corporativo</li>
<li class="">Desenvolvimento de produtos</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-boas-práticas-1">✅ Boas práticas<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-boas-pr%C3%A1ticas-1" class="hash-link" aria-label="Enlace directo al ✅ Boas práticas" title="Enlace directo al ✅ Boas práticas" translate="no">​</a></h3><ul>
<li class="">Estabelecer limites e thresholds</li>
<li class="">Planejar ciclos de reposição</li>
<li class="">Integrar CapEx ao plano estratégico</li>
</ul><div class="alert_DgrF info_ED0Q"><strong class="title_dbqf">Erro comum</strong><div class="content_jSH8"><p>Misturar CapEx com OpEx pode afetar a apuração correta do ROI e da
depreciação.</p></div></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="card__owf p-4 mt-2"><div class="content_CUpA"><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-é-2">💡 O que é<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-o-que-%C3%A9-2" class="hash-link" aria-label="Enlace directo al 💡 O que é" title="Enlace directo al 💡 O que é" translate="no">​</a></h3><p>Custos <strong>diretamente ligados à geração de receita</strong> e entrega de produtos ou serviços.</p><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-por-que-acompanhar-2">🎯 Por que acompanhar<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-por-que-acompanhar-2" class="hash-link" aria-label="Enlace directo al 🎯 Por que acompanhar" title="Enlace directo al 🎯 Por que acompanhar" translate="no">​</a></h3><ul>
<li class="">Calcula margem de lucro real</li>
<li class="">Determina precificação e lucratividade</li>
<li class="">Escala custos com o crescimento</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-quando-rastrear-2">⏱️ Quando rastrear<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#%EF%B8%8F-quando-rastrear-2" class="hash-link" aria-label="Enlace directo al ⏱️ Quando rastrear" title="Enlace directo al ⏱️ Quando rastrear" translate="no">​</a></h3><ul>
<li class="">Análises de margem bruta</li>
<li class="">Precificação</li>
<li class="">Unit economics</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-impacto-financeiro-2">💹 Impacto financeiro<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-impacto-financeiro-2" class="hash-link" aria-label="Enlace directo al 💹 Impacto financeiro" title="Enlace directo al 💹 Impacto financeiro" translate="no">​</a></h3><ul>
<li class="">Impacta a <strong>receita direta</strong></li>
<li class="">Afeta a margem bruta</li>
<li class="">Varia conforme o volume de vendas</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exemplos-2">📦 Exemplos<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-exemplos-2" class="hash-link" aria-label="Enlace directo al 📦 Exemplos" title="Enlace directo al 📦 Exemplos" translate="no">​</a></h3><ul>
<li class="">Custo de mercadorias vendidas (COGS)</li>
<li class="">Materiais diretos</li>
<li class="">Distribuição e logística</li>
<li class="">Comissões de vendas</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-boas-práticas-2">✅ Boas práticas<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-boas-pr%C3%A1ticas-2" class="hash-link" aria-label="Enlace directo al ✅ Boas práticas" title="Enlace directo al ✅ Boas práticas" translate="no">​</a></h3><ul>
<li class="">Acompanhar por produto/serviço</li>
<li class="">Calcular CAC e LTV</li>
<li class="">Otimizar custos de aquisição</li>
</ul><div class="alert_DgrF info_ED0Q"><strong class="title_dbqf">Erro comum</strong><div class="content_jSH8"><p>Custos ocultos em contratos e logística podem distorcer a margem real.</p></div></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="card__owf p-4 mt-2"><div class="content_CUpA"><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-é-3">💡 O que é<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-o-que-%C3%A9-3" class="hash-link" aria-label="Enlace directo al 💡 O que é" title="Enlace directo al 💡 O que é" translate="no">​</a></h3><p>Custos relacionados ao <strong>financiamento e à estrutura de capital</strong> da empresa.</p><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-por-que-acompanhar-3">🎯 Por que acompanhar<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-por-que-acompanhar-3" class="hash-link" aria-label="Enlace directo al 🎯 Por que acompanhar" title="Enlace directo al 🎯 Por que acompanhar" translate="no">​</a></h3><ul>
<li class="">Otimiza estrutura de capital</li>
<li class="">Reduz custo de financiamento</li>
<li class="">Melhora indicadores de liquidez e rentabilidade</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-quando-rastrear-3">⏱️ Quando rastrear<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#%EF%B8%8F-quando-rastrear-3" class="hash-link" aria-label="Enlace directo al ⏱️ Quando rastrear" title="Enlace directo al ⏱️ Quando rastrear" translate="no">​</a></h3><ul>
<li class="">Gestão de dívidas</li>
<li class="">Planejamento de capital</li>
<li class="">Projeções de fluxo de caixa</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-impacto-financeiro-3">💹 Impacto financeiro<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-impacto-financeiro-3" class="hash-link" aria-label="Enlace directo al 💹 Impacto financeiro" title="Enlace directo al 💹 Impacto financeiro" translate="no">​</a></h3><ul>
<li class="">Reduz o lucro líquido</li>
<li class="">Afeta a relação dívida/patrimônio</li>
<li class="">Dedutível de impostos</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-exemplos-3">📦 Exemplos<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-exemplos-3" class="hash-link" aria-label="Enlace directo al 📦 Exemplos" title="Enlace directo al 📦 Exemplos" translate="no">​</a></h3><ul>
<li class="">Juros de empréstimos</li>
<li class="">Custos de leasing</li>
<li class="">Taxas bancárias</li>
<li class="">Variações cambiais</li>
</ul><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-boas-práticas-3">✅ Boas práticas<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-boas-pr%C3%A1ticas-3" class="hash-link" aria-label="Enlace directo al ✅ Boas práticas" title="Enlace directo al ✅ Boas práticas" translate="no">​</a></h3><ul>
<li class="">Comparar opções de financiamento</li>
<li class="">Planejar reestruturações de dívida</li>
<li class="">Monitorar custo médio ponderado de capital (WACC)</li>
</ul><div class="alert_DgrF info_ED0Q"><strong class="title_dbqf">Erro comum</strong><div class="content_jSH8"><p>Endividamento excessivo e falta de hedge cambial aumentam riscos financeiros.</p></div></div></div></div></div></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-comparativo-geral">📊 Comparativo Geral<a href="https://techlab.alugafacil.org/es/blog/opex-vs-capex-vs-revex-vs-finex#-comparativo-geral" class="hash-link" aria-label="Enlace directo al 📊 Comparativo Geral" title="Enlace directo al 📊 Comparativo Geral" translate="no">​</a></h2>
<table><thead><tr><th>Tipo</th><th>Horizonte</th><th>Impacto Principal</th><th>Exemplos</th></tr></thead><tbody><tr><td>⚙️ <strong>OpEx</strong></td><td>Curto prazo</td><td>Operações</td><td>Salários, marketing</td></tr><tr><td>🏗️ <strong>CapEx</strong></td><td>Longo prazo</td><td>Ativos</td><td>Equipamentos, software</td></tr><tr><td>🛒 <strong>RevEx</strong></td><td>Médio prazo</td><td>Receita</td><td>Custo de vendas</td></tr><tr><td>💸 <strong>FinEx</strong></td><td>Variável</td><td>Estrutura de capital</td><td>Juros, leasing</td></tr></tbody></table>
<hr>
<div class="alert_DgrF info_ED0Q"><strong class="title_dbqf">Resumo Final</strong><div class="content_jSH8"><p>Gerenciar corretamente cada tipo de despesa permite <strong>otimizar lucros, prever
fluxos de caixa e escalar negócios de forma sustentável</strong>.</p></div></div>
<blockquote>
<p>📘 <em>Baseado no modelo visual de Eric Partaker — adaptado para documentação técnica com MDX interativo.</em></p>
</blockquote>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="FinançAs Corporativas" term="FinançAs Corporativas"/>
        <category label="Contabilidade" term="Contabilidade"/>
        <category label="EstratéGia" term="EstratéGia"/>
        <category label="Custos" term="Custos"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Conhecimentos Técnicos Essenciais e Diferenciais em Inteligência Artificial e Desenvolvimento]]></title>
        <id>https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia</id>
        <link href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia"/>
        <updated>2025-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre conhecimentos técnicos essenciais e diferenciais em inteligência artificial e desenvolvimento.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conhecimentos-técnicos-essenciais-e-diferenciais-em-inteligência-artificial-e-desenvolvimento">🧠 Conhecimentos Técnicos Essenciais e Diferenciais em Inteligência Artificial e Desenvolvimento<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#-conhecimentos-t%C3%A9cnicos-essenciais-e-diferenciais-em-intelig%C3%AAncia-artificial-e-desenvolvimento" class="hash-link" aria-label="Enlace directo al 🧠 Conhecimentos Técnicos Essenciais e Diferenciais em Inteligência Artificial e Desenvolvimento" title="Enlace directo al 🧠 Conhecimentos Técnicos Essenciais e Diferenciais em Inteligência Artificial e Desenvolvimento" translate="no">​</a></h2>
<p>Este artigo tem como objetivo detalhar os principais conhecimentos indispensáveis e diferenciais esperados de um profissional que atua
com <strong>Inteligência Artificial aplicada a sistemas corporativos</strong>, integrando soluções em <strong>C#</strong>, <strong>ReactJS</strong>, <strong>SQL Server</strong> e <strong>infraestruturas modernas de IA</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-o-que-é-indispensável">⚙️ O QUE É INDISPENSÁVEL<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#%EF%B8%8F-o-que-%C3%A9-indispens%C3%A1vel" class="hash-link" aria-label="Enlace directo al ⚙️ O QUE É INDISPENSÁVEL" title="Enlace directo al ⚙️ O QUE É INDISPENSÁVEL" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-domínio-em-c-reactjs-e-sql-server"><strong>1. Domínio em C#, ReactJS e SQL Server</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#1-dom%C3%ADnio-em-c-reactjs-e-sql-server" class="hash-link" aria-label="Enlace directo al 1-domínio-em-c-reactjs-e-sql-server" title="Enlace directo al 1-domínio-em-c-reactjs-e-sql-server" translate="no">​</a></h3>
<p>O domínio dessas três tecnologias é fundamental para o desenvolvimento de soluções completas:</p>
<ul>
<li class=""><strong>C#</strong>: linguagem utilizada em back-end, especialmente em aplicações .NET, com alta performance e robustez.</li>
<li class=""><strong>ReactJS</strong>: framework JavaScript moderno para criação de interfaces dinâmicas e reativas.</li>
<li class=""><strong>SQL Server</strong>: sistema de gerenciamento de banco de dados relacional, utilizado para armazenar, consultar e manipular grandes volumes de dados.</li>
</ul>
<blockquote>
<p>🔍 A combinação dessas tecnologias permite criar sistemas corporativos escaláveis, com integração fluida entre front-end, back-end e base de dados.</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-entender-como-funciona-um-neurônio-artificial"><strong>2. Entender como funciona um neurônio artificial</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#2-entender-como-funciona-um-neur%C3%B4nio-artificial" class="hash-link" aria-label="Enlace directo al 2-entender-como-funciona-um-neurônio-artificial" title="Enlace directo al 2-entender-como-funciona-um-neurônio-artificial" translate="no">​</a></h3>
<p>Compreender a estrutura de um <strong>neurônio artificial</strong> é essencial para interpretar como as redes neurais aprendem padrões a partir de dados.<br>
<!-- -->Isso envolve entender conceitos como:</p>
<ul>
<li class="">Entradas (features),</li>
<li class="">Pesos e bias,</li>
<li class="">Função de ativação,</li>
<li class="">Processo de retropropagação (backpropagation).</li>
</ul>
<blockquote>
<p>💡 Essa base conceitual é o alicerce de qualquer modelo de Machine Learning ou Deep Learning.</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-pré-processamento-de-documentos-para-ia"><strong>3. Pré-processamento de documentos para IA</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#3-pr%C3%A9-processamento-de-documentos-para-ia" class="hash-link" aria-label="Enlace directo al 3-pré-processamento-de-documentos-para-ia" title="Enlace directo al 3-pré-processamento-de-documentos-para-ia" translate="no">​</a></h3>
<p>Antes de alimentar modelos de IA, é necessário realizar o <strong>pré-processamento de dados</strong>, o que pode incluir:</p>
<ul>
<li class="">Normalização de texto,</li>
<li class="">Remoção de ruídos (como HTML, símbolos ou caracteres inválidos),</li>
<li class="">Tokenização e vetorização,</li>
<li class="">Indexação dos dados em bases otimizadas para IA.</li>
</ul>
<blockquote>
<p>📚 Esse processo garante a qualidade e consistência dos dados utilizados na extração de conhecimento.</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-extração-de-embeddings-e-pesquisa-semântica"><strong>4. Extração de embeddings e pesquisa semântica</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#4-extra%C3%A7%C3%A3o-de-embeddings-e-pesquisa-sem%C3%A2ntica" class="hash-link" aria-label="Enlace directo al 4-extração-de-embeddings-e-pesquisa-semântica" title="Enlace directo al 4-extração-de-embeddings-e-pesquisa-semântica" translate="no">​</a></h3>
<p>Os <strong>embeddings</strong> representam textos ou objetos em vetores numéricos de alta dimensão, capturando relações semânticas entre palavras e conceitos.<br>
<!-- -->Esses vetores são usados para:</p>
<ul>
<li class="">Pesquisas semânticas (buscas inteligentes baseadas em significado),</li>
<li class="">Sistemas de recomendação,</li>
<li class="">Agrupamento e similaridade de documentos.</li>
</ul>
<blockquote>
<p>🔎 Entender embeddings é essencial para construir soluções de busca contextualizadas e precisas.</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-conhecimento-sobre-guard-rails"><strong>5. Conhecimento sobre Guard Rails</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#5-conhecimento-sobre-guard-rails" class="hash-link" aria-label="Enlace directo al 5-conhecimento-sobre-guard-rails" title="Enlace directo al 5-conhecimento-sobre-guard-rails" translate="no">​</a></h3>
<p><strong>Guard Rails</strong> são mecanismos de segurança e controle aplicados em sistemas de IA generativa.<br>
<!-- -->Eles definem limites para evitar comportamentos indesejados, como:</p>
<ul>
<li class="">Geração de respostas incorretas, ofensivas ou confidenciais;</li>
<li class="">Quebra de políticas de privacidade e conformidade (ex: LGPD).</li>
</ul>
<blockquote>
<p>🔐 Implementar Guard Rails garante a ética e segurança no uso de modelos de linguagem (LLMs).</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-formação-e-especialização"><strong>6. Formação e Especialização</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#6-forma%C3%A7%C3%A3o-e-especializa%C3%A7%C3%A3o" class="hash-link" aria-label="Enlace directo al 6-formação-e-especialização" title="Enlace directo al 6-formação-e-especialização" translate="no">​</a></h3>
<ul>
<li class=""><strong>Superior completo em Tecnologia</strong>: assegura a base teórica em computação, algoritmos e estruturas de dados.</li>
<li class=""><strong>Especialização em Inteligência Artificial</strong>: aprofunda o domínio de técnicas de aprendizado de máquina, redes neurais, NLP e visão computacional.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-é-um-diferencial">🚀 O QUE É UM DIFERENCIAL<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#-o-que-%C3%A9-um-diferencial" class="hash-link" aria-label="Enlace directo al 🚀 O QUE É UM DIFERENCIAL" title="Enlace directo al 🚀 O QUE É UM DIFERENCIAL" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-algoritmos-clássicos-de-nlp"><strong>1. Algoritmos clássicos de NLP</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#1-algoritmos-cl%C3%A1ssicos-de-nlp" class="hash-link" aria-label="Enlace directo al 1-algoritmos-clássicos-de-nlp" title="Enlace directo al 1-algoritmos-clássicos-de-nlp" translate="no">​</a></h3>
<p>Domínio de técnicas como:</p>
<ul>
<li class=""><strong>Remoção de stop words</strong> (palavras irrelevantes),</li>
<li class=""><strong>Lematização</strong> (redução à forma base),</li>
<li class=""><strong>Stemming</strong> (redução por sufixo),
permite tratar textos de forma estruturada e otimizada para análise semântica.</li>
</ul>
<blockquote>
<p>🧩 Esses algoritmos são a base do processamento de linguagem natural (NLP).</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-algoritmos-clássicos-de-machine-learning"><strong>2. Algoritmos clássicos de Machine Learning</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#2-algoritmos-cl%C3%A1ssicos-de-machine-learning" class="hash-link" aria-label="Enlace directo al 2-algoritmos-clássicos-de-machine-learning" title="Enlace directo al 2-algoritmos-clássicos-de-machine-learning" translate="no">​</a></h3>
<p>Conhecimento em algoritmos como:</p>
<ul>
<li class=""><strong>Classificadores binários</strong>,</li>
<li class=""><strong>Naive Bayes</strong>,</li>
<li class=""><strong>KNN (K-Nearest Neighbors)</strong>,<br>
<!-- -->permite criar modelos interpretáveis e eficientes para tarefas de classificação, previsão e análise preditiva.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-integração-entre-ia-llms-e-apis"><strong>3. Integração entre IA (LLMs) e APIs</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#3-integra%C3%A7%C3%A3o-entre-ia-llms-e-apis" class="hash-link" aria-label="Enlace directo al 3-integração-entre-ia-llms-e-apis" title="Enlace directo al 3-integração-entre-ia-llms-e-apis" translate="no">​</a></h3>
<p>Capacidade de <strong>integrar modelos de linguagem (LLMs)</strong> a sistemas corporativos, expondo funcionalidades por meio de <strong>APIs</strong> ou <strong>Tools</strong>.<br>
<!-- -->Essa competência possibilita automatizar fluxos de trabalho e expandir o alcance das aplicações de IA.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-configuração-do-chromadb-em-linux"><strong>4. Configuração do ChromaDB em Linux</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#4-configura%C3%A7%C3%A3o-do-chromadb-em-linux" class="hash-link" aria-label="Enlace directo al 4-configuração-do-chromadb-em-linux" title="Enlace directo al 4-configuração-do-chromadb-em-linux" translate="no">​</a></h3>
<p>O <strong>ChromaDB</strong> é um banco de dados vetorial utilizado para armazenar embeddings de IA.<br>
<!-- -->Saber configurá-lo em <strong>ambientes Linux</strong> é essencial para:</p>
<ul>
<li class="">Indexação de vetores,</li>
<li class="">Consultas semânticas em tempo real,</li>
<li class="">Escalabilidade de soluções de IA generativa.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-implantação-de-llms-com-ollama"><strong>5. Implantação de LLMs com Ollama</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#5-implanta%C3%A7%C3%A3o-de-llms-com-ollama" class="hash-link" aria-label="Enlace directo al 5-implantação-de-llms-com-ollama" title="Enlace directo al 5-implantação-de-llms-com-ollama" translate="no">​</a></h3>
<p>O <strong>Ollama</strong> é uma ferramenta para instalação e execução local de modelos de linguagem (LLMs) em infraestrutura dedicada.<br>
<!-- -->Dominar sua configuração permite:</p>
<ul>
<li class="">Implementar modelos privados de IA,</li>
<li class="">Evitar dependência de APIs externas,</li>
<li class="">Garantir conformidade e segurança de dados sensíveis.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-especialização-desejável"><strong>6. Especialização Desejável</strong><a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#6-especializa%C3%A7%C3%A3o-desej%C3%A1vel" class="hash-link" aria-label="Enlace directo al 6-especialização-desejável" title="Enlace directo al 6-especialização-desejável" translate="no">​</a></h3>
<p>Ter <strong>especialização adicional em IA aplicada, NLP ou engenharia de dados</strong> representa um diferencial competitivo, reforçando a capacidade de entregar soluções inovadoras e éticas.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusão">🧩 Conclusão<a href="https://techlab.alugafacil.org/es/blog/discoveries/Tecnologia/conhecimentos-tecnicos-ia#-conclus%C3%A3o" class="hash-link" aria-label="Enlace directo al 🧩 Conclusão" title="Enlace directo al 🧩 Conclusão" translate="no">​</a></h2>
<p>Profissionais que dominam essas competências unem <strong>base sólida em desenvolvimento de software</strong> com <strong>entendimento profundo de IA aplicada</strong>, tornando-se capazes de:</p>
<ul>
<li class="">Criar sistemas inteligentes,</li>
<li class="">Automatizar processos corporativos,</li>
<li class="">Garantir segurança e conformidade,</li>
<li class="">E integrar modelos de IA a produtos reais com eficiência e escalabilidade.</li>
</ul>
<blockquote>
<p>🌐 Em um cenário cada vez mais orientado à IA, o domínio dessas habilidades define o novo perfil de desenvolvedor completo e estratégico.</p>
</blockquote>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Conhecimentos" term="Conhecimentos"/>
        <category label="Tcnicos" term="Tcnicos"/>
        <category label="Essenciais" term="Essenciais"/>
        <category label="Diferenciais" term="Diferenciais"/>
        <category label="Inteligncia" term="Inteligncia"/>
        <category label="Artificial" term="Artificial"/>
        <category label="Desenvolvimento" term="Desenvolvimento"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Descobertas Tecnológicas e Aprendizados – 14 de Outubro de 2025]]></title>
        <id>https://techlab.alugafacil.org/es/blog/discoveries/2025-10-14-OpenAI-API</id>
        <link href="https://techlab.alugafacil.org/es/blog/discoveries/2025-10-14-OpenAI-API"/>
        <updated>2025-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Artigo sobre descobertas tecnológicas e aprendizados – 14 de outubro de 2025.]]></summary>
        <content type="html"><![CDATA[<p>Hoje realizei uma série de experimentos e testes em soluções de tradução automática e infraestrutura de modelos de linguagem. As principais descobertas incluem:
Estas experiências reforçam a importância de alinhar <strong>configuração, automação e design de conteúdo</strong> antes de escalar soluções de IA no ambiente de produção.</p>
<ol>
<li class="">
<p><strong>Integração com modelos locais e remotos:</strong> Testei tanto o LM Studio local quanto a API da OpenAI,
constatando que o LM Studio é ótimo para desenvolvimento offline e prototipagem rápida, enquanto a API cloud oferece maior robustez e suporte a modelos de grande escala.</p>
</li>
<li class="">
<p><strong>Limite de tokens e chunking:</strong> Implementar chunking dinâmico com base no limite de tokens do modelo é crucial para evitar erros de tradução e otimizar custos de processamento.</p>
</li>
<li class="">
<p><strong>Configuração de i18n em Docusaurus:</strong> Ajustes no front matter e no <code>routeBasePath</code> são essenciais para evitar duplicação de rotas em múltiplos idiomas, especialmente no blog.</p>
</li>
<li class="">
<p><strong>Boas práticas para pipelines de tradução:</strong> Manter slugs consistentes, nomes de arquivos e path mapping correto garante URLs previsíveis e facilita a manutenção de conteúdos traduzidos.</p>
</li>
</ol>
<p>Proximo passo sobre esse assunto: <a href="https://github.com/vllm-project/vllm" target="_blank" rel="noopener noreferrer" class="">vLLM</a> + <a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener noreferrer" class="">FastAPI</a> é uma boa escolha no futuro.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="esboço-de-uma-solução-rag">Esboço de uma solução RAG<a href="https://techlab.alugafacil.org/es/blog/discoveries/2025-10-14-OpenAI-API#esbo%C3%A7o-de-uma-solu%C3%A7%C3%A3o-rag" class="hash-link" aria-label="Enlace directo al Esboço de uma solução RAG" title="Enlace directo al Esboço de uma solução RAG" translate="no">​</a></h3>
<p>A implementação de pipelines RAG escaláveis e resilientes (ingest, embeddings, indexação, retrieval, reranking, prompting e geração.
Projetos RAG: embeddings, vector DB (FAISS/Annoy/HNSW/Chroma/Weaviate/RedisVector), chunking e prompt engineering será tentencia nos proximos anos.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rag-solution/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── docker-compose.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── services/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── api_gateway/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ ├── main.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ ├── requirements.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ └── Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── retriever/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ ├── retriever.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ ├── requirements.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ └── Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── rag_worker/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ ├── worker.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ ├── requirements.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ │ └── Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ └── message_bus/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ └── redis.conf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── .env.example</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Alfredo Fernandez</name>
            <uri>https://techlab.alugafacil.org</uri>
        </author>
        <category label="Descobertas" term="Descobertas"/>
        <category label="Tecnolgicas" term="Tecnolgicas"/>
        <category label="Aprendizados" term="Aprendizados"/>
        <category label="Outubro" term="Outubro"/>
        <category label="2025" term="2025"/>
    </entry>
</feed>