拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Docker 容器中的Root 用户和密码

Docker 容器中的Root 用户和密码

白鹭 - 2022-07-05 2281 0 2

一、概述

Docker的工作原理是将应用程序及其所有必需的依赖项打包到轻量级容器中除了在测试时部署在本地集群上,我们还可以在生产环境中部署这些轻量级容器。

在本教程中,我们将研究使用不同用户在Docker 容器中执行命令。

首先,我们将学习使用root 用户访问Docker 容器以获得一些额外的权限。我们还将讨论为root 和非root 用户设置密码,以保护容器免受易受攻击的来源的影响。

2. 设置一个Docker 容器

在我们继续之前,让我们首先创建一个Dockerfile 来添加一个用户baeldung

FROM ubuntu:16.04
RUN apt-get update
RUN useradd -m baeldung
USER baeldung
CMD /bin/bash

在这里,我们使用“ ubuntu:16.04”作为基础镜像。让我们使用docker build命令构建镜像:

$ docker build -t baeldung .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
58690f9b18fc: Pull complete
...
Step 5/5 : CMD /bin/bash
---> Running in d04af94585e2
Removing intermediate container d04af94585e2
---> 312faa93c781
Successfully built 312faa93c781
Successfully tagged baeldung:latest

我们现在将使用baeldung映像运行Docker 容器:

$ docker run -id --name baeldung baeldung
34dbc77279a2a6244b0e4ee87890d79e814128391c6a4387d2e2fd10fa6e8f20

让我们使用docker ps命令验证容器是否按预期运行:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34dbc77279a2 baeldung "/bin/sh -c /bin/bash" About a minute ago Up About a minute baeldung

在这里,我们可以看到Docker 容器正在运行,没有任何问题。

3. 访问Docker 容器

Docker 容器旨在以root 用户身份访问,以执行非root 用户无法执行的命令。我们可以使用docker exec在正在运行的容器中运行命令。我们将使用docker exec命令的-i-t选项来获取具有TTY 终端访问权限的交互式shell。

3.1。使用非root 用户

Docker 容器“ baeldung”已启动并运行。我们现在将使用docker exec命令来访问它:

$ docker exec -it baeldung bash

仔细注意我们之前创建的Dockerfile。我们添加了一个新用户baeldung,它被设置为使用该Docker 映像运行的所有容器的默认用户。让我们使用whoami命令验证这一点:

$ whoami
baeldung

现在,如果我们尝试将任何包安装到容器中,我们将收到以下错误消息:

$ apt-get update
Reading package lists... Done
W: chmod 0700 of directory /var/lib/apt/lists/partial failed - SetupAPTPartialDirectory (1: Operation not permitted)
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/

在这种情况下,非root 用户无法访问lock文件。通常,此用户将具有对容器的受限访问权限。

现在让我们退出容器并使用root 用户重新登录。

3.2.使用根用户

为了在Docker 容器中使用root 用户执行,我们将使用u选项:

$ docker exec -it -u 0 baeldung bash

使用docker exec 命令的“ -u” docker exec,我们定义了root 用户的id。我们也可以在这个命令中使用用户名:

$ docker exec -it -u root baeldung bash

为了检查当前用户的详细信息,我们将运行whoami命令:

$ whoami
root

这一次,我们以root 用户身份进入容器。现在,我们可以对容器执行任何操作:

$ apt-get update
Hit:1 http://security.ubuntu.com/ubuntu xenial-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Hit:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease
Reading package lists... Done

从上面的输出可以看出update命令成功,root用户可以访问lock文件。有了root 用户的全部权限,我们可以毫无问题地更改任何文件。

作为替代方案,我们也可以以root 身份访问Docker 容器。在这种情况下,我们将使用nsenter命令来访问Docker 容器。要使用nsenter命令,我们必须知道正在运行的容器的PID

我们来看一下获取容器PID的命令:

$ docker inspect --format {{.State.Pid}} baeldung
6491

获得PID后,我们将PID nsenter命令按以下方式使用此PID:

$ nsenter --target 6491 --mount --uts --ipc --net --pid

这允许我们以root 用户身份访问Docker 容器并运行任何命令来访问任何文件。

4. 在容器内使用sudo命令

Docker 容器通常以root 作为默认用户运行。为了以不同的权限共享资源,我们可能需要在Docker 容器中创建额外的用户。

在这里,我们将创建一个Dockerfile 并添加一个新用户。重要的是,我们还将在构建映像时在Docker 容器中安装sudo包。当此用户需要额外权限时,可以使用s udo命令访问这些权限。

让我们检查一下Dockerfile:

FROM ubuntu:16.04
RUN apt-get update && apt-get -y install sudo
RUN useradd -m baeldung && echo "baeldung:baeldung" | chpasswd && adduser baeldung sudo
USER baeldung
CMD /bin/bash

此Dockerfile 使用镜像“ ubuntu:16.04 ”作为基础镜像,安装sudo包,并创建一个新用户“ baeldung ”。我们正在使用chpasswd命令为baeldung用户添加密码。之后,我们将其用作默认用户。

让我们运行命令来构建映像:

$ docker build -t baeldung .

上面的命令将创建baeldung图像。现在,让我们使用baeldung映像运行容器:

$ docker run -id --name baeldung baeldung
b0f83a7e8b49ddf043c80792f21d5c483c0c5ab56c700815a83b0a40e5292754

容器的默认用户是baeldung,所以我们将使用它来访问容器:

$ docker exec -it baeldung bash
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

让我们运行whoami命令来找出登录用户的用户名:

$ whoami
baeldung

这证实了我们以非root 用户身份登录。如果我们运行apt-get update命令,我们将遇到与第3.2 节相同的权限相关问题。

这一次,我们将使用sudo命令来获取非root 用户baeldung的权限:

$ sudo apt-get update
[sudo] password for baeldung:
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [99.8 kB]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [99.8 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [97.4 kB]
Fetched 297 kB in 1s (178 kB/s)
Reading package lists... Done

通过使用这种方法,我们可以使用sudo命令在非root 帐户中运行任何命令。

5. 结论

在本文中,我们演示了如何在具有不同用户的Docker 容器中运行命令。首先,我们讨论了root 和非root 用户在运行的Docker 容器中的角色。然后,我们学习了如何以root 用户身份访问Docker 容器以获得额外的权限。

理想情况下,我们不应该允许对Docker 容器进行root 访问。这增加了更多的安全问题。相反,我们应该创建一个单独的用户来访问容器。这是容器世界中的标准安全步骤。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *