Entrer_dans_un_conteneur_SSH_sans_limitations_avec_nsenter__french_

Entrer dans un conteneur SSH sans limitations avec nsenter

Pour accéder à un conteneur Docker sur un hôte, on se connecte par SSH sur l’hôte puis on entre dans le conteneur. Cependant, cette pratique est souvent interdite pour des raisons de sécurité.

Une solution est d’utiliser docker exec.

Une autre solution est d’utiliser nsenter. nsenter permet de se connecter à un conteneur en passant par nsenter. Pour cela, nsenter doit tourner dans ce conteneur.

nsenter présente l’avantage de ne pas entrer dans des cgroups et donc de ne pas subir de limitations sur les ressources. C’est très pratique pour le débogage et les audits externes.

Créons un conteneur sur lequel nous voulons entrer en direct sans nous connecter par SSH sur l’hôte :

CONTAINER_ID=`sudo docker run -d -p 80:80 devopstestlab/nginx-helloworld`

L’ID du conteneur se trouve dans la variable CONTAINER_ID :

echo $CONTAINER_ID
4b67dee983e7dd2df1fad6d40946a0d3295e9ac29428d6345c7261ac513ca48d

Vérifions que le conteneur nginx est opérationnel :

curl localhost:80
<html>
<body>
<p>Helloworld !</p>
</body>
</html>

Lançons nsenter dans un conteneur :

sudo docker run -v /usr/local/bin:/target jpetazzo/nsenter
Unable to find image 'jpetazzo/nsenter:latest' locally
latest: Pulling from jpetazzo/nsenter

6812d18f: Pulling fs layer 
32ba7c2e: Pulling fs layer 
fee778a4: Pulling fs layer 
febb3269: Pulling fs layer 
eba697b4: Pulling fs layer 
dc1669a4: Pulling fs layer 
6cb2aa95: Pulling fs layer 
aadcb10f: Pulling fs layer 
72e5ddd6: Pulling fs layer 
86fd17d5: Pulling fs layer 
5bd1f3e3: Pulling fs layer 
56024686: Pulling fs layer 
b3c7ffa5: Pulling fs layer 
Digest: sha256:9a5758441e7929abcff9f13a69b4ca962063ec89b818395f02b7b7e8150ca088
Status: Downloaded newer image for jpetazzo/nsenter:latest
Installing nsenter to /target
Installing docker-enter to /target
Installing importenv to /target

La commande nsenter a ainsi été ajoutée au répertoire /usr/local/bin.

Vérifions que cette commande est disponible sur l’hôte :

nsenter --version
nsenter de util-linux 2.33

Récupérons le PID du conteneur que nous avons lancé au début :

PID=`sudo docker inspect --format {{.State.Pid}} $CONTAINER_ID`
echo $PID
8748

Nous pouvons maintenant accéder au conteneur que nous avons lancé au début :

sudo nsenter --target $PID -m -u -n -i --pid sh

Nous sommes entrés dans le conteneur devopstestlab/nginx-helloworld.

Entrer_dans_un_conteneur_SSH_sans_limitations_avec_nsenter__english_

Enter an SSH container without limitations with nsenter

To access a Docker Container on a host, one connects via SSH to the host and then enters the Container. However, this practice is often prohibited for security reasons.

One solution is to use docker exec.

Another solution is to use nsenter. nsenter allows you to connect to a container via nsenter. To do this, nsenter must be running in that container.

The advantage of nsenter is that it doesn’t enter cgroups and therefore doesn’t suffer from resource limitations. It is very useful for debugging and external audits.

Let’s create a container that we want to enter live without connecting via SSH to the host:

CONTAINER_ID=`sudo docker run -d -p 80:80 devopstestlab/nginx-helloworld`

The container ID can be found in the CONTAINER_ID variable:

echo $CONTAINER_ID
4b67dee983e7dd2df1fad6d40946a0d3295e9ac29428d6345c7261ac513ca48d

Let’s check that the nginx container is operational:

curl localhost:80
<html>
<body>
<p>Helloworld !</p>
</body>
</html>

Let’s run ‘nsenter’ in a container:

sudo docker run -v /usr/local/bin:/target jpetazzo/nsenter
Unable to find image 'jpetazzo/nsenter:latest' locally
latest: Pulling from jpetazzo/nsenter

6812d18f: Pulling fs layer 
32ba7c2e: Pulling fs layer 
fee778a4: Pulling fs layer 
febb3269: Pulling fs layer 
eba697b4: Pulling fs layer 
dc1669a4: Pulling fs layer 
6cb2aa95: Pulling fs layer 
aadcb10f: Pulling fs layer 
72e5ddd6: Pulling fs layer 
86fd17d5: Pulling fs layer 
5bd1f3e3: Pulling fs layer 
56024686: Pulling fs layer 
b3c7ffa5: Pulling fs layer 
Digest: sha256:9a5758441e7929abcff9f13a69b4ca962063ec89b818395f02b7b7e8150ca088
Status: Downloaded newer image for jpetazzo/nsenter:latest
Installing nsenter to /target
Installing docker-enter to /target
Installing importenv to /target

The nsenter command was added to the /usr/local/bin directory.

Let’s check that this command is available on the host:

nsenter --version
nsenter de util-linux 2.33

Let’s retrieve the PID of the container we launched at the beginning:

PID=`sudo docker inspect --format {{.State.Pid}} $CONTAINER_ID`
echo $PID
8748

We can now access the container we launched at the beginning:

sudo nsenter --target $PID -m -u -n -i --pid sh

We entered the container devopstestlab/nginx-helloworld.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×