Born to be root!


Esse é um projeto da 42 sp com o objetivo de nos introduzir ao mundo da virtualização.

Primeiramente teremos que instalar um linux (Debian/Centos) com a minima quantidade de sofwares, e baixar somente o necessario para o funcionamento de um servidor.

Instalação

  • Para o projeto eu optei pelo Debian por ser mais simples.
  • Podemos fazer o download do nosso sistema em Debian.
  • Irei estar utilizar o Virtual box para instalar nosso sistema.
  • Agora basta Criar uma nova maquina virtual
  • Antes de iniciar nossa nova maquina precisamos mudar a configuração de rede do virtual box para Placa em Modo Bridge.
  • Ao ligar nossa VM podemos selecionar nossa Debian Iso para instalação.
  • É importante que selecionemos a instalação sem a interface grafica.
  • A primeira parte da instalação é bastante simples, basta selecionar a linguagem, localização,hostname (login da intra + 42), senha do root e usuario inicial.
  • Depois das configurações basicas iremos definir como nossas partições serão organizadas.
  • Basta selecionar a opção para setar o lvm encriptado automaticamente.
  • Iremos criar algumas pastas em partições separadas.
  • Agora basta esperar a instalação.
  • Irei deixar apenas os sofwares padrões e o ssh como programas iniciais.

Configurações

  • Durante A instalação desse servidor estarei utilizando o gerenciador de pacote aptitude, por se tratar uma aplicação mais simples
  • apt install aptitude
  • Vim como editor de texto.
  • aptitude install vim
  • App Armor é um software sutilizado para limitar o acesso dos programas a certos recursos.
  • Podemos visualizar o apparmor com aa-status.
  • Podemos verificar o hostname da nossa maquina com hostname
  • O hostname pode ser modificado com hostnamectl set-hostname "new host name"

SSH

  • O SSH é um protolo de rede utilizado para acessar, gerenciar e modificar um servidor remotamente.
  • Esse acesso é realizado atraves da rede, onde dados e informações são transmitidos atraves de uma comunicação criptografada.
  • A ferramenta utilizada sera o Open SSH
  • Podemos verificar sua execução com o systemctl status ssh
  • Por padrão ele estara rodando na porta 22
  • Estarei mudando a porta no arquivo /etc/ssh/sshd_config com o vim
  • Agora computadores na mesma rede podem acessar nossa maquina via SSH
  • A conexão é realizada com ssh user@host -p 4242
    1. ssh é o comando utilizado para realizar nossa conexão.
    2. user sera o usuario que tentaremos acessar na nossa maquina.
    3. host sera o ip da nossa maquina
    4. -p é utilizado para indicar a porta onde conexão sera estabelecida, em nosso caso a porta 4242
  • Para ver o ip da nossa maquina usamos ip -4 address, sera a numeração na frente do inet e atras do brd
  • Logo para se conectar a nossa maquina precisamos do seguinte codigo: ssh flda-sil@10.0.0.110 -p 4242
  • Ao executar o codigo de outra maquina (ou mesmo da local) sera pedido a senha do usuario estamos tentando se conectar.
  • Agora podemos navegar na nossa maquina remotamente.

  • Firewall

    • Estarei utilizando UFW como firewall.
    • Ele é um firewall front-end descomplicado que nos permite o gerenciamento das regras do firewall.
    • Foi criado para facilitar a configuração de um firewall.
    • Para installar e ativar o ufw:
      1. aptitude install ufw
      2. ufw enable (para iniciar as regras)
      3. systemctl enable ufw (para iniciar as regras sempre no boot)
    • Iremos começar negando todas conexões recebidas e permitindo as saidas:
      1. ufw default allow outgoing
      2. ufw default deny incoming
    • Nesse ponto caso tentemos nos conectar via SSH como foi feito anteriormente, a conexão sera negada.
    • Para resolver esse problema podemos permitir a porta na qual o SSH esta rodando (4242)
      1. ufw allow 4242
    • Da mesma forma podemos negar novamente esse porta
      1. ufw deny 4242
    • ufw status podemos verificar nossas regras.

    Password Policy

    • Irei modificar algumas da politiacas de segurança.
    • Para as configurações iniciais estarei modificando o arquivo /etc/login.defs com o vim.
    • Estarei deixando a expiração de uma senha para 30 dias, um warning 7 dias antes e a modificação de uma senha tem que ter o intervalo minimo de 2 dias.
    • Essas configurações serão aplicadas apenas para os novos usuarios
      • Para ver as configurações de expiração de senha para os usuarios ja criados usamos chage -l "username"
      • E para modificar os valores:
      • chage -M "days" "username" (Numero maximo de dias uma senha pode ser usada).
      • chage -m "days" "username" (Numero minimo de dias antes de uma senha ser trocada).
      • chage -W "days" "username" (Manda um warning antes da senha expirar).
    • Para algumas configurações mais avançadas estarei utilizando o pwquality
    • aptitude install libpam-pwquality
    • Agora podemos adicionar regras mais avançadas no arquivo etc/pam.d/common-password
    • Setarei um tamanho minimo de 10 characters, minimo de 1 letra maiuscula e 1 digito, maximo de 3 repetições do mesmo character, alem das configurações padrões do pwquality.

    Sudo

    • O sistema bloqueia certos locais e ações por razões de segurança, o unico que pode acessar essas areas é o root user.
    • Não é uma boa pratica utilizar o sistema sempre logado na conta root, pois podemos executar alguma ação não intencionada que pode dafinificar o sistema.
    • Para resolver essas questões surgiu o sudo que nos permitira acesso temporario ao direitos de administrador mesmo não estando logado na conta root.
    • aptitude install sudo
    • Podemos verificar no arquivo /etc/sudoers que os usuarios que estiverem dentro do grupo sudo podera executar ações de administrador.
    • Para adicionar um usuario para esse grupo basta usar usermod -aG sudo "username".
    • Podemos acompanhar os comandos que os usuarios executaram com o sudo com grep sudo /var/log/auth.log
    • Estarei adicionando algumas configurações sobre o sudo
      1. Configurações podem ser adicionados no arquivo /etc/sudoers
      2. Estarei modificando o numero maximo de tentativa ao errar a senha para executar um comando com sudo.
      3. Tambem colocarei uma mensagem costumizada caso o usuario erre a senha.
    • Como citado anteriormente os logs do sudo estão presentes no /var/log/auth.log, mas esse arquivo tambem possui o logs de varias outras aplicações, logo é uma boa pratica ter um arquivo separado para o sudo.
    • Para realizar tal ação, primeiro precisaremos adicionar a seguinte linha no arquivo /etc/sudoers:
    • Depois precisaremos modificar o arquivo /etc/rsyslog.conf adicionando a seguinte linha:
    • Agora reiniciaremos o serviço rsyslog, sudo systemctl restart rsyslog
    • Agora os logs relacionados ao sudo ficarão armazenados no arquivo /var/log/sudo.log
    • Por razões de segurança tambem esterei fazendo com que o sudo so possa ser usado com uma tty real, ou seja não pode ser executado por um cron por exemplo.
    • Defaults requiretty no /etc/sudoers

    Cron

    • Podemo utilizar o cron quando precisamos que alguma tarefa seja executada a cada periodo de tempo.
    • O serviço cron utiliza os seguintes arquivos : /var/spool/cron/*, /etc/cron.d/*, /etc/anacrontab
    • Podemos criar um novo cron utilizando crontab -e

    Wordpress

    • Agora é gora de montar nosso primeiro serviço do nosso servidor.
    • Primeiro vamos installar o MariaDB como nosso banco de dados.
    • aptitude install mariadb-server mariadb-client
    • Podemos chegar se foi instalado com sucesso com o comando mysql
    • Agora precisaremos instalar o lighttpd
    • aptitude install lighttpd
    • Podemos checar se esta rodando com systemctl status lighttpd
    • Podemos verifica suas configurações em /etc/lighttpd/lighttpd.conf e /etc/lighttpd/conf-available/
    • Agora caso coloquemos o ip da nossa maquina no browser uma pagina inicial sera mostrada
    • O arquivo inicial do lighttpd esta localizado em /var/ww/html/
    • Agora iremos instalar o php para trabalhar junto com lighttpd
    • Para installar o php assim como as extenções necessarias utilizamos aptitude install php php-cli php-common php-fpm php-mysql
    • Agora precisamos modificar o php.ini para habilitar o suporte do php pro lighttpd
    • vim /etc/php/"version"/fpm/php.ini
    • Primeiro iremos descomentar o comando cgi.fix_pathinfo=1
    • Por padrão o php-fpm escuta no socket /var/run/php7-fpm.sock, para mudar essa configuração padrão iremos alterar o arquivo /etc/php/"version"/fpm/pool.d/www.conf
    • Na linha listen = /run/php/php7.0-fpm.sock iremos substituir por listen = 127.0.0.1:9000
    • Agora iremos habilitar o FastCgi modificando o arquivo /etc/lighttpd/conf-available/15-fastcgi-php.conf
    • nas linhas:
      "bin-path" => "/usr/bin/php-cgi
      "socket" => "/var/run/lighttpd/php.socket"
    • Colocaremos:
      "host" => "127.0.0.1",
      "port" => "9000",
    • Agora basta habilitar o FastCgi e FastCgi-php com:
    • lighty-enable-mod fastcgi
    • lighty-enable-mod fastcgi-php
    • Agora iremos reiniciar os serviços:
    • systemctl restart php7.0-fpm
    • systemctl restart lighttpd
    • Agora podemos testar subindo nosso primeiro site: (SEGUINTES PASSOS SÃO IRRELEVANTES PARA O PROJETO, JA QUE O VIRTUAL HOST SO SERIA ACESSIVEL DENTRO DA MAQUINA)
      • mkdir /var/www/html/testsite
      • Agora criamos uma configuração para o nosso virtual host: vim /etc/lighttpd/conf-available/test.conf
      • Dentro dele colamos:
      • $HTTP["host"] =="test.example.com" {
      • server.document-root = "/var/www/html/testsite"
      • index-file.names = ( "index.php" )
      • }
      • Agora ciramos um index.php dentro da pasta que criamos, essa sera nossa pagina inicial
      • Dentro dela fiz um Hello World para testar
      • Agora podemos habilitar nosso virtual host com:
      • ln -s /etc/lighttpd/conf-available/test.conf /etc/lighttpd/conf-enabled/
      • Agora setamos as permisões apropriadas para a pasta do nosso site:
      • chown -R www-data:www-data /var/www/html/testsite
      • Finalmente reiniciamos nosso serviço: systemctl restart lighttpd
      • Agora caso tentemos acessar o host que configuramos (test.example.com) iremos ver o conteudo do nosso index.php
    • Agora podemos criar nosso database para o nosso wordpress
      • mysql
      • CREATE DATABASE wordpress;
      • CREATE USER 'flda-sil'@'localhost' IDENTIFIED BY '123'
      • GRANT ALL ON wordpress.* TO 'flda-sil'@'localhost';
      • FLUSH PRIVILEGES
    • Com o database criado podemos ir na pasta /var/www/html/ para setar nosso wordpress
      • Primeiro apagaremos todos os arquivos da pasta: rm -fr /var/www/html/
      • Agora dentro da nossa pasta de downloads iremos baixar o wordpress: wget http://wordpress.org/latest.tar.gz
      • Podemos extrair seu conteudo com: tar xpf latest.tar.gz
      • Agora copiados todo conteudo da pasta wordpress que foi oque extraimos e colamos em /var/www/html
      • sudo cp -r wordpress /var/www/html/
      • Agora setamos as permisões da pasta do nosso site:
      • sudo chown -R www-data:www-data /var/www/html
      • sudo chmod -R 777 /var/www/html
    • Agora quando acessarmos o ip da nossa maquina no navegador conseguiremos nos conectar ao wordpress
    • Agora basta conectar o database ao wordpress e nosso site estara pronto:

    Ngrok

    • Como serviço extra estarei utilizando Ngrok
    • Com ele podemos expor alguma porta local para a internet, dessa forma compartilhando nosso site sem muitas complicações.
    • Primeiro estarei realizando a instalação:
      • sudo apt install snapd
      • sudo snap install ngrok
    • Agora podemos executar /snap/bin/ngrok 80 http para expor nosso servidor web pra internet
    • Agora podemos disponibilizar os links fornecidos no Forwarding para quem quiser acessar nosso site.