Featured image of post 只读用户reader执行部分docker命令

只读用户reader执行部分docker命令

只读用户reader执行部分docker命令

1. 概述

当一个普通用户(我们假设是只读用户reader)执行docker ps时,会报以下异常:

1
2
3
[reader@nexus ~]$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json: dial unix /var/run/docker.sock: connect: permission denied
[reader@nexus ~]$

docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。可通过以下命令可以确认:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[root@nexus ~]# ls -lah /var/run/docker.sock
srw-rw---- 1 root docker 0 Jan 29  2024 /var/run/docker.sock
[root@nexus ~]# stat /var/run/docker.sock
  File: ‘/var/run/docker.sock’
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: 14h/20d Inode: 279557849   Links: 1
Access: (0660/srw-rw----)  Uid: (    0/    root)   Gid: (  991/  docker)
Access: 2025-02-23 22:29:56.307183105 +0800
Modify: 2024-01-29 20:42:31.572778347 +0800
Change: 2024-01-29 20:42:31.594778249 +0800
 Birth: -
[root@nexus ~]#

可以看到,root用户和docker组可以对其进行操作。

2. 组权限配置

方案1就是将reader直接加入到docker组中,这个时候reader就可以执行所有docker相关命令:

1
2
## 将用户reader加入到docker组中
gpasswd -a reader docker

实际执行校验:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## 将用户reader加入到docker组中
[root@nexus ~]# gpasswd -a reader docker
Adding user reader to group docker

## 查看reader用户的id信息,可以看到已经包含在docker组中
[root@nexus ~]# id reader
uid=1003(reader) gid=1003(reader) groups=1003(reader),991(docker)

## 切换到reader只读账号下
[root@nexus ~]# su - reader
Last login: Sun Feb 23 22:38:55 CST 2025 on pts/0

## 此时可以执行docker相关命令
[reader@nexus ~]$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                                                      NAMES
8b931229efd4   sonatype/nexus3:3.59.0   "/opt/sonatype/nexus…"   13 months ago   Up 13 months   0.0.0.0:8001-8003->8001-8003/tcp, 0.0.0.0:8081->8081/tcp   nexus
[reader@nexus ~]$ docker logs --tail 10 nexus
2025-02-23 22:10:19,179+0800 INFO  [SessionValidationThread-1] *UNKNOWN org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Validating all active sessions...
2025-02-23 22:10:19,180+0800 INFO  [SessionValidationThread-1] *UNKNOWN org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Finished session validation.  No sessions were stopped.
2025-02-23 22:20:00,002+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change WAITING -> RUNNING
2025-02-23 22:20:00,003+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change RUNNING -> WAITING (OK)
2025-02-23 22:30:00,002+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change WAITING -> RUNNING
2025-02-23 22:30:00,019+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change RUNNING -> WAITING (OK)
2025-02-23 22:40:00,002+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change WAITING -> RUNNING
2025-02-23 22:40:00,003+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change RUNNING -> WAITING (OK)
2025-02-23 22:50:00,002+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change WAITING -> RUNNING
2025-02-23 22:50:00,003+0800 INFO  [quartz-10-thread-19] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repository.storage-facet-cleanup] state change RUNNING -> WAITING (OK)
[reader@nexus ~]$
Licensed under the GNU General Public License v3.0