Project 4: born2beroot - Fourth project for the formation of software engineers at school 42 São Paulo
- This project consists of create my first machine in VirtualBox under specific instructions.
Como este projeto é voltado para administração de sistemas operacionais, decidi colocar tudo o que usei para desenvolvê-lo. Boa leitura :)
- O que é: é um recurso de computação que usa software em vez de um computador físico para executar programas e implantar aplicativos.
- Como funciona: funciona trabalhando por meio da tecnologia de
virtualização
. A virtualização usa software para simular hardware virtual que permite VMs para execução em uma única máquina host. - Qual a utilidade: as VMs podem ser implantadas para acomodar diferentes níveis de necessidades de poder de processamento, para executar software que requer um diferente sistema operacional ou para testar aplicativos em um ambiente seguro em área restrita.
Os dois sistemas são de distribuição Linux
, logo de código aberto, porém possuem algumas
diferenças.
- Debian: é considerado mais de classe pessoal/doméstica, já que é utilizado pela maioria da comunidade nesse ambiente.
- CentOs: é considerado mais de classe empresarial, isso pelo fato de receber atualizações com pouca frequência, o que torna ele um sistema mais estável que o Debian.
Aptitude
e apt-get
são duas das ferramentas populares que tratam do gerenciamento de pacotes. Ambos são capazes de lidar com todos os tipos de atividades em pacotes, incluindo instalação, remoção, pesquisa, etc.
- apt: é um gerenciador de pacotes padrão do
debian
, e é mais antigo. - aptitude: é um gerenciador de pacotes
front-end
para uma ferramenta de empacotamento avançada que adiciona uma interface de usuário à funcionalidade, permitindo ao usuário pesquisar interativamente por um pacote e instalá-lo ou removê-lo.
Ou seja, apt é raíz e o aptitude é mais amigável.
- SELinux: o
Security-Enhanced Linux®
, também conhecido comoSELinux
, é uma arquitetura de segurança para sistemasLinux®
que permite que administradores tenham mais controle sobre quem pode acessar o sistema (Para oCentOS
). - AppArmor: tem o mesmo funcionamento do
SELinux,
só que para oDebian
.
É uma ferramenta de configuração de firewall, que é um dispositivo de segurança de rede que cuida do trafego de informações bloqueando ou permitindo passagens de dados dependendo das regras configuradas.
É um protocolo utilizado pra troca de dados entre cliente e servidor remoto de forma segura e dinâmica. Ele possibilita a comunicação criptografada através da rede permitindo acessar e fazer alterações em outro computador através do terminal.
Ordem | Descrição | Comando |
---|---|---|
1º | Entrar como root | su - |
2º | Instalar o sudo no sistema operacional | apt install sudo |
3º | Dar permissão para o usuário | usermod -aG sudo <seu usuário> |
4º | Criar um novo grupo | groupadd user42 |
4º | Adcionando o usuário ao novo grupo | usermod -aG user42 <seu usuário> |
LVM.mp4
2.Configurando o sistema operacional com o firewall UFW (Uncomplicated Firewall ou Firewall descomplicado) e deixando apenas a porta 4242 aberta:
Primeiro, devemos saber o que é o firewall UFW
. O firewall UFW
é um gerenciador simplificado de firewall que esconde a complexidade das tecnologias de filtragem de pacotes de baixo nível. Se desejamos começar a proteger a rede, mas não temos certeza sobre qual ferramenta usar, o UFW é a escolha certa para nós.
Para fazermos isso, devemos usar os seguintes comandos:
Ordem | Descrição | Comando |
---|---|---|
1º | Instalar o ufw no sistema operacional | sudo apt install ufw |
2º | Ativar o ufw no sistema operacional | ufw enable |
3º | Permitir a execução do ufw no sistema operacional | systemctl enable ufw |
4º | Deixar apenas a porta 4242 aberta | ufw allow 4242 |
5º | Checar as portas abertas (Aparecerá os protocolos IPV4 e IPV6) | ufw status |
Ordem | Descrição | Comando |
---|---|---|
1º | Instalar o SSH no sistema operacional | sudo apt install ssh openssh-server openssh-client |
2º | Ativar o SSH no sistema operacional | systemctl enable sshd |
3º | Editar as confiurações do ssh | nano /etc/ssh/sshd_config |
4º | Alterar a porta de acesso padrão | #Port 22 >> Port 4242 |
5º | Reiniciando o serviço | systemctl restart sshd |
6º | Checando os soquetes | ss -tunlp |
7º | Testando a conexão | ssh <seu usuário>@<seu ip> -p 4242 |
Ordem | Descrição | Flag |
---|---|---|
1º | Encontrar no arquivo de login e alterar as flags | sudo nano /etc/login.defs/ |
2º | Expiração da senha a cada 30 dias | PASS_MAX_DAYS 30 |
3º | Modificação de senha deve ser no mínimo 2 dias | PASS_MIN_DAYS 2 |
4º | Receber um alerta 7 dias antes da expiração | PASS_WARN_AGE 7 |
5º | Entra como root | su - |
6º | Aplicar alteração nos usuarios existentes (fora de login.defs) | chage -M30 -m2 -W7 <usúario> |
7º | Verificando as mudanças | chage -l <usúario> |
Ordem | Descrição | Flag |
---|---|---|
1º | Instalar o pacote libpam-security para facilitar | sudo apt install libpam-pwquality |
2º | Fazer alterações no seguinte arquivo | sudo nano /etc/security/pwquality.conf |
3º | Pelo menos 10 caracteres | minlen = 10 |
4º | Pelo menos um letras maiúscula | ucredit = -1 |
5º | Pelo menos 1 número | dcredit = -1 |
6º | Não deve conter 3 caracteres idênticos consecutivos | maxrepeat = 3 |
7º | Não deve incluir o nome do usuário | usercheck = 1 |
8º | A autenticação usando sudo deve ser limitada a 3 tentativas | retry = 3 |
9º | Para aplicar toda a política acima para o root | retry = 3 |
Ordem | Descrição | Flag |
---|---|---|
1º | Adicionar as configurações no arquivo | sudo nano /etc/sudoers |
2º | Mensagem personalizada de erro ao usar o sudo | Defaults badpass_message="<sua mensagem>" |
3º | Cada ação usando o sudo deve ser salva na pasta: | Defaults logfile="/var/log/sudo/sudo.log" Defaults log_input,log_output |
4º | O modo TTY deve ser ativado por motivos de segurança | Defaults requiretty |
5º | Limitando o maximo de tentativa a 3 | Defaults passwd_tries=3 |
O PDF pede para criarmos um script de monitoramento chamado: monitoring.sh. Esse script deverá exibir as seguintes informações:
- A arquitetura do seu sistema operacional e sua versão do kernel;
- O número de processadores físicos;
- O número de processadores virtuais;
- A RAM disponível atualmente em seu servidor e sua taxa de utilização como uma porcentagem;
- A memória de disco (HD) atual disponível em seu servidor e sua taxa de utilização como uma porcentagem;
- A taxa de utilização atual de seus processadores como uma porcentagem;
- A data e hora da última reinicialização;
- Se o LVM está ativo ou não;
- O número de conexões ativas;
- O número de usuários usando o servidor;
- O endereço IPv4 do seu servidor e seu endereço MAC (Media Access Control);
- O número de comandos executados com o programa sudo.
Veja como o código ficou:
#!bin/bash
ARCHITECTURE=$(uname -a)
CPU=$(cat /proc/cpuinfo | grep 'physical id' | wc -l)
VIRTUALCPU=$(cat /proc/cpuinfo | grep 'processor' | wc -l)
USAGERAM=$(free -m | grep "Mem.:" | awk '{print $3}')
TOTALRAM=$(free -m | grep "Mem.:" | awk '{print $2}')
PERCENTRAM=$(free -m | grep "Mem.:" | awk '{printf("%.2f"), $3/$2*100}')
DSK1=$(df -m --total | grep "total" | awk '{print $3}')
DSK2=$(df -h --total | grep "total" | awk '{printf ("%.0f"), $2}')
DSK3=$(df -h --total | grep "total" | awk '{print $5}')
LCPU=$(top -bn1 | grep '^%Cpu' | awk '{printf("%.1f%%"), $2 + $4}')
LASTBOOT=$(who -b | awk '{print $4 " " $5 }')
USAGELVM=$(lsblk | if grep -q "lvm";then echo "yes"; else echo "no"; fi)
TCP=$(netstat | grep "tcp" | wc -l)
TCPM=$(netstat | if grep -q "tcp";then echo "ESTABLISHED";else echo "NOT ESTABLISHED"; fi)
LOGGEDUSERS=$(users |wc -w)
NET=$(hostname -I | awk '{print $1}')
MAC=$(ip link show | awk '$1 == "link/ether" {print $2}')
SUDO=$(cat /var/log/sudo/sudo.log | grep 'COMMAND' | wc -l)
wall "
#Architecture: $ARCHITECTURE
#CPU physical: $CPU
#vCPU: $VIRTUALCPU
#Memory Usage: $USAGERAM/${TOTALRAM}MB ($PERCENTRAM%)
#Disk Usage: $DSK1/${DSK2}GB ($DSK3)
#CPU load: $LCPU
#Last boot: $LASTBOOT
#LVM use: $USAGELVM
#Connections TCP: $TCP $TCPM
#User log: $LOGGEDUSERS
#Network: IP $NET $MAC
#Sudo: $SUDO cmd
"
Veja detalhadamente como fizemos isso:
#!bin/bash
Esta informação é necessária para sabermos o caminho completo do interpretador desejamos utilizar para execução do comando. No nosso caso, sem ela também é possível executar o script, pois por default, o shell do Unix executa shell scripts.
$(uname -a)
Usamos este comando para exibir as informações da arquitetura do sistema operacional.
- Vermelho: Nome do kernel
- Verde: Nome do host
- Azul Claro: Versão do kernel
- Rosa: Versão do SMP. O SMP significa Symmetric multiprocessing or shared-memory multiprocessing. É a versão do multiprocessamento simétrico do sistema operacional
- Amarelo: Data de criação do sistema operacional
- Azul Escuro: Versão da arquitetura do sistema operacional
(cat /proc/cpuinfo \| grep 'physical id' \| wc -l)
Usamos este comando para exibir a quantidade de CPU's físicas.
cat /proc/cpuinfo
: Acessa o arquivo proc e depois o cpuinfo;grep 'physical id'
: Busca a palavra chave 'physical id' no arquivo cpinfo;wc -l
: Conta a quantidade de vezes que aparece as palavras 'physical id' e retorna essa quantidade.
(cat /proc/cpuinfo \| grep 'processor' \| wc -l)
Usamos este comando para exibir a quantidade de CPU's virtuais.
cat /proc/cpuinfo
: Acessa o arquivo proc e depois o cpuinfo;grep 'processor'
: Busca a palavra chave 'processor' no arquivo cpinfo;wc -l
: Conta a quantidade de vezes que aparece a palavra 'processor' e retorna essa quantidade.
(free -m \| grep "Mem.:" \| awk '{print $3}')
Usamos este comando para armazenara quantidade de memória RAM usada.
free -m
Os valores são exibidos em megabytes. Se quisessemos em gb, era só usar a flag -g;grep "Mem.:'
Busca a palavra chave 'Mem.:' na saída de free -m;awk '{print $3}'
O AWK é um processador de texto. Junto com o print, nós imprimimos o elemento na posição 3, que no caso é a a quantidade de memória usada.
(free -m \| grep "Mem.:" \| awk '{printf("%.2f"), $3/$2*100}')
Usamos este comando para armazenara quantidade de memória RAM total.
free -m
Os valores são exibidos em megabytes. Se quisessemos em gb, era só usar a flag -g;grep "Mem.:'
Busca a palavra chave 'Mem.:' na saída de free -m;awk '{print $2}'
O AWK é um processador de texto. Junto com o print, nós imprimimos o elemento na posição 2, que no caso é a memória total.
(df -m --total \| grep "total" \| awk '{print $3}')
Usamos este comando para exibir a quantidade de disco usado.
df -m --total
: Exibir a quantidade de disco livre (-m: em megabytes |-Bm: em megabytes com o M no final);grep "total"
: Busca a palavra chave 'total';3
: Retorna o terceiro valor;-m
: Output em megabytes;-Bm
: Output em megabytes com símbolo 'M' no final;-h
: Output para leitura humana (Divide por 1024);- DSK1: Mosta a quantidade de disco usado;
- DSK2: Mostra a quantidade de disco total;
- DSK3: Mostra a quantidade de disco usado em porcentagem.
LASTBOOT=$(who -b | awk '{print $4 " " $5 }')
Usamos este comando para mostrar a última vez que a máquina foi bootada.
USAGELVM=$(lsblk | if grep -q "lvm";then echo "yes"; else echo "no"; fi)
Usamos este comando para verificar se o LVM está sendo usado ou não.
- Lista os blocos de partição:
lsblk
; - Se nesse filtro, for encontrado a palavra chave
lvm
, então a saída é "yes", se não é "não"; - Para finalizar o script de condicional:
fi
; -q
silenciar saída. Ou seja, não printar ela.
TCP=$(netstat | grep "tcp" | wc -l)
Usamos este comando para verificar se temos conexão TCP (Transmission Control Protocol).
TCPM=$(netstat | if grep -q "tcp";then echo "ESTABLISHED";else echo "NOT ESTABLISHED"; fi)
- Retorna a quantidade de ips;
- Se esse ip for maior ou igual a 1, então retorna "ESTABLISHED", se não retorna "NOT ESTABLISHED".
LOGGEDUSERS=$(users | wc -w)
Usamos este comando para saber a quantidade de usuários logados
wc -W
: word count;- (1 linha, 2 palavras e 18 caracteres).
NET=$(hostname -I | awk '{print $1}')
Usamos este comando para saber o IP da máquina virtual.
MAC=$(ip link show | awk '$1 == "link/ether" {print $2}')
Usamos este comando para saber os endereços MAC da máquina virtual.
SUDO=$(cat /var/log/sudo/sudo.log | grep 'COMMAND' | wc -l)
Usamos este comando para verificar a quantidade de comandos SUDO usados. Todos esses comando ficam na pasta sudo.log.
wc -W
: word count;
Um resumo geral:
Comando | Descrição |
---|---|
uname -a |
Imprime toda as informações do sistema -s , do kernel -v , e maquina -m |
cat /proc/cpuinfo |
Concatena e imprime informações da CPU do pseudo-diretorio /proc , PROC(5) |
grep "<padrão>" |
Imprime a linha de acordo com o padrão usado |
wc -l |
Imprime no terminal a quantidade de linhas -l , palavras -w ou letras -c |
free -m |
Mostra a quantidade de memoria livre da RAM e SWAP em mega -m, ou gigas -g |
awk '{print $x}' |
AWK(1) é um processador de texto e de padrões. É possivel imprimir um elemento na possição x usando a estrutura '{print $x}' |
df -m |
Mostra um relatório do espaço usado no "disco". Em blocos de mega -Bm ou gigabits -Bg |
awk '{printf ("%.0f"), $2}' |
AWK(1) também permite a utilização de funções para imprimir formatado_ |
top -bn1 |
Mostra os processos do Linux com a opção de mostrar por lotes -b de tempo por -n1 vezes |
who -b |
Expoe o nome do usuário que está logado e a data da ultima inicialização -b |
lsblk |
Lista as partições (blocos) de armazenamento |
Conditions |
É possivel usar condicionais no terminal, seguindo essa estrutura: if 'comando' ; then 'comando' ; fi |
netstat |
pip install netstat Programa que imprime as conexões de rede, como a "tcp" |
users |
Imprime os nomes dos usuários logados no hospedeiro ("Vm") |
hostname -I |
Imprime o nome do hospedeiro, com a opção -i imprime o ip e todos os ips com -I |
ip link show |
Mostra os endereços de Ethernet e MAC (Controle de Acesso de Mídia) |
cat /var/log/sudo/sudo.log |
Imprime todos os comandos sudo registrados no arquivo sudo.log |
Trabalho feito com: Lucas Datilio Carderelli.