如何限制GCP VM实例中用户拉取及运行Docker容器的权限?
GCP VM实例上Docker操作的特定用户权限限制方案
一、基础方案:通过sudoers限制命令范围
这是最直接易用的方式,适合仅需要限制用户执行docker pull和docker run操作的场景:
确认/创建目标系统用户
- 如果用户已存在,跳过此步;若需新建用户,执行:
sudo useradd -m docker-limited-user sudo passwd docker-limited-user - 若使用GCP OS Login功能,GCP IAM用户会自动在VM中创建系统用户,直接使用该用户名即可。
- 如果用户已存在,跳过此步;若需新建用户,执行:
配置sudoers规则
- 必须用
visudo编辑sudoers文件(避免语法错误导致sudo失效):sudo visudo - 在文件末尾添加以下规则(替换
docker-limited-user为你的目标用户名,/usr/bin/docker为VM中Docker的实际路径,可通过which docker确认):docker-limited-user ALL=(ALL) NOPASSWD: /usr/bin/docker pull *, /usr/bin/docker run *- 若要求用户执行命令时需输入密码,移除
NOPASSWD:即可。 - 规则含义:允许该用户以root身份执行指定的Docker命令,禁止其他sudo操作。
- 若要求用户执行命令时需输入密码,移除
- 必须用
验证权限
- 切换到目标用户:
su - docker-limited-user - 测试允许的命令:
sudo docker pull nginx,应正常执行 - 测试禁止的命令(如
sudo docker rm $(docker ps -aq)),会收到权限拒绝提示
- 切换到目标用户:
二、进阶方案:用OPA实现精细化镜像控制
如果需要更严格的限制(比如仅允许拉取GCR仓库的镜像、仅运行特定镜像),可以使用Open Policy Agent(OPA)作为Docker授权插件:
安装并启动OPA服务
wget https://github.com/open-policy-agent/opa/releases/latest/download/opa_linux_amd64 chmod +x opa_linux_amd64 sudo mv opa_linux_amd64 /usr/local/bin/opa opa run --server编写OPA策略文件(如
docker-policy.rego)
示例规则:仅允许拉取gcr.io仓库的镜像,仅运行该仓库的镜像package docker.authz allow { input.Action == "pull" contains(input.Request.Parameters[0], "gcr.io/") } allow { input.Action == "run" contains(input.Request.Parameters[0], "gcr.io/") }加载策略到OPA
curl -X PUT http://localhost:8181/v1/policies/docker-authz --data-binary @docker-policy.rego配置Docker daemon使用OPA授权
- 编辑
/etc/docker/daemon.json,添加:{ "authorization-plugins": ["opa-http://localhost:8181/v1/data/docker/authz/allow"] } - 重启Docker服务:
sudo systemctl restart docker
- 编辑
验证策略
- 尝试拉取非GCR镜像(如
docker pull nginx)会被拒绝 - 拉取
gcr.io/google-containers/busybox则正常执行
- 尝试拉取非GCR镜像(如
注意事项
- 确保目标用户无法通过其他途径获取root权限(如禁止用户执行
sudo bash、su root等) - 若使用GCP OS Login,需确保IAM用户拥有
roles/compute.osLogin或roles/compute.osAdminLogin权限才能登录VM - 定期检查sudoers规则和Docker配置,避免权限泄露
内容的提问来源于stack exchange,提问作者chickenman
相关产品推荐
相关产品推荐

