配置容器用户
对于生产部署来说,使用非零UID运行软 件事件代理容器是一个良好的安全实践:
- 如果容器运行时由根用户启动(即,在有根模式下),主机用户命名空间与软件事件代理容器共享;因此,拥有一个非根容器用户可以限制恶意进程如果突破容器进入主机可能造成的损害。
- 使用无根容器时,主机和容器不共享用户命名空间。容器内的根用户映射到主机中的非根用户。
指定容器UID
Docker和Podman都允许您指定容器应该以哪个用户身份运行。在这两种情况下,UID
都是通过create
或run
命令中的--user
或-u
选项设置的。
如果您不指定这个参数,命令将以容器镜像中指定的用户身份运行。
Solace容器中的默认用户ID是1000001。也就是说,如果您不指定-u
参数,容器将以UID=1000001运行。在无根环境中,容器将无法运行,因为操作系统不会在用户命名空间内分配一个以1000001开始的UID范围。要解决这个问题,在启动容器时请指定一个较小的非零用户ID作为-u
参数。
附加Linux功能
当创建软件事件代理容器时,容器内启动的所有进程都具有有效的Linux功能。
如果出于操作需要设置Linux环境限制,并且环境允许进行此类调整,您可以在创建软件事件代理容器时指定--ulimits
选项。例如,如果环境允许,我们建议您允许软件事件代理容器根据需要mlock()
尽可能多的内存。为此,在调用docker create
或podman create
命令时,您需要指定--ulimit memlock=-1
。有关使用--ulimit
选项的更多信息,请参见为容器镜像设置并发打开文件的数量和设置核心文件大小资源限制。
配置特权端口
典型的Linux操作系统(包括容器运行时的Linux虚拟机)将特权端口范围设置为0到1023,仅供根用户使用。如果用户有一个非零的UID
,则无法使用特权端口。为了解决这个问题,您可以使用配置键设置端口号。
有关您可以使用的配置键以设置各种服务的端口号的列表,请参见初始化软件事件代理容器。
卷所有权和权限
软件事件代理容器用户必须对其关联卷中的所有文件和目录具有读写访问权限。有根和无根容器的机制不同:
- 有根容器与主机共享用户命名空间,因此您可以直接运行
chown
或chmod
来应用所需的权限。 - 无根容器有单独的用户命名空间,因此您可以使用
podman unshare
在容器的用户命名空间内运行chown
或chmod
来更新权限。有关详细信息,请参见无根容器和管理容器镜像存储。
您可以使用以下chown
命令(如果您使用的是无根Podman,则使用unshare
)在Linux主机上更改软件事件代理容器的卷的所有者和组为所需的<UID>:<GID>
:
chown --recursive <container uid>:<container gid> <host path of volume>
为确保卷对软件事件代理容器用户具有读写访问权限,请在Linux主机上执行以下chmod
(如果您使用的是无根Podman,则使用unshare
)命令。
chmod --recursive u+rwx,g-rwx,o-rwx
容器的默认umask
为0077,因此软件事件代理容器对所有新文件具有读写访问权限。
如果外部工具需要对某个卷中的文件进行读取访问,您可以在Linux主机上使用chmod
命令,并在创建容器时指定umask
为0022。
chmod --recursive u+rwX,g+rX,o+rX