作为非根用户的 AWS CodeBuild

Liv*_*oso 7 amazon-web-services bitbake yocto aws-codebuild

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

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

...

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

失败:

bash: /codebuild/output/src624711770/src/.../make.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)

知道我们如何以非 root 身份运行它吗?

Cur*_*Sam 9

我成功地在 AWS CodeBuild 中使用非根用户。
要提出实用的解决方案,需要的不仅仅是了解一些 CodeBuild 选项。

每个人都应该很容易找到run-as选择。 下一个问题是“哪个用户?”;您不能只输入任何单词作为用户名。

为了找出哪些用户可用,下一个线索是CodeBuild 部分提供的 Docker 映像。在那里,您将找到每个图像定义的链接。对我来说,该链接将我带到GitHub 上的此页面
。 在检查 的源代码后Dockerfile,我们会知道有一个名为codebuild-useravailable 的用户。我们可以在构建规范中使用codebuild-userrun-as

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

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

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

chmod +x ~
chown -R codebuild-user:codebuild-user ~/.rbenv
Run Code Online (Sandbox Code Playgroud)

 
(Ruby 的依赖管理工具bundler)仍然想要访问不可写的主目录。我们必须设置一个环境变量以使其使用其他可写位置作为主目录。环境变量是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/**/*
Run Code Online (Sandbox Code Playgroud)

我的观点是:

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

  • 马恩这需要正确记录 (2认同)

Liv*_*oso 2

我们最终做了以下事情:

创建一个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"]
Run Code Online (Sandbox Code Playgroud)

我们在 Codebuild 步骤中构建此 docker ,并在运行映像时在(in )pre_build中运行实际构建。容器被激发后,我们将其复制到 Codebuild 主机并将它们放在 S3 上:ENTRYPOINTmake.shartifacts

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
Run Code Online (Sandbox Code Playgroud)

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