A análise DAST (Dynamic Application Security Testing) é uma técnica de teste de segurança de software que avalia a segurança de um aplicativo web enquanto ele está sendo executado. O DAST envolve o envio de solicitações de entrada para o aplicativo e o exame das respostas para identificar possíveis vulnerabilidades de segurança, como injeção de SQL (SQLi), cross-site scripting (XSS) e outros tipos de ataques.

O DAST simula ataques reais e, por isso, é considerado um tipo de teste de penetração. Ele é útil para avaliar a segurança de um aplicativo web em tempo real e pode ser integrado em ciclos de desenvolvimento ágil para ajudar a identificar vulnerabilidades precocemente. O DAST pode ser usado em conjunto com outras técnicas de teste de segurança, como SAST (Static Application Security Testing) e IAST (Interactive Application Security Testing), para fornecer uma cobertura mais completa de segurança de software.

 

Algumas das principais vantagens do DAST incluem:

  • Simulação de ataques reais: o DAST simula ataques reais que podem ser realizados por atacantes, ajudando a identificar vulnerabilidades que poderiam ser exploradas.
  • Identificação de vulnerabilidades em tempo real: o DAST avalia a segurança do aplicativo enquanto ele está em execução, permitindo a identificação de vulnerabilidades em tempo real.
  • Facilidade de uso: o DAST é relativamente fácil de usar e não requer habilidades avançadas de programação.
  • Cobertura ampla: o DAST pode avaliar a segurança de um aplicativo web em sua totalidade, incluindo sua interface de usuário, componentes de backend, banco de dados e outros sistemas relacionados.
  • Integração com ferramentas de automação: o DAST pode ser integrado a ferramentas de automação, como uma pipeline CI/CD, assim permitindo que os desenvolvedores avaliem a segurança do aplicativo web durante o ciclo de vida do desenvolvimento.
  • Identificação de vulnerabilidades complementar ao SAST: o DAST é capaz de identificar vulnerabilidades que outras técnicas de teste de segurança, como o SAST, podem perder, como vulnerabilidades que só podem ser identificadas quando o aplicativo está em execução. Assim, o DAST é considerado um scan complementar ao SAST.
  • Redução de riscos: o DAST ajuda a reduzir o risco de violações de segurança, interrupções no negócio e perda de dados, protegendo a empresa e seus clientes.

Algumas ferramentas DAST:

OWASP ZAP
Burp Suite Enterprise
Data Theorem
Fortify
Veracode
Synopsys

Ao Som de: MindFlow – Crossing Enemy’s Line

Nesse post, vou abordar a instalação do GitLab 15.0 em um Ubuntu Server 20.04.4 LTS / Focal Fossa. Também instalarei o gitlab-runner localmente e também em container. Além da instalação, farei o cadastro dos dois Runners.

Inicialmente, vamos instalar algum pacotes necessários:

apt install -y curl openssh-server ca-certificates tzdata perl

Em seguida, vamos adicionar o repositório oficial da versão community do GitLab.

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Agora com o repositório oficial já na lista dos repositórios que o nosso gerenciador de pacotes irá verificar, basta instalar o gitlab usando apt

apt install gitlab-ce -y

Ao concluir a instalação, vamos configurar a URL que servirá de acesso ao Gitlab. No nosso caso, não estamos utilizando nenhuma entrada de DNS ou domínio, portanto vamos apontar o IP do servidor mesmo. Nesse caso, é o IP interno 192.168.0.115. Esse procedimento não é recomendável para produção, que deve ser utilizado inclusive com certificado válido.

Para fazer a configuração, vamos editar o arquivo /etc/gitlab/gitlab.rb. Esse arquivo será lido no momento de configuração do gitlab.

vim /etc/gitlab/gitlab.rb

Agora, vamos procurar a linha que contém “external_url” e vamos colocar nosso ip:

Para iniciar o modo de edição do vim, basta apertar a tecla “i”. Ao concluir, basta apertar “Esc” e depois para sair do vim, basta digitar :wq!

Agora, vamos iniciar a configuração do gitlab usando o binário gitlab-ctl:

gitlab-ctl reconfigure

Ao concluir a configuração, o gitlab informará que a senha inicial do usuário root está em um arquivo chamado initial_root_password. Portanto, vamos exibir esse arquivo para visualizarmos a senha.

cat /etc/gitlab/initial_root_password

A senha será exibida na tela. Vamos copiá-la para o acesso inicial ao gitlab. Esse acesso inicial se dará pelo navegador e com o endereço informado anteriormente. Nesse caso, vou usar o Firefox para acessar o ip 192.168.0.115.

1 – No campo Username or email vamos colocar o usuário root

2 – No campo Password, vamos colocar a senha que copiamos anteriormente.

Depois basta clicar em Sign In.

 

Para modificar a senha do root, clique no lado direito superior e depois em Preferences.

 

No menu esquerdo, clique em Password.

 

1 – Inserir a senha atual em Current Password que foi copiada do arquivo initial_root_password

2 – Inserir uma senha nova em New password / Password confirmation.

Depois basta clicar em Save password para confirmar a senha. Ao clicar, você será redirecionado para a página inicial onde deve entrar novamente com o usuário root e a nova senha.

 

Instalação e Registro dos Runners (Shell e Docker)

Vamos fazer a instalação de depois Runners: um localmente e outro utilizando Docker.

Assim como o Gitlab, vamos fazer a configuração do repositório oficial do Runners.

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash

Agora, vamos instalar o gitlab-runner

apt install gitlab-runner -y

Após a instalação, vamos registrar o primeiro Runner. Para fazer o registro, vamos precisar do token. Esse token pode ser acessado em Admin que fica no Menu da esquerda.

Após o acesso da área Admin, vamos em Runners, ainda do lado esquerdo.

Já em Runners, no lado direito, clique em Register an instance runner e logo em seguida, vamos clicar no segundo símbolo para fazer a cópia do token.

Agora com o Token copiado, vamos voltar ao terminal e registrar o Runner que já foi instalado.

Abaixo o comando que deve ser inserido no terminal para fazer o registro do Runner.

É necessária a substituição das opções url (colocar a URL que está acessando o Gitlab), registration-token (colar o token que foi copiado anteriormente).

gitlab-runner register -n --url http://192.168.0.115 --registration-token se8sztuB1o1ewFbXHVav --executor shell --description "Runner Shell"

Ao acessar novamente os Runners no Gitlab, verá que o Runner foi registrado como Shell e com o descrição Runner Shell.

Em seguida, vamos subir um Runner usando Docker e depois fazer o registro desse Runner que estará rodando em container.

Caso não tenha o Docker instalado, seguem os comandos para a instalação. Não será abordado os detalhes aqui, pois o foco é a instalação e configuração do GitLab.

apt remove -y docker docker-engine docker.io containerd runc
apt update -y
apt install ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update -y
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Primeiramente, vamos executar o container do gitlab-runner:

Executando o Runner em Docker
docker run -dit \
--name runner-docker \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner:latest

Agora com o Runner já sendo executado em container, vamos fazer o registro desse Runner. A ideia de registro é a mesma do Runner que está rodando localmente, porém precisamos fazer isso para o container, por tanto será necessário os ajustes da URL e Token assim como feito no anterior. Não é necessário a geração de um novo token. Pode-se aproveitar o token que foi utilizado para o runner anterior.

docker exec -it runner-docker \
gitlab-runner register -n \
--url http://192.168.0.115 \
--registration-token se8sztuB1o1ewFbXHVav \
--clone-url http://192.168.0.115 \
--executor docker \
--docker-image "docker:latest" \
--docker-privileged

Agora, onde havia apenas um Runner, há dois Runners sendo executados e registrados no Gitlab.

Referências:

https://about.gitlab.com/install/?version=ce
https://docs.gitlab.com/runner/install/
https://docs.docker.com/engine/install/ubuntu/

Ao som de: Ney Matogrosso – Sorte

O Security Enhanced Linux (SELinux) é uma camada adicional de segurança do sistema. Ele não utiliza as regras de firewall (iptables, firewalld…) e também não utiliza o sistema de acesso/permissão “UGOA” (user, group, others, all).
A proposta do SELinux é utilizar Controle de Acesso Obrigatório (Mandatory Access Control, MAC) que é baseado em objeto, restringindo o acesso de um usuário ou iniciador a esse objeto.

O SELinux se baseia em um conjunto de regras de segurança que determinam qual processo pode acessar quais arquivos, diretórios e portas. Esse controle é feito através de um rótulo que cada processo, porta ou arquivo recebe. Esse rótulo, dentro do SELinux é conhecido “context”.
Cada contexto tem uma política de acesso para determinar o que pode ser acessado e o que não pode ser acessado. Porém, o SElinux funciona de forma restritiva, ou seja, caso a regra não seja explícita, o acesso será negado.
Os rótulos do SELinux têm vários contextos: usuário, função, tipo e sensibilidade.

A política direcionada (SELINUXTYPE=targeted que está no arquivo de configuração do SELinux, demonstrada a seguir), que é a política padrão ativada. Ele se baseia no contexto “TIPO”. Eles são facilmente identificados, pois geralmente terminam com _t.

Contexto do arquivo SELinux:
unconfined_u:object_r:user_home_dir_t:s0 /home/bruno/

_u: User
_r: Role
_t: Type
s: Level

Abaixo, alguns contextos de tipo para arquivos e diretórios:

– /home é user_home_dir_t;
– /var/www/html é httpd_sys_content_t;
– /tmp e /var/tmp é tmp_t.

Também há contextos para portas de um servidor web, por exemplo, que é o http_port_t.

Isso tudo impede que serviços que foram comprometidos não tenha acessos a outras áreas do sistemas operacional.
Um bom exemplo é o caso do Apache. Caso comprometido, o usuário e grupo apache têm acesso ao /tmp. Com as regras restritivas do SELinux, o acesso do apache só sera do diretório /var/www/html

Alguns comandos utilizam a opção “-Z” para exibir os contextos do SELinux.

Exemplos:

# ps uaZ
# ls -Z

ENTENDENDO E ALTERANDO OS ESTADOS DO SELINUX

Para fins didáticos, vamos separar o processo do SELinux em algumas partes.
A primeira, mais básica: Ativado e Desativado.
Ativado: Ele inicia junto ao sistema operacional;
Desativado: Ele NÃO inicia junto ao sistema operacional.

Para fazer isso na inicialização, pode passar um parâmetro no Kernel informando seus estados.
Para Desativar, basta passar o parâmetro selinux=0
Para Ativar, basta passar o parâmetro selinux=1
Mais a frente, demonstro como fazer no arquivo de configuração e de forma definitiva.

Quando o SELinux está Ativo, ele tem dois estados de funcionamento: Imposição (enforcing) e Permissivo (permissive)

Imposição: o SELinux está ativo e impõe que as regras de controle de acesso sejam utilizado no Sistema Operacional.
Permissivo: o SELinux está ativo mas apenas registra quais regras de controle de acesso foram violadas sem impedir qualquer tipo de acesso.

A vantagem da utilização do modo Permissivo é o fato de não alterar o acesso ao sistema e poder utilizar para estudos, testes ou correções de problemas.
Quando o SELinux está desativado, nem mesmo o registro dos acessos é feito.

Para fazer uma verificação manual do SELinux e assim saber em qual modo ele está, pode verificar manualmente ou através do seu arquivo de configuração

getenforce = Verifica o estado atual do SELinux.
setenforce = Aplica um novo estado para o SELinux

Para o modo Imposição (Enforcing):
setenforce 1” ou “setenforce Enforcing

Para o modo Permissivo (Permissive):
setenforce 0” ou “setenforce Permissive

ARQUIVO DE CONFIGURAÇÃO DO SELINUX

O arquivo de configuração do SELinux fica em “/etc/selinux/config“. Nele é possível modificar de forma definitiva o comportamento do SELinux ao iniciar o sistema;

# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – No SELinux policy is loaded.
SELINUX=enforcing

# SELINUXTYPE= can take one of these two values:
# targeted – Targeted processes are protected,
# minimum – Modification of targeted policy. Only selected processes
# are protected.
# mls – Multi Level Security protection.
SELINUXTYPE=targeted

Basta utilizar o nome do estado do SELinux no parâmetro de mesmo nome.

SELINUX=enforcing
SELINUX=permissive
SELINUX=disabled

Ao finalizar, basta salvar o arquivo e reiniciar o sistema.
Quando o sistema é reiniciado, os parâmetros do Kernel são lidos. Assim como fizemos manualmente informando o estado Ativado ou Desativado, o arquivo de configuração irá informar se o SELinux está ativado selinux=0 ou 1 e qual o seu estado enforcing=0 ou 1

HERANÇAS DOS CONTEXTOS DO SELINUX

Como dito anteriormente, todos os processos e arquivos são rotulados. Novos arquivos herdam o contexto do diretório pai.
Porém, essa herança pode ser prejudicada de duas formas:

1 – Se um arquivo for criado em um diretório e movido para outro, o contexto será do diretório onde foi criado.

Exemplo:

# echo “Servidor Apache” >> /tmp/index.html
# ls -Z /tmp/index.html
# mv /tmp/index.html /var/www/html
# ls -Z /var/www/html/index.html

Observe que o contexto continuará como do diretório /tmp
unconfined_u:object_r:user_tmp_t:s0 /var/www/html/index.html

2 – A outra forma é copiando o arquivo e mantendo seus atributos (cp -a), pois o contexto é preservado.

# echo “Servidor Apache” >> /tmp/index.html
# ls -Z /tmp/index.html
# cp -a /tmp/index.html /var/www/html
# ls -Z /var/www/html/index.html

ALTERAÇÃO DOS CONTEXTOS DO SELINUX

Para alterar os contextos do SELinux, são necessário conhecer 3 comandos:
– semanage
– restorecon
– chcon

O “semanage” serve para fazer a declaração de qual será o rótulo padrão, porém ele tem que vir acompanhado do argumento fcontext.
O “restorecon” faz com que o contexto padrão seja aplicado aos diretórios e arquivos.
Já o “chcon” faz altera o contexto, porém não fica de forma permanente como o “semanage fcontext“. Ele é ideal para a realização de testes por não ficar permanente e pode ser facilmente removido com a execução do “restorecon

Exemplo:

# mkdir /testeSeLinux
# ls -dZ /testeSeLinux
unconfined_u:object_r:default_t:s0 /testeSeLinux/

# chcon -t ssh_exec_t /testeSeLinux
# ls -dZ /home/bruno/testeSeLinux
unconfined_u:object_r:ssh_exec_t:s0 /testeSeLinux/

# restorecon -v /testeSeLinux
Relabeled /testeSeLinux from unconfined_u:object_r:ssh_exec_t:s0 to unconfined_u:object_r:default_t:s0

# ls -dZ /home/bruno/testeSeLinux
unconfined_u:object_r:default_t:s0 /testeSeLinux/

No exemplo acima:
– Criamos um diretório /testeSeLinux
– Mudamos o contexto, não definitivamente, de default_t para ssh_exec_t
– Restauramos o contexto do diretório /testeSeLinux para o padrão (default_t)

DEFINIÇÃO DAS REGRAS DE CONTEXTO PADRÃO DO SELINUX

Utilizando o “semanage fcontext“, podemos definir um novo contexto padrão para diretórios e arquivos.
O “restorecon” utiliza os contextos definidos pelo “semanage” para restaurar o contexto padrão.

A utilização do “semanage fcontext” pode ser para adicionar, deletar ou listar dos tipos de contexto:

-a (–all): Adiciona um registro
-d (–delete): Apaga um registro
-l (–list): Lista os registros

Para a utilização desses comandos, será necessário verificar se os pacotes policycoreutils e policycoreutils-python-utils estão instaladas em seu Sistema Operacional. Também é necessário o entendimento da seguinte expressão regular: (/.*)? que significa “opcionalmente, corresponder uma / seguida por qualquer número de caracteres” e na prática ele lê o diretório em questão e seus arquivos recursivamente.

A utilização segue a seguinte lógica:

# semanage fcontext -a -t contexto ‘/diretório(/.*)?’

A opção -a é utilizada para adicionar um contexto; A opção -t é o tipo do contexto.
O argumento é o diretório que será aplicado o contexto junto com a expressão regular no final, dentro de aspas simples.

Exemplo:

# mkdir /MeuSite
# echo “Teste do Meu Site” >> /MeuSite/index.html
# ls -Zd /MeuSite
# ls -Z /MeuSite
# semanage fcontext -a -t httpd_sys_content_t ‘/MeuSite(/.*)?’
# restorecon -RFvv /MeuSite
# ls -Zd /MeuSite
#  ls -Z /MeuSite

AJUSTE DO SELINUX COM BOOLEANOS

Os booleanos do SELinux são opções que alteram o comportamento da política do SELinux, regras que podem ser habilitadas ou desabilitadas para fazer ajustes seletivos.
Instale o pacote selinux-policy-doc e com o comando “man -k _selinux” poderá ver todos os manuais disponíveis com todas as regras que utilizam booleanos.

Para fazer esses ajustes, utilizaremos os seguintes comandos:

– getsebool
– setsebool
– semanage boolean (Esse será utilizado apenas para consulta)

O comando “getsebool” lista os booleanos e seus estados. Pode listar todos de uma única vez (-a) ou um específico

# getsebool -a
# getsebool httpd_enable_homedirs

O comando “setsebool” modifica os valores dos booleanos

# setsebool httpd_enable_homedirs on
# semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (on , off) Allow httpd to enable homedirs

Nesse ponto você observará que existe entre parênteses as palavras on e off. No primeiro campo, indica o estado atual do valor daquele booleano e o segundo campo indica se aquele valor será persistente ao reiniciar o sistema. No exemplo acima, a opção httpd_enable_homedirs está ativada no momento, porém se a máquina for reiniciada esse estado voltará para desativado.
Para tornar esse valor persistente, vamos utilizar a opção -P.

# setsebool -P httpd_enable_homedirs on
# semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (on , on) Allow httpd to enable homedirs

Nesse momento, a opção httpd_enable_homedirs está ativada e caso seja necessário reiniciar o host, a opção permanecerá ativa.

Caso queira listar todos os booleanos que estão com o valor diferente do padrão, basta executar:
# semanage boolean -l -C

ENTENDENDO OS PROBLEMAS DO SELINUX

Todas as ações tomadas pelo SELinux são gravadas em log, portanto podemos utilizar essas informações para verificar se há algum serviço que o SELinux está impedindo de ser executado. Como vimos anteriormente, o “restorecon” server para restaurar o contexto padrão de um diretório. Ele pode resolver em muitos casos, porém é sempre importante entender como o SELinux funciona e suas mensagens para assim resolver o problema mais rapidamente.

Você precisa instalar o pacote setroubleshoot-server para que as mensagens do arquivo “/var/log/audit/audit.log” envie um resumo da informação que o SELinux gerar para o arquivo “/var/log/messages“. Caso sua distribuição não tenha o arquivo messages, instale o pacote rsyslog e inicie o serviço.

Exemplo:
Vamos simular um erro para que assim possa ser gerado o alerta no sistema de auditoria do linux e enviado para o arquivo de mensagens.
Você irá precisar instalar o apache para o exemplo a seguir:

# systemctl start httpd
# echo “Meu Site” >> /root/meusite.html
# mv /root/meusite.html /var/www/html
# curl http://localhost/meusite.html

Nesse momento você verá a seguinte mensagem do Apache:

<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML 2.0//EN”>
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don’t have permission to access /meusite.html
on this server.<br />
</p>
</body></html>

Isso gerou um alerta que está nos logs que comentamos anteriormente:

# tail /var/log/audit/audit.log

type=AVC msg=audit(1598297683.712:239): avc: denied { getattr } for pid=5356 comm=”httpd” path=”/var/www/html/meusite.html” dev=”dm-0″ ino=8409719 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0

# tail /var/log/messages

localhost setroubleshoot[1913]: SELinux is preventing httpd from getattr access on the file /var/www/html/meusite.html. For complete SELinux messages run: sealert -l 14fa81a0-f8be-40a1-82da-908440c823c8

Nos dois arquivos, é possível observar a negação do acesso ao arquivo “/var/www/html/meusite.html
No arquivo messages, é possível ver a sugestão da utilização do comando “sealert” para ver informações adicionais

# sealert -l 14fa81a0-f8be-40a1-82da-908440c823c8

O “sealert” trará o mesmo conteúdo, mas de duas formas. Uma mais organizada e outra no modo “raw” que trás o mesmo conteúdo do “audit.log

Utilizando a saída do “sealert“, é possível observar três campos importante para o nosso erro:

Contexto de origem system_u:system_r:httpd_t:s0
Contexto de destino unconfined_u:object_r:admin_home_t:s0
Objetos de destino /var/www/html/meusite.html [ file ]

no Raw messages:

scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 path=”/var/www/html/meusite.html”

O “Contexto de origem” ou “scontext” é o contexto que o selinux espera para o “Objetos de destino” ou “path“. Já o “Contexto de destino” ou “tcontext” mostra a informação que o SELinux encontrou no “Objetos de destino” ou “path“. No nosso caso, era esperado “httpd_t” e foi encontrado “admin_home_t“, pois o arquivo foi criado no “/root” (admin_home_t) e movido para “/var/www/” e como vimos anteriormente, isso gera um erro.

Vamos verificar como está o contexto de “/var/www/html

# ls -Zd /var/www/html
system_u:object_r:httpd_sys_content_t:s0 /var/www/html

Agora vamos restaurar o contexto dos arquivos dentro do diretório “/var/www/html

# restorecon -RFvv /var/www/html/
Relabeled /var/www/html/meusite.html from unconfined_u:object_r:admin_home_t:s0 to system_u:object_r:httpd_sys_content_t:s0

A saída do comando (por causa da opção -vv) mostra que o contexto do arquivo foi alterado de admin_home_t para httpd_sys_content_t. Com isso, o arquivo html deve estar disponível para acesso.

# curl http://localhost/meusite.html
Meu Site

Apesar de uma explicação básica sobre o SELinux, é possível entender sua importância, como trabalhar com ele e ainda tratar alguns erros.
O objetivo é tirar um pouco da ideia que o SELinux é muito complicado e que só serve para desabilitar após a instalação.

Referências:
https://www.redhat.com/pt-br/topics/linux/what-is-selinux
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_selinux/index

Ao som de: Curumin – Passarinho