Installare e mettere in sicurezza una vps debian

Installare e mettere in sicurezza una vps debian

Installare un vps debian 7 e metterla in sicurezza

Installazione LEMP

Cominciamo con creare e installare una macchina pulita debian wheezy (7).

Una volta installata connettiamoci tramite root e andiamo subito ad aggiungere la repo di dotdeb

vim  /etc/apt/sources.list  

aggiungiamo queste 4 righe (le ultime 2 sono opzionali per installare php 5.6 e zend)

deb http://packages.dotdeb.org wheezy all  
deb-src http://packages.dotdeb.org wheezy all  
deb http://packages.dotdeb.org wheezy-php56-zts all  
deb-src http://packages.dotdeb.org wheezy-php56-zts all  

Finiamo con aggiungere la loro chiave e aggiornare le repo

wget https://www.dotdeb.org/dotdeb.gpg  
sudo apt-key add dotdeb.gpg  
apt-get update  

Adesso cominciamo subito a installare nginx (con il comando apt-get install nginx) e passiamo a configurare il suo file come segue

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak  
vim /etc/nginx/nginx.conf  

e inseriamo questo nel file

user  www-data;  
worker_processes auto;  
pid /run/nginx.pid;

# [ debug | info | notice | warn | error | crit ]
error_log  /var/log/nginx/error.log  warn;

events {  
  worker_connections  1024;
  use epoll;
}

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

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                '$status $body_bytes_sent "$http_referer" '
                                '"$http_user_agent"';

        server_tokens off;

        server_names_hash_max_size    64;
        server_names_hash_bucket_size 64;

        client_header_timeout   10m;
        client_body_timeout     10m;
        send_timeout            10m;

        connection_pool_size         512;
        client_header_buffer_size     8k;
        large_client_header_buffers 8 8k;
        request_pool_size            64k;

        gzip              on;
        gzip_http_version 1.0;
        gzip_buffers      16 8k;
        gzip_comp_level   9;
        gzip_min_length   2048;
        gzip_types        text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_vary         on;

 output_buffers  16 32k;
        postpone_output 1460;

        sendfile        on;
        tcp_nopush      on;
        tcp_nodelay     off;

        keepalive_timeout  30;
        keepalive_requests 10;

        chunked_transfer_encoding off;

        ignore_invalid_headers on;

  include /etc/nginx/sites-enabled/*; 
}

Diamo il comando nginx -t per vedere se il file è stato scritto correttamente e passiamo a installare il modulo php

apt-get install php5-cli php5-common  
apt-get install php5-fpm php5-cgi  

dati i due comandi andiamo a inserire le seguenti righe nei file di configurazione di php5-fpm

vim /etc/php5/fpm/php-fpm.conf  

e inseriamo in fondo

pm.max_children = 25  
pm.start_servers = 4  
pm.min_spare_servers = 2  
pm.max_spare_servers = 10  
pm.max_requests = 500  
request_terminate_timeout = 30s  

Adesso riavviamo il demone con service php5-fpm restart

Fatto questo ora dovremo andare a creare il nostro primo file per il nostro sito web, dunque:

vim /etc/nginx/sites-available/nostrosito  

e all'interno scriviamo

server {  
  listen       80;
        server_name  ~^(\w*)\.?nostrosito\.it$;
        index index.html;

        root /var/www/nostrosito;


        if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
        return 444;
}

         location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov) {
  if (-f $request_filename) {
                expires max;
                access_log off;
    break;
                }
        }
  location ~ \.php$ {
  fastcgi_pass   unix:/var/run/php5-fpm.sock;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME /var/www/nostrosito$fastcgi_script_name;
  include fastcgi_params;
}
        }

adesso creiamo un link simbolico

ln -s /etc/nginx/sites-available/nostrosito /etc/nginx/sites-enabled/nostrosito  

Ora se tutto è andato correttamente possiamo creare un file .php e scrivere all'interno

<?php phpinfo(); ?>

così da vederne il risultato

Adesso che abbiamo configurato il nostro vps a elaborare e servire siti con contenuti statici e/o dinamici (ricordiamoci in caso avessimo bisogno di dover installare un db e un gestore di sessioni come redis per ottimizzare il load) possiamo passare a metterlo in sicurezza a partire dalla nostra sessione ssh.

Configuriamo dunque una chiave ssh per poter accedere alla nostra sessione

Partiamo dunque nel generare una chiave RSA (durante la creazione vi chiederà di inserire una password se vorrete)

ssh-keygen -t rsa  

A questo punto, nella directory

cd ~/.ssh/  

troveremo due file idrsa e idrsa.pub, copiamo dunque il nostro idrsa.pub nella directory dell'utente che useremo per loggarci ~/.ssh/authorizedkeys

Ora passiamo a configurare il demone ssh editando il file di configurazione in questo modo

vim /etc/ssh/sshd_config  

Scriviamo

Port 22  
AllowUsers vostro-nome-utente  
Protocol 2

HostKey /etc/ssh/ssh_host_rsa_key  
HostKey /etc/ssh/ssh_host_dsa_key  
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600  
ServerKeyBits 768

SyslogFacility AUTH  
LogLevel INFO

LoginGraceTime 120  
PermitRootLogin no  
StrictModes yes


RSAAuthentication yes  
PubkeyAuthentication yes  
AuthorizedKeysFile  %h/.ssh/authorized_keys

IgnoreRhosts yes  
RhostsRSAAuthentication no  
HostbasedAuthentication no

PermitEmptyPasswords no


ChallengeResponseAuthentication no  
PasswordAuthentication no

X11Forwarding no  
PrintMotd no  
PrintLastLog yes  
TCPKeepAlive yes


AcceptEnv LANG LC_*  

Fatto tutto non ci rimane altro che riavviare il demone ssh

service ssh restart

Adesso passiamo alla messa in sicurezza tramite firewall del port knocking (per aprire determinate porte solo su richieste telnet)

Passiamo dunque a installare il demone shorewall

apt-get install shorewall -y  

e copiamo le config standard che sono nella doc del pacchetto

cp /usr/share/doc/shorewall/default-config/* /etc/shorewall/  

modifichiamo il file zones

vim /etc/shorewall/zones  

e scriviamo

#
# Shorewall version 4 - Zones File
#
# For information about this file, type "man shorewall-zones"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-zones.html
#
###############################################################################
#ZONE   TYPE            OPTIONS         IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall  
net     ipv4  
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

abbiamo definito la zona fw che identifica la rete locale dal punto di vista del firewall, e la zona net, considerata come la rete esterna

passiamo all'interfaccia di rete

vim /etc/shorewall/interfaces  

E aggiungiamo le seguenti righe. Nel caso in cui la vostra interfaccia di rete si chiami diversamente, sostituite eth0 con il suo nome.

#
# Shorewall version 4 - Interfaces File
#
# For information about entries in this file, type "man shorewall-interfaces"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-interfaces.html
#
###############################################################################
#ZONE   INTERFACE       BROADCAST       OPTIONS
net eth0 detect  
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Adesso andiamo a bloccare tutto il traffico in entrata su tutte le porte (solo successivamente inseriremo le porte necessarie)

vim /etc/shorewall/policy  

e scriviamo

#
# Shorewall version 4 - Policy File
#
# For information about entries in this file, type "man shorewall-policy"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-policy.html
#
###############################################################################
#SOURCE         DEST            POLICY          LOG             LIMIT:BURST
fw net ACCEPT  
net all DROP info  
all all REJECT info  
#LAST LINE -- DO NOT REMOVE

In parole povere consentiamo tutto il traffico dall'interno del vps all'esterno e viceversa blocchiamo tutto il traffico in entrata loggandolo come info nei log

Adesso dobbiamo aprire le porte che ci interessano

vim /etc/shorewall/rules  

andiamo a modificare ciò che ci interessa

#
# Shorewall version 4 - Rules File
#
# For information on the settings in this file, type "man shorewall-rules"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-rules.html
#
############################################################################################################################
#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK
#                                                       PORT    PORT(S)         DEST            LIMIT           GROUP
ACCEPT net fw tcp www  
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

In breve andiamo ad accettare net fw tcp www

infine facciamo partire shorewall in automatico ad ogni login, quindi andiamo a modificare

vim /etc/default/shorewall  

cerchiamo lo startup e impostiamolo a 1

(attenzione a non far partire ancora il firewall o a riavviare la macchina, andiamo adesso a specificare le porte necessarie per aprire la porta 22 dell'ssh)

Installiamo port knocking

apt-get install knockd  

modifichiamo il file

vim /etc/knockd.conf  

e inseriamo

[ssh]
  sequence         = 6547:tcp,2547:tcp,3234:tcp,1852:tcp
  seq_timeout      = 5
  start_command    = /sbin/iptables --append dynamic -s %IP% -p tcp --dport 22 -j ACCEPT
  tcpflags         = syn
  cmd_timeout      = 60
  stop_command     = /sbin/iptables --delete dynamic -s %IP% -p tcp --dport 22 -j ACCEPT

Modifichiamo a piacimento le porte (magari leggermente piu alte) e portiamo a compimento la nostra sequenza entro 5 secondi che sbloccherà la porta ssh pe 60 secondi entro i quali dovremo fare il login con la nostra chiave ssh precedentemente creata

Adesso modifichiamo l'ultimo file

vim /etc/default/knockd  

Troviamo la stringa START_KNOCKD e impostiamola a 1 per far partire knockd in automatico all'avvio.

Troviamo e decommentiamo la riga che contiene il flag KNOCKD_OPTS modificandolo in base al nome della nostra interfaccia di rete, nel caso di questo esempio:

KNOCKD_OPTS="-i eth0"  

Fatto tutto questo possiamo avviare knockd

service knockd start  

E infine avviamo shorewall

shorewall start  

Articoli Correlati