Visualiser une révision

[Ubuntu/Debian] Installation complète de Shinobi Community Edition

voxdemonix : révision n°11 (27 décembre 2018 20:01:41)

Introduction
============

Dans ce tutoriel sera presque tout expliqué afin de transformer une machine fraîchement installée en serveur ShinobiCCTV Community Edition.

Ndlr : ajouter anti-bruteforce (fail2ban?) et sécurisation.

**Pages principales de la WEBUI de Shinobi :**

- http://your_shinobi:8080 ⇒ Dashboard.
- http://your_shinobi:8080/admin ⇒ Ici les utilisateurs créés par l'Administrateur pourront créer des "sous-utilisateurs", permettant de partager l'accès a des caméras.
- http://your_shinobi:8080/super ⇒ Gestion de l'administrateur, des comptes utilisateurs et de quelques paramètres de bases.

Désinstallation
===============


**Supprimez la base de données.**

```bash
mysql -uroot -p -e "DROP DATABASE ccio;"
mysql -uroot -p -e "DROP USER ‘shinobi’@’localhost’;"
mysql -uroot -p -e "DROP USER ‘shinobi’@’10.8.%.%’;"
```

**Désinstallez les logiciels et supprimez les dossiers.** (/!\ ndlr : je ne suis pas sur que le dev a testé sa propre procédure de désinstallation, procédure en attente de test)

```bash
pm2 kill
sudo npm uninstall pm2 -g
sudo apt remove ffmpeg mariadb-server nodejs -y && sudo apt autoremove -y && sudo apt-get autoclean
sudo rm -rf /usr/local/bin/npm /usr/local/share/man/man1/node* /usr/local/lib/dtrace/node.d ~/.npm ~/.node-gyp /opt/local/bin/node /opt/local/include/node /opt/local/lib/node_modules /usr/local/lib/node* /usr/local/include/node* -rf /usr/local/bin/node* -rf /home/Shinobi
```

Installation de A-Z
===================

Logiciels
---------

```bash
mv /tmp/
wget https://gitlab.com/Shinobi-Systems/Shinobi-Installer/raw/master/shinobi-install.sh
sudo bash shinobi-install.sh
```

Mémoire
---------

### Logs

**Si vous le souhaitez, vous pouvez ranger les logs de votre système en mémoire [RAM](https://fr.wikipedia.org/wiki/M%C3%A9moire_vive). C'est fortement conseillé si votre système est sur une carte [SD](https://fr.wikipedia.org/wiki/Carte_SD)/[eMMC](https://fr.wikipedia.org/wiki/Carte_MMC#eMMC) ou pour gagner des performance en cas d'utilisation de [HDD](https://fr.wikipedia.org/wiki/Disque_dur). C'est déconseillé sur [SSD](https://fr.wikipedia.org/wiki/Solid-state_drive).**

```bash
cd /tmp/
curl -Lo log2ram.tar.gz https://github.com/azlux/log2ram/archive/master.tar.gz
tar xf log2ram.tar.gz
cd log2ram-master
chmod +x install.sh && sudo ./install.sh
cd ..
rm -r log2ram-master
```
### Base de données

**Créez votre base de données et son utilisateur multi-accès. Pensez à adapter la commande (surtout le mot de passe). NE CHANGEZ PAS LE NOM DE LA BASE DE DONNÉES.**

```bash
mysql -u root -p -e "GRANT ALL PRIVILEGES ON ccio.* TO 'shinobi'@'localhost' identified by 'my_super_password'; GRANT ALL PRIVILEGES ON ccio.* TO 'shinobi'@'10.8.%.%' identified by 'my_super_password'; FLUSH PRIVILEGES;
```

**Éditez _/home/Shinobi/conf.json_ et ajoutez-y les informations de votre base de données.**

```bash
nano /home/Shinobi/conf.json
```

**Initialisez la base de données.**

```bash
mysql -u shinobi -p shinobi < /home/Shinobi/sql/framework.sql
mysql -u shinobi -p shinobi < /home/Shinobi/sql/tables.sql
mysql -u shinobi -p shinobi < /home/Shinobi/sql/database.sql
```

### Stockage

**[Agrégez vos disques afin de créer un JBOD](https://linuxfr.org/wiki/tuto-howto-ubuntu-debian-creer-un-jbod-raid0-non-strip-avec-btrfs) (sorte de _super-partition_)**

**Déplacez le stockage principale de Shinobi vers votre nouvelle _super-partition_.**

```bash
mkdir /media/raidSSD/videos
mv /home/Shinobi/videos/* /media/raidSSD/videos/
rm -R /home/Shinobi/videos
ln -s /media/raidSSD/videos  /home/Shinobi/videos
```

**Redémarrez Shinobi.**

```bash
pm2 reload
pm2 --update-env restart all
```

Ajouter un Frontend HaProxy avec HTTPS
--------------------------------------

Dans ce tutoriel, les pages /admin et /super seront bloquées par mesure de sécurité. Si vous voulez y accédez, connectez-vous directement sur votre noeud Shinobi sans passer par le frontend.

Toutes les commandes suivantes doivent être lancée en root (admin).

**Installation des logiciels nécessaires.**


```bash
apt-get update
apt-get install -y haproxy letsencrypt
```

Générez votre certificat TLS (https). Attention vous avez une limite mensuel.

```bash
letsencrypt certonly --register-unsafely-without-email --standalone --agree-tos --domains www.hello.world
```

**Éditez le cron de root.**

```bash
crontab -e
```

**Copiez-collez les commandes suivantes. Elles mettront à jours la liste de blocage et les certificats https tout les mois. Pensez à remplacer www.hello.world par votre propre nom de domaine valide.**

```bash
30 12 27 * *		( sudo service haproxy stop ; letsencrypt renew --standalone ; sudo -E bash -c 'cat /etc/letsencrypt/live/www.hello.world/fullchain.pem /etc/letsencrypt/live/www.hello.world/privkey.pem > /etc/haproxy/certs/www.hello.world.pem' ; sudo service haproxy restart )
@monthly		( wget -P /etc/haproxy/banlist/ https://gitlab.com/voxdemonix/divers-script/raw/master/Shinobi/HaProxy_Banlists/Ban_User-Agent.list ; chown root:root -R /etc/haproxy/banlist ; chmod 744 -R /etc/haproxy/banlist ; sudo service haproxy reload )
```

**Créez le dossier où HaProxy va ranger vos certificats et vos banlistes.**

```bash
mkdir -p /etc/haproxy/certs/
mkdir /etc/haproxy/banlist
chown root:root -R /etc/haproxy/certs
chmod 744 -R /etc/haproxy/certs
chown root:root -R /etc/haproxy/banlist
chmod 744 -R /etc/haproxy/banlist
```

**Concaténez votre clés publique et privée. Recommencez pour chaque nom de domaine.** Remplacez le nom de domaine en exemple par le votre.

```bash
DOMAIN='www.hello.world' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'
```

**Éditez le fichier de configuration de HaProxy.**

```bash
nano /etc/haproxy/haproxy.cfg
```
**Cet exemple vous permet d'adapter votre configuration.**

```
global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# Default ciphers to use on SSL-enabled listening sockets.
	# For more information, see ciphers(1SSL). This list is from:
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
	ssl-default-bind-options no-sslv3

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http

frontend Frontend_HTTP
	bind *:80 v4v6
	bind *:443 v4v6 ssl crt /etc/haproxy/certs/www.hello.world.pem
#	option dontlog-normal # un-comment this line for logging only problem (recommanded if logs are on SD/eMMC card)
	option httpclose
	option forwardfor
	reqadd X-Forwarded-Proto:\ https
                # security
        tcp-request inspect-delay 5s
        acl bad_gateway hdr_sub(X-Tor2Web) -i 1 # ban tor2web bridge (tor hidden service protection)
        tcp-request content reject if bad_gateway # ban tor2web
                # ban User-Agent
        acl blockedagent hdr_sub(user-agent) -i -f /etc/haproxy/banlist/Ban_User-Agent.list # ban user agent list (https://gitlab.com/voxdemonix/divers-script/blob/master/Shinobi/HaProxy_Banlists/Ban_User-Agent.list)
        http-request deny if blockedagent # ban user agent list
        http-request deny if { hdr_cnt(user-agent) eq 0 } # ban empty user agent
                # ban pages
        acl restricted_page path_beg,url_dec -f /etc/haproxy/banlist/Ban_URL.list
        http-request deny if restricted_page
        # Define hosts
		# www.hello.world
        acl host_www.hello.world hdr(host) -i www.hello.world
        use_backend server_shinobi if host_www.hello.world


backend server_shinobi
        mode http
        balance roundrobin
	http-request add-header X-Forwarded-Proto https if { ssl_fc }
                # force https
	acl http      ssl_fc,not
	http-request redirect scheme https if http
	option forwardfor
	option httpchk GET /admin HTTP/1.0
        cookie SERVERID insert indirect nocache
		# YOUR SERVER HERE
        server ShinobiServer ShinobiServer:8080 cookie ShinobiServer check #ssl verify none
```

Si HaProxy et Shinobi sont situé sur deux machines différentes, il est franchement recommendé de chiffrer les communications entre les deux. Vous pouvez utiliser openssh, pivpn (openvpn) ou autre.


**Téléchargez les banlists et accordez dessus les bonnes permissions.**

```bash
wget -P /etc/haproxy/banlist/ https://gitlab.com/voxdemonix/divers-script/raw/master/Shinobi/HaProxy_Banlists/Ban_User-Agent.list
wget -P /etc/haproxy/banlist/ https://gitlab.com/voxdemonix/divers-script/raw/master/Shinobi/HaProxy_Banlists/Ban_URL.list
chown root:root -R /etc/haproxy/banlist
chmod 744 -R /etc/haproxy/banlist
```

**Redémarrez HaProxy.**

```bash
service haproxy reload
```

Farm Link
=========

- [[Tuto/HowTo] [Debian/Ubuntu] Complete Install of Shinobi Community Edition](https://wiki.0rion.netlib.re/doku.php?id=tutorial_en:tuto_howto_debian_ubuntu_install_shinobi) (article d'origine)
- [Shinobi Forum](https://forum.shinobi.video/)
- [Shinobi Discord](https://discordapp.com/invite/mdhmvuH)
- [GitLab - Shinobi](https://gitlab.com/Shinobi-Systems/Shinobi)
- [Facebook - Shinobi](https://www.facebook.com/Shinobi-1223193167773738)
- [Twitter - Shinobi](https://twitter.com/ShinobiCCTV)