【问题标题】:AWS CodeBuild as non-root userAWS CodeBuild 作为非 root 用户
【发布时间】:2018-12-24 05:24:40
【问题描述】:

有没有办法在 AWS CodeBuild 上删除 root 用户? 如果我们是 root,我们正在构建一个 Yocto 项目,该项目在 CodeBuild 上失败(Bitbake 健全性检查)。

我们绝望的方法也不起作用:

...

build:
  commands:
    - chmod -R 777 $(pwd)/ && chown -R builder $(pwd)/ && su -c "$(pwd)/make.sh" -s /bin/bash builder
...

失败:

bash: /codebuild/output/src624711770/src/.../make.sh: Permission denied

知道我们如何以非 root 用户运行它吗?

【问题讨论】:

  • 不确定如何以non-root 身份运行该命令将解决permission denied 问题,因为root 用户比non-root 用户提供更多权限。

标签: amazon-web-services yocto bitbake aws-codebuild


【解决方案1】:

我已成功在 AWS CodeBuild 中使用非 root 用户。
想出一个实用的解决方案不仅仅需要了解一些 CodeBuild 选项。

每个人都应该发现run-as 选项quite easily
下一个问题是“哪个用户?”;您不能只使用任何单词作为用户名。

为了找出可用的用户,下一条线索位于Docker images provided by CodeBuild 部分。在那里,您会找到每个图像定义的链接。 对我来说,该链接将我带到this page on GitHub
查看Dockerfile的源代码后,我们会知道有一个名为codebuild-user的用户可用。我们可以在构建规范中将这个codebuild-user 用作我们的run-as

然后我们将面临一大堆其他问题,因为标准映像只为root 安装每种语言的运行时。 这是一般解释所能达到的程度。

对我来说,我想使用 Ruby 运行时,所以我唯一关心的是 Ruby 运行时。 如果您将 CodeBuild 用于其他用途,那么您现在就靠自己了。

为了将 Ruby 运行时用作codebuild-user,我们必须从 root 用户公开它们。为此,我使用以下命令更改 CodeBuild 映像使用的.rbenv 所需的权限和所有者。

chmod +x ~
chown -R codebuild-user:codebuild-user ~/.rbenv

 
bundler(Ruby 的依赖管理工具)仍然想访问主目录,它是不可写的。我们必须设置一个环境变量以使其使用其他可写位置作为主目录。 环境变量为BUNDLE_USER_HOME

把所有东西放在一起;我的构建规范看起来像:

version: 0.2

env:
  variables:
    RAILS_ENV: test
    BUNDLE_USER_HOME: /tmp/bundle-user
    BUNDLE_SILENCE_ROOT_WARNING: true

run-as: codebuild-user

phases:
  install:
    runtime-versions:
      ruby: 2.x
    run-as: root
    commands:
      - chmod +x ~
      - chown -R codebuild-user:codebuild-user ~/.rbenv
      - bundle config set path 'vendor/bundle'
      - bundle install
  build:
    commands:
      - bundle exec rails spec

cache:
  paths:
    - vendor/bundle/**/*

我的观点是:

  • 确实有可能。
  • 展示我是如何针对我的用例做到这一点的。

【讨论】:

  • 这需要正确记录
【解决方案2】:

感谢您提出此功能请求。目前您无法在 CodeBuild 中以非 root 用户身份运行,我已将其传递给团队以供进一步审查。非常感谢您的反馈。

【讨论】:

  • 还是这样吗?现在控制台中有一个复选框...
【解决方案3】:

要以非 root 身份运行 CodeBuild,您需要使用 buildspec.yaml 中的 run-as 标记指定 Linux 用户名,如 docs 所示

version: 0.2

run-as: Linux-user-name

env:
  variables:
   key: "value"
   key: "value"
parameter-store:
key: "value"
key: "value"

phases:
  install:
  run-as: Linux-user-name
  runtime-versions:
    runtime: version

【讨论】:

  • 值得注意的是,HOME 不会在您执行此操作时在 shell 中设置。如果您需要将其设置为 run-as 用户的主目录,则必须自己设置,例如,在 env/variables 块中。
【解决方案4】:

我们最终做了以下事情:

创建一个 Dockerfile ,其中包含构建 Yocto / Bitbake 项目的所有内容,我们在其中 ADD 所需的源并创建一个用户 builder 用于构建我们的项目。

  FROM ubuntu:16.04

  RUN apt-get update && apt-get -y upgrade

  # Required Packages for the Host Development System
  RUN apt-get install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \
       build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
       xz-utils debianutils iputils-ping vim

  # Additional host packages required by poky/scripts/wic
  RUN apt-get install -y curl dosfstools mtools parted syslinux tree

  # Create a non-root user that will perform the actual build
  RUN id builder 2>/dev/null || useradd --uid 30000 --create-home builder
  RUN apt-get install -y sudo
  RUN echo "builder ALL=(ALL) NOPASSWD: ALL" | tee -a /etc/sudoers

  # Fix error "Please use a locale setting which supports utf-8."
  # See https://wiki.yoctoproject.org/wiki/TipsAndTricks/ResolvingLocaleIssues
  RUN apt-get install -y locales
  RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
          echo 'LANG="en_US.UTF-8"'>/etc/default/locale && \
          dpkg-reconfigure --frontend=noninteractive locales && \
          update-locale LANG=en_US.UTF-8

  ENV LC_ALL en_US.UTF-8
  ENV LANG US.UTF-8
  ENV LANGUAGE en_US.UTF-8

  WORKDIR /home/builder/
  ADD ./ ./

  USER builder

  ENTRYPOINT ["/bin/bash", "-c", "./make.sh"]

我们在 Codebuild pre_build 步骤期间构建此 docker,并在运行映像时在 ENTRYPOINT(在 make.sh 中)运行实际构建。容器激活后,我们将artifacts复制到Codebuild主机,放到S3上:

version: 0.2

phases:
  pre_build:
    commands:
      - mkdir ./images
      - docker build -t bob .
  build:
    commands:
      - docker run bob:latest
  post_build:
    commands:
      # copy the last excited container's images into host as build artifact
      - docker cp $(docker container ls -a | head -2 | tail -1 | awk '{ print $1 }'):/home/builder/yocto-env/build/tmp/deploy/images ./images
      - tar -cvzf artifacts.tar.gz ./images/*
artifacts:
  files:
    - artifacts.tar.gz

这种方法的唯一缺点是我们不能(轻松)使用 Codebuild 的缓存功能。但是构建对我们来说已经足够快了,因为我们白天进行本地构建,晚上基本上从头开始重新构建,这大约需要 90 分钟(在最强大的 Codebuild 实例上)。

【讨论】:

    【解决方案5】:

    叹息,所以我遇到了这个问题,我很失望这个问题没有好的或简单的答案。有很多很多进程强烈反对像 composer 那样以 root 身份运行,而其他进程会像 wp-cli 一样完全拒绝。如果您使用的是 AWS 提供的 Ubuntu“标准映像”,那么 /etc/passwd 文件中似乎有一个现有用户 dockremap:x:1000:1000::/home/dockremap:/bin/sh。我认为这个用户是用于 docker 中的 userns-remap 的,我不确定它的可用性。另一个令人惊讶的是没有提到的选项是运行useradd -N -G users develop 在容器中创建一个新用户。这比为如此琐碎的事情创建自定义容器要简单得多。

    【讨论】:

    • 我遇到了类似的问题,您能否使用pre_build 命令添加用户?
    • 在我放弃尝试使用 CodeBuild 之前,我最终还是以 root 身份运行。这个过程非常痛苦,我已经浪费了更多我希望通过使用这些工具来节省的时间。帮自己一个忙,使用 CircleCI 或其他任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2011-09-28
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多