mercredi 12 juillet 2017

Uncomplicated firewall

Dans cet article nous verrons ensemble quelques commandes pour utiliser UFW sans se casser la tête. Ici seront détaillées que quelques cas très basiques, UFW est bien plus complet et permet des choses plus poussées.

Nous allons partir du début en installant UFW:
sudo apt install ufw

En suite, par défaut, il faut rejeter l'ensemble du trafic et puis enfin créer les règles pour autoriser uniquement les ports dont nous avons besoin.
Pour tout rejeter:
sudo ufw default deny

Pour continuer, il peut être "utile" de se permettre un accès en ssh depuis le réseau local. Pour ce faire, modifier la commande suivante si votre réseau local n'est pas 192.168.0.0/24 afin que vous ne vous bannissiez pas de votre propre serveur (ce serait fâcheux, ça m'est arrivé par erreur et ça fait tout drôle --face palm--):
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22

Enfin, partons du principe que le serveur doit pouvoir recevoir le trafic depuis internet sur le port 443 pour le https:
sudo ufw allow 443/tcp

Cette commande est à modifier et répéter pour tous les autres services qui doivent être atteints depuis tout l'internet mondial.

Pour terminer la mise en place initiale d'UFW, il faut l'activer. Attention à bien vérifier les règles pour être certain de ne pas vous enfermer à l'extérieur de votre serveur...
sudo ufw enable

Ensuite, il peut arriver après quelques temps que vous vous souveniez plus trop des règles que vous avez mis en place. Et donc il est possible d'afficher un résumé comme ça:
sudo ufw status

Pour avoir une liste des règles numérotées (utile pour la gestion des règles), il est possible d'utiliser la commande suivante:
sudo ufw status numbered

Et puis, en lisant les logs du serveur, il peut arriver que des petits skriptkiddie soient un peu trop insistants, trop agressifs ou tout simplement trop entreprenants. Il peut être utile de bloquer leur ip. Cela ne découragera que les moins aguerris, mais pour ce que je dois protéger, pas besoin d'en faire plus. A voir ce que vous vous devez protéger.
sudo ufw insert 1 deny from [ip-to-block] to any

Dans cette commande, nous demandons d'insérer la règle en première position. En effet, UFW donne priorité aux règles en fonction de leur position dans la liste des règles. la règle la plus haute prime sur la règle la plus basse. Ainsi, si on autorise tout le trafic sur le port 443, comme dans notre exemple, et que cette règle est située en position 1, il se sera pas possible de bloquer une ip. A chaque fois qu'on fait une règle particulière, il faut donc s'assurer qu'elle figure au dessus des règles générales. Pour connaitre les règles actuelles et leur ordre, il faut utiliser "ufw status" (voir ci-dessus).

Avec le temps il peut être utile de supprimer une règle. Ainsi, après avoir pris le numéro de la règle à effacer (voir ci-dessus), on peut la supprimer:
sudo ufw delete [numéro de la règle]

Attention cependant lorsque vous traitez un nombre de règles, chaque fois que vous supprimez une règle, l'ordre et donc le numéro des règles change... Donc vérifier après chaque manipulation avec les numéros des règles.

mardi 2 mai 2017

Mise à jour manuelle d'un serveur Nextcloud 11

Dans ce tuto, nous allons voir comment mettre à jour notre serveur Nextcloud installé dans un tuto précédent. Si vous tentez la mise à jour avec l'updater, il y aura un certain nombre d'erreurs qui ne permettront pas de terminer le processus de mise à jour automatique. Certaines de ces erreurs peuvent être corrigées rapidement et facilement, d'autres nécessitent plus de recherches et des compétences que je ne possède pas...
Ainsi, il est préférable de laisser tomber l'update automatique, aussi pratique soit-elle, pour utiliser la méthode manuelle. Ce tuto n'est finalement qu'une traduction de la page de la documentation officielle, avec quelques ajustements pour notre configuration.

1) La bonne pratique veut que nous fassions une mise à jour:
sudo apt-get update
sudo apt-get dist-upgrade

2) Une autre bonne pratique est de créer une image de notre carte sd afin de pouvoir la restaurer facilement en cas de besoin.
Pour ce faire, nous allons arrêter le Raspberry pi, enlever la carte sd, la brancher sur notre Linux préféré et en faire une image. Commençons par éteindre le pi.
sudo poweroff

Sur notre ordinateur muni d'une distribution Linux (pour les autres OS, débrouillez-vous, c'est tout aussi facile), il faut lister les disques, puis brancher la carte sd puis lister à nouveau les disques. Ainsi, il est facile de voir quel est le disque à cloner.
df -h
(brancher la carte sd)
df -h

Le résultat ressemble à "/dev/mmcblk0p1" ou "/dev/sdb1". Le dernier numéro tel que "p1" ou "1" est le numéro de partition. Comme nous voulons une image de la carte entière, il faut utiliser "/dev/mmcblk0" ou "/dev/sdb".

Dans un terminal, taper la commande suivante (à modifier en fonction de l'étape précédente) et attendre, cela peut être assez long en fonction de la taille de la carte:
sudo dd if=/dev/sdb of=~/SDCardBackup.img

Voilà, maintenant, quoi qu'il arrive, il est possible de revenir à cette image et de retrouver un système qui fonctionne parfaitement. Passons donc à la mise à jour de Nextcloud.

3) Faire un backup du fichier config.php (éventuellement du dossier contenant les données, ce qui est inutile si les données sont ailleurs que dans le dossier de Nextcloud)
Créer un dossier bkp qui contiendra le backup:
cd /var/www
sudo mkdir bkp
sudo cp /var/www/nextcloud/config/config.php /var/www/bkp

4) Télécharger la dernière version de Nextcloud
sudo wget https://download.nextcloud.com/server/releases/nextcloud-[version].zip

5) Maintenant nous entrons dans le vif du sujet, il faut mettre Nextcloud en mode maintenance:
cd /var/www/nextcloud
sudo -u www-data php occ maintenance:mode --on

6) Arrêter le serveur apache
sudo /etc/init.d/apache2 stop

7) Renommer le dossier de l'installation courante de Nextcloud, par exemple par nextcould-old.
sudo mv /var/www/nextcloud /var/www/nextcloud-old

8) Décompresser l'archive téléchargée à l'étape 4 dans le dossier /var/www.
cd /var/www
sudo unzip nextcloud-[version].zip

9) Des fichiers contenus dans l'ancienne installation sont encore utiles. Nous allons les copier de l'ancienne installation vers la nouvelle.
Copier le fichier config.php de l'ancienne installation dans la nouvelle installation.
sudo cp /var/www/bkp/config.php /var/www/nextcloud/config

Si vous avez suivi le tuto précédent pour l'installation, vous n'êtes pas concernés par ce qui suit, passez directement à l'étape 10. Sinon, vérifiez si votre dossier contenant les données est dans votre installation, il faut le copier de l'ancienne installation vers la nouvelle (nextcloud-old/data -> nextcloud/data).

10) Si vous utilisez des applications tierces, et qu'elles ne se trouvent pas dans la nouvelle installation (nextcloud/apps), il faut les copier depuis l'ancienne installation. Une fois fait, vérifiez les permissions afin qu'elles soient identiques à celles de l'ancienne installation. Pour ma part j'utilise les applications calendar et contacts, si vous en utilisez d'autres, il faut répéter l'opération pour chacune d'elle.
sudo cp -r /var/www/nextcloud-old/apps/calendar /var/www/nextcloud/apps/
sudo cp -r /var/www/nextcloud-old/apps/contacts /var/www/nextcloud/apps/

11) Il ne reste qu'à définir les permissions et l’appartenance des fichiers.
sudo chown -R www-data:www-data nextcloud
sudo find nextcloud/ -type d -exec chmod 750 {} \;
sudo find nextcloud/ -type f -exec chmod 640 {} \;

12) Démarrer le serveur web et se déplacer dans le dossier de la nouvelle version de nextcloud.
sudo /etc/init.d/apache2 start
cd /var/www/nextcloud

13) A présent il faut lancer la mise à jour en utilisant occ.
sudo -u www-data php occ upgrade

La mise à jour peut prendre quelques minutes à plusieurs heures en fonction de la taille de l'installation. Si vous suivez ce tutoriel pour le raspberry pi, comptez plutôt quelques minutes... ;) Normalement tout doit bien se passer et un message de réussite s'affiche.



Dans le cas contraire, un message d'erreur vous indiquera ce qui s'est mal passé.

14) En partant du principe que tout s'est bien passé, nous désactiver le mode maintenance.
sudo -u www-data php occ maintenance:mode --off

Nous pouvons à présent nous connecter dans notre nouvelle version de Nextcloud. Une bonne idée serait de se connecter avec un compte admin et de vérifier la version de Nextcloud sur la page d'admin. Se rendre ensuite sur la page des apps et ré-activer les applications.

15) Faisons encore juste un peu de ménage.
sudo rm -r /var/www/bkp
sudo rm -r /var/www/nextcloud-[version].zip
sudo rm -r /var/www/nextcloud-old

dimanche 26 mars 2017

Installation de Nextcloud sur un Raspberry Pi

Dans ce tuto, nous allons installer Nextcloud, fork de ownCloud, sur un raspberrypi. Les données seront stockées sur une clé usb, la base de donnée utilisée est mariadb la version de php installée sera php7. Le serveur sera securisé grâce à fail to ban et ufw (uncomplicated fire wall). La connexion sera sécurisée grâce à un certificat let's encrypt. Ce tuto part du principe que vous avez déjà un nom de domaine. Si vous n'en avez pas, vous pouvez utiliser no-ip ou un autre fournisseur de ce type de service et adapter le tuto à vos besoins (très simple).

Premièrement la clé usb qui acceuillera vos données doit etre insérée et montée automatiquement à chaque (re)boot.

1) Brancher votre clé ou votre disque externe.

2) Ma clé était formatée en NTFS, installons le paquet qui permet de travailler avec ce système de fichiers:
sudo apt-get install ntfs-3g

3) Créer le répertoire qui va accueillir le "mount" du disque:
sudo mkdir /media/cloudata

4) Monter le disque dans notre répertoire fraichement créé au point précédent (cette commande est valable pour le système de fichiers NTFS, pour tout autre système de fichier que vous souhaitez utiliser, changer la commande comme il se doit):
sudo mount -t ntfs-3g -o uid=1000,gid=1000,umask=007 /dev/sda1 /media/cloudata

5) Trouver le UUID du disque USB que nous venons de brancher au point 18, c'est une suite de chiffres ressemblant à ça:4264E66D64E66361 normalement en bleu et associé à sda1 avec la commande ci-dessous:
ls -l /dev/disk/by-uuid/

6) Si comme moi, vous êtes nul et que vous avez de gros doigts gras qui ne vous obéissent pas toujours comme vous le souhaiteriez, choisir la sécurité et faire un backup du fichier fstab:
sudo cp /etc/fstab /etc/fstab.backup

7) Editer fstab et ajouter le UUID de votre clé ou disque externe USB que vous avez trouvé au point 22 (vous suivez?):
sudo nano /etc/fstab

Ne pas effacer ce qui est déjà dans le fichier, mais copier-coller cette ligne tout en bas (remplacer le UUID de cette ligne par celui de votre disque)
UUID=4264E66D64E66361 /media/owncloud ntfs-3g uid=1000,gid=1000,umask=007 0 0

8) Reboot du Pi et vérifier si la clé est montée correctement
mount

9) Installer Apache2
sudo apt-get install apache2 -y

10) Pour installer PHP7 il faut ajouter le dépôt
sudo nano /etc/apt/sources.list

11) ajouter la ligne suivante
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi

12) Créer un fichier pour continuer
sudo nano /etc/apt/preferences

13) Coller ces lignes
Package: *
Pin: release n=jessie
Pin-Priority: 600

14) Installer php7 et tout ce qu'il faut pour que la cache soit activée et que ça fonctionne avec mariadb, exécuter les commandes suivantes dans l'ordre:
sudo apt-get update
sudo apt-get install -t stretch php7.0 php7.0-curl php7.0-gd php7.0-fpm php7.0-cli php7.0-opcache php7.0-mbstring php7.0-xml php7.0-zip -y
sudo apt-get install php7.0-APC -y
sudo apt-get install mysql-server php7.0-mysql -y
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.0-fpm
sudo service apache2 reload
sudo apt-get install libxml2-dev php-zip php-dom php-xmlwriter php-xmlreader php-gd php-curl php-mbstring -y
sudo a2enmod rewrite
sudo service apache2 restart

15) Installer MariaDB:
sudo apt-get install mariadb-server -y
   
16) Créer une redirection vers l'installation de Nextcloud
cd /var/www/html
sudo nano index.html

Ajouter la ligne suivante où "nextcloud.nomdedomaine.com." doit être l'adresse qui pointe sur votre serveur.
    <meta http-equiv="refresh" content="0; URL='http://nextcloud.nomdedomaine.com/nextcloud'" />

17) Installer Nextcloud:
cd /var/www/
sudo wget https://download.nextcloud.com/server/releases/nextcloud-10.0.0.zip
sudo unzip nextcloud-10.0.0.zip
sudo rm nextcloud-10.0.0.zip
cd /

18) Ajuster les permissions grâce à un script:
cd /home/pi
nano permissions.sh

Coller le code suivant dans le fichier créé
#!/bin/bash

ocpath='/var/www/nextcloud'

htuser='www-data'

htgroup='www-data'

rootuser='root'


printf "Creating possible missing Directories\n"

mkdir -p $ocpath/data

mkdir -p $ocpath/assets

mkdir -p $ocpath/updater


printf "chmod Files and Directories\n"

find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640

find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750


printf "chown Directories\n"

chown -R ${rootuser}:${htgroup} ${ocpath}/

chown -R ${htuser}:${htgroup} ${ocpath}/apps/

chown -R ${htuser}:${htgroup} ${ocpath}/assets/

chown -R ${htuser}:${htgroup} ${ocpath}/config/

chown -R ${htuser}:${htgroup} ${ocpath}/data/

chown -R ${htuser}:${htgroup} /media/cloudata

chown -R ${htuser}:${htgroup} ${ocpath}/themes/

chown -R ${htuser}:${htgroup} ${ocpath}/updater/

chown -R ${htuser}:${htgroup} /tmp


chmod +x ${ocpath}/occ


printf "chmod/chown .htaccess\n"

if [ -f ${ocpath}/.htaccess ]

then

 chmod 0644 ${ocpath}/.htaccess

 chown ${rootuser}:${htgroup} ${ocpath}/.htaccess

fi
 
if [ -f ${ocpath}/data/.htaccess ]

then

 chmod 0644 ${ocpath}/data/.htaccess

 chown ${rootuser}:${htgroup} ${ocpath}/data/.htaccess

fi

Rendre le script exécutable et le lancer
chmod +x permissions.sh
sudo ./permissions.sh

19) Configurer Apache2 en modifiant le fichier nextcloud.conf
cd /etc/apache2/sites-available
nano nextcloud.conf

Coller ceci dans le fichier:
Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
 Options +FollowSymlinks
 AllowOverride All

<IfModule mod_dav.c>
 Dav off
</IfModule>

SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud

</Directory>

Puis lancer dans l'ordre les commandes suivantes:
ln -s /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-enabled/nextcloud.conf

a2enmod headers

a2enmod env

a2enmod dir

a2enmod mime

a2enmod ssl

a2ensite default-ssl

service apache2 reload

20) Mettre en place la base de données en commençant par se loguer en root à la base de données:
mysql -u root -p

Puis lancer les commandes suivantes dans l'ordre. Je vous conseille fortement de remplacer MOTDEPASSE par un mot de passe fort de votre cru, souvenez-vous en, nous en aurons besoin plus tard.
CREATE DATABASE nextcloud;

CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'MOTDEPASSE';

GRANT ALL PRIVILEGES ON nextcloud.* TO nextclouduser@localhost;

EXIT

21) Mettre en place le certificat ssl de let's encrypt:
sudo apt install git -y

cd /etc

sudo git clone https://github.com/letsencrypt/letsencrypt

cd letsencrypt

sudo ./letsencrypt-auto

crontab -e

Copier la ligne suivante au bas du fichier:
30 1 * * 1 root /etc/letsencrypt/certbot-auto renew --quiet

22) Si tout s'est bien passé, nous sommes prêts à nous connecter à notre interface pour terminer l'installation de Nextcloud par la génération des fichiers de configuration.
Ouvrir votre navigateur préféré et taper l'adresse qui devrait vous amener à votre cloud. Créer un utilisateur d'administration et changer le chemin des données pour pointer le disque usb.
/media/cloudata

En ce qui concerne la base de données, renseigner les champs comme ceci, en utilisant le mot de passe que vous avez choisi à l'étape 20
nextclouduser

MOTDEPASSE

nextcloud
   
Si il y a un message d'erreur signalant que le dossier des données ne peut pas être écrit, ça m'est arrivé, essayer ceci:
sudo usermod -a -G pi www-data

23) Activer le Mem Cache, cela peut paraître facultatif et le serveur fonctionnera sans, mais ce sera plus lent et vous aurez des messages d'erreur dans la console d'administration...
sudo nano /var/www/nextcloud/config/config.php


Juste avant ); insérer:
'memcache.local' => '\OC\Memcache\APC',

24) Un petit "clean" qui ne fera pas de mal... ;)
sudo apt-get clean

25) Définir la taille maximale de fichiers
cd /var/www/nextcloud

sudo nano .htaccess

Trouver la ligne php_value upload_max_filesize 512M et la ligne php_value post_max_size 512M
Changer les deux valeurs à celle souhaitée, si souhaité utiliser G pour gigas à la place de M
sudo nano .user.ini

Trouver la ligne upload_max_filesize=512M et post_max_size=512M
Changer les valeurs par la même que défini à l'étape précédente et ne pas oublier de changer le M en G, si besoin...

26) Éviter les attaques de l'homme du milieu:
cd /etc/apache2
sudo nano apache2.conf

A la fin du fichier, ajouter ce qui suit:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</IfModule>

27) Reboot et vérification que tout fonctionne bien
sudo reboot

Félicitations! Vous avez fait un grand pas pour vous éloigner des GAFAM! La route n'a pas été si difficile, n'est-ce pas?
Maintenant, avec plus d'indépendance et de liberté, viennent immanquablement plus de responsabilités. Vous êtes responsables de votre matériel et de vos données. A vous de faire en sorte que tout fonctionne comme souhaité et que vos données soient raisonnablement protégées contre les regards indiscrets. La suite du tutoriel est à votre on vouloir et n'est en aucun cas obligatoire pour que le serveur fonctionne bien. Cependant, je vous encourage vivement de le suivre. Je ne suis pas un expert en sécurité et il y a peut-être des aberrations (merci de les relever dans les commentaires)... Faites vos propres recherches et agissez en fonction.


28) Installer et activer fail2ban pour les logins (Basé sur: https://forum.owncloud.org/viewtopic.php?f=8&t=28678):
sudo apt-get install fail2ban

Puis créer un fichier nextcloud.conf:
sudo nano /etc/fail2ban/filter.d/nextcloud.conf

Coller dans ce fichier les lignes suivantes:
[Definition]
failregex={"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}

ignoreregex =

Créer un fichier jail.local:
sudo nano /etc/fail2ban/jail.local

Coller dans ce fichier les lignes suivantes:   
[nextcloud]
enabled = true
filter  = nextcloud
# selectionner http, https ou les deux, en fonction de vos besoins:
port    =  http,https
# modifier le chemin des logs si besoin:
logpath = /var/www/nextcloud/data/nextcloud.log

Activer fail2ban par cette suite de commandes:
sudo service fail2ban start
sudo service fail2ban reload
sudo service fail2ban status

Vérifier périodiquement les logs de fail2ban:
nano /var/log/fail2ban.log

29) Installer ufw (uncomplicated firewall):
sudo apt install ufw

Rejeter par défaut tous les paquets:
sudo ufw default deny

Il peut être utile de désactiver les IP v6, à voir si cela vous est utile...
sudo nano /etc/default/ufw
Changer la ligne 7:
IPV6=no

Permettre la connexion SSH depuis le réseau local uniquement. Si votre réseau local n'est pas 192.168.1.0/24 , il faut modifier le code suivant à votre convenance.
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22

Permettre le port 443 pour le https depuis internet.
sudo ufw allow 443/tcp

Activer le firewall:
sudo ufw enable

Vérifier le statut de ufw:
sudo ufw status