DevOps Quicktips - Criando um pipeline para verificação de segurança em projetos Golang utilizando gosec no Gitlab.
Tags: go, security, gosec, tutorial
Published: 2020-12-27 05:58:28

 Durante o desenvolvimento do meu projeto pessoal para estudo em Golang(o [F8ReconScope](https://gitlab.com/Figur81/f8reconscope)) eu tinha vontade de validar meu código e verificar coisas envolvendo segurança, da mesma forma que fazíamos no node utilizando o npm audit, então acabei caindo de paraquedas no artigo [Golang Security Checker](https://dev.to/renatosuero/golang-security-checker-3j5p) onde ele demonstra como utilizar o gosec para a verificação de [CVE's](https://cve.mitre.org/) no projeto Golang, a partir disso eu tentei utilizar esta ferramenta em um pipeline do meu projeto gitlab, e como não encontrei artigos sobre como fazer isso no gitlab, fiz este para ajudar caso alguém precise e para fixar o meu conhecimento.
Caso no seu projeto não possua nada envolvendo [CI](https://www.atlassian.com/continuous-delivery/continuous-integration), crie um arquivo chamado [.gitlab-ci.yml](https://docs.gitlab.com/ee/ci/yaml/) que é o arquivo que define como as etapas do CI funcionarão. 
##### .gitlab-ci.yml
```yaml
image: golang:1.14

before_script:
  - wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s latest

stages:
  - quality

security_check:
  stage: quality
  script:
    - ./bin/gosec ./...
```
 Agora que você já viu por completo, vamos entender por partes o que está acontecendo neste arquivo.
```yaml
image: golang:1.14

before_script:
  - wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s latest
```
 Primeiro temos uma parte *before_script* que irá executar comandos no container de execução que determinamos na primeira linha(*image: golang:1.14*), sendo assim optei por deixar no *before_script* o processo de download do gosec utilizando o wget, porém [leia a referência de configuração de pipelines do gitlab](https://docs.gitlab.com/ee/ci/yaml/#global-defaults) e faça o download num lugar que faça mais sentido para o seu contexto, como se trata de um projeto de estudos não me importei em usar em qualquer lugar, porém se eu estivesse fazendo mais sério iria tentar efetuar este download apenas na pipeline *security_check* para ser mais performático, eu também preferi baixar a versão mais nova do gosec, pois na minha cabeça faz sentido que um verificador de falhas de segurança seja sempre o mais atualizado quanto possível.
```yaml
stages:
  - quality

security_check:
  stage: quality
  script:
    - ./bin/gosec ./...
```
 A partir daqui criamos os pipelines propriamente ditos, isto fará com que durante os *stages* possamos executar aquilo que queremos realmente verificar, pois o nosso download irá criar uma pasta bin e dentro dele estará o executável gosec e a partir dai apenas peço para que ele execute em todo o projeto utilizando o ./..., a partir dai em caso de encontrar alguma falha, a sua pipeline irá falhar no gitlab
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3l9dt6czz0m4qk7pqmd6.png)

 E você receberá um log como este:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/2g59bjagtrg1ogx4x2nq.png)

 Neste caso apresentado por exemplo, ele me avisa que estou falhando em [G107 (CWE-88)](https://cwe.mitre.org/data/definitions/88.html) e ao pesquisar um pouquinho encontrei também [este material bem maneiro](https://securego.io/docs/rules/g107.html) que é da mesma galera que criou o gosec.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/b78xke53v09xsue9kzh4.png)

 Após entender o problema e corrigir a falha, o seu pipeline deve dar sucesso:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/q00i2w7nmc1lt1697xex.png)

 E você deve receber um log como este:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/j8uumxvjgaym58uchqyr.png)

 Bem, era isto o que eu queria mostrar. Até o momento era isto que eu queria mostrar, dê uma olhada no [repositório do gosec](https://github.com/securego/gosec) para saber quais as CVE's que eles verificam e contribua com o projeto se possível e caso não seja possível pelo menos deixe uma :star: caso goste do projeto e lembre-se sempre que não existe bala de prata, principalmente em segurança.

 Pessoal, caso tenha algo a acrescentar ou corrigir deste artigo deixe nos comentários, utilizo estes artigos para fixar conhecimento e compartilhar para os próximos, sendo assim qualquer feedback é extremamente bem-vindo grato por você ter lido até aqui \o/ e até a próxima.
![Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--uLCaazgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5991methcmv4ojwolws2.gif)