以非root用户身份使用AWS CodeBuild

时间:2018-07-16 15:44:49

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

是否有办法在{strong> AWS CodeBuild 上删除root用户? 我们正在构建一个Yocto项目,如果我们是root用户,则该项目在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用户身份运行它?

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我在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

将所有内容放在一起;我的buildspec看起来像:

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 :(得分:1)

我们最终要做的是:

创建一个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实例上)。

答案 3 :(得分:1)

要以非超级用户身份运行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

答案 4 :(得分:0)

很遗憾,所以我遇到了这个问题,但对这个问题没有好的或简单的答案感到失望。有很多进程强烈反对像composer这样的以root用户身份运行,而另一些进程则会像wp-cli一样拒绝垃圾邮件。如果您使用的是AWS提供的Ubuntu“标准映像”,则/ etc / passwd文件dockremap:x:1000:1000::/home/dockremap:/bin/sh中似乎已有用户。我认为该用户适用于docker中的userns-remap,我不确定它的可用性。另一个没有被提及的选项是运行useradd -N -G users develop在容器中创建一个新用户。这比将自定义容器简化为琐碎的事情要简单得多。