Typo + exo not in submissions
This commit is contained in:
parent
b459443d9e
commit
6fd83df1fd
@ -27,7 +27,8 @@ On trouve par exemple :
|
|||||||
* `CAP_KILL` : permet de tuer n'importe quel processus ;
|
* `CAP_KILL` : permet de tuer n'importe quel processus ;
|
||||||
* `CAP_SYS_BOOT` : permet d'arrêter ou de redémarrer la machine ;
|
* `CAP_SYS_BOOT` : permet d'arrêter ou de redémarrer la machine ;
|
||||||
* `CAP_SYS_MODULE` : permet de charger et décharger des modules ;
|
* `CAP_SYS_MODULE` : permet de charger et décharger des modules ;
|
||||||
* et beaucoup d'autres, il y en a environ 39 en tout !
|
* et beaucoup d'autres, il y en a environ 39 en tout (ça dépend de la
|
||||||
|
version du noyau) !
|
||||||
|
|
||||||
|
|
||||||
### `ping`
|
### `ping`
|
||||||
@ -44,16 +45,16 @@ utilisateur de prendre les droits du super-utilisateur, le temps de l'exécution
|
|||||||
du programme.
|
du programme.
|
||||||
|
|
||||||
Les problèmes surviennent lorsque l'on découvre des vulnérabilités dans les
|
Les problèmes surviennent lorsque l'on découvre des vulnérabilités dans les
|
||||||
programmes Setuid root. En effet, s'il devient possible à un utilisateur
|
programmes Setuid root. En effet, s'il devient possible pour un utilisateur
|
||||||
d'exécuter du code arbitraire, ce code sera exécuté avec les privilèges de
|
d'exécuter du code arbitraire, ce code sera exécuté avec les privilèges de
|
||||||
l'utilisateur root ! Dans le cas de ping, on se retrouverait alors à pouvoir
|
l'utilisateur root ! Dans le cas de ping, on se retrouverait alors à pouvoir
|
||||||
lire l'intégralité de la mémoire, alors que l'on avait juste besoin d'écrire
|
lire l'intégralité de la mémoire, alors que l'on avait juste besoin d'écrire
|
||||||
sur une interface réseau.
|
sur une interface réseau.
|
||||||
|
|
||||||
C'est donc à ce moment que les *capabilities* entrent en jeu : un processus (ou
|
C'est donc à ce moment que les *capabilities* entrent en jeu : un processus (ou
|
||||||
même un thread) privilégié peut décider, à son lancement, de réduire ses
|
même un thread) privilégié peut décider, généralement à son lancement, de
|
||||||
*capabilities*, pour ne garder que celles dont il a réellement besoin. Ainsi,
|
réduire ses *capabilities*, pour ne garder que celles dont il a réellement
|
||||||
`ping` pourrait se contenter de `CAP_NET_RAW`.
|
besoin. Ainsi, `ping` pourrait se contenter de `CAP_NET_RAW`.
|
||||||
|
|
||||||
|
|
||||||
## Les attributs de fichier étendus
|
## Les attributs de fichier étendus
|
||||||
@ -95,8 +96,8 @@ cat: toto: Permission denied
|
|||||||
Hello World!
|
Hello World!
|
||||||
```
|
```
|
||||||
|
|
||||||
Bien que les droits UNIX traditionnels ne vous donne pas accès au fichier, les
|
Bien que les droits UNIX traditionnels ne vous donnent pas accès au fichier,
|
||||||
ACL POSIX vous autorisent à lire le contenu du fichier.
|
les ACL POSIX vous autorisent à le lire.
|
||||||
|
|
||||||
Vous pouvez voir ces attributs avec la commande :
|
Vous pouvez voir ces attributs avec la commande :
|
||||||
|
|
||||||
@ -134,18 +135,41 @@ Ou, dans sa version plus lisible :
|
|||||||
|
|
||||||
## Exercice : visualisateur de capabilities d'un processus
|
## Exercice : visualisateur de capabilities d'un processus
|
||||||
|
|
||||||
Écrivons maintenant un script permettant de voir les *capabilities* d'un
|
Écrivons maintenant un programme permettant de voir les *capabilities*
|
||||||
processus :
|
d'un processus :
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
42sh$ ./view_caps 1
|
||||||
|
cap_user_header_t
|
||||||
|
-----------------
|
||||||
|
Version: 20080522
|
||||||
|
PID: 1
|
||||||
|
|
||||||
|
cap_user_data_t
|
||||||
|
---------------
|
||||||
|
effective: 0xffffffff
|
||||||
|
CAP_AUDIT_CONTROL
|
||||||
|
CAP_AUDIT_READ
|
||||||
|
CAP_AUDIT_WRITE
|
||||||
|
CAP_BLOCK_SUSPEND
|
||||||
|
CAP_CHOWN
|
||||||
|
CAP_DAC_OVERRIDE
|
||||||
|
CAP_DAC_READ_SEARCH
|
||||||
|
permitted: 0xffffffff
|
||||||
|
CAP_AUDIT_CONTROL
|
||||||
|
CAP_AUDIT_READ
|
||||||
|
CAP_AUDIT_WRITE
|
||||||
|
CAP_BLOCK_SUSPEND
|
||||||
|
CAP_CHOWN
|
||||||
|
CAP_DAC_OVERRIDE
|
||||||
|
CAP_DAC_READ_SEARCH
|
||||||
|
inheritable: 0x0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Rendu
|
Astuces : `capget(2)`, X-macros, ...
|
||||||
|
|
||||||
|
|
||||||
|
## Pour aller plus loin
|
||||||
|
|
||||||
## Aller plus loin
|
|
||||||
|
|
||||||
Je vous recommande la lecture des *man* suivants :
|
Je vous recommande la lecture des *man* suivants :
|
||||||
|
|
||||||
@ -154,7 +178,10 @@ Je vous recommande la lecture des *man* suivants :
|
|||||||
|
|
||||||
Et de ces quelques articles :
|
Et de ces quelques articles :
|
||||||
|
|
||||||
* [https://www.freedesktop.org/wiki/CommonExtendedAttributes/](Guidelines for
|
* [Guidelines for extended attributes](https://www.freedesktop.org/wiki/CommonExtendedAttributes/)
|
||||||
extended attributes)
|
* [File-based capabilities](https://lwn.net/Articles/211883/)
|
||||||
* [https://lwn.net/Articles/211883/](File-based capabilities)
|
* [A bid to resurrect Linux capabilities](https://lwn.net/Articles/199004/)
|
||||||
* [http://lwn.net/Articles/199004/](A bid to resurrect Linux capabilities)
|
|
||||||
|
Pour revenir à Docker, par défaut, un certain nombre de *capabilities* sont
|
||||||
|
désactivées par défaut ; vous pouvez en ajouter et en retirer via les arguments
|
||||||
|
`--cap-add` et `--cap-drop` du `docker run`.
|
||||||
|
@ -165,7 +165,7 @@ curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \
|
|||||||
Pour vérifier que les données ont bien été ajoutées, vous pouvez effectuez la
|
Pour vérifier que les données ont bien été ajoutées, vous pouvez effectuez la
|
||||||
requête suivante dans l'interface web d'InfluxDB :
|
requête suivante dans l'interface web d'InfluxDB :
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT * from "$my_cgroup_name";
|
SELECT * from "$my_cgroup_name";
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -183,13 +183,14 @@ Liste non exhaustive de données à monitorer :
|
|||||||
<https://www.kernel.org/doc/Documentation/cgroup-v1/>
|
<https://www.kernel.org/doc/Documentation/cgroup-v1/>
|
||||||
|
|
||||||
|
|
||||||
### Permettre à l'utilisateur de monitorer des process
|
### Permettre à l'utilisateur de monitorer des processus
|
||||||
|
|
||||||
Maintenant, séparer votre script en deux parties afin qu'un utilisateur normal
|
Maintenant, séparer votre script en deux parties afin qu'un utilisateur normal
|
||||||
(non-root) puisse utiliser la partie monitoring de notre script.
|
(non-root) puisse utiliser la partie monitoring de notre script.
|
||||||
|
|
||||||
Un premier script doit s'occuper de créer le(s) *cgroup*s et lui attribuer les
|
Un premier script doit s'occuper de créer le(s) *cgroup*s et lui attribuer les
|
||||||
bons droits, tandis que le deuxième va utiliser effectuer le monitoring, sans
|
bons droits, tandis que le deuxième va utiliser effectuer le monitoring, sans
|
||||||
|
privilèges particuliers.
|
||||||
|
|
||||||
#### Exemple
|
#### Exemple
|
||||||
|
|
||||||
@ -199,24 +200,6 @@ bons droits, tandis que le deuxième va utiliser effectuer le monitoring, sans
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Rendu
|
|
||||||
|
|
||||||
### Script de monitoring
|
|
||||||
|
|
||||||
Rendez la révision la plus avancée de vos scripts de monitoring de processus.
|
|
||||||
|
|
||||||
### Questions
|
|
||||||
|
|
||||||
1. Un même processus peut-il être dans plusieurs *cgroup*s de type différents
|
|
||||||
(freezer et cpuacct par exemple) ?
|
|
||||||
|
|
||||||
1. Que sera-t-il possible de limiter via un nouveau *cgroup* dans la prochaine
|
|
||||||
version du noyau (4.3) ?
|
|
||||||
|
|
||||||
1. Actuellement, comment peut-on limiter le nombre de processus lancés par un
|
|
||||||
utilisateur ou un groupe ?
|
|
||||||
|
|
||||||
|
|
||||||
## Pour aller plus loin
|
## Pour aller plus loin
|
||||||
|
|
||||||
Depuis les noyaux 4.5, il est possible d'utiliser la nouvelle version du
|
Depuis les noyaux 4.5, il est possible d'utiliser la nouvelle version du
|
||||||
@ -224,10 +207,9 @@ pseudo système de fichiers des *CGroup*s. Le principal changement vient du
|
|||||||
regroupement au sein d'une seule hiérarchie des différents *CGroup*s que l'on
|
regroupement au sein d'une seule hiérarchie des différents *CGroup*s que l'on
|
||||||
avait dans la v1. Davantage d'informations sont disponibles :
|
avait dans la v1. Davantage d'informations sont disponibles :
|
||||||
|
|
||||||
* [https://lwn.net/Articles/679786/](Understanding the new control groups API)
|
* [Understanding the new control groups API](https://lwn.net/Articles/679786/)
|
||||||
;
|
;
|
||||||
* [https://www.kernel.org/doc/Documentation/cgroup-v2.txt](Kernel Document
|
* [Kernel Document about Control Group v2](https://www.kernel.org/doc/Documentation/cgroup-v2.txt).
|
||||||
about Control Group v2).
|
|
||||||
|
|
||||||
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
||||||
Control groups](https://lwn.net/Articles/604609/) est excellente !
|
Control groups](https://lwn.net/Articles/604609/) est excellente !
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
L'isolation ... du pauvre
|
L'isolation ... du pauvre
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
Depuis les premières version d'Unix, il est possible de changer le répertoire
|
Depuis les premières versions d'Unix, il est possible de changer le répertoire
|
||||||
vu comme étant la racine du système de fichiers.
|
vu comme étant la racine du système de fichiers.
|
||||||
|
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ mkdir newroot
|
|||||||
|
|
||||||
### `busybox`
|
### `busybox`
|
||||||
|
|
||||||
On a déjà parlé du porjet Busybox : c'est un programme linké statiquement,
|
On a déjà parlé du projet Busybox : c'est un programme linké statiquement,
|
||||||
c'est-à-dire qu'il n'a pas de dépendance sur des bibliothèques
|
c'est-à-dire qu'il n'a pas de dépendance sur des bibliothèques
|
||||||
dynamiques. Il se suffit donc à lui-même dans un chroot (dans lequel on ne peut
|
dynamiques. Il se suffit donc à lui-même dans un chroot (dans lequel on ne peut
|
||||||
pas accéder aux bibliothèques du système, il faudrait toutes les copier à la
|
pas accéder aux bibliothèques du système, il faudrait toutes les copier à la
|
||||||
@ -34,7 +34,7 @@ chroot newroot /busybox ash
|
|||||||
|
|
||||||
`debootstrap` est le programme utilisé par l'installeur des distributions
|
`debootstrap` est le programme utilisé par l'installeur des distributions
|
||||||
Debian et ses dérivés. Il permet d'installer dans un dossier (en général, ce
|
Debian et ses dérivés. Il permet d'installer dans un dossier (en général, ce
|
||||||
dossier correspond au point de montage de la nouvelle racine choisi par
|
dossier correspond au point de montage de la nouvelle racine choisie par
|
||||||
l'utilisateur lors de l'installation) le système de base.
|
l'utilisateur lors de l'installation) le système de base.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
@ -84,13 +84,6 @@ cat /path/to/foo
|
|||||||
|
|
||||||
## Rendu
|
## Rendu
|
||||||
|
|
||||||
### Fichiers
|
|
||||||
|
|
||||||
Rendez un fichier `.c` contenant un programme qui, lorsqu'il est compilé puis
|
|
||||||
exécuté dans un chroot, permet de s'en échapper pour rejoindre la véritable
|
|
||||||
racine.
|
|
||||||
|
|
||||||
|
|
||||||
### Questions
|
### Questions
|
||||||
|
|
||||||
1. Citez un moyen d'empêcher l'échappement du `chroot`.
|
1. Citez une solution empêchant l'échappement d'un `chroot`.
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
Projet et rendu
|
Projet et rendu
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
Les exercices de ce TP ne sont pas à rendre.
|
||||||
|
|
||||||
|
|
||||||
## Sujet
|
## Sujet
|
||||||
|
|
||||||
**Ce projet, étalé sur ce TP et le TP suivant, constitue le cœur de la notation
|
**Ce projet, étalé sur ce TP et le TP suivant, constitue le cœur de la notation
|
||||||
@ -30,7 +33,7 @@ principalement question de faire des appels système.
|
|||||||
### Stage 1 : Restreindre l'environnement
|
### Stage 1 : Restreindre l'environnement
|
||||||
|
|
||||||
Après avoir mis en place les bases de votre programme, commencez par créer les
|
Après avoir mis en place les bases de votre programme, commencez par créer les
|
||||||
différentes hiérarchies (si vous avez un noyau récent, vous pouvez les
|
différentes hiérarchies (si vous avez un noyau récent, vous pouvez utiliser les
|
||||||
cgroups-v2) dont vous allez avoir besoin pour limiter l'utilisation de
|
cgroups-v2) dont vous allez avoir besoin pour limiter l'utilisation de
|
||||||
ressources.
|
ressources.
|
||||||
|
|
||||||
@ -38,8 +41,13 @@ Puis, mettez en place ces limites :
|
|||||||
|
|
||||||
* pas plus d'1 GB de mémoire utilisée ;
|
* pas plus d'1 GB de mémoire utilisée ;
|
||||||
* 1 seul CPU au maximum ;
|
* 1 seul CPU au maximum ;
|
||||||
|
* 100 PIDs ;
|
||||||
* ...
|
* ...
|
||||||
|
|
||||||
|
En bonus, vous pouvez gérer les cas où le noyau sur lequel s'exécute votre
|
||||||
|
moulinette ne possède pas tous ces *CGroup*s, au lieu de planter, ne rien faire
|
||||||
|
n'est pas forcément une mauvaise solution.
|
||||||
|
|
||||||
|
|
||||||
### Stage 2 : Réduire les *capabilities*
|
### Stage 2 : Réduire les *capabilities*
|
||||||
|
|
||||||
@ -61,11 +69,14 @@ rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
|
|||||||
59e714c4331e71ac3529a6502994ef1d
|
59e714c4331e71ac3529a6502994ef1d
|
||||||
|
|
||||||
bash# ping 8.8.8.8
|
bash# ping 8.8.8.8
|
||||||
Operation not permitted
|
ping: icmp open socket: Permission denied
|
||||||
```
|
```
|
||||||
|
|
||||||
Astuces : `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ...
|
Astuces : `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ...
|
||||||
|
|
||||||
|
Aidez-vous du visualisateur de *capabilities* de la partie 4, pour voir si vous
|
||||||
|
êtes sur la bonne voie.
|
||||||
|
|
||||||
|
|
||||||
### Stage 3 : Utilisable par un utilisateur
|
### Stage 3 : Utilisable par un utilisateur
|
||||||
|
|
||||||
@ -81,16 +92,16 @@ et toutes ses bibliothèques, il faudrait utiliser un système contenant le
|
|||||||
strict minimum. Recréez un environnement minimaliste, comme on a pu en voir
|
strict minimum. Recréez un environnement minimaliste, comme on a pu en voir
|
||||||
dans la partie sur les *chroot*.
|
dans la partie sur les *chroot*.
|
||||||
|
|
||||||
**Ne rendez pas cet environnement, il vous sera seulement utile pour faire des
|
**Ne mettez pas cet environnement dans votre tarball de rendu, il vous
|
||||||
tests.**
|
sera seulement utile pour faire des tests.**
|
||||||
|
|
||||||
|
|
||||||
### Stage 4 : Isolation du pauvre
|
### Stage 4 : Isolation du pauvre
|
||||||
|
|
||||||
Nous n'avons pas encore vu de meilleure méthode pour mieux isoler
|
Nous n'avons pas encore vu de meilleure méthode pour mieux isoler
|
||||||
l'environnement que de faire un `chroot`, ajouter à votre programme cette
|
l'environnement que de faire un `chroot`, ajouter à votre programme cette
|
||||||
isolation rudimentaire. Et rendez-vous au prochain cours pour avoir de
|
isolation rudimentaire. Et rendez-vous au prochain cours pour avoir une
|
||||||
moyen d'isolation !
|
meilleure d'isolation !
|
||||||
|
|
||||||
|
|
||||||
### Stage 5 (bonus) : automatisation de la création de l'environnement
|
### Stage 5 (bonus) : automatisation de la création de l'environnement
|
||||||
@ -131,12 +142,6 @@ Voici une arborescence type:
|
|||||||
|
|
||||||
```
|
```
|
||||||
login_x-TP3/questions.txt
|
login_x-TP3/questions.txt
|
||||||
login_x-TP3/chroot/escape.c
|
|
||||||
login_x-TP3/pseudofs/rev_kdb_leds.sh
|
|
||||||
login_x-TP3/pseudofs/procinfo
|
|
||||||
login_x-TP3/caps/view_caps
|
|
||||||
login_x-TP3/cgroups/monitor
|
|
||||||
login_x-TP3/cgroups/monitor_init
|
|
||||||
login_x-TP3/mymoulette/README
|
login_x-TP3/mymoulette/README
|
||||||
login_x-TP3/mymoulette/...
|
login_x-TP3/mymoulette/...
|
||||||
```
|
```
|
||||||
|
@ -28,11 +28,11 @@ programme d'initialisation en utilisant des systèmes de fichiers virtuels, mis
|
|||||||
à disposition par le noyau.
|
à disposition par le noyau.
|
||||||
|
|
||||||
Ces systèmes sont virtuels, car ils ne correspondent à aucune partition d'aucun
|
Ces systèmes sont virtuels, car ils ne correspondent à aucune partition d'aucun
|
||||||
disque : l'arborescence est créé de toute pièce par le noyau pour trier les
|
disque : l'arborescence est créée de toute pièce par le noyau pour trier les
|
||||||
informations mises à disposition, mais il n'est pas toujours possible d'y
|
informations mises à disposition, mais il n'est pas toujours possible d'y
|
||||||
apporter des modifications.
|
apporter des modifications.
|
||||||
|
|
||||||
Linux emploi de nombreux systèmes de fichiers virtuels :
|
Linux emploie de nombreux systèmes de fichiers virtuels :
|
||||||
|
|
||||||
- `/proc` : contient, principalement, la liste des processus (`top` et ses
|
- `/proc` : contient, principalement, la liste des processus (`top` et ses
|
||||||
dérivés se contentent de lire les fichiers de ce point de montage) ;
|
dérivés se contentent de lire les fichiers de ce point de montage) ;
|
||||||
@ -44,14 +44,14 @@ Linux emploi de nombreux systèmes de fichiers virtuels :
|
|||||||
l'UEFI ;
|
l'UEFI ;
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
Tous ces systèmes de fichiers sont généralement exclusivement stocké en
|
Tous ces systèmes de fichiers sont généralement exclusivement stockés en
|
||||||
RAM. Pour rendre une modification persistante, il est nécessaire de modifier un
|
RAM. Pour rendre une modification persistante, il est nécessaire de modifier un
|
||||||
fichier de configuration qui sera chargé par le programme d'initialisation. Par
|
fichier de configuration qui sera chargé par le programme d'initialisation. Par
|
||||||
exemple, pour modifier les paramètres du noyau, on passe par le fichier
|
exemple, pour modifier les paramètres du noyau, on passe par le fichier
|
||||||
`/etc/sysctl.conf` et du programme `sysctl`.
|
`/etc/sysctl.conf` et du programme `sysctl`.
|
||||||
|
|
||||||
|
|
||||||
## Exercice
|
## Exercices
|
||||||
|
|
||||||
### `rev_kdb_leds.sh`
|
### `rev_kdb_leds.sh`
|
||||||
|
|
||||||
@ -118,9 +118,22 @@ user:[4026531837]
|
|||||||
uts:[4026531838]
|
uts:[4026531838]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Rendu
|
## Rendu
|
||||||
|
|
||||||
### Fichiers
|
### Questions
|
||||||
|
|
||||||
Rendez vos scripts `rev_kdb_leds.sh` et `procinfo`.
|
Sur le serveur `antares`, un serveur applicatif critique tourne aux côtés de sa
|
||||||
|
base de données PostgreSQL. Le serveur applicatif étant connu pour produire un
|
||||||
|
grand nombre de leak, il est relancé chaque nuit. Le serveur applicatif tourne
|
||||||
|
en root car plus personne ne sait le paramétrer ; la base de données a été
|
||||||
|
installé par le système de paquets de la distribution.
|
||||||
|
|
||||||
|
Il arrive quelque fois que le serveur de base de données soit tué par
|
||||||
|
l'OOM-killer alors que le serveur applicatif
|
||||||
|
|
||||||
|
1. Quel paramètre du processus pourrait-on modifier pour que ce soit le serveur
|
||||||
|
applicatif qui aie plus de chance de se faire tuer par l'OOM-killer ?
|
||||||
|
|
||||||
|
2. Pourquoi est-ce le serveur de base de données qui est principalement tiré au
|
||||||
|
sort pour être tué en cas de manque de mémoire plutôt que le serveur
|
||||||
|
applicatif qui occupe pourtant bien plus de mémoire ?
|
||||||
|
@ -9,7 +9,7 @@ date: Jeudi 6 octobre 2016
|
|||||||
Ce premier TP consacré aux Linux Internals va nous permettre d'appréhender les
|
Ce premier TP consacré aux Linux Internals va nous permettre d'appréhender les
|
||||||
notions de pseudos systèmes de fichiers, de cgroups ainsi que de capabilities.
|
notions de pseudos systèmes de fichiers, de cgroups ainsi que de capabilities.
|
||||||
|
|
||||||
Tous les éléments de ce TP (exercices et questions) sont à rendre à
|
Certains éléments de ce TP (questions et projet) sont à rendre à
|
||||||
<virli@nemunai.re> au plus tard le jeudi 20 octobre 2016 à 8 h 42. Consultez la
|
<virli@nemunai.re> au plus tard le jeudi 20 octobre 2016 à 8 h 42. Consultez la
|
||||||
dernière section de chaque partie pour plus d'information sur les éléments à
|
dernière section de chaque partie pour plus d'information sur les éléments à
|
||||||
rendre.
|
rendre.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user