3 votes

La manière la plus simple et la plus évolutive d'isoler ImageMagick dans une VM ou un conteneur.

Pour les utilisateurs de mon service Web fonctionnant sur le serveur Ubuntu 16.04 ou 18.04, j'aimerais intégrer des fonctionnalités de programmes utiles tels que ImageMagick. Par exemple, j'aimerais recadrer leurs photos de profil ou créer des vignettes.

Mais parce que les logiciels en général ont des bogues, et en particulier ImageMagick a beaucoup d'eux [1] [2] il serait évidemment préférable d'isoler l'exécution d'ImageMagick du reste du serveur, non ?

Quelle est donc la meilleure façon d'isoler ImageMagick du point de vue de la sécurité, en tenant compte du fait que la configuration doit être aussi simple que possible et qu'ImageMagick devra s'exécuter toutes les quelques secondes (voire plusieurs fois par seconde aux heures de pointe) ? Idéalement, ImageMagick devrait non seulement être isolé de la machine hôte, mais les exécutions d'ImageMagick (avec les données sur lesquelles elles opèrent) devraient également être isolées les unes des autres.

Je suppose que l'on peut utiliser une VM ou des conteneurs (par exemple Docker) pour cela ? Les conteneurs sont-ils mieux adaptés parce qu'ils sont plus rapides à mettre en place et à démonter ?

De plus, quelle est la bonne façon de commencer ? J'ai jeté un coup d'œil à divers manuels, mais je ne sais pas exactement par où commencer et de quels composants j'ai besoin.

Ce que j'ai jusqu'à présent est le suivant. Bien que je ne sache pas si c'est réellement sécurisé, et l'installation coûteuse de paquets ne devrait être faite qu'une seule fois, si possible. De plus, je ne suis pas sûr que cela permette réellement une exécution parallèle par plusieurs utilisateurs.

Dockerfile :

FROM ubuntu:16.04

RUN apt-get update
RUN apt-get install -y imagemagick

VOLUME ["/my-images"]
WORKDIR /my-images

ENTRYPOINT ["convert"]

Initialisation :

docker build -t my-imagemagick .

Utilisation :

docker run --rm --volume=$(pwd):/my-images:rw my-imagemagick -resize 500 /my-images/input.jpg /my-images/output.jpg

0voto

s1mmel Points 1794

Les conteneurs en général

Un conteneur Docker ou KVM se comporte comme un système réel. Vous pouvez même entrer dans un conteneur et y apporter des modifications, sans problème. Travaillez avec le bash, installez des paquets, etc. (juste au cas où vous auriez oublié quelque chose ou voudriez vérifier quelque chose).

L'avantage d'un conteneur est qu'il est beaucoup plus facile à mettre à niveau et à reconstruire. Avec votre propre registre docker, vous pouvez même avoir des versions portant des noms différents les unes à côté des autres.

Stocker les données de l'utilisateur dans un conteneur supplémentaire

Je suggérerais de stocker les données dans un conteneur de données attaché au conteneur docker. Cela éviterait que le conteneur ait des points de montage qui aboutissent sur un dossier de votre serveur réel. Au lieu de cela, utilisez un conteneur de données et attachez/détachez le conteneur de données, lorsque vous reconstruisez le conteneur docker ImageMagick et rattachez le conteneur de données à celui-ci à tout moment. Aucune donnée n'est perdue, mais vous avez tous vos fichiers dans un conteneur qui peut également être déplacé assez facilement.

A propos de la sécurité

Comme mentionné ci-dessus, un conteneur se comporte comme un système réel, il peut donc être piraté comme un système réel. Cela signifie que votre attaquant peut toujours mettre la main sur les données des clients et obtenir un accès root à cette machine. Sortir d'un conteneur Docker n'est pas si facile mais peut être possible, en raison de l'absence de correctifs, etc. J'ai moi-même une astuce simple que j'utilise pour rendre les choses plus difficiles pour un attaquant. Je reconstruis simplement le conteneur par crontab toutes les quelques heures/jour. Ainsi, si un attaquant obtient un accès, il devra tout recommencer quelques heures/jours plus tard.

Essayez également d'y attacher un conteneur nginx, afin qu'ImageMagick soit déclenché par un proxy inverse au lieu de donner accès à ImageMagick lui-même. Il est facile de construire une chaîne de production de conteneurs nginx --> Imagemagick --> conteneur de données

Vous vous retrouveriez donc avec 2 ou 3 conteneurs qui s'enchaînent pour former une chaîne de production isolée.

Hth,

Jens

P.S. : Pour entrer dans les détails, il vous faudrait plus de connaissances sur Docker. Mais la méthode que vous avez suggérée est la bonne à mon avis.

P.P.S. : Vous pouvez aussi rester à l'ancienne et utiliser simplement un environnement chroot. Mais plus difficile à mettre en place, plus difficile à maintenir, situé sur votre serveur lui-même.

0voto

KK Patel Points 17190

Vous pouvez utiliser un conteneur qui redimensionne toutes les images situées dans le dossier monté. Vous devez effectuer des changements de glissement dans le fichier Docker et construire l'image Docker.

FROM ubuntu:16.04

RUN apt-get update
RUN apt-get install -y imagemagick

VOLUME ["/my-images"]
WORKDIR /my-images

CMD ["magick", "-help"]

Construire l'image Docker.

docker build -t my-imagemagick .

Exécutez le conteneur docker et redimensionnez les images situées dans le dossier /my-images en une seule fois.

docker run --rm -v "$( pwd ):/my-images" my-imagemagick find -type f -iname '*.jpg' -o -iname '*.jpeg' -exec convert {} -verbose -resize "500x500>" {} \;

Vous pouvez également exécuter la commande comme cronjob pour le planifier. POUR permettre à plusieurs utilisateurs sur votre système d'exécuter cette commande. Vous devez ajouter des utilisateurs dans le groupe docker.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X