lundi 20 décembre 2010

Creer un Certificat auto-signé dit “autographe”

Un certificat permet de fournir diverses informations concernant l'identité de son détenteur (la personne qui publie les données). Ce certificat s'accompagne d'une clé publique qui est indispensable pour que la communication entre les machines soit chiffrée.

De même, afin de garantir l'authenticité du certificat, ce dernier est signé numériquement par le biais d'une clé privée provenant soit d'un organisme officiel (Société spécialisée dans la certification) soit par le détenteur du Certificat lui même. Dans ce dernier cas, on parlera de certificat auto-signé.

Dans la plupart des cas, l'obtention d'un Certificat certifié par une autorité officielle ayant un prix assez élevé, les webmasters auront tendance a vouloir signer eux-même leur certificat. Ce faisant, il est à noter que dans ce cas, le certificat ne sera pas reconnu par les navigateurs internet comme étant certifié.

Génération de la clé SSL :
openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
......................++++++
.................................++++++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:


Suppression de la "pass phrase" de la clé :
mv server.key server.key.secure
openssl rsa -in server.key.secure -out server.key
Enter pass phrase for server.key:


Génération d'un certificat de requete (certificate signing request : server.csr)
openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Génération d'un certificat valide 365 jours (server.crt)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Getting Private key
Enter pass phrase for server.key:

  • x509 : type de certificat désiré
  • -days 365 : indique la durée de validité (en jours) de ton certificat


Il ne reste plus qu'a configurer ton serveur apache :
sudo a2enmod ssl

et a crée le virtualhost :
NameVirtualHost *:443
<VirtualHost *:443>
ServerName hostname.com
DocumentRoot /var/www/hostname.com

[...]

SSLEngine on
SSLCertificateFile /chemin/vers/le/certificat/server.crt
SSLCertificateKeyFile /chemin/vers/la/cle/server.key
</VirtualHost>

jeudi 16 décembre 2010

Sauvegarder tes bases MySQL...

il faut en premier lieu que tu crées un fichier pour le script de sauvegarde :
vi /root/mysqlbackup.sh
"copie-colle" le script suivant dedans.
#!/bin/bash
# Par David H. 16.12.2010

USER="SET-MYSQL-USER-NAME"
PASSWORD="SET-PASSWORD"
HOST="localhost"

OUTPUTDIR="/var/backups/mysql"
MYSQLDUMP="$(which mysqldump)"
MYSQL="$(which mysql)"
GZIP="$(which gzip)"

NOW="$(date +"%H00.%F")"

[ ! -d $OUTPUTDIR ] && mkdir -p $OUTPUTDIR || :

find $OUTPUTDIR -type f -mtime +7 -exec rm {} \;

DATABASES="$($MYSQL --host=$HOST --user=$USER --password=$PASSWORD -Bse 'SHOW DATABASES')"

for db in $DATABASES
do
$MYSQLDUMP --host=$HOST --user=$USER --password=$PASSWORD $db | $GZIP -9 > $OUTPUTDIR/$db.$NOW.sql.gz
done

il ne te reste plus qu'a rendre le script /root/mysqlbackup.sh exécutable...
sudo chown root:root /root/mysqlbackup.sh
sudo chmod 700 /root/mysqlbackup.sh

... qu' a le place dans le crontab de root ...
sudo crontab -eu root
et a rajouter la ligne suivante :
0 */6 * * * /root/mysqlbackup.sh

Dans notre cas précis, les bases sont sauvegardées toutes les 6h ( cf: la mise en place du cron )
et les archives sont conservé 7 jours ( cf: la ligne du script /root/mysqlbackup.sh )
find $OUTPUTDIR -type f -mtime +7 -exec rm {} \;

Sécurisation d'un serveur Apache

Vivons heureux, vivons caché!

Voici ce qu'un pirate peut apprendre sur ton serveur via la séquence de code suivante :
telnet localhost 80
Trying 83.167.35.48...
Connected to localhost.
Escape character is '^]'.
GET /page-qui-n-existe-pas.html HTTP/1.0

HTTP/1.1 404 Not Found
Date: Fri, 17 Dec 2010 10:13:46 GMT
Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.12 with Suhosin-Patch
Content-Length: 342
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /page-qui-n-existe-pas.html was not found on this server.</p>
<hr>
<address>Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.12 with Suhosin-Patch Server at localhost Port 80</address>
</body></html>
Connection closed by foreign host.

1 - la version de ton serveur Apache est 2.2.8
2 - le service Apache tourne sous une distribution Ubuntu
3 - mod_php est activé sur ce service en version 5.2.4

Le but ici est de limiter la divulgation d'informations en insérant le code suivant :
ServerTokens Prod
ServerSignature Off
TraceEnable Off
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</IfModule>

dans un des fichiers de configuration disponible en fonction de ta version d'apache :
/etc/apache/httpd.conf
/etc/apache/apache.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
/etc/apache2/conf.d/security
...

ServerTokens Prod
Cette directive va limiter les informations au niveau de l'entête HTTP
Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.12 with Suhosin-Patch
va devenir ...
Server: Apache
ServerSignature Off
va supprimer la seciotn de pied de page...
<address>Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.12 with Suhosin-Patch Server at localhost Port 80</address>
Par défaut sous Apache, la méthode TRACE est activée ce qui peut conduire à des vulnérabilités de type XSS :
telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TRACE / HTTP/1.0

HTTP/1.1 200 OK
Date: Thu, 16 Dec 2010 11:08:56 GMT
Server: Apache (ServerTokens Prod)
Connection: close
Content-Type: message/http

TRACE / HTTP1.1

Connection closed by foreign host.

Ce trou de securité peut etre comblé, en ajoutant la directive suivante dans le fichier de conf apache :
#pour la version d'apache >= 1.3.34
TraceEnable Off
#pour les versions ne supportant pas la directive ci dessus...
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</IfModule>


Voila a partir de maintenant, ton serveur est relativement bien protégé...
telnet localhost 80
Trying 213.152.4.93...
Connected to localhost.
Escape character is '^]'.
GET /page-qui-n-existe-pas.html HTTP/1.0

HTTP/1.1 404 Not Found
Date: Fri, 17 Dec 2010 10:35:05 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 218
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL page-qui-n-existe-pas.html was not found on this server.</p>
</body></html>
Connection closed by foreign host.


Les seules informations qui nous sont delivrés :
- le service http est Apache
- page-qui-n-existe-pas.html n'existe pas

Attention tout de même a bien maintenir Apache a jour et aux directives contenues dans la configuration des virtualhosts.

lundi 13 décembre 2010

Apache : configurer un site internet...

En premier lieu, il te faut créer un fichier de configuration pour ton VirtualHost
sudo vi /etc/apache2/sites-available/host.domain.com

Copie colle ensuite la section suivante (et change host.domain.com par le nom de ton site) :
<VirtualHost *>
ServerAdmin webmaster@host.domain.com
DocumentRoot /var/www/host.domain.com
ServerName host.domain.com
ErrorLog /var/log/apache2/host.domain.com/error_log
CustomLog /var/log/apache2/host.domain.com/access.log combined

<Directory "/var/www/host.domain.com">
Options FollowSymLinks Includes
Order deny,allow
AllowOverride None
</Directory>

DirectoryIndex index.html index.php index.htm
</VirtualHost>


Il faut ensuite que tu vas devoir créer le repertoire qui va acceuillir les logs de ton site :
mkdir /var/log/apache2/host.domain.com

A présent activons la nouvelle configuration
cd /etc/apache2/sites-enabled/
sudo ln -s /etc/apache2/sites-available/host.domain.com


On recharge la configuration apache :
sudo service apache2 reload
ou facon old school
sudo /etc/init.d/apache2 reload

vendredi 10 décembre 2010

Faire sortir le génie de la L.A.M.P...

A priori si ta machine est en état de fonctionner, il ne te reste plus qu'a frotter la L.A.M.P et exaucer tes 3 voeux :
sudo aptitude mysql-server
sudo aptitude apache2
sudo aptitude php5 php5-cli
Tester apache :
sudo service apache2 status
Apache is running (pid 00000).
a ce niveau ton serveur apache est démarré

Tester MySQL
sudo service mysql status
mysql start/running, process 00000
a ce niveau ton serveur mysql est démarré

Tester PHP
php <<info | more
> <?php phpinfo(); ?>
> info
phpinfo()
PHP Version => 5.2.4-2ubuntu5.12

System => Linux localhost 2.6.24-19-server #1 SMP Wed Aug 20 23:54:28 UTC 2008 i686
Build Date => Sep 20 2010 13:15:27
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc/php5/cli
Loaded Configuration File => /etc/php5/cli/php.ini
Scan this dir for additional .ini files => /etc/php5/cli/conf.d
additional .ini files parsed => /etc/php5/cli/conf.d/apc.ini,
[...]

et..
sudo touch /var/www/info.php
sudo echo "<?php phpinfo(); ?>" > /var/www/info.php

ouvrir un navigateur sur http://localhost/info.php

ou encore...
curl http://localhost/info.php > info.html
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' info.html > info.txt
cat info.txt | more



body {background-color: #ffffff; color: #000000;}
body, td, th, h1, h2 {font-family: sans-serif;}
pre {margin: 0px; font-family: monospace;}
a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
[...]


phpinfo()



PHP Version 5.2.4-2ubuntu5.12



System Linux localhost 2.6.24-19-server #1 SMP Wed Aug 20 23:54:28 UTC 2008 i686
Build Date Sep 20 2010 12:57:55
Server API Apache 2.0 Handler
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc/php5/apache2
Loaded Configuration File /etc/php5/apache2/php.ini
[...]


Si pour toi tout ne c'est pas passé comme prévu, je t'invites a poster ta question et ton message d'erreur ici...

Devenir Root...

Voici globalement 4 méthodes pour devenir root et leurs différences :

Méthode 1 :
sudo -i
HOME=/root
PATH=/usr/lib/kde4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
MAIL=/var/mail/nom-utilisateur (*)
SHELL=/bin/bash

Méthode 2 :
sudo -s
HOME=/home/nom-utilisateur (*)
PATH=/usr/lib/kde4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
MAIL=/var/mail/nom-utilisateur (*)
SHELL=/bin/bash

Méthode 3 :
sudo bash
HOME=/home/nom-utilisateur (*)
PATH=/usr/lib/kde4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
MAIL=/var/mail/nom-utilisateur (*)
SHELL=/bin/bash

Méthode 4 :
sudo su
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
MAIL=/var/mail/root
SHELL=/bin/bash

(*) Les methodes 1, 2, 3 voit leur environnement root "pollué" par celui de l'utilisateur. La façon la plus "saine" de devenir root serait donc,a priori, la méthode 4

Qu'est-ce qu'un shell ?

Le shell est ce qui s'exécute quand tu te connectes. C'est lui qui te présente le prompt, qui envoie tes commandes au système, qui enregistre certaines variables. Il est encore là quand tu te déconnectes.

connaître la liste des shells disponible...
cat /etc/shells

Par défaut les shells disponibles sont :
# /etc/shells: valid login shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash

Mais d'autres shells peuvent être installés comme le très utile scponly
sudo aptitude install scponly

Créer un utilisateur

sudo useradd nom-utilisateur

Par défaut l'utilisateur se verra attribuer les éléments par /etc/default/useradd.
Pour plus d'information :
cat /etc/default/useradd

Il faut a présent lui affecter un shell :
sudo usermod -s /chemin/vers/shell nom-utilisateur

Il faut également lui attribuer un groupe principal...
sudo usermod -g nom-groupe nom-utilisateur

... et ou un groupe secondaire
sudo usermod -G nom-groupe nom-utilisateur

Il faut a cet utilisateur un repertoire pour travail
sudo usermod -d /chemin/vers/repertoire-utilisateur nom-utilisateur

Attention cette dernière commande ne créer pas le répertoire directement. Il faut donc :
créer le répertoire
sudo mkdir /chemin/vers/repertoire-utilisateur
et autoriser nom-utilisateur a travailer dedans
sudo chown -R nom-utilisateur:nom-groupe /chemin/vers/repertoire-utilisateur

Il ne manque plus qu'a creer un mot de passe pour notre utilisateur :
sudo passwd nom-utilisateur
Enter new UNIX password:
Retype new UNIX password:

si tout ce passe bien ta machine te gratifiera d'un :
passwd: password updated successfully

Pour les acrobates de la console la création d'un compte utilisateur peut être effectuée sans passer par usermod.

Pour plus d'informations :
sudo man useradd

jeudi 9 décembre 2010

Mise a jour et entretien de ta machine

Aptitude est un gestionnaire de paquets basé sur l'infrastructure APT, c'est-à-dire que tu pourras installer, supprimer et mettre à jour les logiciels (paquets) avec Aptitude.


Rechercher un paquet :
sudo aptitude search nom_du_paquet
Il existe des alternatives a la recherche de paquet. Les commandes suivantes permettent d'effectuer des recherches dans la liste des paquets déjà installés :
sudo aptitude search nom_du_paquet | grep '^i'
ou bien encore...sudo dpkg -l | grep 'nom_du_paquet'
Tu peux également vérifier l’état de ta machine en tapant : sudo apt-show-versions | grep -v 'uptodate'cette dernière commande te retournera la liste des paquets qui ne sont plus a jours sur ton système

Installer un paquet :
sudo aptitude install nom-paquet

Désinstaller un paquet :
sudo aptitude remove nom-paquet

Désinstaller le paquet et supprimer ses fichiers de configuration :
sudo aptitude purge nom-paquet

Mettre à jour la liste des paquets disponibles, (à faire avant toute installation) :
sudo aptitude update

Mettre a jours les paquets déjà installés sur ta machine :
# Pour Gutsy (7.10) et versions supérieures
sudo aptitude safe-upgrade
# Pour Feisty (7.04) et versions antérieures
sudo aptitude upgrade

Faire une mise à jour de ta distribution :
# Pour Gutsy (7.10) et versions ultérieures
sudo aptitude full-upgrade
# Pour Feisty (7.04) et versions antérieures
sudo aptitude dist-upgrade

Supprimer tous les paquets .deb téléchargés et enregistrés dans /var/cache/apt/archives.
sudo aptitude clean

Supprimer tout paquet enregistré dans le cache et qui n'est plus proposé au téléchargement. Cela te permet d'empêcher que le cache ne grossisse démesurément avec le temps, sans avoir à le vider complètement.
sudo aptitude autoclean

Connaitre la version et le nom de code de ta distribution

sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.04.1 LTS
Release: 10.01
Codename: lucid

Historique des versions et nom de code :
10.2004 - 4.10 : Warty Warthog
05.2005 - 5.04 : Hoary Hedgehog
10.2005 - 5.10 : Breezy Badger
05.2006 - 6.06 LTS : Dapper Drake
10.2006 - 6.10 : Edgy Eft
04.2007 - 7.04 : Feisty Fawn
10.2007 - 7.10 : Gutsy Gibbon
04.2008 - 8.04 LTS : Hardy Heron
10.2008 - 8.10 : Intrepid Ibex
04.2009 - 9.04 : Jaunty Jackalope
10.2009 - 9.10 : Karmic Koala
08.2010 - 10.04 LTS : Lucid Lynx
10.2010 - 10.10 : Maverick Meerkat
??.???? - 11.04 : Natty Narwhal