Let’s encrypt Partout et même sur Windows

J’avais déjà écrit un billet sur cette solution sans être super satisfait de la chose. Pourquoi :
1° ça ne tournait pas sous nunux mais sous windows sans utiliser la solution native let’s ecrrypt
2° impossible de demander le renouvellement du certificat … un bug …euh ouais mais c’est le principe de la solution que d’avoir du renouvellement automatisé ?

Du coup, grand ménage et on repart sur des bases bien meilleures.
J’ai créé un Ubuntu sous VMware avec tout ce qu’il faut pour générer mes certificats en utilisant ACME :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
apt-get install git
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh –install
[/codesyntax]
un petit coup d’auto-upgrade:
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
./acme.sh –upgrade –auto-upgrade
[/codesyntax]

Puis après j’ai utilisé les API OVH pour valider mon nom de domaine via DNS sur let’s encrypt (et franchement c’est top ce qui me fait dire que pour les noms de domaine … OVH est plus qu’utile entre les API et le ghostdns).
Il faut aller sur cette adresse https://eu.api.ovh.com/createApp/ ce qui vous permet de récupérer une application key et une application secrète.
Après cette commande :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
acme.sh –issue -d mydomain.com –dns dns_ovh
[/codesyntax]
Comme c’est la première fois, il faut utiliser les 2 clés pour s’authentifier aupres d’ovh et c’est bon :
https://eu.api.ovh.com/auth/?credentialToken=n0Qbjm6wBdBr2KiSqIuYSEnixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Il faut sélectionner illimité et accès autorisé.
et on recommence :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
acme.sh –issue -d mydomain.com –dns dns_ovh
[/codesyntax]
Je génère mon certificat :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
./acme.sh –issue -d toto.com -d autodiscover.toto.com -d adfs.toto.com –d mail.toto.com –dns dns_ovh
[/codesyntax]
J’ai aussi besoin d’un pfx et merci openssl
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
./acme.sh –issue -d cd /root/.acme.sh/sdskh.com && openssl pkcs12 -export -out toto.com.pfx -inkey toto.com.key -in toto.com.cer -name « le1.toto.com » -passout pass: passquetuveux
[/codesyntax]
Boum certificat généré !!!!
Avec tous les fichiers qu’il faut pour Windows et Linux

Maintenant, un coup de fstab pour monter un répertoire commun (genre un répertoire du NAS) et copie de tous les fichiers vers ce répertoire (qui est donc celui d’un NAS).

Pour intégrer les certifs sous nginx ou apache (parce que j’ai pas mal de machine qui utilisent l’un ou l’autre), ce n’est pas très compliqué.
Un coup de fstab qui va taper sur le répertoire commun plus haut.
Vous donnez comme chemin SSL pour apache ou nginx les bon fichiers du commun et a minuit tous les jours on redémarre apache et/ou nginx.
Les fichiers mis à jour sont automatiquement et sans autre manipulation pris en compte.

Ce qui est pratique c’est que les fichiers certificats sont copiés tous les jours et prise en compte tous les jours. Dès qu’il y aura une vrai mise à jour des certificats (vers le 2eme mois dans mon cas en utilisant acme –force) Nginx et Apache en tiendront compte rapidement (pendant moins de 15min tous les 2 mois, il y aura un certificat valide mais obsolète sans être révoqué un nouveau certificat valide non pris en compte).
Par contre dans l’univers Windows, ça se corse.
J’opère une copie vers un répertoire spécifique d’Exchange pour faire une manip d’intégration.
D’abord je détruis l’ancien certificat :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
certutil -delstore My toto.com
[/codesyntax]
Ensuite j’importe le nouveau certificat :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
certutil -f -p «  » -importpfx toto.com.pfx
[/codesyntax]
Enfin un coup de powershell pour stocker dans une variable le « thumbprint » (c’est-à-dire l’identifiant unique du certificat) et puis de l’activer sous exchange pour smpt,iis,pop et imap :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
$Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match « toto.com »}).Thumbprint;
Enable-ExchangeCertificate -Thumbprint $Thumbprint -Services POP,IMAP,SMTP,IIS –force
[/codesyntax]
Boum, j’ai donc une copie régulière du bon certificat en provenance de mon Ubuntu (via un support commun type NAS et en même temps cela pourrait être un montage direct fstab).
Je récupère le thumbprint (qui change à la mise à jour du certificat) et je le force sous Exchange.

Cette solution ne fonctionne pas tout à fait de la même manière pour web application proxy et ADFS. Tout simplement mon certificat ADFS contient toto.com et mon certificat let’s encrypt aussi du coup j’ai un peu galéré pour cette ligne powershell :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
$Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {($_.Subject -match « toto.com ») -and ($_.Subject -notmatch « adfs.toto.com »)}).Thumbprint;
[/codesyntax]
En gros je veux le thumbprint de toto.com mais pas adfs.toto.com et avec cette ligne powershell je la récupère.
Une fois récupéré j’injecte sous Web Application Proxy là encore en powershell :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
Get-WebApplicationProxyApplication -Name autodiscover.toto.com | Set-WebApplicationProxyApplication -ExternalCertificateThumbprint $Thumbprint
Get-WebApplicationProxyApplication -Name mail.toto.com | Set-WebApplicationProxyApplication -ExternalCertificateThumbprint $Thumbprint
[/codesyntax]
et ainsi de suite (peut etre qu’il y a un moyen d’imposer le certificat toto.com à toutes les entrée WAP mais je n’ai pas trouvé).

La solution fonctionne aussi sur le mêle principe pour le certificat pour le vpn sstp
Grosse astuce … je stock encore en variable le thumbprint
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
$Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {($_.Subject -match « sdskh.com ») -and ($_.Subject -notmatch « adfs.sdskh.com »)}).Thumbprint;
[/codesyntax]

J’affecte le certificate via son thumbprint au remote access
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
netsh ras set sstp-ssl-cert hash=$Thumbprint
[/codesyntax]

Et pour que ca fonctionne je le redémarre !

[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
net stop RemoteAccess
net start RemoteAccess
[/codesyntax]

Le tout dans un script powershell.
Maintenant il faut que tous ces scripts soit programmé. Rien de plus simple un petit .bat à créer pour Exchange, pour le WAP et pour le VPN qui invoque le script powershell :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command « . « C:\chemindemonscript\monscript.ps1 »
[/codesyntax]

 

Une fois que tout cela est fini, j’ai :
Ubuntu génère/renouvelle les certificats let’s encryt
Copie vers un répertoire commun

le Serveur Exchange fait une copie du commun vers un répertoire ad hoc. Importation dans la librairie des certificats avec certutil. Powershell permet de récupérer le thumb du bon certificat. Il est force en affectation POP,IMAP,SMTP,IIS.

Le serveur WAP fait une copie du commun vers un répertoire ad hoc. Importation dans la librairie des certificats avec certutil. Powershell permet de récupérer le thumb du bon certificat. Il est force en affectation de toutes les adresses du reverse proxy.

Le serveur WAP fait une copie du commun vers un répertoire ad hoc. Importation dans la librairie des certificats avec certutil. Powershell permet de récupérer le thumb du bon certificat. Il est force en affectation du vpn sstp. Redémarrage du service VPN.

 

Tout étant programmé. Terminé je ne fais plus rien et j’ai toujours le bon certicat let’s encrypt sous linux ou Windows.
Elle est pas belle la vie ?

Let’s encrypt: binding, ADFS et certificats

Je pars du principe que votre ADFS est fonctionnel :

Serveur ADFS – OK
Serveur Microsoft WAP – OK
un certificat auto-signé attaché au WAP

Si tout fonctionne « bien » lorsque vous prenez un ordinateur lambda (un mac dans un Apple store par exemple), n’importe quel navigateur va raller parce que le certificat n’est pas reconnu.
Si vous utilisez un certificat Let’s encrypt … pas de problème et pas de warning.
Maintenant, je vous expose le souci.
J’utilise ADFS pour publier plusieurs services (Exchange, Guacamole – j’en parlerais dans un billet, wordpress, LAMP, etc…). Je voulais aussi accédera un VPN SSL (type SSTP). Et pour se faire, il n’y a (à ma connaissance) que ADFS qui sache le faire.

Maintenant, je peux utiliser un certificat «payant » valide 1 ou 2 ans et le « jumeler » avec mon ADFS (une importation dans la banque perso des certificats SSL et hop, il sera disponible en tant que certificat pour ADFS).

Si je passe par Let’s encrypt vu que le certificat doit etre renouvelé tous les 3 mois … ma fainéantise aidant je ne me voyais pas le mettre à jour à la main.

 

Voila comment faire !!!!

Pour que l’astuce fonctionne, vous devez nommer vos règles ADFS-WAP du nom de votre service.
Par exemple pour https://exchange.titi.com … la règle va se nommer exchange.titi.com.

Il faut un serveur IIS (ou server cert) qui est disponible via le firewall sur port 80 !!!! et qui soit capable de répondre à tous vos préfixes de domaine.

Donc un site :

exchange.titi.com en C:\InetPub\WWWRoot
lamp.titi.com en C:\InetPub\WWWRoot
iis.titi.com en C:\InetPub\WWWRoot

C’est aussi ce serveur qui va générer et renouveler les certificats (on va voir ça plus tard).
Il faut un autre serveur qui est le serveur WAP classique que vous utilisez déjà sur le port 443 (ou server wap)

 

Farm server et Central SSL store

Il faut installer sur les 2 serveur central SSL store (c’est une option de sécurité d’IIS).
Vous choisissez un nom de dossier identique pour server cert et server wap.
Une fois bien paramétré vous avez un Central SSL store sur les 2 serveurs et c’est le partage de fichier windows de server cert qui permet à server wap de voir les certificats.
Pour le moment c’est vide.

Il va falloir fabriquer un server farm. Cela va permettre à Let’s encrypt de valider votre demande de certificat. Let’s encrypt vérifie la présence d’une ligne de caractère dans un fichier pour valider que vous êtes le propriétaire du site qui demande le certificat.

Dans le Farm Server vous fabriquer une première « ferme » sur server wap que j’appelle par exemple reponse-cert et une deuxième regle reponse-wap

Vous remontez sur le serveur web IIS et cliquer sur URL-rewrite.

VOUS DEVEZ METTRE AU 1ER NIVEAU LA REGLE reponse-cert et l’editer
Rien ne doit changer sauf pattern qui de * va devenir

[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]

.well-known/acme-challenge/*

[/codesyntax]

Sur le server cert, il faut telecharger https://github.com/Lone-Coder/letsencrypt-win-simple (et aller sur download version … le code source ne nous intéresse pas).

Pour ce tuto, je decompresse le contenu de letsencrypt-win -simple dans c:\ letsencrypt-win

Et puis on va créer le certificat.

–          Il faut créer C:\InetPub\WWWRoot\.well-known\acme-challenge (un petit mkdir c’est plus simple)

–          Puis copier Web_Config.XML dans C:\InetPub\WWWRoot\.well-known\acme-challenge\ et le renommer en Web_Config

–          Nous allons créer un certificat maintenant qui utilise SAN (nom alternatif) et central SSL store

–          letsencrypt –san –centralsslstore \\ server_cert\nom_de_mon_partage

–          vous vous laissez guider tout du long de la procédure jusqu’à

W: Generate a certificate via WebDav and install it manually.
F: Generate a certificate via FTP/ FTPS and install it manually.
M: Generate a certificate manually.
A: Get certificates for all hosts
Q: Quit

–          choisissez M (pour manually)

–          entrez titi.com

–          puis exchange.titi.com,lamp.titi.com,iis.titi.com

–          puis C:\InetPub\WWWRoot\

–          vous acceptez la création de tâche

Normalement tout devrait bien se dérouler et vos certificats se retrouve sur

\\ server_cert\nom_de_mon_partage

Et magie ils sont aussi dans l’ISS central cert de server wap.

Ce dernier contient déjà les règles ADFS reverse proxy suivante :

exchange.titi.com https://exchange.titi.com  certificatADFS https://exchange.titi.com
lamp.titi.com https://lamp.titi.com  certificatADFS https://lamp.titi.com
iis.titi.com https://iis.titi.com  certificatADFS https://iis.titi.com

 

et là … magie de powershell, nous allons importer les certificats du partage \\ server_cert\nom_de_mon_partage dans le gestionnaire personnel de certificat puis changer pour chaque WAP le certificat qui va bien.

[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]

$CentralStore = "\\FSCluster\SSLStore"
$TargetPath = "C:\CertifyVault"
$SharePath = "\c$\CENTSERV"
$TargetServers = @("server_wap")

ForEach ($Target in $TargetServers) {
  New-Item -ItemType Container ("\\" + $Target + $SharePath) -ErrorAction SilentlyContinue
  Copy-Item $CentralStore\* ("\\" + $Target + $SharePath) -Recurse

  $TargetSession = New-PSSession -ComputerName $Target -Authentication Kerberos

  Invoke-Command -Session $TargetSession -ScriptBlock {
  param($TargetPath)
  $CertFiles = Get-ChildItem -Path $TargetPath -Filter '*.pfx'
  ForEach ($CertFile in $CertFiles) {
  $Certificate = (Import-PfxCertificate -FilePath $CertFile.FullName -CertStoreLocation Cert:\LocalMachine\My -Verbose)
  $Thumbprint = $Certificate.ThumbPrint
  ForEach ($DNSName in $Certificate.DnsNameList) {
  $Subject = $DNSName.Punycode
  Get-WebApplicationProxyApplication -Name $Subject -Verbose | Set-WebApplicationProxyApplication -ExternalCertificateThumbprint $Thumbprint -Verbose
  }
  }
  } -ArgumentList $TargetPath

  Remove-PSSession -Session $TargetSession
}

[/codesyntax]

 

Et là si tout se passe bien (normalement ca devrait) vous avez les certificats let’s encrypt qui vont remplacer les certificats ADFS sur vos règles de reverse proxy WAP.

La ou c’est encore plus magique c’est que cette règle tourne tous les jours (n’oubliez pas de créer une tâche qui lance le script) et remplace le certificat tous les jours.

La tâche lié au certificat tourne elle aussi tous les jours et le certificat (qui n’est valable que 3 mois) se retrouve renouvelé pour 3 mois ….tous les mois. Cela laisse une bonne marge.

 

VOILA vous avez un ADFS avec let’s encrypt totalement automatisé.
Pas belle la vie ?

Let’s encrypt – SSL c’est quoi ? et ADFS ?

Vous connaissez tous SSL/TLS ?
Non ?

Voilà ce qu’en dit Wikipédia

TLS (ou SSL) fonctionne suivant un mode client-serveur. Il permet de satisfaire aux objectifs de sécurité suivants :

  • L’authentification du serveur ;
  • la confidentialité des données échangées (ou session chiffrée) ;
  • l’intégrité des données échangées ;
  • de manière optionnelle, l’authentification du client (mais dans la réalité celle-ci est souvent assurée par le serveur).

 

En gros, cela permet d’afficher un petit cadenas vert dans le navigateur et de garantir que le serveur en face communique de façon sécurisé avec votre navigateur.

 

Concernant Let’s Encrypt (et toujours Wikipédia)

Let’s Encrypt est une autorité de certification lancée le 3 décembre 2015 (qui est sorti de Beta il y a quelques mois). Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet.

L’avantage la gratuité. L’inconvénient, le certificat doit être renouvelé tous les 3 mois et qu’ils font donc l’attacher à vos serveurs. Si en plus le dit serveur est un IIS ou un service Microsoft …s’pas facile.

MAIS … MAIS … il y a une petite solution bien sympa et qui fonctionne avec ADFS.

Que permet ADFS … de fabriquer entre autre un reverse proxy intelligent.
Le reverse proxy permet d’interpréter les adresses web pour le relayer vers une machine d’un LAN.

C’est-à-dire.
Admettons que j’ai le nom de domaine titi.com.
Admettons que j’ai 3 machines avec exchange, un apache sous linux et un serveur IIS quelconque.
Admettons qu’elles servent toutes un service sur le port 443 ou SSL/TLS.

Soit j’expose chaque machine avec un port différent (nattage par port). C’est crade.
Soit j’utilise mon ADFS pour dire que exchange.titi.com va sur l’Exchange, apache.titi.com va sur le serveur Apache et iis.titi.com va sur le serveur IIS le tout sur un seul port 443.

C’est mieux non. Sans compter qu’il devient possible avec ADFS d’utiliser SSTP (le VPN SSL de Microsoft) 3 machines différentes en 443 sur le même port !
La ça devient TOP !!!

Dans un prochain billet, je vous expliquerais comment.

Jeedom et Siri

J’ai installé Jeedom en octobre dans une petite machine virtuelle sur un des ESXI de mon labo maison.

Jeedom est un serveur open source gratuit de domotique (bon j’ai paillé 50 € mais c’est pour soutenir la communauté et bénéficier de plugin gratuit).

Sur ce serveur, j’ai ajouté une clé Zwave Z-Stick S2 (c’est un des nombreux protocoles radio possible en domotique mais il a le vent en poupe depuis un bon moment). Cette clé est juste bien et pas cher (60€).
Elle est branché en usb directement sur le serveur ESXI qui le passe à la machine virtuel (ce qui veut dire aussi que la machine virtuelle ne peut pas changer d’hôte).

J’ai installé une machine Ubuntu server 15.10 et procédé à l’installation de Jeedom. Je vous passe les details de l’install. C’est très bien documenté sur le site de Jeedom.

Tout fonctionne direct. La clé est reconnue tout de suite. Les caméras aussi.

J’ai ajouté un plugin pour ma télécommande Harmony et celui de Weemo pour une lampe.
J’ai acheté chez Orange (réduction oblige) des éléments Zwave (deux prise et un détecteur de présence).

Tout fonctionne à merveille. Ce n’est pas compliqué. Je ne rentrerais pas dans les détails de l’installation ou des scénarios (peut-être un jour mais pas là).

J’ai voulu (comme je suis un grand fou) intégrer une passerelle Homekit (le truc de domotique d’Apple qui ne décolle pas vraiment) qui s’appelle Homebridge.
J’ai eu beaucoup de mal et voici ma technique :

[codesyntax lang="bash" container="div" tab_width="400" strict="yes"]
 Enter code herecurl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -

sudo apt-get install -y nodejs

sudo apt-get install git

sudo apt-get install libavahi-compat-libdnssd-dev

sudo npm install -g homebridge

sudo npm install -g homebridge-legacy-plugins

sudo npm install -g homebridge-http

sudo npm install -g homebridge-harmonyhub

sudo npm install -g homebridge-platform-wemo

homebridge
[/codesyntax]

Et miracle, ça fonctionne.

 

Ayant ajouté le plugin homebridge weemo, je peux dire à Siri :

« Dis Siri, allume la lampe du salon »

Ok Siri me répond la lampe est male mais ça fonctionne nickel.

 

Pour les prises Zwave, je me sers de Jeedom en passerelle http (via le plugin homebridge-http).

Voici un exemple de config.json (homebridge se trouve sur le même serveur que Jeedom):

[codesyntax lang="php" container="div" tab_width="400" strict="yes"]
{
     "bridge": {
         "name": "Maison",
         "username": "CC:22:3D:E3:CE:30",
         "port": 51826,
         "pin": "031-45-154"
     },
 "description":"Configuration Jeedom",
 "accessories":[
         {
             "accessory": "Http",
             "name": "Prise salle a manger",
             "on_url": "http://127.0.0.1/core/api/jeeApi.php?apikey=cléapi-jeedom&type=cmd&id=571",
             "off_url": "http://127.0.0.1/core/api/jeeApi.php?apikey=cléapi-jeedom&type=cmd&id=572",
 "username": "",
                 "password": "",
                 "sendimmediately": "",
 "http_method": "POST",
                 "http_brightness_method": "POST",
                 "service": "Switch",
                 "brightnessHandling": "no"
         }
 ]
 }
[/codesyntax]

 

Enfin pour faire fonctionner Homebridge en service, j’ai fait ça

/etc/systemd/system/homebridge.service

Un petit fichier :

[codesyntax lang= »bash »  » container= »div » tab_width= »400″ strict= »yes »]

[Unit]
Description=Start homebridge server[Service]Type=simpleUser=tatschExecStart=/usr/bin/homebridge[Install]WantedBy=multi-user.target
sudo wget -O /etc/systemd/system/homebridge.service https://gist.githubusercontent.com/jmtatsch/f73e5ea87deaaaf2e9ff/raw/2d0f88ca6c943a356d5913461f0c4a51e439ad4f/homebridge.service
sudo nano /etc/systemd/system/homebridge.service
sudo systemctl enable homebridge
sudo systemctl start homebridge

[/codesyntax]

 

Et pour voir ce qu’il fait :

sudo systemctl status homebridge -l

Voilà mes premiers pas dans l’univers fascinant de la domotique.

 

Personnal Cloud 2015

Petite mise à jour de mon LAN avant de faire un point sur ADFS et Jeedom (oui je sais … rien à voir)

mondomaine

 

En mai 2015 (ça date hein ?), j’ai mis à jour un de mes hotes ESXI.

Je me suis fabriqué une petite bête de course. Carte mère Supermicro et Xeon 12 cœurs avec 64 giga de RAM.
La carte mère est juste extraordinaire. Elle embarque un petite serveur web qui permet de gérer tout ce qui se passe sur la carte à distance dans un navigateur.
Quant au XEON … que de puissance.
64 giga du bonheur (et il ne me reste que 7 giga … attention à l’overcommit).

Alors vous allez me dire pourquoi faire tout ca ?

D’abord sur le premier hôte :

Un pFsense dernière mouture comme firewall, routeur et IPS.

Le même couple en cluster d’Active Directory 2012R2 (en attendant 2016). Ce couple gere le SSO dans le LAN, le DHCP IPV4/6, le DNS IPV4/6 et DNSSEC.
Petite nouveauté sur l’AD2 … la présence d’ADFS pour faire un beau reverse proxy/vpn sur un autre serveur.

Le toujours même Windows Update Server … pour les updates centralisé dans le LAN de tous les Windows et Office et économiser de la bande passante (quoiqu’avec la fibre …)

Un petit RDC. C’est peut-être mon serveur préféré. Il me permet en SSL (donc en passant même les firewall proxy les plus vicieux) de me connecter à mes machines (par exemple mon Windows 10 virtuel) et de quelque part transporter partout mes machines. Mais surtout de « diffuser » mes services et d’accéder juste à un Firefox à distance (et donc de passer outre les limitations de certaines entreprises).

Un Exchange 2016 … ma messagerie PIM en fait. C’est bien d’internaliser parfois pour ne pas perdre la main.

Un serveur de Streeam (avec Subsonic mon deezer perso) et Plex (pour consulter mes films, série et autres n’importe où dans le monde et aussi sur mon Apple TV4 dans le salon).

Un serveur VEEAM pour sauvegarde au mieux les petites machines virtuelles.

Puis le deuxième hôte :

Un pFsense dernière mouture comme firewall, routeur et IPS en mode « slave ». En gros, si l’hôte 1 s’arrête … ce firewall prend la main automatiquement. Pas de coupure d’internet. Pas de coupure de serveur (sauf ce qui sont sur l’hôte 1 évidemment. Je ferais du VMware HA bientôt).

Une machine CenTOS avec openVZ. C’est un peu « inception » ce truc. Donc une machine virtuelle sur une machine physique qui fait tourner 3 serveur virtualisés LAMP (sur un LAMP – un site, sur un autre mes petits services comme TTRSS, Fever et Full text RSS et infiniteWP. Ce dernier centralise la mise à jour des mes WordPress interne et chez OVH).

Un Freenas qui est un NAS open Source (pour test)

Un autre CentOS qui gère l’onduleur et qui permet d’envoyer des ordres d’extinctions aux ESXI si jamais la coupure de courant était un peu longue.

Evidemment un VCenter Server et un Nested ESXI (c’est-à-dire un ESXI virtualisé sur un ESXI … c’est utile parce que Nested ESXI est patché et que je ne veux pas patcher un ESXI sur un hote physique. On ne sait jamais. Le patch quant à lui permet de faire tourner OSX Server dans une machine virtuelle)

Un Ubuntu avec Zentyal … en gros un Windows Server open source. Très bon système.

Un Ubuntu avec Docker. Là encore c’est inception. Docker me sert à virtualiser non les machines mais les services.

Un Ubuntu Jeedom. Ma petite découverte de fin 2015. C’est un serveur open Source de domotique. J’en parlerais dans un autre billet.

Un Ubuntu MySQL. Ce serveur centralise toutes les bases de données de me différent service. J’ai préféré isoler MySQL sur sa propre machine virtuelle il y a 3 jours (avant le serveur MySQL était une machine openVZ)

Un Ubuntu NZBapp qui sert à télécharger avec Sabnzbd, NZBget, Couchpotato, Sickrage, Headphone et le serveur/client Torrent Transmission.

Une VM Synololgy pour faire des test de communication et de synchronisation entre mon NAS 1318+ de Synology et cette VM (qui à 10 T de stockage en direct sur la machine virtuelle).

Une Debian 7 (ca date) avec Newznab (c’est une machine qui vérifie tout ce qui est publié en newsgroup et en sort les releases pour téléchargement. C’est sur ce serveur que Sickrage et Couchpotato vérifient respectivement les sorties séries et films. Tout est automatisé évidemment avec une petite notification sur iOS via Prowl)

Un OSX El Capitan Server pour faire du Mobile Device Management de mes « iOS devices »

 

Et enfin un petit Windows 10 parce qu’l faut bien un petit client pour manager tout ca de temps en temps. Sans compter que grâce a Remote Desktop, cela me permet d’avoir un Windows 10 sur mon iPad.

Virtualisation OpenVZ (Application)

Après avoir parlé du principe de virtualisation containers Linux, je vous propose l’application.

Tout d’abord sur une machine physique ou virtuelle, j’ai installé Cent OS.

Il faut ajouter le Répertoire OpenVZ

yum install wget

wget -P /etc/yum.repos.d/ http://ftp.openvz.org/openvz.repo

rpm –import http://ftp.openvz.org/RPM-GPG-Key-OpenVZ

 

Installer l’OpenVZ kernel

yum install vzkernel

 

Editer le sysctl.conf et ajouter:

net.ipv4.ip_forward = 1

net.ipv6.conf.default.forwarding = 1

net.ipv6.conf.all.forwarding = 1

net.ipv4.conf.default.proxy_arp = 0

net.ipv4.conf.all.rp_filter = 1

kernel.sysrq = 1

net.ipv4.conf.default.send_redirects = 1

net.ipv4.conf.all.send_redirects = 0

 

Inhiber SELinux en editant /etc/sysconfig/selinux

SELINUX=disabled

 

Il faut installer OpenVz usage statistics tools

yum install vzctl vzquota ploop

 

Faire une petite versification réseau en editant /etc/vz/vz.conf

NEIGHBOUR_DEVS=all

 

 

Après j’avoue qu’il n’est pas désagréable d’avoir une petite interface graphique:

wget -O – http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh

 

Il faut ajuster l’ipTables en editant /etc/sysconfig/iptables

-A INPUT -m state –state NEW -m tcp -p tcp –dport 3000 -j ACCEPT

 

Redemarrer ipTables

service iptables restart

 

un petit coup de :

http://<votre-serveuropenvz>:3000

 

Il vous faudra changer le mot de passe admin et surtout télécharger

des modèles (templates) de systèmes d’exploitation.

openvztemplates

puis vous cocher ce dont vous avez besoin comme type de machines.

 

openvztemplate2

 

Une fois le template téléchargé (et c’est loooooong même avec une fibre),

il faut créer une machine. Create New Virtual Server et zou …

vous avez une nouvelle machine comme une machine « physique » et que vous administrez comme d’habitude (SSH et Webmin pour moi).

 

 

PS: Il est possible que les machines ne veuillent pas redemarrer (gloups);

il suffit alors de changer les réglages de la machine (RAM, CPU, etc …).

 

Virtualisation OpenVZ (principe)

Enfin un petit billet (oui ça faisait longtemps)

 

Il y a peu j’ai changé l’hébergement des blogs.
Nous étions sur un dédié OVH (vieil Atom avec 2 giga de RAM et un disque dur « magnétique » poussif). Le tout assez cher donc et complétement obsolète.

J’ai testé le VPS OVH … prix bien plus raisonnable et à ma grande surprise sympathiquement plus véloce que l’ancien dédié.

Une fois les migrations de blog faite (et quand vous n’avez plus accès à la database … s’pas facile), je me suis penché sur le « mais comment ça fonctionne-t-il donc cet hébergement VPS chez OVH ».

 

Sans surprise OVH propose du VMWARE ESXI. De la bonne virtualisation en  « elastic cloud ». C’est-à-dire que les machines sont dans une sorte de cloud virtuel et qu’en ajoutant une machine, elle s’autoconfigure pour amener de la RAM et du CPU au cloud. Je présume que tout est stocké dans des bais fibrées (mais bon cette partie-là ne nous intéresse pas).

Et une autre forme de virtualisation bien sympathique : OpenVZ (conteneur Linux)

En quoi cela consiste-t-il ?

Vous installez (dans mon cas) un Cent OS et après plein de ligne de commande (que je vous donnerais après) vous avez installé une sorte de cloneur – containeur Linux.
Il suffit de créer une machine virtuelle au-dessus du Cent OS. La création est rapide puisqu’elle repose sur les fichiers du Cent OS qui sont « virtualisés ».
Cette virtualisation est bien plus limité que celle de VMware (que du Linux et pas toutes les versions) mais elle permet de  compartimenter des installations de Linux.
Dans mon cas :
une petite machine virtuelle avec ESXI, j’ai installé Cent OS dessus. Puis installation dans la VM d’OpenVZ.
Sur cette machine en virtualisation « noyaux », j’ai 4 Ubuntu : 1 MySQL et 3 AP (apache PHP).

Cela m’a permis de séparer 1 « machine » MySQL, 1 « machine » WordPress, 1 « machine » apache et plein de chose dedans et enfin un dernière « machine » WordPress.
Tout est bien séparer. Je peux rebooter un site sans toucher l’autre.
L’énorme avantage, c’est lorsque je fais une mise à jour du Cent OS … la plupart des machines virtualisées qui sont au-dessus sont elles aussi mise à jour.

Eteindre son ESXI avec un onduleur USB

Bon, vous n’êtes pas sans savoir (si vous fouillez sur ce blog) que j’ai 2 ESXI qui font tourner un vingtaine de machine.
Elles sont toutes sauvegardées grâce à VEEAM (dont j’ai déjà parlé).
Les sauvegardes sont sur un NAS Synology vi un partage NFS.
Les sauvegardes sont régulièrement copiées sur un disque qui n’est pas chez moi.
Oui, je sais … on est jamais trop prudent !

MAIS quid de l’énergie électrique qui alimente tout ça ?
Forcément, pour assurer une certaine robustesse à l’ensemble, je me suis motivé pour acheter un UPS (un onduleur quoi) en USB.
Quelle erreur … sans carte réseau sur l’engin autant dire impossible de gérer les ESXI pour qu’ils s’éteignent normalement via un message de l’onduleur.
Mais ça c’était avant 😉

Il y a une petite méthode qui fonctionne pas mal.

Installation de CENTOS

Déjà, un petit téléchargement de CENTos.
Il faut créer une VM avec CENTos dessus et surtout pour la partie réseau ne pas oublier d’activer le DHCP sur eth0 (perso, je me suis fait avoir et j’ai oublié).
Au pire en post-install, via la console VMware :
Editer : /etc/sysconfig/network-scripts/ifcfg-eth0
Changer : set onboot to yes reboot
un yum upgrade
Puis vous accrocher via vsphere l’onduleur UPS en USB.
Un coup de yum install usbutils

Installation de APCUPSD

Ajout du repo epel :
rpm -Uvh http://ftp.osuosl.org/pub/fedora-epel/6/i386/epel-release-6-7.noarch.rpm
Un coup de :
yum install apcupsd
chkconfig apcupsd on
edit /etc/apcupsd/apcupsd.conf

Il faut alors modifier :
• UPSNAME – on choisit un nom – UPSNAME myups01
• UPSCABLE – usb – UPSCABLE usb
• UPSTYPE – usb – UPSTYPE usb
• DEVICE – on touche pas – DEVICE
service apcupsd start

On teste avec : apcaccess qui doit remonter des informations sur l’UPS (genre voltage, minutes restentes, etc …)

Installation des VMware TOOLS

Il est très important de les installer.
Via le menu vsphere Vm -> Guest -> Install Tools (mon Vsphere est en anglais).
• yum install gcc kernel-devel
• mount /dev/cdrom /mnt
• cp /mnt/VMwareTools* /tmp
• cd /tmp
• tar xzvf VMWareTools…
• cd vmware-tools-distrib
• ./vmware-install.pl
On reboot la VM et normalement les outils sont vu comme installés dans vsphere.

Installation du serveur web UPS

Ça fait un petit plus pour voir en GUI ce qui se passe sur l’UPS.
• yum install apcupsd-cgi
• chkconfig httpd on
• service httpd start
• edit /etc/sysconfig/iptables (ajouté une ligne pour autoriser le port 80 – je copie la ligne ssh/22. Oui je suis une fainéant je sais.)
• service iptables restart
• edit /etc/httpd/conf.d/apcupsd.conf (commenter avec # Allow from lines et add Allow from all)
• service httpd reload

Naviguer avec une autre machine sur l’IP du CENTos
http://x.x.x.x/apcupsd

Autoriser l’accès SSH par certificat sans mot-de-passe

Il faut se loguer en SSH sur le centOS (pas besoin de détailler ça.. hein ?)

On commence par générer une clée
ssh-keygen -t rsa -b 4096 -C « moi@centosups »
à la génération ne tapez surtout aucune mot de passe sinon aucun intérêt !

Puis on copie vers l’ESXI (dont le SSH doit évidemment être activé et surtout activé au reboot machine)
cat ~/.ssh/id_rsa.pub | ssh [email protected] ‘cat >> .ssh/authorized_keys’

Et on finit par du chmod:
chmod go-w ~/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Si tout a bien fonctionné, lorsque vous etes en console SSH sur le CENTos et que vous tapez :
ssh [email protected] « ls »

La commande LS s’exécute sans demande de password et renvoi le contenu du répertoire.

Paramétrage de l’extinction des machines

Je résume.
Votre UPS fonctionne en USB et est raccordé à la machine CENTOS.
Cette machine fait tourner APCUPSD et peut se connecter en SSH vers l’ESXI sans mot de passe grâce à un certificat.
Pour fermer les ESXI en cas de panne de courant. Il y a plusieurs méthodes. Perso je préfère un custom-script que le sh stop && shutdown.

Il faut modifier la ligne shutdown –h pour ajouter ssh [email protected] « disque/scripts/shutdown-all-vms.sh »
Disque étant un emplacement de disque dans l’ESXI (il suffit de copier un chemin accessible).

D’abord connectez vous en SSH sur l’ESXI.
Puis listez les VM :
vim-cmd vmsvc/getallvms

Après il faut écrire dans shutdown-all-vms.sh le script suivant : (le numéro après le # est ici fictif. Vous le récupérez de la commande juste au dessus)

#!/bin/sh
#Vmid Name File Guest OS Version Annotation
#156 nomdevm1
#157 nomdevm3

# shutdown VM in order
echo « Shutting down on essential… »
vim-cmd vmsvc/power.shutdown 157
vim-cmd vmsvc/power.shutdown 156

# leave the ups station running to continue exeuting this script

# sleep for X to ensure everything shutdown
echo « Sleeping for 180 seconds… »
sleep 180s

# shutdown the esx server
echo « Shutting down self… »
poweroff
Voila … tout le monde se ferme et l’ESXI en se fermant va couper correctement la VM CENTos si vous l’avez réglé dans vSphere :
HOST -> configuration -> virtual machine startup/shutdown -> Propertie -> allow VM to startup and shutdown with system
Dernier conseil.
Il faut branchez sur l’UPS : le ou les switch (sinon pas de communication réseau). Il faut ajouter dans le script de l’HOST la fermeture du NAS (et brancher le NAS sur l’UPS).

 

Newznab … un bon exercice de service : Installation

La suite du billet : Newznab … un bon exercice de service : Préparation du LAMP

Il s’agit maintenant d’installer proprement dit … NEWZNAB.

Le set de script est gratuit mais le service est payant (10$ une seule fois) pour que le serveur indexe.
(Il y a NZEDB qui lui est gratuit est pas mal du tout non plus).

On commence par ca:

mkdir -p /var/www/newznab chmod 777 /var/www/newznab
mkdir -p /var/www/newznab
chmod 777 /var/www/newznab

On installe les dépendances (dont certaines sont déjà dans le Turnkey … s’pas grave, on est certain de tout avoir du coup):

apt-get install -y php5 php5-dev php-pear php5-gd php5-mysql php5-curl
apt-get install -y lame
apt-get install -y unrar-free
apt-get install -y ffmpeg
apt-get install -y python-software-properties
apt-get install -y mediainfo
apt-get install -y subversion

 

Dans /etc/php5/apache2/php.ini  et /etc/php5/cli/php.ini

il faut changer ou ajouter ces éléments

register_globals = Off
max_execution_time = 120
memory_limit = 512MB
ou  memory_limit =  -1
date.timezone = Europe/Paris

On fait la petite manip suivante:

a2dissite default
a2ensite newznab
a2enmod rewrite

Petit redemarrage d’Apache:

/etc/init.d/apache2 restart
et on regarde dans son navigateur si le site mondomaine.com/phpinfo.php n’a pas eu de vapeur ….
MySQL est bon il fonctionne
Apache écoute en 8080
Nginx en 80 et va dans le répertoire var/www/newnzab
Jusqu’ici tout va bien !

On installe svn (subversion pour les intimes)

apt-get install subversion
Puis:
svn co svn://svn.newznab.com/nn/branches/nnplus /var/www/newznab

(les codes sont login:SVNPLUS et Password:SVNPLU5)

Après, c’est le drame 😉

chmod 777 /var/www/newznab/www/lib/smarty/templates_c
chmod 777 /var/www/newznab/www/covers/anime
chmod 777 /var/www/newznab/www/covers/console
chmod 777 /var/www/newznab/www/covers/movies
chmod 777 /var/www/newznab/www/covers/console
chmod 777 /var/www/newznab/www/covers/music
chmod 777 /var/www/newznab/www
chmod 777 /var/www/newznab/www/install
chmod 777 /var/www/newznab/nzbfiles/
chmod 777 /var/www/newznab/nzbfiles/
L’installation de NEWZNAB est terminé il faut passer au paramétrage qui ne necessite plus de tuto 🙂
http://localhost/newznab/www/install

Il reste une dernière difficulté. Faire démarrer les scripts avec le Turnkey:

Dans /etc/init.d , il faut faire un joli fichier newznabstart qui contient ça:

 ### BEGIN INIT INFO
# Provides:          newznab
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: newznab plus update scripts.
# Description:       This script runs the scripts that periodically
#                    update the newznab indices.
### END INIT INFO
sleep 60
[ -c /dev/urandom ] || exit 0

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh

. /lib/lsb/init-functions

case "$1" in
  start)
        sudo -u nzb /usr/bin/screen -d -m -S newznab sh /var/www/newznab/misc/update_scripts/cron_scripts/newznab_screen_local.sh
    ;;
  stop)
        sudo -u nzb /usr/bin/screen -X -S newznab quit
    ;;
  status)
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  *)
    echo "Usage: nnplus [start|stop]" >&2
    exit 3
    ;;
esac

 

Et zou c’est parti !

Newznab … un bon exercice de service : Préparation du LAMP

OHhh la on s’attaque à du dur …

Petit récapitulatif sur les newsgroups : Usenet est un système en réseau de forums, inventé en 1979. En gros, ça date d’avant les inter-tubes. 😉

Normalement, ça sert donc à faire un forum. Mais Usenet semble connaitre un regain d’intérêt : avec l’HADOPI2, les systèmes d’échanges P2P étant surveillés, de nouvelles méthodes de téléchargement sont recherchées, et le réseau Usenet (principalement binaire) est de plus en plus fréquenté pour sa haute vitesse de téléchargement, la richesse des contenus et le respect de la neutralité du réseau4. (Wikipedia).

Donc il faut un fournisseur de newsgroup. Vous pouvez oublier votre FAI. « Hadopi c’est fini, c’était la ville de notre dernieeeeer amour ».
Par exemple, Giganews. Il est cher certes mais il offre plusieurs années de rétention, des VPN qui sortent sur la terre entière (qui a dit Netflix ? qu’il se dénonce !) et puis de la vitesse surtout avec un serveur Européen.

Après il faut trouver des fichiers à télécharger. C’est là que Newznab entre en jeu. C’est un peu le google des newsgroup. Un moteur de recherche qui va regarder des groups et en tirer les « releases ».

C’est bien expliqué ici chez Korben.

 

On commence avec Turnkey LAMP que l’on bidouille comme vu sur ce billet : Les Turnkeys de mon Labo

 

On va juste ajouter PHP en fast CGI sur Apache :

apt-get install apache2-mpm-worker libapache2-mod-fastcgi php5-fpm php-apc

Il faut valider MPM worker pour Apache.

a2enmod actions alias fastcgi rewrite

On edite /etc/apache2/conf.d/php5-fpm

# Configure all that stuff needed for using PHP-FPM as FastCGI
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>
# application/x-httpd-php-source                 phps
<FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Order Deny,Allow
    Deny from all
</FilesMatch>
 # Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[345]?|t|tml|ps)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>
 # Define Action and Alias needed for FastCGI external server.
Action application/x-httpd-php /fcgi-bin/php5-fpm virtual
Alias /fcgi-bin/php5-fpm /fcgi-bin-php5-fpm
<Location /fcgi-bin/php5-fpm>
  # here we prevent direct access to this Location url,
  # env=REDIRECT_STATUS will let us use this fcgi-bin url
  # only after an internal redirect (by Action upper)
  Order Deny,Allow
  Deny from All
  Allow from env=REDIRECT_STATUS
</Location>
FastCgiExternalServer /fcgi-bin-php5-fpm -socket /var/run/php5-fpm.sock -idle-timeout 250 -pass-header Authorization

 

On édite /etc/php5/fpm/php-fpm.conf


emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s

 

On édite /etc/php5/fpm/pool.d/www.con

 

pm = dynamic
pm.max_children = 100
pm.start_servers = 25
pm.min_spare_servers = 25
pm.max_spare_servers = 50
pm.max_requests = 500

 

Et on relance PHP-FPM :

/etc/init.d/php5-fpm reload

 

Petite bidouille d’Apache dans  /etc/apache2/conf.d/security :

 

ServerTokens Prod
ServerSignature Off
TraceEnable Off

 

Un petit reload d’Apache:

/etc/init.d/apache2 reload


Et perso je reboot:

Sudo reboot

 

Théoriquement au reboot si vous avez un phpinfo.php dans var/www, vous devez voir fast-cgi comme handler.

On est bon donc : Apache en port 8080, NGINX en port 80 et du fast-cgi avec APC.
Sauf que Nginx a besoin d’etre un peu modifier pour supporter Newznab.

Dans /etc/nginx/sites-available on va créer un fichier newznab :

 server {
    listen 80;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    root /var/www/newznab/www/;
    index index.html index.htm index.php;
    server_name mondomaine.com;
         location ~* \.(?:ico|css|js|gif|inc|txt|gz|xml|png|jpe?g) {
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";    }
         location /admin { }
        location /install { }
         location ~ \.php$ {   
         proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
         }
         location / { try_files $uri $uri/ @rewrites; }
        location @rewrites {
            rewrite ^/([^/\.]+)/([^/]+)/([^/]+)/? /index.php?page=$1&id=$2&subpage=$3 last;
            rewrite ^/([^/\.]+)/([^/]+)/?$ /index.php?page=$1&id=$2 last;
            rewrite ^/([^/\.]+)/?$ /index.php?page=$1 last;
    }
          location ~ /\.ht {
                deny all;
        }
}

 

Et aussi une petite modif dans /etc/nginx/nginx.conf

user www-data;
worker_processes  1;
 error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 events {
    worker_connections  1024;
}
 http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
     access_log  /var/log/nginx/access.log  main;
     sendfile        on;
    #tcp_nopush     on;
     keepalive_timeout  65;
     #gzip  on;
     include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

 

 

(A SUIVRE)