Archivio

Archivio per la categoria ‘Sicurezza’

Filtrare una porta con iptables

19 marzo 2010 Nessun commento

iptables e’ un’applicazione utilizzata per configurare il firewall del kernel linux. La gestione dei pacchetti avviene mediante l’utilizzo di ‘catene’ utili per poter distinguere e gestire il traffico di rete.  Di default sono attive le seguenti catene:

INPUT, OUTPUT, PREROTING, POSTROUTING, FORWARD

e vengono accettate tutte le connessioni.

Per filtrare una porta e’ necessario operare solamente su INPUT (traffico diretto al server) o OUTPUT (traffico in uscita dal server).

Potrete verificare lo stato del firewall con questo comando:

iptables -L -n

Con questo comando filtreremo la porta tcp 61282

iptables -A INPUT -p tcp –dport 61282 -j DROP

Per rimuovere la suddetta regola si puo’ utilizzare

iptables -D INPUT -p tcp –dport 61282 -j DROP

Potrete bloccare l’accesso ad un range di porte con un unico comando utilizzando il carattere ‘:’ nell’opzione –dport, ecco un esempio per filtrare le porte tcp dalla 600 alla 700

iptables -D INPUT -p tcp –dport 600:700 -j DROP

Ovviamente e’ possibile consentire l’accesso ad una determinata porta solamente ad un  indirizzo ip predefinito (nell’esempio viene utilizzato 127.0.0.1)

iptables -A INPUT -p tcp –dport 443 -s ! 127.0.0.1 -j DROP

Per eliminare tutte le regole si puo’ utilizzare

iptables -F

Categorie:Altro, Sicurezza Tag: ,

Installare mod_fcgid con apache2 in CentOS GNU/Linux

24 dicembre 2009 1 commento

apacheDi default il web server apache esegue gli script php di un sito con l’utente “www-data”. Per permettere ad uno script di memorizzare dati all’interno di una directory, allora i permessi di quest’ultima devono essere settati a 777 oppure il proprietario della cartella deve essere l’utente “www-data”. In questo caso, se sul vostro server web e’ attivo piu’ di un sito internet, allora uno script di un dominio potrebbe modificare i dati di un’altro. Come fare per ovviare a questo problema?  Eseguendo gli script di ogni sito con un utente distinto installando la suexec, mod_fcgid ed utilizzando il php in modalita’ cgi. Piu’ difficile a dirsi che a farsi, bastano difatti pochi comandi e qualche minuto per configurare il tutto:

1) Occorre disabilitare SELinux

setenforce 0

Editare il file /etc/selinux/config ed impostare SELINUX a ‘disable’

SELINUX=disabled

2) Installare mod_fcgid. Questo modulo  non e’ disponibile nel repository ufficiale di CentOS ma possiamo prelevarlo da un’altra fonte

cd /etc/yum.repos.d/
wget http://centos.karan.org/kbsingh-CentOS-Extras.repo

Editare /etc/yum.repos.d/kbsingh-CentOS-Extras.repo ed impostare gpgcheck a 0 ed enabled a 1 nella sezione [kbs-CentOS-Testing]:

[...]
[kbs-CentOS-Testing]
gpgcheck=0
enabled=1
[..]

Eseguire adesso questo comando

yum install mod_fcgid

4)
Commentare tutte le righe del file /etc/httpd/conf.d/php.conf (per evitare che il php venga caricato come modulo), anteponendo il carattere # ad inizio riga

5)
Adesso dovremo forzare il PHP a correggere il percorso del cgi in modo conforme alle specifiche PATH_INFO/PATH_TRANSLATED. Bastera’ aggiungere nel php.ini (/etc/php.ini) questa direttiva:

cgi.fix_pathinfo = 1

6) Creiamo l’utente con cui dovranno essere eseguiti gli script del sito

groupadd sito1
useradd -s /bin/false -d /var/www/sito1 -m -g web1 web1
chmod 755 /var/www/sito1

7) Creiamo la cartella che dovra’ ospitare i file del sito

mkdir -p /var/www/sito1/htdocs
chown sito1:sito1 /var/www/sito1/htdocs

8) Creiamo il wrapper che utilizzeremo per avviare il php e configurare mod-fcgid:

mkdir -p /var/www/fcgid-conf-sito1

9) Inseriamo queste righe nel file /var/www/fcgid-conf-sito1/sito1.conf

#!/bin/sh
export PHPRC=/etc/
export PHP_FCGI_MAX_REQUESTS=400
export PHP_FCGI_CHILDREN=2
exec /usr/bin/php-cgi

PHPRC,PHP_FCGI_MAX_REQUESTS e PHP_FCGI_CHILDREN sono opzionali e se verranno omessi sara’ impostato il valore di default. Sono utili per poter indicare il percorso del php.ini, permettendo cosi’ di utilizzare una configurazione diversa da sito a sito, oppure per definire il numero di child per processo ed il numero di richieste che puo’ gestire prima di terminare.

10) Impostiamo i corretti permessi/proprietario

chmod 755 /var/www/fcgid-conf-sito1/sito1.conf
chown -R sito1:sito1 /var/www/fcgid-conf-sito1

11) Creiamo in /etc/httpd/conf/httpd.conf la configurazione del sito

<VirtualHost *:80>
ServerName www.sito1.it
ServerAdmin postmaster@sito1.it
DocumentRoot /var/www/sito1/htdocs/

<IfModule mod_fcgid.c>
SuexecUserGroup sito1 sito1
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/sito1/htdocs/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/fcgid-conf-sito1/sito1.conf .php
Order allow,deny
Allow from all
</Directory>
</IfModule>

# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off

</VirtualHost>

12) Salvare il file e riavviare il web server

/etc/init.d/httpd restart

Categorie:Altro, Apache, How-to, Server, Sicurezza Tag:

File System Access Control Lists (ACL POSIX nei sistemi GNU/Linux)

2 novembre 2009 Nessun commento

In questo articolo vedremo come sia possibile integrare nel nostro GNU/Linux il sistema di gestione delle ACL POSIX. Cio’ rendera’ possibile gestire in maniera’  avanzata il controllo sull’ accesso ai dati. Ecco  un esempio che vi aiutera’ a comprendere di cosa stiamo parlando:

Se avessimo tre utenti di sistema  appartenenti allo stesso gruppo come potremmo fare leggere un file solamente ai primi due negando l’accesso al terzo? Appartenendo allo stesso gruppo sarebbe vano ogni tentativo con chmod o chown. Ecco allora che con un’acl possiamo possiamo risolvere questo problema!

Dobbiamo installare il pacchetto ‘acl’. Questo e’ il comando da eseguire con la distribuzione Debian o Ubuntu

apt-get install acl

Questo invece con Fedora o CentOS

yum install acl

Adesso dobbiamo rimontare il filesystem con l’opzione acl

mount / -o remount,acl

Editiamo /etc/fstab per far si che al prossimo avvio il sistema abiliti automaticamente le acl sul filesystem

/dev/sda1       /       ext3     defaults,acl       0       1

I binari che utilizzeremo per verificare/impostare le acl sono ‘setfacl’ e ‘getfacl’. Riprendiamo l’esempio di prima e supponiamo di dover concedere la lettura di /home/utente1/file all’ utente2. Essendo i tre utenti appartenenti allo stesso gruppo, per evitare che utente3 legga il file dovremo impostare su esso i permessi a 600

Eseguiamo ora “getfacl /home/utente1/file” ed analizziamo il suo output

getfacl: Removing leading ‘/’ from absolute path names
# file: home/utente1/file
# owner: utente1
# group: users
user::rw-
group::—
other::—

Se utente2 provasse a leggere il file otterrebbe il classico messaggio di errore di “Permesso Negato”

Adesso eseguiamo

setfacl -m u:utente2:r /home/utente1/file

Nuovamente getfacl

getfacl: Removing leading ‘/’ from absolute path names
# file: home/utente1/file
# owner: utente1
# group: users
user::rw-
user:utente2:r–
group::—
mask::r–
other::—

Come avrete notato c’e’ una riga in piu’

user:utente2:r–

Che sta a significare che utente2 puo’ leggere il file.

Allo stesso modo possiamo negare l’accesso ad un determinato file. Ad esempio

setfacl -m u:www-data:— /usr/bin/perl

Disabilitare SSLv2 e abilitare SSLv3 per le connessioni https

30 ottobre 2009 Nessun commento

In questa guida descriveremo come configurare apache per accettare connesioni solo con SSLv3, nel caso il vostro server accetti ancora l’insicuro SSLv2. Per l’installazione del webserver e la configurazione di openssl potete consultare questa guida.

Editiamo questo file, se non esiste possiamo crearlo:

vi /etc/apache2/conf.d/ssl.conf

SSLProtocol -All +SSLv3 +TLSv1
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:!SSLv2:+EXPRestart

Ora possiamo riavviare il webserver:

/etc/init.d/apache2 restart

Per verificare che venga correttamente utilizzato SSLv3:

openssl s_client -connect localhost:443 -ssl3 -no_ssl2

Dovremmo ottenere qualcosa del genere:


SSL handshake has read 1464 bytes and written 317 bytes

New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit

Per essere sicuri che il nostro server non accetti connessioni con il vecchio protocollo, possiamo forzare il comando openssl a connettersi con la versione 2:

openssl s_client -connect localhost:443 -ssl2 -no_ssl3

Questo messaggio d’errore ci assicura che il nostro webserver accetta solo connessioni SSLv3:

CONNECTED(00000003)
3374:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:428:

Categorie:Altro, Apache, Sicurezza Tag: , , ,