【问题标题】:EFS mount on ECS Fargate - Read/write permissions denied for non root userECS Fargate 上的 EFS 挂载 - 非 root 用户的读/写权限被拒绝
【发布时间】:2021-05-04 01:16:38
【问题描述】:

我有一个 ECS Fargate 容器,该容器运行具有非 root 权限的 nodejs 应用程序,并且还安装到容器内 /.user_data 上的 EFS。

我遵循了this AWS 教程。我的设置几乎相似。

这是 Docker 文件:

FROM node:12-buster-slim

RUN apt-get update && \ 
    apt-get install -y build-essential \
    wget \
    python3 \
    make \
    gcc \ 
    libc6-dev  \
    git

# delete old user
RUN userdel -r node 

# Run as a non-root user
RUN addgroup "new_user_group" && \
useradd "new_user" --gid "new_user_group" \
--home-dir "/home/new_user"

RUN git clone https://github.com/test-app.git /home/new_user/app

RUN chown -R new_user:new_user_group /home/new_user

RUN mkdir -p /home/new_user/.user_data 
RUN chown -R new_user:new_user_group /home/new_user/.user_data
RUN chmod -R 755 /home/new_user/

WORKDIR /home/new_user/app

RUN npm install

RUN npm run build

EXPOSE 1880

USER new_user

CMD [ "npm", "start" ]

当 Node 应用程序尝试在 /.user_data 中写入时,我收到读写权限被拒绝错误。

如果我以 root 身份运行容器,则应用能够读取/写入数据。

我尝试使用 UID 和权限向 EFS 添加访问点,但这也没有帮助。

请注意:Dockerfile 在我的本地机器上运行良好。

【问题讨论】:

    标签: node.js docker amazon-ecs aws-fargate amazon-efs


    【解决方案1】:

    更新

    阅读这篇博文 - Developers guide to using Amazon EFS with Amazon ECS and AWS Fargate – Part 2 > POSIX permissions

    可能与分配给 ECS 任务的 IAM 角色的 IAM 策略有关。

    "...如果 AWS 策略不允许 ClientRootAccess 操作,您的用户将被压缩为预定义的 UID:GID,即 65534:65534。从此时起,标准 POSIX 权限适用:什么这个用户可以做的事情是由 POSIX 文件系统权限决定的。例如,一个由 65534:65534 以外的任何 UID:GID 拥有的具有 666 的文件夹(rw 代表所有者,rw 代表所有人)将允许该保留用户创建文件. 但是,任何 UID:GID 拥有的文件夹(除 65534:65534 之外的 644(所有者为 rw,所有人为 r))将不允许此压缩用户创建文件。”


    确保您的根目录权限设置为777。这样任何 UID 都可以读/写这个目录。

    为了不那么宽松,将根目录设置为755,默认设置为see the docs。这将read-write-execute 提供给root 用户,read-execute 提供给组,read-execute 提供给所有其他用户。

    如果对父目录(目录)没有读取权限,则用户 (UID) 无法访问(读取)子目录。

    您可以使用Docker 轻松测试它,这是一个简单的示例

    创建一个Dockerfile -

    FROM ubuntu:20.04
    
    # Fetch values from ARGs that were declared at the top of this file
    ARG APP_NAME
    ARG APP_ARTIFACT_DIR
    ARG APP_HOME_DIR="/app"
    ARG APP_USER_NAME="appuser"
    ARG APP_GROUP_ID="appgroup"
    
    # Define workdir
    ENV HOME="${APP_HOME_DIR}"
    WORKDIR "${HOME}"
    
    RUN apt-get update -y && apt-get install tree
    
    # Define env vars
    ENV PATH="${HOME}/.local/bin:${PATH}"
    
    # Run as a non-root user
    RUN addgroup "${APP_GROUP_ID}" && \
        useradd "${APP_USER_NAME}" --gid "${APP_GROUP_ID}" --home-dir "${HOME}" && \
        chown -R ${APP_USER_NAME} .
    
    RUN mkdir -p rootdir && \
        mkdir -p rootdir/subdir && \
        touch rootdir/root.file rootdir/subdir/sub.file  && \
        chown -R root:root rootdir && \
        chmod 600 rootdir rootdir/root.file && \
        chmod -R 775 rootdir/subdir
    

    你应该玩chmod 600chmod -R 775,尝试不同的权限集,例如777644,看看是否有意义。

    构建镜像,运行容器,测试权限 -

    docker build boyfromnorth .
    docker run --rm -it boyfromnorth bash
    
    root@e0f043d9884c:~$ su appuser
    $ ls -la
    total 12
    drwxr-xr-x 1 appuser root 4096 Jan 30 12:23 .
    drwxr-xr-x 1 root    root 4096 Jan 30 12:33 ..
    drw------- 3 root    root 4096 Jan 30 12:23 rootdir
    
    $ ls rootdir
    ls: cannot open directory 'rootdir': Permission denied
    

    【讨论】:

    • 谢谢!我尝试更改目录权限,但没有帮助。我将我的 Dockerfile 添加到我原来的问题中。该文件在我的本地机器上运行良好,但不适用于带有 EFS 的 ECS。
    • 直接在你的机器上挂载EFS,检查根文件夹/的权限,这是你应该做的第一件事,随时回发结果
    • drwxr-xr-x 3 root root 6144 Feb 3 00:50 . 是根文件夹的权限。这可能就是容器的根工作的原因。我了解在构建期间创建的 new_user 无权访问 EFS。如何在不安装 EFS 的情况下在 EFS 上创建新用户?
    • 谢谢!我让它工作了。我必须在 EFS 上创建一个访问点,其 UID 和 GID 与我在容器中创建的新用户相匹配。
    • 嘿,@boyfromnorth 我正在尝试为 PHP 应用程序的 www-data 用户设置它,但我仍然无法使其工作。您使用的是“POSIX 用户”配置还是“根目录创建权限”?另外,如何从容器中获取这些 id?
    猜你喜欢
    • 2020-09-07
    • 2020-05-12
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多