Security Code_review Instalando SonarQube
Post
Cancel

Instalando SonarQube

SonarQube

Instalando PostgreSql

Importe a chave do repositório

1
2
3
sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

Crie o arquivo de config do repo

1
sudo sh -c "echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release --codename --short)-pgdg main' > /etc/apt/sources.list.d/pgdg.list"

Atualize os repositórios e instale o PostereSQL

1
2
3
sudo apt update

sudo apt -y install postgresql-15

Habilite e inicie o banco de dados

1
2
systemctl enable postgresql
systemctl start postgresql

Configure o PostgreSQL

Entre na cli do banco

1
sudo -u postgres psql

Crie o usuário sonarqube com a senha desejada

1
postgres=# CREATE ROLE sonarqube WITH LOGIN ENCRYPTED PASSWORD 'MySuperSecretPassword';

Crie a base de dados

1
postgres=# CREATE DATABASE sonarqube;

Permita o usuário com acesso total a essa base de dados

1
postgres=# GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonarqube;

Altere ara a base sonarqube

1
postgres=# \c sonarqube

Output:

1
You are now connected to database "sonarqube" as user "postgres".

Atribua os privilégios do usuário ao schema public.

1
postgres=# GRANT ALL PRIVILEGES ON SCHEMA public TO sonarqube;

Saida do cli

1
postgres=# \q

Nginx

Utilizaremos o NGINX como font end da console web

Importe a chave do repositório

1
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]  http://nginx.org/packages/mainline/ubuntu/ `lsb_release --codename --short` nginx" > /etc/apt/sources.list.d/nginx.list

Crie o arquivo de config do repo

1
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Instale o Nginx

1
2
3
apt update
apt install -y nginx
apt install -y nginx-extras # precisa ser em comando separado

Configurando o NGINX

Edite o arquivo /etc/nginx/nginx.conf conforme abaixo:

Lembre de verificar o parâmetro user para manter o mesmo usuário.

1
2
nginx_user=$(cat /etc/nginx/nginx.conf | grep -E '\buser\b' | sed 's/user//g;s/\;//g' | tr -d ' ')
echo "Nginx User: $nginx_user"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log  /var/log/nginx/error.log warn;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server_names_hash_bucket_size  256;

    client_max_body_size 10m;

    log_format log_standard '$remote_addr, $http_x_forwarded_for - $remote_user [$time_local] "$request_method $scheme://$host$request_uri $server_protocol" $status $body_bytes_sent "$http_referer" "$http_user_agent" to: $upstream_addr';

    access_log /var/log/nginx/access.log log_standard;
    error_log /var/log/nginx/error.log;

    sendfile        on;
    #tcp_nopush     on;
    server_tokens off; # removed pound sign
    more_set_headers 'Server: StrataSec';
    
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Crie o arquivo /etc/nginx/conf.d/sonarqube.conf conforme abaixo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
    listen        80;
    server_name   _;

    root /dev/null;
    index index.html index.htm;
    try_files $uri $uri/ $uri/404 =404;

    client_max_body_size 100000M;

    location / {

        proxy_set_header    Host                $host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $remote_addr;
        proxy_set_header    X-Forwarded-Proto   $scheme;

        proxy_ssl_verify       off;

        proxy_buffer_size 8k;
        proxy_buffering on;
        proxy_buffers 8 8k;
        proxy_busy_buffers_size 16k;
        proxy_http_version 1.1;
        proxy_pass http://127.0.0.1:9000;

    }

    error_page 403 /403.txt;
    location /403.txt{
        internal;
        return 403 'Forbidden';
    }

}

Remova o arquivo padrão

1
rm -rf /etc/nginx/conf.d/default.conf

Habilite o serviço do nginx

1
2
systemctl enable nginx
systemctl start nginx

Configs gerais do sistema operacional

Log de erro multipathd

Dependendo da infra você verá constantemente no syslog o erro abaixo

1
2
3
4
Apr 12 19:03:41 webdev multipathd[736]: sda: add missing path
Apr 12 19:03:41 webdev multipathd[736]: sda: failed to get udev uid: Invalid argument
Apr 12 19:03:41 webdev multipathd[736]: sda: failed to get sysfs uid: Invalid argument
Apr 12 19:03:41 webdev multipathd[736]: sda: failed to get sgio uid: No such file or directory

Caso isso esteja ocorrendo edite o arquivo /etc/multipath.conf adicionando as seguintes linhas

1
2
3
4
5
6
defaults {
    user_friendly_names yes
}
blacklist {
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st|sda)[0-9]*"
}

Posteriormente reinicie o serviço

1
/etc/init.d/multipath-tools restart

Locales

Para que o python possa funcionar em outros locales é necessário instalar

1
2
3
4
5
6
7
locale-gen en_US
locale-gen en_US.utf8
locale-gen pt_BR
locale-gen pt_BR.UTF-8
echo 'LANG="en_US.UTF-8"' > /etc/default/locale
echo 'LANGUAGE="en_US:en"' >> /etc/default/locale
echo 'LC_ALL="en_US.UTF-8"' >> /etc/default/locale

Gestão de logs

Um item interessante pata otimizar e gerir os logs é o processo de logrotate, para isso faremos algumas configurações

Edite o arquivo /etc/logrotate.conf e adicione a linha abaixo

1
dateext

Edite os arquivos abaixo mantendo a seguinte configuração para todos eles:

1
2
3
4
5
6
7
rotate 365
daily
missingok
notifempty
delaycompress
compress
dateext

Arquivos a serem ajustados

  • /etc/logrotate.d/rsyslog
  • /etc/logrotate.d/nginx

Sincronização de data/hora

Etapa 1: lista de fusos horários disponíveis

1
timedatectl list-timezones

Etapa 2: definir o fuso horário desejado

1
timedatectl set-timezone America/Sao_Paulo

Configurar o NTP

Sincronize o relógio do sistema com o servidor a.ntp.br manualmente (use este comando apenas uma vez, ou conforme necessário):

1
2
3
service ntp stop
ntpdate a.ntp.br
service ntp start

Sonar

1
apt install openjdk-17-jre openjdk-17-jdk unzip zip curl jq

Verificar versão do java

1
java -version

Output

1
2
3
openjdk version "17.0.16" 2025-07-15
OpenJDK Runtime Environment (build 17.0.16+8-Ubuntu-0ubuntu122.04.1)
OpenJDK 64-Bit Server VM (build 17.0.16+8-Ubuntu-0ubuntu122.04.1, mixed mode, sharing)

Verifique a ultima release do SonarQube em SonarQube releases page. em Nosso caso utilizaremos a sonarqube-25.9.0.112764.zip.

Realize o donwload deste arquivo

1
2
cd /opt/
curl -LO https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-25.9.0.112764.zip

Extraia o arquivo zip

1
unzip sonarqube-25.9.0.112764.zip

Mova o conteúdo descompactado para o diretório final da instalação

1
sudo mv sonarqube-25.9.0.112764/ /opt/sonarqube

Nota: O SonarQube não pode ser executado como root então será necessário criar um usuário para execução. Desta forma criaremos um usuário sem diretório home e sem permissão de login.

1
adduser --system --no-create-home --group --disabled-login --gecos "" sonarqube

Defina as permissões do diretório /opt/sonarqube para o usuário

1
sudo chown -R sonarqube:sonarqube /opt/sonarqube

Configure SonarQube

Edite o arquivo /opt/sonarqube/conf/sonar.properties adicionando as linhas abaixo:

1
2
3
4
5
6
sonar.jdbc.username=sonarqube
sonar.jdbc.password=MySuperSecretPassword
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube
sonar.web.javaAdditionalOpts=-server
sonar.web.host=127.0.0.1
sonar.web.port=9000

Crie o arquivo /etc/sysctl.d/99-sonarqube.conf com o seguinte conteudo:

1
2
vm.max_map_count=524288
fs.file-max=131072

Que definirá as seguintes configurações:

  • vm.max_map_count=524288: Aumenta o número de mapeamentos de memória que o Elasticsearch pode usar, permitindo lidar com grandes volumes de dados.
  • fs.file-max=131072: Aumenta o número máximo de arquivos que o Elasticsearch pode abrir, permitindo que ele seja executado de forma eficiente.

O SonarQube utiliza o Elasticsearch para armazenar índices em um sistema de arquivos com memória mapeada. Ajustar os limites do sistema para mapeamento de memória virtual e manipulação de arquivos garante maior estabilidade e desempenho do SonarQube.

Crie um novo arquivo /etc/security/limits.d/99-sonarqube.conf para configurar os limites de recursos do SonarQube:

1
2
sonarqube   -   nofile   131072
sonarqube   -   nproc    8192

Dentro dessa configuração:

  • nofile=131072: Aumenta o número de descritores de arquivos abertos, permitindo ao SonarQube lidar com grandes cargas de trabalho.
  • nproc=8192: Eleva o limite de processos para evitar falhas sob alta concorrência.

Configurando SonarQube como serviço

Crie um novo arquivo /etc/systemd/system/sonarqube.service com o seguinte conteúdo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking

ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop

User=sonarqube
Group=sonarqube
PermissionsStartOnly=true
Restart=always

StandardOutput=syslog
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Recarrege as configurações do Systemd, habilite e inicie o serviço

1
2
3
systemctl daemon-reload
systemctl enable sonarqube
systemctl start sonarqube

Access SonarQube

Acesse o SonarQube utilizando o IP do seu servidor ou o nome de domínio.

Faça login no SonarQube com as seguintes credenciais quando solicitado:

  • Usuário: admin
  • Senha: admin

Realizando Scan local

Crie um projeto

Analise utilizando uma imagem Docker

A imagem Docker torna-se versátil por poder ser utilizada em qualquer sistema operacional sem a necessidade de instalação de diversas ferramentas.

1
2
3
4
5
6
7
8
docker pull sonarsource/sonar-scanner-cli:latest

docker run \
--rm \
-e SONAR_TOKEN="sqp_558e1dfb9c..." \
-e SONAR_HOST_URL="https://${SONAR_HOST_URL}"  \
-v "${PROJECT_BASEDIR}:/usr/src" \
sonarsource/sonar-scanner-cli -Dsonar.projectKey=projeto-exemplo

Fonte: https://docs.sonarsource.com/sonarqube-server/9.8/setup-and-upgrade/install-the-server

Pré-requisitos: https://docs.sonarsource.com/sonarqube-server/9.8/requirements/prerequisites-and-overview