Cet article est le premier d’une série sur l’admin système linux. On va donc commencer par les bases : installer un ubuntu server avec une sécurité correcte et on en profite pour installer un LLMP dessus (c’est LAMP mais avec Lighttpd à la place de apache
)
Pour ce tuto, j’ai choisi d’utiliser un serveur virtuel de chez gandi : je profite d’une offre d’été qui propose un serveur gratuit pendant un mois.
J’avais beta testé cette offre il y a un an et demi, mais les trop gros problèmes d’accès disque (lenteurs notamment) m’avaient incité à partir prendre un RPS chez OVH.
Maintenant la situation change : l’offre de gandi est plus mûre (et l’archi disque a notamment changée : c’est maintenant du SAS directement sur les serveurs) et les RPS d’ovh vont disparaitre.
Je vais donc profiter de cette installation pour faire quelques benchs sur l’offre gandi et voir si je (re)bascule dessus ou pas ensuite.
En attendant, voici de quoi installer le serveur
Table des matières
Contents
Du côté de gandi
- Administration / Hebergement : cliquer sur créer un serveur
- Valider le nombre de parts
- Choisir Installation expert et Ubuntu 9.04
- Choisir un hostname, un nom d’utilisateur et un mot de passe [si possible, choisir un nom de user non standard, pour améliorer la sécurité]
- Valider, et attendre le mail de confirmation avec l’@IP du serveur
- Ensuite, on peut se connecter en SSH sur le serveur avec le login et pass entré juste avant.
Ajouter un disque de données :
- sur l’interfance gandi, onglet Gestion des disque, cliquer sur Créer un disque
- choisir un nom pour le disque, la taille souhaitée et le filesystem
- enfin, une fois le disque créé, cliquer sur le petit logo ‘link’ attacher le disque à un serveur
- choisir le serveur et valider
- le volume est dynamiquement ajouté au serveur dans /srv/nomduvolumechoisi
Organiser les users
Le login créé (ici: testuser) n’est pas par défaut dans la liste des sudoers, donc pas de sudo possible.
Le mot de passe root par défaut est le même que celui du user testuser
On va donc d’abord autoriser le sudo pour testuser :
en tant que root :
visudo
et ajouter à la fin du fichier :
# Members of the admin group may gain root privileges %admin ALL=(ALL) ALL
Ensuite on va ajouter testuser dans le groupe admin :
toujours en tant que root :
usermod -G admin testuser
Enfin on change le mot de passe root
en tant que root :
passwd
et entrer un bon mot de passe bien sécurisé
A partir de maintenant, sauf mention spécifique, le reste des commandes sera réalisée avec le user testuser
Mise à jour du système
Afin de démarrer sur un système tout propre
sudo apt-get update sudo apt-get upgrade
Installer et configurer de quoi bien travailler
sudo apt-get install vim-python
puis
vim ~/.vimrc
et coller le texte suivant:
syntax on set number set background=dark set tabstop=2 set shiftwidth=2 set softtabstop=2 set expandtab set autoindent autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class autocmd BufWritePre *.py normal m`:%s/\s\+$//e `` map <F12> :set number!<CR> map <F10> :set paste!<CR>
enfin :
vim ~/.bashrc
et vers la fin du fichier, décommenter les 3 lignes suivantes :
alias ll='ls -l' alias la='ls -A' alias l='ls -CF'
L’heure et ntp
Dans mon système livré par gandi, l’heure est par défaut en heure UTC, si on veut la mettre à l’heure locale (Paris, France pour moi):
sudo dpkg-reconfigure tzdata
et choisir : Europe, puis Paris
Pour NTP :
[édit: Comme le remarque justement Daniel dans les commentaires, paramétrer ntp pour un serveur virtuel n'est vraisemblablement pas nécessaire car il va hériter de la date de son hôte. Je laisse ici l'info au cas où votre serveur n'est pas un hébergement gandi]
sudo vim /etc/cron.daily/ntpdate
et coller les commandes suivantes :
#!/bin/sh #On lance une synchro ntp ntpdate fr.pool.ntp.org
enfin
sudo chmod a+x /etc/cron.daily/ntpdate
Ainsi notre serveur resynchronisera son horloge tous les jours automatiquement.
Sécurité
ssh : autoriser uniquement certains users en ssh
ici, on va limiter le ssh uniquement pour notre user : testuser
sudo vim /etc/ssh/sshd_config
Bin vérifier que dans la zone ‘Authentication’ on a bien :
PermitRootLogin without-password
sinon modifier le paramètre.
ensuite, en bas du fichier, ajouter :
# Allow only a certain list of users AllowUsers testuser
Attention, il faut être vigilant en insérant cette ligne : une erreur dans le nom du user interdirait toute connexion ultérieure en ssh et bloquerait l’accès au serveur. Il est conseillé de garder sa session actuelle ouverte et de tester une nouvelle connexion supplémentaire pour bien vérifier qu’on puisse encore se connecter.
On recharge la config ssh
sudo /etc/init.d/ssh reload
Fail2ban
Fail2ban analyse les logs (ssh notament) et banni les IP qui attaque en force brute sur ssh via des configurations automatiques dans iptables.
sudo apt-get install fail2ban
modification des paramètres de fail2ban:
sudo vim /etc/fail2ban/jail.conf
pour ma part, j’ai juste changé deux paramètres : le bantime et le nombre d’essais :
bantime = 1800 maxretry = 3
sudo /etc/init.d/fail2ban restart
IPtables
Iptable a été installé avec fail2ban, on va maintenant le configurer pour nos applications
Pour cela, on va créer un fichier de commande qui se lancera au boot du serveur et que l’on peut relancer à volonté pour reconfigurer le firewall.
sudo vim /etc/init.d/server_iptables
et coller les commandes suivantes :
#!/bin/bash # reset iptables iptables -F # Autorise les connections sortantes et sur l'interface "loopback" iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -d 127.0.0.0/8 -i ! lo -j DROP # Autorise les connections deja etablies iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Autorise HTTP, SSH, ICMP-ping iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT iptables -A INPUT -p icmp -i eth0 -j ACCEPT # Refuse a priori ce qui vient de l'exterieur iptables -P INPUT DROP iptables -P FORWARD DROP
Ensuite on le rend executable et on l’installe au boot :
sudo chmod +x /etc/init.d/server_iptables sudo update-rc.d server_iptables defaults
Sécuriser le kernel
ça doit être lié à Xen, mais le kernel de gandi est assez ancien (à la date de cet article c’est un 2.6.18, alors que le kernel en cours est un 2.6.28
On va modifier quelques paramètres du kernel pour le rendre plus solide aux attaques
Ici, il faut se mettre directement en root pour que ces commandes passent :
sudo su
Se protéger contre les Smurf Attack:
celui ci est déjà bon dans l’install que j’ai testé:
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Eviter le source routing:
celui ci est déjà bon dans l’install que j’ai testé:
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
Se protéger des attaques de type Syn Flood:
celui ci est déjà bon dans l’install que j’ai testé:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies echo "1024" > /proc/sys/net/ipv4/tcp_max_syn_backlog echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
Désactiver l’autorisation des redirections ICMP:
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects echo "0" > /proc/sys/net/ipv4/conf/all/secure_redirects
Eviter le log des paquets icmp erroné:
celui ci est déjà bon dans l’install que j’ai testé:
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
Active le logging des packets aux adresses sources falficiées ou non routables:
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
on quitte le user root
exit
Installation Lighttpd et php
sudo apt-get install lighttpd sudo apt-get install php5-cgi sudo apt-get install php5-mysql sudo lighty-enable-mod cgi sudo /etc/init.d/lighttpd force-reload
edit le fichier de conf de lighttpd et ajouter le mod fastcgi :
sudo vim /etc/lighttpd/lighttpd.conf
les modules activés sont les suivants (j’ai mis mod_rewrite et mod_redirect en plus, car cela sert toujours finalement)
server.modules = (
"mod_access",
"mod_alias",
"mod_accesslog",
"mod_compress",
"mod_fastcgi",
"mod_rewrite",
"mod_redirect",
# "mod_evhost",
# "mod_usertrack",
# "mod_rrdtool",
# "mod_webdav",
# "mod_expire",
# "mod_flv_streaming",
# "mod_evasive"
)
puis aller chercher dans le fichier la variable : server.dir-listing
et la passer à disable :
server.dir-listing = "disable"
Installation Mysql
apt-get install mysql-server-5.0
Quand il le demande, entrer un mot de passe root pour mysql (choisir un vrai mot de passe bien sécurisé)
On va ‘forcer’ l’utf8 partout :
sudo vim /etc/mysql/conf.d/caractersencoding.cnf
et coller la configuration suivante :
[mysqld] #Set the default character set. default-character-set=utf8 #Set the default collation. default-collation=utf8_general_ci # character-set-server=utf8 skip-character-set-client-handshake init-connect='SET NAMES utf8'
on redémarre pour vérifier que tout est bon
sudo /etc/init.d/mysql restart
Mysql est maintenant installé dans ses répertoires par défaut, et notamment les bases seront crées dans /var/lib/mysql
[ceci est une spécificité liée à l'installation gandi, vous pouvez passer ce point si votre serveur est 'normal'] /var/lib est dans le disque ’système’ de gandi qui fait uniquement 3Go. En fonction de ce qu’on prévoi de faire avec son serveur mysql, il est peut-etre judicieux de le déplacer sur le disque de données :
sudo /etc/init.d/mysql stop sudo mv /var/lib/mysql /srv/nomdurepertoiregandi/mysql sudo ln -s /srv/nomdurepertoiregandi/mysql /var/lib/mysql sudo /etc/init.d/mysql start
Configuration de lighttpd pour un site de test
Afin de voir si tout va bien, on va créer un site de test
sudo mkdir /srv/nomdurepertoiregandi/www sudo chown www-data:www-data /srv/nomdurepertoiregandi/www sudo -u www-data mkdir /srv/nomdurepertoiregandi/www/sitetest1
ensuite on va configurer lighty :
sudo vim /etc/lighttpd/lighttpd.conf
ajouter sous la conf des modules :
# Config pour sitetest
$HTTP["host"] == "111.111.111.111" {
server.document-root = "/srv/nomdurepertoiregandi/www/sitetest1/"
# FAST CGI POUR PHP
fastcgi.server = ( ".php" => ((
"bin-path" => "/usr/bin/php-cgi",
"socket" => "/tmp/php.socket",
"max-procs" => 1,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "4",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"bin-copy-environment" => (
"PATH", "SHELL", "USER"
),
"broken-scriptfilename" => "enable"
)))
}
en remplaçant l’ip 111.111.111.111 par l’ip ou le nom de domaine du site que vous voulez ajouter
ensuite on redémarre lighty
sudo /etc/init.d/lighttpd restart
mettre un fichier de test
sudo -u www-data vim /srv/nomdurepertoiregandi/www/sitetest1/testinfo.php
et coller le code suivant :
<?php phpinfo(); ?>
et voilà, le site est normalement accessible sur l’IP (ou le nom de domaine) que vous avez précisé dans la conf et l’url (en prenant mon exemple ci-dessus) : http://111.111.111.111/testinfo.php
affiche toutes les infos de php.
Conclusion
On a maintenant un serveur ubuntu jaunty prêt à fonctionner, léger et sécurisé. Il prends peu de ressources, très peu de ram et pourra servir de base aux reste des tutos à venir.
Bon tuto
La resynchronisation par NTP est sans doute inutile, les machines virtuelles sous Xen héritant de l’horloge du serveur physique qui est déjà synchronisé (enfin, j’espère, sinon ça doit être un peu coton à gérer tout ça…).
Tuto complet et bien fait bravo ! J’ai eu le lien via Gandi ^^
J’ajoute le site dans les marque-pages
A bientôt.
Bonne remarque Daniel, merci. j’ai effectivement fait le test de changer la date et l’heure sur le serveur. Il accepte bien la commande, mais quand je ré-affiche la date, c’est toujours la bonne, inchangée : le Host doit forcer le guest à garder sa date.
Cela doit être un paramètre particulier de Xen, car j’utilise pas mal VirtualBox pour tester des installs et j’ai souvent des problèmes de synchro de date/heure justement, particulièrement lorsque je réveille un image préalablement sauvegardée.
J’ai mis à jour l’article avec cette info.
Thomas.
tuto très complet. Pour le firewall j’ai longtemps cherché une bonne config et je suis tombé sur « KISS my firewall » (http://www.geocities.com/steve93138/kiss.txt ). Vraiment très bien fait.
Super tuto. Well done buddy
Bravo pour ce tuto et vivement la suite !
Bonjour,
est ce que maintenant c’est mieux? est ce que avec une part cela suffit pour un petit ou moyen site et heberger plusieurs sites? az lepoque meme pour cela ca ramait et planter .. fallait au moins 2 part ( 24 euros ) et encore c’etait pas terrible ( autant prendre la dedibox .. ) je sais pas donc si c’est mieux et qu’avec une part ca tient- la route ..si vous pouviez me répondre sincerement merci
j’avais testé il y a un an au lancement l offre gandi et leur part, et j’avais été décu ( largement moins bien qu’un mutuel..) jen’ai pas eu le temps de retester ( vac oblige
@jojo: oui je suis en train de tester, notamment en comparaison avec un ovh RPS. Ce n’est pas évident de comparer ce qui est comparable et d’être global, mais à priori la bonne nouvelle c’est que la tenue des perfs a l’air assez stable, ce qui n’étais pas vraiment le cas en 2008. Mais mes résultats sont très partiels pour l’instant, il faudra quelques semaines pour être certain (et notamment voir avec le trafic de la rentrée).
Merci de la réponse Thomas. J’ai pris aussi le test mais j’ai rien fait trop la flemme. Mais je me posais la question entre un mutuel et gandi une part ( a l’époque javais largement remarqué que mno mutuel était largement meilleur que le gandi soit disant serveur dédié ( du moins avec une partie dédié de clouding ) . a mon avis autant garder la solution mutuel non? j’avais testé aussi la sortie d’unite opera ( finalement c’est un peu le même systeme que Gandi fait ( sauf que gandi le fait avec ses ordi cest du clouding . Mais bon opera unite c’est leger et pas tip top am oins qu’il y a des trucs que je nai pas vu et que ce cest amélioré
Bravo pour le tuto, ça m’a bien aidé, par contre j’ai un soucis sur la fin. Lorsque j’essaie d’accéder à testinfo.php j’ai une erreur 403… pourtant www-data a bien les droits…
Si jamais quelqu’un sait d’où ça peut venir.
Merci
Formidable,
J’ai appris plein de truc. j’attends avec impatience une suite qui traiterait par exemple de la création d’autres users, avec pour chacuns un répertoire pour les sites internet, le ftp, etc…
Y-a-t-il un avantage évident à préférer lighttpd au lieu d’Apache?
Merci encore
Merci.
Les prochains articles seront peut etre plus orienté ’serveur local’, genre http, dns resolver local, etc.. je reviendrais sur les web après. Mais en ce moment je n’ai pas beaucoup de temps pour les rédiger et les mettre en forme, mais bientôt
Pour lighty, le plus gros avantage que j’y vois est la faible empreinte mémoire, ce qui est bien adapté aux ‘petits’ serveurs comme celui de gandi.
L’install ci-dessus marche bien avec 256Mo de ram. Apache est un peu plus gourmant.
bonjour,
je reviens voir comment ça se passe avec l’offre gandi et leur systeme de part. Est ce que donc l’offre a 1 part et suffisante et mieux qu’un mutualisé ? ou bien finalement il faut mieux avoir un mutualisé ( pour le meme prix ou moins cher .. pour ma part je suis chez les herbegeurs USA dont il ny a pas trop de probleme avec un ovh aussi
est ce vraiment mieux alors d’avoir ce serveur privé ( je ne dis pas dédié car ce nest pas vraiment le cas finalement .. et surtout entre une offre mutualisé et cette offre gandi une part a 14 euros par mois, yatil assez de ressources , bande, etc ( certe cela depend du site mais jaimerai avoir la comparaison est ce que cela vaut vraiment la peine d’aller chez gandi ? ( ou bien de rester en mutuel certe je ne suis pas aussi libre mais au moins il y a la bande passante quil faut ( sans parler du dd enorme
bonjour,
pour ma part, impossible installer lihttpd et ssh fonctionne pas.
Peut être que je n’arrive pas à sauver les fichiers dans le vim, faut bien taper :q pour sortir et sauver???
@jojo: je suis désolé, je n’ai pas encore eu le temps de le faire. J’ai reconduit 1 mois pour les tests, je vais vraiment essayer d’y passer le temps nécessaire.
@grdimal : c’est :wq pour enregistrer et sortir (:w pour enregistrer uniqueemnt) mais c’est bizarre : si tu as modifié le fichier, vim ne te laisse pas sortir comme ça sans faire un :q!
De toute façon tu peux vérifier après en faisant un cat nomdufichier par exemple.
le SSH qui ne marche pas, c’est sur un gandi hosting ou une distrib que tu as installé ? car si c’est une install du CD, il faut bien préciser ’ssh’ dans la la liste des paquets à installer (c’est le seul à mettre d’ailleurs selon moi, le reste on le fait à la main ensuite).
ok Thomas, merci pour ta réponse.
En effet c’est une distrib.iso et je n’ai rien sélectionner dans les paquets durant l’install. Quand au vim, c’est bizarre?? je sors du mode insertion pour pouvoir sauvegarder les données mais que j’essaye :q ou :wq ou :w, il veut rien savoir??? bon j’ai désinstaller tout et je vais réinstaller et vérifier tout ca pour voir… entre temps j’ai essayé sur ubuntu 8 et j’ai le même problème pour sauver les fichiers. je dois pas faire une chose comme il faut???
Important: je suis en train de tester ce serveur et autres sur Vmware Server.
[...] l’installation de base, il suffit de suivre le tuto d’installation d’un serveur ubuntu, en s’arrêtant juste avant l’install de lighttpd qui n’est pas nécessaire ici [...]
Bonjour
Merci de la réponse. Je dois prendre un hebergeur et j hesite entre un mutualiste et gandi ( ca serai une part ) . ( jhesite avec mavenhosting, ou bien hostgator hostpapa voir ovh peut etre en mutuel ( les plans a 5, 7 euros par mois .. je dois faire des présentations d’une 20 de sites différentes .. il me faudra donc un truc simple pour moi qui ne suit pas un pro, mais avec un mininum de sécurité quand même…je suis attiré par gandi et ce systeme ( juste par le fait de la sécurité ) mais je ne pense pas que ce soit lidéal pour moi gandi , d’abord parce que vec une part cela risque de ne pas etre suffisant et ramer , ensuite aussi le fait pour installer des cms ( meme si ce nest pas trop compliquer. ) cms comme elgg ou dolphin .
il me faut des bases de données
Je viens e voir sur le forum certain qui se plaigne encore des lenteurs et cela avec une part ou 2 parts ( 2 parts la ca commence a faire chère ..) ce qui mattire chez gandi cest le fait de monter en puissance sans sans changer ( si un jour mes sites prennent bcp d’importance jaurai pas besoin de tout viré sur un dédié .. mais bon la je vois pas mal de mauvais retour de gandi qui parle de lenteur avec une part …( et pire avec des joomla, wordpress etc
je viens d’aller plusieurs sites qui sont heberger avec gandi et ben franchement je vois que leur page ne s’affiche pas instantanément.. ( on se croirait chez les hebergeur USA avec un temps de latence )..
Finalement j’ai pris un deux parts gandi et migré un de mes sites qui était RPS ovh dessus. On va voir avec le temps ce que cela donne. Ce qui m’intéresse le plus c’est effectivement de pouvoir grandir à volonté, même si c’est un peu plus cher.
Ensuite je migrerait mon second RPS (celui de ce blog) vers le deux part gandi aussi.
Sur ovh, j’ai trop souvent l’impression d’avoir les disques qui rament, je ne l’ai pas encore remarqué sur gandi avec ce nouveau serveur.
Bonjour,
Merci pour ce tuto que je me suis déjà tapé 2 fois pour cause, disons, d’incompétence
L’avantage de Gandi c’est qu’on peut détruire puis refaire un serveur, profitons-en pour apprendre.
J’ai tout fait sauf ligththttpd car si je m’échine à me monter mon propre serveur, c’est pour 2 raisons:
- je veux utiliser les certificats SSL Gandi, il y a des tutoriaux pour Apache2, pour lighthttpd je sais pas (j’ai pas cherché, je serai intéressé de savoir si c’est possible d’ailleurs …) donc j’ai pris Apache.
- ensuite ce qui m’a tout cassé, c’est que j’ai tenté de chrooter (oh le bel anglicisme) SFTP … j’ai réussi, plus personne ne pouvait se connecter, j’ai même pas réussi à revenir en arrière avec la console d’urgence … J’utilise ce tuto: http://www.debian-administration.org/articles/590 … mais il y a quelque chose qui doit m’échapper !!!
L’idée générale est de créer un utilisateur, qui aurait son dossier dans par ex dans /home/user, à l’intérieur duquel il pourrait faire ce qu’il veut en SFTP sans pouvoir aller ailleurs. Les sites rattachés à cet utilisateur pourrait être dans des dossiers du genre /home/user/site1.tld et /home/user/site2.tld, donc un seul user pourrait avoir X sites lui étant rattachés. N’étant pas un expert, je me pose des questions du genre:
- « ou est exactement /home » chez Gandi, sur le disque de 3gb ou sur le disque rattaché « , et en fonction de ça, quel dossier il vaut mieux utiliser pour regrouper tous ces users …
- « comment restreindre le user à son dossier en SFTP »
Votre tuto étant très orienté « sécurité », je me suis permis de vous poser ces questions … Il serait intéressant de le compléter par un tuto SSL car un des gros intérêts de gandi est la fourniture de vrais certificats SSL pas chers pour sécuriser des admin, des trucs non commerciaux ! Merci d’avance !
Pierre
Re
J’oubliai une question additionnelle sur le tuto lui-même:
Est-ce que /srv/nomduvolumechoisi == /srv/nomdurepertoiregandi ?
Mci Pierre
Un grand merci pour ce tuto très pratique et concis…
(j’ai juste gardé Apache au lieu de lighttpd, car ce dernier ne prend pas les .htaccess. Pas pratique quand il y a beaucoup de sites à gérer…)
Pour info: j’utilise plusieurs serveurs chez Gandi et Apache + mysql + php passe bien pour des petits sites sur une seule part, par exemple j’ai un serveur 1 part avec un site sous joomla qui tourne sans ramer…(une petite centaine de page).
@Pierre : cette question du chroot me préoccupe aussi? J’ai trouvé ces liens qui peuvent t’interesser :
http://ubuntuforums.org/showthread.php?t=248724
http://www.howtoforge.com/chrooted_ssh_howto_debian
(je vais tester le premier de ce pas…)