updated informations; add AH files

master
HUC Stéphane 2023-04-15 15:56:49 +02:00
parent 93781b5316
commit f5a1ac55cd
Signed by: hucste
GPG Key ID: C4ED64222D9B037F
13 changed files with 842 additions and 118 deletions

View File

@ -31,67 +31,13 @@ title = "Stéphane HUC :: IT Log"
pre = "fa fa-home"
url = "/"
weight = 1
#[[languages.en.menu.main]]
# identifier = "blog"
# name = "Blog"
# pre = "fa fa-blog"
# url = "/posts"
# weight = 2
[[languages.en.menu.main]]
identifier = "dev"
name = "Dev"
pre = "fa fa-code"
url = "/dev"
weight = 3
[[languages.en.menu.main]]
identifier = "bash"
name = "Bash"
parent = "dev"
# pre = "<img alt=\"Logo Bash\" src=\"/svg/bash.svg\" width=\"24\"><!-- integrity=\"sha512-l17tBuaFnyww01uVTbhokdPpf6oQTunSIe62D+8c20c1F3l8/dYpKdVKIOh/YAsBxG+yuWo/W9WyC3y/UR0C+w== sha384-A7jD9sztYeSDySn5C4R2SdHSn5eRfcmgBM5wmhvhu8pZ4Cubgq0mYauGhyL8RaRz sha256-sS2Osxrgn53fpfkdJ2/4+RYBNgFvv3A9PklPmvgy2Gk=\"> -->"
url = "/dev/bash"
weight = 31
#[[languages.en.menu.main]]
# identifier = "js"
# name = "Javascript"
# parent = "dev"
# pre = "<img alt=\"Logo Javascript\" src=\"/svg/js.svg\" width=\"24\"><!-- integrity=\"sha512-zkMdi9T2q8jRX5t76TQvPV2JfAUoDdgb0p3JvU7EcEmQHmrGlTcQW5aCgUzHF2WPK9P4cbGnm9f+vqgZp+YF8g== sha384-zXjYrb80BkU2eJ0fGyROj3+fpsNV5GGMCFBuQe+3R3qo7HDYw+YbDS5HpIhAqRv3 sha256-mpNdcze+BktAhCwhPWvz2WsoCcMlY+hY1guYu3HjR70=\"> -->"
# url = "/dev/js"
# weight = 32
#[[languages.en.menu.main]]
# identifier = "php"
# name = "PHP"
# parent = "dev"
# pre = "<img alt=\"Logo PHP\" src=\"/svg/php.svg\" width=\"24\"><!-- integrity=\"sha512-MsYw+2YEPPaJ8vs5cZAze8bF7v72cFs4guGYoaROK9A7twUe/P4GPzPS9sMy0q7wIGnnGvlBt9SNEkWG0qJXKw== sha384-Kl8XtZQdEpQDiIOGxv06SAs6cx3XDWJR+D7rtELeGLO2FXyl/TrfL8xWWYtNxAq+ sha256-v4t+SK/pFUGLrXMIPiOqpIakaIxqIpcL/Wr3YRxtKQw=\"> -->"
# url = "/dev/php"
# weight = 33
#[[languages.en.menu.main]]
# identifier = "phpclass"
# name = "PHP Classes"
# parent = "php"
# pre = "fab fa-php"
# url = "/dev/php/class"
# weight = 331
#[[languages.en.menu.main]]
# identifier = "phpfunc"
# name = "PHP Function"
# parent = "php"
# pre = "fab fa-php"
# url = "/dev/php/function"
# weight = 332
[[languages.en.menu.main]]
identifier = "python"
name = "Python"
parent = "dev"
# pre = "<img alt=\"Logo Python\" src=\"/svg/python.svg\" width=\"24\"><!-- integrity=\"sha512-YS2GgMvicTi+2RHJ/B/dbyOsd+qmmzdvRFbi9PkfrUZaT+Eadlo6kJu9vV+XwJ1SK60rf8uswAMaAWxzGOta4A== sha384-YdKYhWfa4MMtzn7OFRmDShh7fsCLYphwbDFhSCUsGtwAoHj7uF2eLdpCE/11nTUE sha256-+8O2mNwRmyVdFvpcJsXLlOPcn50Sbv/qFHet1IF9T6A=\"> -->"
url = "/dev/python"
weight = 34
#[[languages.en.menu.main]]
# identifier = "sh"
# name = "shell"
# parent = "dev"
# pre = "<img alt=\"Logo Bash\" src=\"/svg/bash.svg\" width=\"24\"><!-- integrity=\"sha512-l17tBuaFnyww01uVTbhokdPpf6oQTunSIe62D+8c20c1F3l8/dYpKdVKIOh/YAsBxG+yuWo/W9WyC3y/UR0C+w== sha384-A7jD9sztYeSDySn5C4R2SdHSn5eRfcmgBM5wmhvhu8pZ4Cubgq0mYauGhyL8RaRz sha256-sS2Osxrgn53fpfkdJ2/4+RYBNgFvv3A9PklPmvgy2Gk=\"> -->"
# url = "/dev/shell"
# weight = 35
identifier = "blog"
name = "Blog"
pre = "fa fa-plume"
url = "/post"
weight = 2
#[[languages.en.menu.main]]
# identifier = "sec"
# name = "Security"
@ -256,60 +202,11 @@ title = "Stéphane HUC :: IT Log"
url = "/post"
weight = 2
[[languages.fr.menu.main]]
identifier = "dev"
name = "Dev"
pre = "fa fa-code"
url = "/dev"
identifier = "ah"
name = "Auto-Hébergement"
pre = ""
url = "/ah"
weight = 3
[[languages.fr.menu.main]]
identifier = "bash"
name = "Bash"
parent = "dev"
# pre = "<img alt=\"Logo Bash\" src=\"/svg/bash.svg\" width=\"24\"><!-- integrity=\"sha512-l17tBuaFnyww01uVTbhokdPpf6oQTunSIe62D+8c20c1F3l8/dYpKdVKIOh/YAsBxG+yuWo/W9WyC3y/UR0C+w== sha384-A7jD9sztYeSDySn5C4R2SdHSn5eRfcmgBM5wmhvhu8pZ4Cubgq0mYauGhyL8RaRz sha256-sS2Osxrgn53fpfkdJ2/4+RYBNgFvv3A9PklPmvgy2Gk=\"> -->"
url = "/dev/bash"
weight = 31
#[[languages.fr.menu.main]]
# identifier = "js"
# name = "Javascript"
# parent = "dev"
# pre = "<img alt=\"Logo Javascript\" src=\"/svg/js.svg\" width=\"24\"><!-- integrity=\"sha512-zkMdi9T2q8jRX5t76TQvPV2JfAUoDdgb0p3JvU7EcEmQHmrGlTcQW5aCgUzHF2WPK9P4cbGnm9f+vqgZp+YF8g== sha384-zXjYrb80BkU2eJ0fGyROj3+fpsNV5GGMCFBuQe+3R3qo7HDYw+YbDS5HpIhAqRv3 sha256-mpNdcze+BktAhCwhPWvz2WsoCcMlY+hY1guYu3HjR70=\"> -->"
# url = "/dev/js"
# weight = 32
[[languages.fr.menu.main]]
identifier = "php"
name = "PHP"
parent = "dev"
# pre = "<img alt=\"Logo PHP\" src=\"/svg/php.svg\" width=\"24\"><!-- integrity=\"sha512-MsYw+2YEPPaJ8vs5cZAze8bF7v72cFs4guGYoaROK9A7twUe/P4GPzPS9sMy0q7wIGnnGvlBt9SNEkWG0qJXKw== sha384-Kl8XtZQdEpQDiIOGxv06SAs6cx3XDWJR+D7rtELeGLO2FXyl/TrfL8xWWYtNxAq+ sha256-v4t+SK/pFUGLrXMIPiOqpIakaIxqIpcL/Wr3YRxtKQw=\"> -->"
url = "/dev/php"
weight = 33
#[[languages.fr.menu.main]]
# identifier = "phpclass"
# name = "PHP Classes"
# parent = "php"
# pre = "fab fa-php"
# url = "/dev/php/class"
# weight = 331
#[[languages.fr.menu.main]]
# identifier = "phpfunc"
# name = "PHP Function"
# parent = "php"
# pre = "fab fa-php"
# url = "/dev/php/function"
# weight = 332
[[languages.fr.menu.main]]
identifier = "python"
name = "Python"
parent = "dev"
# pre = "<img alt=\"Logo Python\" src=\"/svg/python.svg\" width=\"24\"><!-- integrity=\"sha512-YS2GgMvicTi+2RHJ/B/dbyOsd+qmmzdvRFbi9PkfrUZaT+Eadlo6kJu9vV+XwJ1SK60rf8uswAMaAWxzGOta4A== sha384-YdKYhWfa4MMtzn7OFRmDShh7fsCLYphwbDFhSCUsGtwAoHj7uF2eLdpCE/11nTUE sha256-+8O2mNwRmyVdFvpcJsXLlOPcn50Sbv/qFHet1IF9T6A=\"> -->"
url = "/dev/python"
weight = 34
#[[languages.fr.menu.main]]
# identifier = "sh"
# name = "shell"
# parent = "dev"
# pre = "<img alt=\"Logo Bash\" src=\"/svg/bash.svg\" width=\"24\"><!-- integrity=\"sha512-l17tBuaFnyww01uVTbhokdPpf6oQTunSIe62D+8c20c1F3l8/dYpKdVKIOh/YAsBxG+yuWo/W9WyC3y/UR0C+w== sha384-A7jD9sztYeSDySn5C4R2SdHSn5eRfcmgBM5wmhvhu8pZ4Cubgq0mYauGhyL8RaRz sha256-sS2Osxrgn53fpfkdJ2/4+RYBNgFvv3A9PklPmvgy2Gk=\"> -->"
# url = "/dev/shell"
# weight = 35
[[languages.fr.menu.main]]
identifier = "sec"
name = "Sécurité"
@ -637,6 +534,7 @@ title = "Stéphane HUC :: IT Log"
enableGitInfo = true
enableRobotsTXT = false
git4Commit = "https://git.huc.fr.eu.org/SH-Hugo/doc.huc.fr.eu.org/commit/"
git4MD = "https://git.huc.fr.eu.org/SH-Hugo/doc.huc.fr.eu.org/raw/branch/master/content/"
git4RAW = "https://git.huc.fr.eu.org/SH-Hugo/doc.huc.fr.eu.org/raw/branch/master/layouts/shortcodes/"

View File

@ -0,0 +1,83 @@
---
aliases: ['/en/dev/python/env-python-openbsd']
date: 2019-06-19T12:03:33+02:00
description: "How to use virtuals environments Python on OpenBSD with W^X security."
draft: false
tags: ['Python','Environnement','OpenBSD']
title: "Python: virtual environment on OpenBSD"
translationKey: "python-env-openbsd"
---
## Description
* OS : OpenBSD 6.x
Since OpenBSD 6.0, `wxallowed` is a mount option, by default on `/usr/local`.
If the partition has this option, the software is allowed to run from that
partition, otherwise it won't be able to run and will issue a `W^X` violation
message:
`$ dmesg | grep wxallowed` <br>
`/home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint`
In fact, since only `/usr/local` had this actived option, if you attempt
to run one program, by example on your `$HOME`, this one will not execute. <br>
That's the whole problem with Python environments that need to work in
your home directory.
Here the problem with `virtualenv`:
{{< code "dev-python-env-openbsd-virtualenv-error-permission-denied" sh >}}
Egual for `pipenv`:
{{< code "dev-python-env-openbsd-pipenv-failed-create" shell >}}
## Configuration
One only little system change will make our lives easier:
- create a folder user into `/usr/local`, i.e.: <br> `# mkdir -p /usr/local/${my_user}/python`
- chown user and group rights: <br> `# chown -R ${my_user}:wheel /usr/local/${my_user}`
- create symbolic link: <br> `# ln -s /usr/local/${my_user}/python $home/python`
*Of course, replace `${my_user}` by your id!* ;-)
If you use `pipenv`, you need to create a new folder and symlink; read the
{{< anchor "TL;DR" tldr >}} below.
## TL;DR
Replace `${my_user}` by your session id!
=> For **virtualenv**: <br>
`# mkdir -p /usr/local/${my_user}/python` <br>
`# chown -R ${my_user}:wheel /usr/local/${my_user}` <br>
`# ln -s /usr/local/${my_user}/python $home/python`
=> For **pipenv**, you need to add more: <br>
`$ mkdir /usr/local/$USER/python/virtualenvs` <br>
`$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs`
## Documentations
* The **pipenv**: https://pipenv.readthedocs.io/en/latest/
* About the mount option **wxallowed**: [EN][1]
## Aknowledgements
* This article would not exists without [Xavier][4]…
* and, this other [article][5]: "***Using cabal on OpenBSD***"
---
[1]: https://www.openbsd.org/faq/upgrade60.html
[2]: https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/upgrade60#changement-de-configuration-et-de-syntaxe
[3]: https://forum.openbsd.fr.eu.org/showthread.php?tid=2352&pid=18773#pid18773
[4]: https://ybad.name/sdj.html
[5]: https://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html
---

View File

@ -51,7 +51,7 @@ Let's retrieve the new firmware version:
- e.g. the current version:
`# v="22.03.2"`
`# v="22.03.4"`
⇒ for the **Ubiquiti EdgeRouter X** :
@ -65,7 +65,7 @@ And, we check the checksum:<br>
`# sha256sum -c sha256sums 2> /dev/null | grep OK`
⇒ Correct result for **Xiaomi Redmi Router AC2100**: <br>
`openwrt-22.03.2-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin: OK`
`openwrt-22.03.4-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin: OK`
{{< note danger >}}
**ATTENTION**: If the verification fails, go to discuss it on the forum!

23
content/fr/ah/_index.md Normal file
View File

@ -0,0 +1,23 @@
---
date: 2021-07-01T18:41:14+01:00
description: "Section à-propos d'articles liés à-propos de l'auto-hébergement…"
draft: false
noindex: true
tags: ['AH']
title: "Section Auto-Hébergement"
---
Différents articles sur l'auto-hébergement, principalement autour d'OpenBSD
Ouvrage inspiré par l'excellent :
[Héberger un serveur avec OpenBSD](https://si3t.ch/ah/fr/)
Qui change + ou - régulièrement d'URL, et qui actuellement s'affiche une
seule et même page HTML, créé à l'origine par @prx, Xavier Catron
Sous [Licence CC By](https://creativecommons.org/licenses/by/4.0/)
---
## OpenNTPD
{{< inside "ah:openntpd" >}}

264
content/fr/ah/httpd-tls.md Normal file
View File

@ -0,0 +1,264 @@
---
categories: ['ah']
date: 2023-03-23T14:35:32+01:00
description: "Auto-héberger des sites web avec httpd, le serveur web sous OpenBSD, et le configurer pour utiliser des certificats TLS"
draft: true
include_toc: true
show_comments: false
tags: ['ah','httpd','TLS']
title: "httpd: Hébergement de sites web avec certificats TLS"
translationKey: 'ah-openbsd-httpd-tls'
---
## Description
Dans le chapitre précédent, nous avons vu comment utiliser basiquement le
serveur web natif dans OpenBSD qu'est **httpd** pour gérer des pages HTML.
Si vous ne l'avez pas lu, retrouvez le : {{< inside "ah/httpd" >}}
Ci-dessous voyons comment configurer **httpd** pour utiliser des certificats
TLS.
Prévoir un accès avec chiffrement pour votre site n'est pas obligatoire.
Un certificat sera de toute façon nécessaire dès que vous voudrez chiffrer
les échanges, non seulement pour un site web mais aussi pour un serveur
mail, par exemple.
Nous allons utiliser l'autorité de certification gratuite **Let's Encrypt**
(https://letsencrypt.org).
Sous OpenBSD, il existe un client natif sécurisé nommé **acme-client**.
Il est possible d'utiliser le logiciel **certbot** mis à disposition par
**Let's Encrypt**. Mais veillez à n'utiliser que l'un ou l'autre, et pas
les deux en même temps ; ce sont deux outils différents qui n'interagissent
pas ensemble.
## acme-client
- fichier de configuration : `/etc/acme-client.conf`
Cet outil va vérifier que vous avez bien accès au domaine pour lequel
vous souhaitez un certificat. Il procède ainsi :
Il demande tout d'abord à letsencrypt un fichier unique, une sorte d'empreinte,
qui est enregistrée dans `/var/www/acme`. Ensuite, letsencrypt tente de
récupérer ce fichier en allant sur votre site dans le dossier `.well-known/acme-challenge`
pour certifier que c'est bien votre serveur qui a fait la demande.
Autrement dit, il interroge l'URL `http://chezmoi.tld/.well-known/acme-challenge/unfichiersecret`.
S'il y accède, la demande de certificat est acceptée.
Puis, le fichier est supprimé.
Il faut donc rendre disponible le dossier `/var/www/acme`.
Ajoutons une nouvelle instruction "location" dans votre fichier de configuration
du serveur **httpd** :
```nginx
server "chezmoi.tld" {
listen on * port 80
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
root "/htdocs/super-site"
}
```
Quelques explications :
- `location "/.well-known/acme-challenge/*" {` : Lorsqu'une requête est
faite pour une adresse ressemblant à `http://chezmoi.tld/.well-known/acme-challenge/nimportequoi`,
alors on applique la configuration qui suit :
- `root "/acme"` : La nouvelle racine est le dossier /acme.
Ce dernier est dans le chroot d'httpd, donc il s'agit bien de `/var/www/acme`.
- `request strip 2` : On retire de l'URL la partie avec ".well-known/acme-challenge"
pour éviter que soit demandé `http://chezmoi.tld/acme/.well-known/acme-challenge`
qui n'a rien à voir.
---
Le fichier de configuration d'acme-client n'existe pas par défaut. Un example
se trouve dans le répertoire `/etc/examples/acme-client.conf`.
Configurons le fichier, tel que :
```cfg
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
authority letsencrypt-staging {
api url "https://acme-staging-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-staging-privkey.pem"
}
domain chezmoi.tld {
alternative names { webmail.chezmoi.tld www.chezmoi.tld }
domain key "/etc/ssl/private/chezmoi.tld.key"
domain full chain certificate "/etc/ssl/chezmoi.tld.crt"
sign with letsencrypt
}
```
Quelques explications sur les déclarations suivantes - à remplacer :
- `chezmoi.tld` par votre nom de domaine.
- `alternative names` par les noms de domaines et sous-domaines à certifier.
- `domain key` est la déclaration du chemin absolu, dans votre système de
fichiers, de la clé privé lié au nom de domaine
- `domain full chain certificate` est la déclaration du chemin absolu du
certificat serveur lié au nom de domaine. Cette dernière est importante.
---
Vérifions la configuration :
```sh
# acme-client -n
```
Si aucun message d'erreur n'est affiché, c'est que c'est bon.
---
Maintenant demandons au client-acme de générer les certificats :
```sh
# acme-client -v chezmoi.tld && rcctl reload httpd
```
Conseils :
- Utiliser la déclaration `sign with letsencrypt-staging` dans le fichier
de configuration permet de tester la configuration avec les serveurs
de Let's Encrypt. Si la communication avec les serveurs s'exécute bien,
les certificats de tests seront générés positivement. Votre configuration
sera donc bonne.
- Ajouter la commande de génération de certificats ci-dessus dans le fichier
de cron quotidien. C'est la même pour le renouvellement de ceux-ci.
### Inclusion configuration acme-client
L'inclusion de fichiers pour la configuration d'acme-client fonctionne
exactement au même principe que pour httpd.
La première chose est de créer le répertoire `acme-client.d` qui n'existe pas
par défaut :
```sh
# mkdir /etc/acme-client.d
```
Puis de créer un fichier de configuration par nom de domaine et d'utiliser
dans le fichier principal la directive `include`, tel que :
- exemple de fichier de configuration pour le domaine **chez-moi.tld**,
nommé `/etc/acme-client.d/chez-moi.tld.conf` :
```cfg
domain chezmoi.tld {
alternative names { webmail.chezmoi.tld www.chezmoi.tld }
domain key "/etc/ssl/private/chezmoi.tld.key"
domain full chain certificate "/etc/ssl/chezmoi.tld.crt"
sign with letsencrypt
}
```
- exemple de réécriture du fichier de configuration d'acme-client :
```cfg
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
authority letsencrypt-staging {
api url "https://acme-staging-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-staging-privkey.pem"
}
include "/etc/acme-client.d/chez-moi.tld.conf"
```
N'oubliez pas de vérifier la configuration…
## certbot
**certbot** est l'outil officiel par **Let's Encrypt** pour générer des
certificats TLS. Il est disponible en tant que paquet :
```sh
# pkg_add certbot
```
L'utilisation en mode console de **certbot** est simple, néanmoins
veillez à ce que le service lié à httpd ne soit pas actif :
```sh
# rcctl stop httpd
# certbot certonly --standalone -d chez-moi.tld -d www.chez-moi.tld
```
Si la génération des certificats TLS se termine correctement, il suffit
de démarrer à nouveau le service httpd après l'avoir reconfiguré correctement.
Voir ci-dessous :
## httpd configuration
Maintenant, il est nécessaire de retoucher la configuration du serveur
**httpd** pour activer la gestion des certificats TLS :
```cfg
# extrait de /etc/httpd.conf
server "chezmoi.tld" {
listen on * port 80
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
# on redirige vers la version https
location * { block return 301 "https://$SERVER_NAME$REQUEST_URI" }
}
server "chezmoi.tld" {
listen on * tls port 443
root "/htdocs/monsupersite"
tls {
certificate "/etc/ssl/chezmoi.tld.crt"
key "/etc/ssl/private/chezmoi.tld.key"
}
hsts
# n'oubliez pas d'ajouter la configuration
# specifique liée à votre site
}
```
Quelques explications :
- la directive `location * { block return 301 …` permet de rediriger toutes
les requêtes faites sur le port 80 vers le service sur le port 443,
en HTTPS.
---
## Licence
Sous [Licence CC By](https://creativecommons.org/licenses/by/4.0/)
- Auteur original : Xavier Catron @prx
- Site original : [Héberger un serveur avec OpenBSD](https://si3t.ch/ah/fr/)
---

176
content/fr/ah/httpd.md Normal file
View File

@ -0,0 +1,176 @@
---
categories: ['ah']
date: 2023-03-20T12:08:01+01:00
description: "Auto-héberger des sites web avec httpd, le serveur web sous OpenBSD"
draft: true
include_toc: true
show_comments: false
tags: ['ah','httpd']
title: "httpd: Hébergement de sites web"
translationKey: 'ah-openbsd-httpd'
---
## Description
OpenBSD intègre par défaut un serveur HTTP qui s'appelle tout simplement
**httpd**. Il ne propose pas de fonctionnalités exotiques, mais sa légèreté
le rend d'autant plus simple à configurer et moins sensible à d'éventuelles
failles de sécurité. Il s'avère amplement suffisant dans la plupart des cas.
Pour des raisons de sécurité, le serveur web httpd sera lancé en chroot
dans le dossier `/var/www`.
En réalité, pour le serveur web, tous les documents qui sont hors du dossier
sont totalement inaccessibles. Pour lui, il s'agit de la racine principale `/`.
Ce comportement peut être modifié, mais je vous le déconseille !
## Un simple site statique
Un "simple site statique" est constitué uniquement de pages {{< abbr "HTML" "HyperText Markup Language" >}}.
Commençons par créer un dossier qui contiendra les pages du site :
```sh
# mkdir /var/www/htdocs/mon_super_site
```
Maintenant, copiez tous les fichiers HTML dans ce répertoire.
### Gestion des droits utilisateur web
L'utilisateur web sous OpenBSD est **www**, le nom du groupe est le même.
Pour vous assurer que le serveur pourra lire et donc servir vos pages html,
il faut changer les droits du propriétaire de ces fichiers pour qu'ils
appartiennent au serveur http :
```
# chown -R www:www /var/www/htdocs/mon_super_site
```
## Configuration
- fichier principal de configuration : `/etc/httpd.conf`
Par défaut, ce fichier n'existe pas. Un fichier d'exemple existe sous
`/etc/examples/httpd.conf`, il suffit de le copier dans le répertoire `/etc`.
Dans notre contexte, faisons simple et écrivons :
```cfg
types { include "/usr/share/misc/mime.types" }
server "chezmoi.tld" {
listen on * port 80
root "/htdocs/mon_super_site"
}
```
Quelques explications concernant ces directives :
- `types`: La première ligne permet de préciser les types des fichiers
que le serveur pourra avoir à fournir. Ce n'est pas obligatoire, mais ça
permet par exemple à un visiteur de voir directement une image dans son
navigateur plutôt que de la télécharger lorsqu'il clique dessus.
- `server` : définit ici le nom de domaine du site web, puis on indique
que nous allons configurer ce site en ouvrant une accolade.
- `listen` : Le serveur écoute les protocoles IPv4 et IPv6 sur le port 80
(le port www par défaut).
- `root` : indique où se trouve la "racine" du site. C'est le dossier
contenant les pages HTML. Il est relatif au chroot évoqué plus haut ;
on ne note donc pas `/var/www/` devant.
- httpd lit chacune des déclarations dans l'ordre d'écriture
---
La commande suivante permet de vérifier l'écriture du fichier de configuration :
```sh
# httpd -n
```
Exécutez-la après toute modification du fichier de configuration d'httpd,
cela assurera la validité de celui-ci. S'il y a une ou plusieurs erreurs,
la commande vous en informera.
### Inclusion
La configuration du serveur permet l'inclusion de fichiers de configuration
secondaires. Ainsi, il est possible de configurer chaque nom de domaine
dans son propre fichier de configuration et le "lier" dans le fichier de
configuration principal d'httpd. Cela reste aussi valable pour tout élément
de configuration qui serait commun à différents domaines.
La première chose est de créer le répertoire `httpd.d` qui n'existe pas
par défaut :
```sh
# mkdir /etc/httpd.d
```
Puis de créer un fichier de configuration par nom de domaine et d'utiliser
dans le fichier principal la directive `include`, tel que :
- exemple de fichier de configuration pour le domaine **chez-moi.tld**,
nommé `/etc/httpd.d/chez-moi.tld.conf` :
```cfg
server "chezmoi.tld" {
listen on * port 80
root "/htdocs/mon_super_site"
}
```
- exemple de réécriture du fichier de configuration d'httpd :
```cfg
types { include "/usr/share/misc/mime.types" }
include "/etc/httpd.d/chez-moi.tld.conf"
```
## Exécution
Ce service n'est pas actif par défaut ; il est donc nécessaire de le faire
puis de le démarrer :
```sh
# rcctl enable httpd
# rcctl start httpd
```
Toutes les pages HTML placées dans `/var/www/htdocs/mon_super_site` seront
servies.
## PF
N'oubliez pas d'ouvrir le port 80 (www) dans le parefeu PF.
Par exemple :
```cfg
pass in on egress proto tcp to port 80
```
---
## Certificats TLS
Maintenant, voyons comment générer et utiliser des certificats TLS pour
chiffrer la communication avec le serveur lié au nom de domaine :
{{< inside "ah/httpd-tls" >}}
---
## Licence
Sous [Licence CC By](https://creativecommons.org/licenses/by/4.0/)
- Auteur original : Xavier Catron @prx
- Site original : [Héberger un serveur avec OpenBSD](https://si3t.ch/ah/fr/)
---

71
content/fr/ah/openntpd.md Normal file
View File

@ -0,0 +1,71 @@
---
categories: ['ah']
date: 2023-03-20T10:56:11+01:00
description: "Auto-héberger un serveur NTP sous OpenBSD"
draft: true
include_toc: true
show_comments: false
tags: ['ah','ntpd']
title: "OpenNTPD: Un serveur à l'heure (ntpd)"
translationKey: 'ah-openbsd-openntpd'
---
## Description
Il est essentiel de disposer d'un serveur ayant la date et l'heure justes.
Afin de maintenir à l'heure votre serveur, utilisons OpenNTPD
pour synchroniser l'horloge à intervalles réguliers sur des
serveurs de temps de confiance.
OpenNTPD développé par l'équipe OpenBSD est déjà présent sur votre machine,
et actif par défaut, avec les bons paramètres de sécurité.
## Configuration
- Fichier de configuration : `/etc/ntpd.conf`
```cfg
# $OpenBSD: ntpd.conf,v 1.16 2019/11/06 19:04:12 deraadt Exp $
#
# See ntpd.conf(5) and /etc/examples/ntpd.conf
servers pool.ntp.org
server time.cloudflare.com
sensor *
constraint from "9.9.9.9" # quad9 v4 without DNS
constraint from "2620:fe::fe" # quad9 v6 without DNS
constraints from "www.google.com" # intentionally not 8.8.8.8
```
Pour vérifier la configuration : `ntpd -n`, tel que :
```sh
$ ntpd -n
configuration OK
```
## Exécution
Vérifions le service :
`# rcctl check ntpd`
Si le service n'est pas actif, démarrons-le :
`# rcctl start ntpd`
---
Et voilà !
---
## Licence
Sous [Licence CC By](https://creativecommons.org/licenses/by/4.0/)
- Auteur original : Xavier Catron @prx
- Site original : [Héberger un serveur avec OpenBSD](https://si3t.ch/ah/fr/)
---

View File

@ -0,0 +1,63 @@
---
aliases: ['/fr/dev/php/sitemap-gz']
date: 2018-11-13T19:10:51+02:00
description: "Générer un fichier sitemap et sa version compressée en PHP 5 et 7"
draft: false
tags: ['PHP5', 'PHP7', 'sitemap']
title: "PHP5|7 : un fichier sitemap.xml, ou sitemap.xml.gz"
---
## Description
Ou comment créer un fichier **[sitemap.xml][1]** - ou sa version compressée **sitemap.xml.gz** en PHP.
## Sitemap.xml basique
Voyons comment écrire en PHP un sitemap.xml très basique :
{{< code "dev-php-sitemap-basic" php >}}
Bien-sûr l'écriture du fichier `sitemap.xml` est basique, non compressé,
et ne sert - *dans ce cas* - qu'à indexer le fichier `index.php` - *cas peu utile, avouons-le* !
## Parcours de répertoire
Maintenant, admettons que nous avons un répertoire 'outils', dans lequel
nous avons différents scripts PHP que nous souhaitons indexer, eux aussi ;)
Pour cela, nous allons utiliser les Itérateurs par parcourir le répertoire,
puis récupérer les informations de fichier par le biais de la classe SPL !
{{< code "dev-php-sitemap-spl-loop-folders" php >}}
Bien-sûr, ce code PHP de parcours de dossier et de restitution d'informations
fichiers, envoyé dans le flux XML nécessaire, est à intégrer après le code
relatif au fichier index et avant le code de fermeture du flux XML.
## Compression du sitemap.xml
Maintenant, voyons comment compresser de manière simple et rapide le flux
XML pour créer un fichier **sitemap.xml.gz** nécessaire :
{{< code "dev-php-sitemap-gzencode" php >}}
Ensuite pour envoyer les données, utilisons les bons entêtes, puis affichons le flux encodé :
{{< code "dev-php-sitemap-headers" php >}}
## TL;DR
Voici la version finale du code PHP pour créer dynamiquement un fichier
**sitemap.xml**, et sa version compressée **sitemap.xml.gz** :
{{< file "dev-php-sitemap-tldr" php "sitemap.php" >}}
Et, voilà ! :D
---
[1]: https://www.sitemaps.org/fr/
---

View File

@ -0,0 +1,50 @@
---
aliases: ['/fr/dev/shell/split-archive']
date: 2017-07-31T00:00:00+01:00
description: "Comment découper une archive tar, .gz, .bz dans un shell (Bash, ksh), puis la reconstruire !"
draft: false
include_toc: true
show_comments: false
tags: ['shell','archive']
title: "Shell : découper/reconstruire une archive…"
---
## Description
Le code ci-dessous compresse le fichier archive et le découpe par tranche
de 100 Mo, en ajoutant une extension incrémentée alphabétique… <br>
*(tel que : `_aa` pour le premier fichier, `_ab` pour le second, `_ac` pour le troisième, etc…)*
## Découper
### Découper une archive tar
Pour découper une archive tar, utilisons le binaire **split** :
`tar cz fichier | split -b 100m - archive_split.tgz_`
{{< note warning >}}Attention : sous OpenBSD, tar supporte mal les gros
fichiers et se mettra en erreur !{{</note>}}
### Découper une archive gzip
Pour découper votre archive au format gzip :
`gzip -c fichier | split -b 100m - archive_split.gz_`
## Reconstruire
Dans un premier temps, il nous faut "concaténer" l'archive, nous utiliserons
dans les deux cas l'outil **cat**, puis ensuite il faut la décompresser
pour obtenir le(s) fichiers(s) de l'archive.
### Reconstruire l'archive tar
`cat archive_split.tgz_* | tar xz`
### Reconstruire l'archive gzip
`cat archive_split.gz_* | gunzip -c > fichier`
---

View File

@ -0,0 +1,89 @@
---
aliases: ['/fr/dev/python/env-python-openbsd']
date: 2019-06-19T12:03:33+02:00
description: "Utiliser les environnements Python virtuels sous OpenBSD (W^X)"
draft: false
tags: ['Python','Environnement','OpenBSD']
title: "Python : environnement virtuel sous OpenBSD"
translationKey: "python-env-openbsd"
---
## Description
* OS : OpenBSD 6.x
Depuis OpenBSD 6.0, l'option de montage `wxallowed` est configuré par
défaut sur `/usr/local`. Pour ceux qui ne le savent pas, c'est une protection
système. Si la partition a cette option, les logiciels sont autorisés à
fonctionner depuis cette partition, sinon ils ne pourront fonctionner et
émettront un message de violation `W^X`, tel que :
`$ dmesg | grep wxallowed` <br>
`/home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint`
De fait, puisque seul `/usr/local` a cette option activée, si vous tentez
d'exécuter un programme depuis, par exemple, votre `$HOME`, cela ne fonctionnera
pas. Et, c'est tout le problème avec les environnements Python qui doivent
fonctionner dans votre répertoire personnel.
Dans les faits, voici ce qui se passe pour `virtualenv` :
{{< code "dev-python-env-openbsd-virtualenv-error-permission-denied" shell >}}
C'est pareil pour `pipenv` :
{{< code "dev-python-env-openbsd-pipenv-failed-create" shell >}}
D'autant que ce n'est vraiment pas un problème de droits utilisateurs :
{{< code "dev-python-env-openbsd-ls-mybeautifull-project" shell >}}
## Configuration
Une petite modification système va faciliter notre vie - puisque `/usr/local`
est la seule partition autorisée à l'exécution des programmes qui nécessitent
la violation `W^X` :
- Création d'un répertoire utilisateur dedans : <br> `# mkdir -p /usr/local/${my_user}/python`
- Attribution des droits utilisateur et groupe correcte : <br> `# chown -R ${my_user}:wheel /usr/local/${my_user}`
- Création d'un lien symbolique : <br> `# ln -s /usr/local/${my_user}/python $home/python`
Remplacez `${my_user}` par votre identifiant de session ;)
Si vous avez la bonne idée d'utiliser l'outil `pipenv`, il faudra créer
un nouveau répertoire et le lier symboliquement ; lisez la section {{< anchor "TL;DR" tldr >}} ci-dessous…
## TL;DR
Remplacez ''${my_user}'' par votre identifiant de session !
=> Pour **virtualenv** : <br>
`# mkdir -p /usr/local/${my_user}/python` <br>
`# chown -R ${my_user}:wheel /usr/local/${my_user}` <br>
`# ln -s /usr/local/${my_user}/python $home/python`
=> Pour **pipenv**, il faut rajouter à ce qui suit au-dessus : <br>
`$ mkdir /usr/local/$USER/python/virtualenvs` <br>
`$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs`
## Documentations
* La documentation de **pipenv** - *en anglais* : https://pipenv.readthedocs.io/en/latest/
* À-propos de l'option de montage **wxallowed** : le Guide de Migration OpenBSD 5.9 vers 6.0 - [EN][1] / [FR][2]
* La [réponse][3] expliquée sur le forum "obsd4*"
## Remerciements
* Ce tutoriel n'existerait pas sans [Xavier][4]…
* et, sans cet [article][5] anglais, nommé "***Using cabal on OpenBSD***"
---
[1]: https://www.openbsd.org/faq/upgrade60.html
[2]: https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/upgrade60#changement-de-configuration-et-de-syntaxe
[3]: https://forum.openbsd.fr.eu.org/showthread.php?tid=2352&pid=18773#pid18773
[4]: https://ybad.name/sdj.html
[5]: https://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html
---

View File

@ -63,7 +63,7 @@ Depuis le répertoire `/tmp`, récupèrons la nouvelle version du firmware :
- e.g. pour la version actuelle :
`# v="22.03.2"`
`# v="22.03.4"`
⇒ pour le routeur **Ubiquiti EdgeRouter X** :
@ -79,7 +79,7 @@ Puis, nous vérifions la somme de contrôle afin de nous assurer du firmware : <
`$ sha256sum -c sha256sums 2> /dev/null | grep OK`
⇒ Résultat correct pour le routeur **Xiaomi Redmi Router AC2100** : <br>
`openwrt-22.03.2-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin: OK`
`openwrt-22.03.4-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin: OK`
{{< note danger >}}
**ATTENTION** : Si la vérification échoue, allez en discuter sur le forum !

View File

@ -20,6 +20,9 @@
<p class="is-right is-white-50">
{{ i18n "countWords" . }}<br>
{{ i18n "pTxtSrcMd" }}<a class="raw-src" href="{{ .Site.Params.git4MD }}/{{.Lang}}/{{ .File.Path }}" title="Source Markdown"><i class="fa fa-markdown" aria-hidden="true"></i></a>
{{ if .Site.Params.enableGitInfo }}<br>
{{ if $.GitInfo }}Commit version : <a href="{{ .Site.Params.git4Commit }}{{ .GitInfo.Hash }}" title="Commit">{{ .GitInfo.AbbreviatedHash }}</a>{{ end }}
{{ end }}
</p>
</div>
</div>

View File

@ -5,4 +5,8 @@
{{ $d := .Lastmod.Day }} {{ $y := .Lastmod.Year }} {{ $m := i18n .Lastmod.Month }}
{{ $dateModified := printf "%d %s %d" $d $m $y }}
<i aria-hidden="true" class="fa fa-calendar"></i>
<em>{{ i18n "published" . }}<time class="post-date" datetime="{{ $dateTime }}">{{ print $dateCreated }}</time>{{ if gt $dateModifUnix $dateTimeUnix }}{{ T "modified" . }}<time class="post-date" datetime="{{ $dateTimeModif }}">{{ print $dateModified }}</time>{{ end }}<br><i aria-hidden="true" class="fa fa-clock-o"></i> {{ i18n "timeToRead" .ReadingTime }}</em>
<em>
{{ i18n "published" . }}<time class="post-date" datetime="{{ $dateTime }}">{{ print $dateCreated }}</time>
{{ if gt $dateModifUnix $dateTimeUnix }}{{ T "modified" . }}<time class="post-date" datetime="{{ $dateTimeModif }}">{{ print $dateModified }}</time>{{ end }}<br>
<i aria-hidden="true" class="fa fa-clock-o"></i> {{ i18n "timeToRead" .ReadingTime }}
</em>