Isyweb est fermé et ne propose plus aucun de ses services !

Installer et sécuriser un serveur web complet, mail et ftp sur Debian 10 Buster

Installer et configurer l'application serveur linux : Installer et sécuriser un serveur web complet, mail et ftp sur Debian 10 Buster

Ce tutoriel est compatible avec les distributions suivantes : DebianDebian

Tutoriel

Ce tuto est plus une liste de commandes. Il est fait de manière à mettre sur pied un serveur web (avec serveur mail, serveur ftp, et quelques protections de bases) en un temps record.


Nous allons lister une série de commandes à écrire en SSH. Elles sont pratiquement toutes suffisamment explicite pour se passer de les commenter. Vous pouvez tout faire sous votre compte root. ("# command" signifie que vous
distrib
010000
devez entrer "command" dans votre client SSH; putty par exemple; sous un compte root)

Si vous ne pouvez-pas utiliser le compte root pour une raison quelconque; vous pouvez tenter de sudoïser votre compte utilisateur :
éditez le fichier : /etc/sudoers
et ajoutez une ligne telle que ceci : monlogin ALL=(ALL) NOPASSWD: ALL
Ceci vous permettra d'utiliser la commande "sudo" sans devoir mettre de mot de passe à chaque fois.

Notez bien que si vous ne faites pas les commandes suivantes sous root, il faudrait ajouter "sudo" devant chacune de ces commandes.



1) C'est parti !

Changez votre mot de passe root fourni par votre hébergeur



# passwd

# echo > /root/.ssh/authorized_keys
Ou videz le dossier : /etc/ssh/ des fichiers ssh_host*

# rm -rf /root/scripts-d-initialisation-de-votre-hebergeur

Changez vos serveurs dns



# nano /etc/resolv.conf
Remplacez par ceux que vous souhaitez, par exemple :
nameserver 1.1.1.1 #rapide
nameserver 1.0.0.1 #rapide
#nameserver 9.9.9.9 #securise
#nameserver 149.112.112.112 #securise


Mises à jours et installations diverses



# apt-get update

# apt-get install aptitude

# aptitude update && aptitude full-upgrade

# date

Vérifiez que la date est correcte, sinon mettez-la à jour avec :

# dpkg-reconfigure tzdata

Si besoin, modifiez votre .bashrc


Via http://bashrcgenerator.com/ pour ajouter de la couleur ou activer des alias (exemple : alias ll='ls -lah’)

# nano ~/.bashrc

# source ~/.bashrc

# nano /etc/ssh/sshd_config
Modifiez le port SSH : Port 15839 (Attention, pensez à vous connecter à ce port à l’avenir)


Changez le nom d’hôte



# nano /etc/hostname
Ajoutez :
monsite.com

# nano /etc/hosts
Ajoutez ou vérifiez :
127.0.0.1 localhost
111.222.333.444 monsite.com monsite




Installation de divers paquets pour serveur web


# aptitude install unzip gcc mutt make ftp bzip2 curl perl openssl locate htop exim4 vnstat



Configurez votre serveur mail EXIM4 (pour postfix, allez plus bas)



# dpkg-reconfigure exim4-config
Utilisez un serveur internet, ne minimalisez pas les requêtes DNS, ne relayez aucun serveur externe.

(Optionnel) Désactivez la gestion IPV6 qui cause parfois des problèmes :
# nano /etc/exim4/update-exim4.conf.conf
Ajoutez :
dc_disable_ipv6='true'


# update-exim4.conf afin de recharger la configuration

# nano /etc/aliases
Modifiez éventuellement :
root : [email protected]


# newaliases

# nano /etc/mailname
monsite.com

# /usr/lib/sendmail -f [email protected] -v [email protected]
Entrez un texte et envoyez le mail via "CTRL+D"
..
Que dit le log, cela s’est bien passé ?

Quittez via "CTRL+C".




Générez une clé DKIM (pour EXIM4)


# openssl genrsa -out monsite.com.dkim.pkey 1024

# openssl rsa -in monsite.com.dkim.pkey -pubout -out monsite.com.dkim.key

# mkdir /etc/exim4/keys

# cp monsite.com.dkim.pkey /etc/exim4/keys/

# chown root:Debian-exim -R /etc/exim4/keys

# chmod 0644 /etc/exim4/keys/monsite.com.dkim.pkey

Ensuite créez un enregistrement DNS de type TXT avec un selecteur au hazard, par exemple :
exemple._domainkey IN TXT "k=rsa; p=PUB_KEY"
Veillez à remplacer PUB_KEY par votre clé publique (monsite.com.dkim.key) en pensant a supprimer retour chariot ou espace.

# nano /etc/exim4/exim4.conf.template
Ajoutez/Vérifier ceci :

IGNORE_SMTP_LINE_LENGTH_LIMIT = 1
REMOTE_SMTP_HELO_DATA=monsite.com
DKIM_CANON = relaxed
DKIM_DOMAIN = ${sender_address_domain}
DKIM_FILE = ${if exists{/etc/exim4/keys/${sender_address_domain}.dkim.pkey}{/etc/exim4/keys/${sender_address_domain}.dkim.pkey}{0}}
.ifdef DKIM_FILE
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
.endif
DKIM_SELECTOR = exemple #pour exemple._domainkey c'est donc : exemple
DKIM_STRICT = false # optional ; false= pass if no key available

Veillez toujours à remplacer "monsite.com" !






Installer POSTFIX comme serveur mail (plutot que exim4)



# aptitude install postfix
(Si nécessaire, répondez : "Site Internet" et "monsite.com".

# dpkg-reconfigure postfix
Répondez "Site Internet" ensuite "monsite.com" (ou mail.monsite.com, comme le hostname, sous une IP non masquée par cloudflare ou autre)
Il vous sera ensuite demandé où envoyer les mails système, répondez root (ou bien monlogin si vous en avez fait un).

Après, renseignez les domaines vers lesquels vous souhaitez recevoir des emails sur ce serveur : monsite.com, mail.monsite.com, localhost
Ensuite, cliquez "Oui" pour forcer les mises à jours synchrones.
Les machines à relayées : localhost, 127.0.0.1, ... (vous pouvez ajouter des IP externes si besoin, mais faites attention !!)
Limitez la taille si besoin, sinon 0.
Finalement, choisissez le protocol souhaité : tous (par défaut), ipv4 only ou ipv6 only.

# echo "Le contenu du mail" | mail -s "ceci est le sujet" [email protected]

# cat /var/mail/monlogin
Vous devriez voir votre email... Ceci est une distribution locale... donc ça fonctionne facilement !

Mais si ça ne fonctionne pas, vous pouvez vérifier les logs :
# tail -f /var/log/mail.log

Testez ensuite d'envoyer un mail à l'extérieur, sur votre gmail ou autre... Si tout est OK... c'est fait !


Si vous souhaitez recevoir tous vos email directement sur votre gmail, faites ceci

# nano /etc/aliases
et modifiez la ligne root pour :
root: [email protected]
# newaliases
pour mettre à jour les alias.



Générez une clé DKIM (pour POSTFIX)


# aptitude install opendkim opendkim-tools

# mkdir -p /etc/opendkim && cd /etc/opendkim/

# opendkim-genkey --directory /etc/opendkim/ --domain=monsite1.com --selector=mail --verbose && rename 's/mail/monsite1/' *
Répétez ceci pour tous vos nom de domaines. (modifiez monsite1.com et monsite1)

# nano /etc/opendkim/KeyTable
Ajoutez quelque chose adapté à vos sites :
mail._domainkey.monsite1.com monsite1.com:mail:/etc/opendkim/monsite1.private
mail._domainkey.monsite2.com monsite2.com:mail:/etc/opendkim/monsite2.private


# nano /etc/opendkim/SigningTable
Ajoutez quelque chose adapté à vos sites :
monsite1.com mail._domainkey.monsite1.com
monsite2.com mail._domainkey.monsite2.com/i>

# chown opendkim:opendkim -R /etc/opendkim

# nano /etc/opendkim.conf
Ajoutez/Vérifiez :
Domain monsite1.com,mail.monsite.com,monautresite.com
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
Selector mail
AutoRestart Yes
AutoRestartRate 10/1M
DNSTimeout 5
Socket inet:[email protected]
UserID opendkim


# nano /etc/postfix/main.cf
Ajoutez/Vérifiez :
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters
message_size_limit = 51200000
inet_protocols = ipv4


# cat /etc/opendkim/mail.txt
Copiez le résultat de cette commande

Ensuite créez un enregistrement DNS de type TXT avec un selecteur au hazard, par exemple :
mail._domainkey IN TXT "k=rsa; p=PUB_KEY"
Veillez à remplacer PUB_KEY par votre clé publique (ce que vous avez copié juste avant)
Il se peut que vous devez ajouter l'enregistrement : mail._domainkey.subdomain avec la même valeur, ainsi que des enregistrements semblables pour vos autres domaines.

Ajoutez postfix dans le groupe opendkim, gérez les droits et redémarrez le serveur mail
# chown opendkim:opendkim -R /var/run/opendkim
# adduser postfix opendkim
# systemctl restart opendkim
# systemctl restart postfix
Si tout va bien, vous avez votre dkim fonctionnel, vérifiez via des outils en ligne et inspectez vos log.

Vous pouvez également tester votre clé DKIM via cette commande :
# opendkim-testkey -d monsite.com -s mail -vvv




Ajoutez un SPF


Super facile, ajoutez un enregistrement DNS de type TXT encore, comme ceci (remplacez par votre IP serveur) :
@ IN TXT "v=spf1 ip4:MONIP ~all"

Ajoutez un DMARC


Tout aussi simple que le SPF, ajoutez un enregistrement DNS de plus (remplacez par votre email:
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; sp=none"

Vérifiez et testez votre serveur mail


Plus d'infos ici : Configurer son serveur email avecc SPF DKIM DMARC

Installation du serveur Apache et configuration d’un site web sur Apache 2.4



# aptitude install apache2 php7.4 php7.4-dev php7.4-gd php7.4-curl php7.4-bcmath php7.4-mysql php7.4-opcache php-apcu php-pear

If you need to install some PHP extensions, do it in this way : (mcrypt for example)
# pecl install mcrypt-1.0.2

# nano /etc/apache2/conf-available/security.conf
Décommentez/ajoutez/modifiez :
ServerTokens Prod
ServerSignature Off


# a2enmod cgi rewrite expires headers mod_reqtimeout

# nano /etc/apache2/mods-available/mpm_prefork.conf
Ajoutez/Vérifier ceci, à adapter selon vos besoins et le serveur (voir avec par exemple "apache2buddy") :

<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 200
ServerLimit 200
MaxConnectionsPerChild 0
</IfModule>


# nano /etc/apache2/apache2.conf
Vérifiez/modifiez :
Timeout 30
<Directory /var/www/>
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>


# nano /etc/apache2/mods-available/reqtimeout.conf
Vérifiez/modifiez :
<IfModule mod_reqtimeout.c>
RequestReadTimeout header=10-20,MinRate=500 body=10,MinRate=500
</IfModule>

# nano /etc/apache2/sites-available/monsite.conf
Ajoutez :
<VirtualHost *:80>
ServerName www.monsite.com
ServerAdmin [email protected]
DocumentRoot /var/www/monsite
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/monsite>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>


# a2ensite monsite

Si vous souhaitez ajouter HTTPS à votre site, vous pouvez suivre ces bons conseils :

# a2enmod ssl

# aptitude install certbot python-certbot-apache

Si vous utilisez (ou comptez utiliser) cloudflare, installez aussi ce paquet :

# aptitude install python3-certbot-dns-cloudflare
et lisez ceci à l'aide de google traduction car ceci nécessitera une connexion par API: https://certbot.eff.org/docs/using.html#dns-plugins

# certbot --dns-cloudflare --dns-cloudflare-credentials ~/.secret/.mdp-cloudflare-API.txt -d monsite.com,www.monsite.com

(ajoutez une tâche cron une fois par jour : crontab -e -> 1 1 * * * certbot renew --quiet )

Pour parfaire la sécurité, il serait intéressant d'installer un WAF (Web-Application Firewall), tel que mod_security2 et facultativement mod_qos, qui pourrait aider lors de certaines attaques DDOS... mais pourrait faire "double-emploi" avec le module reqtimeout.il semblerait que mod_qos soit contre performant au coté de mod_reqtimeout.

Pour mod_security, c'est parti :
# aptitude install libapache2-mod-security2
ensuite on copie la configuration par defaut
# cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

# nano /etc/modsecurity/modsecurity.conf
Ajoutez/vérifiez :
SecRuleEngine On
SecResponseBodyAccess Off
SecRequestBodyLimit 1024000 #pour des upload de 1mb max
<Directory /var/www/monsite/DossierSecretPourAdminerOuAutre/>
SecRuleEngine Off
</Directory*>


# a2enmod security2 && systemctl reload apache2
Après avoir ajouté le mod et redémarré apache2; on peut tester !

# curl localhost/index.html?exec=/bin/bash
Devrait afficher une erreur 403.
# tail -f /var/log/apache2/error.log
devrait nous montrer un "ModSecurity: Warning".


Pour mod_qos :
# aptitude install libapache2-mod-qos

# nano /etc/apache2/mods-available/qos.conf
Ajoutez en fin de fichier :
<IfModule mod_qos.c>
QS_ClientEntries 100000
#vérifie jusqu'a 100000 ips
QS_SrvMaxConnPerIP 50
#max 50 connections par ip
MaxClients 256
#max 256 ip differentes
QS_SrvMaxConnClose 180
#desactive keep-alive lorsqu'on atteint 180 ip differentes connectees
QS_SrvMinDataRate 150 1200
#requière minimum 150 bytes/secondes et limite a 1200 bytes/secondes lorsque MaxClients est atteint
</IfModule>


# a2enmod qos && systemctl reload apache2





Installation du serveur FTP



# aptitude install proftpd

# adduser monlogin -shell /bin/false -home /var/www/monsite

# nano /etc/proftpd/proftpd.conf
Ajoutez/Modifiez :
ServerName "Mon serveur FTP"
TimeoutStalled 3600
ListOptions "-latr"
AllowStoreRestart on


Décommentez :
RequireValidShell off




Installation de MySQL - MariaDB



# aptitude install mariadb-server

# mysql_secure_installation
Appuyez "enter" à la première question, ensuite, oui et entrez votre mot de passe root, puis répondez oui à toutes les questions suivantes.

Maintenant on va configurer un utilisateur avec tous les privilèges :

# mysql -uroot -p
Entrez votre mot de passe root puis saisissez ces 4 lignes de commande une à une dans le terminal mysql :

CREATE USER 'monsite' IDENTIFIED BY 'monpass';
GRANT ALL PRIVILEGES ON *.* TO 'monsite'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Ensuite, vous pouvez installer phpmysql ou plus simplement utiliser une page tel que adminer pour administrer vos bases de données.
Si vous utilisez adminer, pensez à sécuriser le dossier par htpasswd dans un dossier secret et de nom complexe dans lequel il se trouve.



Installation du monitoring serveurs



# aptitude install logwatch monit A ce jour, MONIT n'est toujours pas dispo pour debian 10 (utilisez les scripts shell fournis)

# nano /etc/monit/conf.d/isy
Créez ce fichier (configurez-le, au moins l’email et login :pass et disques !):
set daemon 60
set logfile syslog facility log_daemon
set mailserver localhost
set mail-format {
subject: [Monit] $HOST - $SERVICE $EVENT
}
set alert [email protected]
set httpd port 22334 #monit sera accessible via http://monsite.com:22334
allow monlogin:pass #vous pouvez aussi mettre allow @groupAdmin si vous avez un groupe unix
check system $HOST
if loadavg (5min) > 3 then alert
if memory usage > 80% for 4 cycles then alert
# Apache2
check process apache2 with pidfile /run/apache2/apache2.pid
group www-data
start program = "/bin/systemctl start apache2"
stop program = "/bin/systemctl stop apache2"
if failed host 127.0.0.1 port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout
# MySQL
check process mysqld with pidfile /run/mysqld/mysqld.pid
group database
start program = "/bin/systemctl start mysqld"
stop program = "/bin/systemctl stop mysqld"
if failed host 127.0.0.1 port 3306 then restart
if 5 restarts within 5 cycles then timeout
# Disques (configurez votre disque selon le chemin indiqué via la commande : df)
check device rootfs with path /dev/sda1
if space usage > 80% then alert
group system




Installation de fail2ban



# aptitude install fail2ban

# nano /etc/fail2ban/jail.d/myjails.conf

Créons une jail supplémentaire pour les erreurs 408 (tel que bloquées par mod_req_timeout)
# nano /etc/fail2ban/filter.d/apache-408.conf
Ajoutez ceci :

# Fail2Ban filter to block web requests ended by a 408 error
[Definition]
failregex = ^ -.*"(GET|POST|HEAD) .*" 408 .*$


Configurez vos prisons à activer et ajoutez par exemple, en général ou sur un module précis :
[DEFAULT]
bantime = 60m
findtime = 10m
[sshd]
enabled = true
port = 65000
maxretry = 3
bantime = 20000
findtime = 3600
[apache-auth]
enabled = true
[apache-noscript]
enabled = true
[apache-overflows]
enabled = true
[apache-nohome]
enabled = true
[apache-botsearch]
enabled = true
[apache-modsecurity]
enabled = true
[apache-shellshock]
enabled = true
[php-url-fopen]
enabled = true
[proftpd]
enabled = true
[mysqld-auth]
enabled = true
[apache-408]
enabled = true
maxretry = 3
bantime = 5m
findtime = 1m
port = http,https
logpath = %(apache_access_log)s



Rechargez la nouvelle configuration :
# systemctl reload fail2ban

Vous pouvez vérifier vos jails :
# fail2ban-client status
ou un jail en particulier, tel que : fail2ban-client status sshd





Configuration muttrc



# nano ~/.muttrc
Créez ce fichier (en remplaçant votre nom/ email) :
set from="monsite.com <[email protected]>"
set date_format="%A %d %b %Y à %H:%M:%S (%Z)"
set attribution="Le %d, %n a écrit :"
set forward_format="[Fwd: %s]"
set forward_quote
set pager_index_lines=7
set pager_stop
set copy = no




Installation d’un script de backup des sites et du serveur



Si vous possédez le script de backup Isyweb, installez le comme ceci :

# wget http://machin/scriptbackup.sh (désolé pour ceux qui ne l’ont pas, le script n’est plus disponible... Voir un peu plus bas !)

# nano scriptbackup.sh
Configurez nom du site, serveur, email, heure cron, ftp, …

# sh scriptbackup.sh

# rm scriptbackup.sh


Si vous n'avez pas le script, un simple backup chaque heure de votre base de données pourrait être une simple ligne dans cron :
# crontab -e
Ajoutez :

10 * * * * mysqldump mabase | gzip > /chemin/local/secret/$(date +\%H)H_mabase.backup.sql.gz




Configurez un service anti-DDOS


Enregistrez-vous et protéger votre IP en bypassant vos visiteurs par CloudFlare (ou un autre service équivalant).

Cela peut apporter une sécurité supplémentaire et une facilité pour certaines choses, par exemple le changement d'IP(DNS) qui peut être instantané en cas de changement de serveur.

Cependant il peut arriver que l'IP client ait une IP CF... Petit correctif :
# aptitude install apache2-dev libtool git

# wget https://www.cloudflare.com/static/misc/mod_cloudflare/mod_cloudflare.c

# apxs -a -i -c mod_cloudflare.c

# systemctl restart apache2



Pour chipoter un peu, on peut améliorer quelques petits détails :
# nano /etc/sysctl.conf
Ajoutez ceci :
# Enable IP spoofing protection, turn on Source Address Verification
net.ipv4.conf.all.rp_filter = 1
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Decrease TIME_WAIT seconds
# (default: 60)
net.ipv4.tcp_fin_timeout = 30
# Recycle and Reuse TIME_WAIT sockets faster
# (default: 0)
net.ipv4.tcp_tw_reuse = 1
# KeepAlive interval: determines the wait time between isAlive interval probes.
# (default: 75 seconds, recommended: 15-30 seconds)
net.ipv4.tcp_keepalive_intvl = 30
# KeepAlive probes: determines the number of probes before timing out
# (default: 9, recommended 5)
net.ipv4.tcp_keepalive_probes = 5
# Disable timestamps to avoid 12 byte TCP header overhead
# (default: 1)
net.ipv4.tcp_timestamps = 0
# Disable selective acknowledgements
# (default: 1)
net.ipv4.tcp_sack = 0
# Enable window scaling
# (default: 1)
net.ipv4.tcp_window_scaling = 1


Charger les changements :
# sysctl -p


Un supplément anti-ddos serait intéressant... Via un tas de règles iptables ou via un outil tel que : ddos-deflate.
Mais vite-fait, deux petites règles iptables pour exemple (bloquer plus de 50 connections d'une même IP sur HTTPS ou plus de 20 connections sur le port 443)
# iptables -A INPUT -p tcp --syn --dport 8443 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
# iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT --reject-with tcp-reset

Et n'oubliez pas d'installer le petit truc qui va bien pour sauver vos règles
# aptitude install iptables-persistent
Ensuite, pour sauvegarder :
# netfilter-persistent save

... Après il faut s'arrêter et souffler un peu... ou bien aussi installer un petit load-balancer, type HAproxy??? hum... on verra !

Fini !


Redémarrez, votre serveur Debian 10 Buster est prêt à la production et complètement configuré!
# reboot

Envoyez vos fichiers via FTP, créer un utilisateur sql, des bases de données ou importez vos bdd avec adminer
Vous pouvez par exemple envoyer un fichier directement par SSH de votre ancien serveur vers le nouveau avec : # sudo rsync -azP -e 'ssh -p PORT-SSH-SECRET' /home/mondossier-ou-fichier/ [email protected]:/home/mondossier/
NB : finissez bien vos dossiers par un '/' final, sinon vos fichiers cachés risque de ne pas être copiés


Et vous devriez, à présent, avoir accès à votre site et tout le reste.

Par la suite il peut être intéressant d'installer mysqltuner et d'adapter certaines valeurs de fonctionnement :
# wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl && perl mysqltuner.pl --user root --pass MONPASSSQL

Et également apache2buddy :
# curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl

Bonne chance !



Revenir aux listes des applications Linux

Créer un site web avec Isyweb.com © 1999 - 2020 - Tous les prix affichés sur Isyweb.com sont HTVA