DEV Community

Cover image for Adicionando Headers no Nginx com Ansible
Leonan Viana
Leonan Viana

Posted on

Adicionando Headers no Nginx com Ansible

Fala comunidade !!!

A ideia desse post é passar uma forma de automatizar o incremento de Headers dentro do arquivo de configuração do Nginx.

GitHub Repo ⭐🚀

Recentemente passei por um Projeto no qual precisava adicionar Headers no Nginx para que a Aplicação Web não quebrasse em certas páginas.

Exemplo de Headers:

- Strict-Transport-Security
- Content-Security-Policy
- X-XSS-Protection
- X-Frame-Option
- X-Content-Type-Options
- Referrer-Policy
- Permissions-Policy

Devido a quantidade de Hosts e também incrementos, resolvi criar uma automação com Ansible.

Etapa 1:
Criaremos um arquivo TXT para adicionar os headers e os cabeçalhos inseridos necessários para nossa Aplicação, um exemplo abaixo:


add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload';
add_header Content-Security-Policy "connect-src 'self' www.google-analytics.com adservice.google.com analytics.google.com translate.googleapis.com www.google.co.ao www.google.co.in www.google.com.ar ; font-src 'self' data: fonts.gstatic.com; img-src 'self' data: static.zdassets.com unsafe c.bing.com www.google-analytics.com www.googletagmanager.com www.facebook.com lh4.googleusercontent.com www.securityscore.com.br a.slack-edge.com lh5.googleusercontent.com www.google.com www.google.com.br www.google.ca adservice.google.com lh4.googleusercontent.com www.google-analytics.com www.google.co.ao www.google.co.in www.google.co.mz www.google.com.ar www.google.pt www.googletagmanager.com www.securityscore.com.br a.slack-edge.com analytics.google.com blob: i.ytimg.com lh5.googleusercontent.com stats.g.doubleclick.net unsafe www.google.com.au www.google.com.pe www.google.st; script-src-attr 'unsafe-inline'; script-src-elem 'self' 'unsafe-inline' cdn.mxpnl.com static.zdassets.com www.google-analytics.com www.googletagmanager.com blob: ; script-src 'unsafe-eval' wasm-eval; style-src-attr 'unsafe-inline'; style-src-elem 'self' 'unsafe-inline' fonts.googleapis.com; style-src 'self' fonts.googleapis.com 'unsafe-inline'; form-action www.facebook.com; child-src www.youtube.com; default-src 'self' 'unsafe-inline' adservice.google.com analytics.google.com connect.facebook.net data: fonts.googleapis.com fonts.gstatic.com googleads.g.doubleclick.net stats.g.doubleclick.net www.facebook.com www.google.com.br www.googletagmanager.com";
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy "strict-origin";
add_header Permissions-Policy "geolocation=(self),midi=(self),sync-xhr=(self),microphone=(self),camera=(self),magnetometer=(self),gyroscope=(self),fullscreen=(self),payment=(self)";


Enter fullscreen mode Exit fullscreen mode

Etapa 2:
Criando a Playbook e os Jobs de execução.

Nossa Playbook é composta por alguns Jobs:

- Backup do arquivo nginx.conf;

- Remoção das linhas com a diretiva add_header para entradas sem duplicidade;

- Remoção das linhas com a diretiva add_header para linhas comentadas;

- Remoção de linhas em brancos após remoção das linhas do add_header para manter o arquivo da formatação correta;

Incremento dos Headers a partir do arquivo .txt;

- Restart nginx para atualizar o servico com as alterações realizadas;

- name: Adicionar Headers no Nginx
  hosts: localhost
  become: yes
  become_method: sudo

  vars:
    # ALTERAR PATHS CONFORME SUA NECESSIDADE
    PATH_ADD_HEADERS_TXT: /Users/leonanviana/Repos/LeonanViana/add_headers_nginx/playbooks/headers_nginx.txt # Alterar para o seu diretorio. 
    PATH_NGINX_CONF: /opt/homebrew/etc/nginx/nginx.conf # Alterar para o seu diretorio. 

  tasks:

    - name: Fazer backup do arquivo nginx default # Primeira opcao de BKP
      fetch:
        src: /opt/homebrew/etc/nginx/nginx.conf 
        dest: /var/tmp/
        flat: yes
      become: true

    - name: Fazer backup do arquivo nginx default com comando cp # Segunda opcao de BKP
      shell: cp "{{ PATH_NGINX_CONF }}" /var/tmp/default_nginx_bkp

    - name: Remover linhas com add_header
      lineinfile:
        path: "{{ PATH_NGINX_CONF }}" 
        state: absent
        regexp: '^(\s*add_header\s.*;)$'

    - name: Remover linhas com add_header comentadas com "#"
      lineinfile:
        path: "{{ PATH_NGINX_CONF }}" 
        state: absent
        regexp: '^(\s*#add_header\s.*;)$'         

    - name: Remover linhas em branco
      replace:
        path: "{{ PATH_NGINX_CONF }}" 
        regexp: '^\s*$'
        replace: ''      

    - name: Add Headers Nginx
      shell: awk '/gzip_vary on;/ {print; system("cat \"{{ PATH_ADD_HEADERS_TXT }}\""); next} 1' "{{ PATH_NGINX_CONF }}" > tmpfile && mv tmpfile "{{ PATH_NGINX_CONF }}"

    - name: Restart Nginx
      service:
        name: nginx
        state: restarted          

Enter fullscreen mode Exit fullscreen mode

OBS: O JOB que adiciona os Headers no nginx.conf usa AWK para buscar a string "gzip_vary on;" como base (Podendo ser substituída por outro parametro ja existente) no arquivo de configuração do Nginx. Se encontrada, imprime a linha atual e acrescenta o conteúdo de um arquivo de cabeçalhos Nginx definido pela variável PATH_ADD_HEADERS_TXT. Em seguida, redireciona a saída para um arquivo temporário e, se bem-sucedido, substitui o arquivo de configuração original do Nginx pelo temporário.

HANDS_ON 🚀:
Abaixo uma breve demonstração da execução da Playbook.

  • Arquivo nginx.conf sem nenhuma diretiva de Headers;
    Nginx.conf sem Headers

  • Execução da Playbook para adicionar Headers;
    Run Playbook

  • Visualização do Arquivo nginx.conf e as diretivas de Headers;
    Nginx.conf com Headers

🔚 CONCLUSÃO:
Com isso podemos ajustar nossas diretivas e adicionar headers conforme a necessidade em vários hosts de uma só vez;

Por último criei uma Playbook para a remoção das diretivas de Headers se necessário:
Remove Headers

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

AWS GenAI Live!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️