#1 Le 07/11/2018, à 13:37
- Byggvir
[R] Restreindre l'accès à certains conteneurs à l’extérieur du serveur
Bonjour à tous,
Alors je m'explique, j'auto héberge sur mon propre serveur sous Ubuntu Server 18.04, une version du logiciel Libre ShareLaTeX (pour ceux qui ne connaissent pas : https://fr.wikipedia.org/wiki/ShareLaTeX), il m'est très très utile au quotidien. C'est du docker, mais c'est la tout le problème, je suis très loin d'être expert sur docker (mais je cherche à m'améliorer).
Je vous montre rapidement comment je l'installe :
PORT=7000
apt install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt update -y
apt install docker.io -y
# Steps to allow running docker without sudo
groupadd docker
gpasswd -a ${USER} docker
service docker restart
newgrp docker &
docker pull sharelatex/sharelatex
# Starting sharelatex docker container
docker run -d --name sharemongo -e AUTH=no tutum/mongodb
docker run -d --name shareredis -v /var/redis:/var/lib/redis redis
docker run -d -P -p $PORT:80 -v /var/sharelatex_data:/var/lib/sharelatex --env SHARELATEX_MONGO_URL=mongodb://mongo/sharelatex --env SHARELATEX_REDIS_HOST=redis --env SHARELATEX_ADMIN_EMAIL=$email --link sharemongo:mongo --link shareredis:redis --name sharelatex sharelatex/sharelatex
docker exec sharelatex /bin/bash -c "cd /var/www/sharelatex/; grunt user:create-admin --email $email" && echo "Installed sharelatex" || echo "Failed to install the sharelatex container"
#install some extra packages (float, etc..)
docker exec sharelatex /bin/bash -c "sudo apt update -y"
docker exec sharelatex /bin/bash -c "sudo apt install texlive-generic-extra -y"
docker exec sharelatex /bin/bash -c "sudo apt install texlive-full -y"
Configuration Apache pour sharelatex.conf :
<VirtualHost *:80>
ServerName sharelatex.$domainName
ServerSignature Off
ProxyPreserveHost On
# Ensure that encoded slashes are not decoded but left in their encoded state.
AllowEncodedSlashes NoDecode
<Location />
Require all granted
ProxyPassReverse http://127.0.0.1:7000
ProxyPassReverse http://sharelatex.$domainName/
</Location>
RewriteEngine on
RewriteRule .* http://127.0.0.1:7000%{REQUEST_URI} [P,QSA,NE]
RequestHeader set X_FORWARDED_PROTO 'https'
RequestHeader set X-Forwarded-Ssl on
#Set up apache error documents, if back end goes down (i.e. 503 error) then a maintenance/deploy page is thrown up.
ErrorDocument 404 /404.html
ErrorDocument 422 /422.html
ErrorDocument 500 /500.html
ErrorDocument 502 /502.html
ErrorDocument 503 /503.html
LogFormat \"%{X-Forwarded-For}i %l %u %t \\\"%r\\\" %>s %b\" common_forwarded
ErrorLog /var/log/apache2/logs/sharelatex.$domainName""_error.log
CustomLog /var/log/apache2/logs/sharelatex.$domainName""_forwarded.log common_forwarded
CustomLog /var/log/apache2/logs/sharelatex.$domainName""_access.log combined env=!dontlog
CustomLog /var/log/apache2/logs/sharelatex.$domainName.log combined
</VirtualHost>
mkdir -p /var/log/apache2/logs/
a2ensite sharelatex.conf
systemctl restart apache2
# HTTPS on Sharelatex
letsencrypt --apache --email $email -d sharelatex.$domainName
systemctl restart apache2
Donc grâce à ça j'ai accès à mon instance directement depuis l'url : https://sharelatex.MonDomain.eu
Mes questions maintenant :
- Sharelatex est toujours directement accessible depuis le port 7000, donc toutes les mesures que je mets en place depuis Apache son un peu inutile. D'où ma question comment rendre le port 7000 uniquement accessible par apache ou uniquement en interne du serveur ? Je pensais passer par UFW pour limiter l'accès du port à Apache uniquement, vous en pensez quoi ?
- Pour ce qui est de mongodb, shareLaTeX se connecte sans authentification au conteneur, pouvez-vous me confirmer que le conteneur de mongodb est seulement accessible via le conteneur de ShareLaTeX et pas via l'extérieur ?
Merci d'avance de vos conseils !
Bonne journée,
Dernière modification par Byggvir (Le 13/12/2018, à 14:20)
Hors ligne
#2 Le 08/11/2018, à 07:31
- bruno
Re : [R] Restreindre l'accès à certains conteneurs à l’extérieur du serveur
Bonjour,
Pour la première question il suffit de modifier le ligne qui lance le conteneur sharelatex:
docker run -d -P -p 127.0.0.1:$PORT:80 …
ainsi le service qui est en écoute sur le port 80 dans le conteneur sera disponible uniquement sur l'interface de bouclage port 7000 de l'hôte
Pour mongodb je ne sais pas, il faudrait voir le retour de :
docker ps
et peut être préciser les ports de manière analogue afin que mongodb ne soit pas exposé à l'extérieur.
#3 Le 09/11/2018, à 19:23
- Byggvir
Re : [R] Restreindre l'accès à certains conteneurs à l’extérieur du serveur
Oh ! Merci beaucoup c'est une très bonne idée, je ne sais pas pourquoi je n'y ai pas pensé. Ça marche nickel.
Alors voilà pour le retour de :
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cda51b0d1ad8 sharelatex/sharelatex "/sbin/my_init" 2 minutes ago Up About a minute 127.0.0.1:7000->80/tcp sharelatex
9b73b486f056 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp shareredis
88d23e35ae4c tutum/mongodb "/run.sh" 2 minutes ago Up 2 minutes 27017/tcp, 28017/tcp sharemongo
Donc je suppose, que mongodb est accessible depuis l’extérieur, via les ports 27017 et 28017, non ?
Hors ligne
#4 Le 09/11/2018, à 20:18
- bruno
Re : [R] Restreindre l'accès à certains conteneurs à l’extérieur du serveur
Dans la mesure où les autres conteneurs ne sont pas lancés avec l'option -p (--publish) je ne pense pas.
Tu peux vérifier avec :
sudo netstat -tlnp
et
docker ports sharemongo
La référence pour docker : https://docs.docker.com/engine/referenc … ne/docker/
#5 Le 13/12/2018, à 14:18
- Byggvir
Re : [R] Restreindre l'accès à certains conteneurs à l’extérieur du serveur
Merci pour la réponse, je confirme que c'est tout bon. Je passe le topic en résolu
Hors ligne