[小ネタ]EC2 Image Builderでコンポーネントを実行するユーザを調べてみた

EC2 Image Builderでコンポーネントを実行するユーザを調べてみました。
2019.12.17

きっかけ

ImageBuilderのAmazon提供コンポーネントを調べてみると、コマンド実行時にsudoを付与しているようでした。「sudoを付与するということは、root以外のユーザで実行されている可能性があるかもしれないけど、では一体どのユーザで?」ということが気になったので、実際に調べてみました。

結論

root権限でした。

調べ方

以下ようなカスタムコンポーネントを作成し、実際にImageBuilderで実行してみました。

name: builder-check
schemaVersion: 1.0

phases:
  - name: build
    steps:
      - name: hoge
        action: ExecuteBash
        inputs:
          commands:
            - whoami >> /tmp/hoge.log
            - id >> /tmp/hoge.log
            - pwd >> /tmp/hoge.log
            - cd ~
            - pwd >> /tmp/hoge.log
            - touch /tmp/xxxxx
            - ls -al /tmp/ >> /tmp/hoge.log

出力されたファイルを確認してみました。

$ cat /tmp/hoge.log
root
uid=0(root) gid=0(root) groups=0(root)
/tmp
/root
total 44
(中略)
-rw-r--r--  1 root root     0 Dec 16 08:28 xxxxx

わかったこと

  • root権限で実行される。
  • 初期ディレクトリは/tmp。ホームディレクトリは/root

コンポーネントの実行はSSMエージェントを介して行われているようで、SSMのドキュメントには以下のようにあります。ナルホドね。

SSM エージェント は、root アクセス権限 (Linux) または SYSTEM アクセス権限 (Windows) を使用して Amazon EC2 インスタンスで実行されます。

SSM エージェント を介してルートレベルコマンドへのアクセスを制限する - AWS Systems Manager

おまけ

あれ、ということはsudoいらないのでは・・・?

というわけで試してみました。

name: code-deploy-agent
description: Install CodeDeploy agent.
schemaVersion: 1.0

phases:
  - name: build
    steps:
      - name: install
        action: ExecuteBash
        inputs:
          commands:
            - yum update -y
            - yum install ruby wget -y
            - wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install -O /tmp/install -nv
            - chmod +x /tmp/install
            - /tmp/install auto
            - rm -f /tmp/install

特にトラブルなく、AMIの作成が完了しました。

しかし、sudoを利用することでログが残ります。ImageBuilderはコンポーネント単位でスクリプト化して実行しています。そのため、内部でどのようなコマンドを実行したか残したい場合に履歴を残すことができます。 「CodeDeployのインストール」「Apacheのインストール」の2つのモジュールを、それぞれsudo有りと無しで試した場合のログです。

sudo有りの場合の/var/log/secure

Dec 17 05:35:18 ip-******** useradd[2527]: new group: name=ec2-user, GID=1000
Dec 17 05:35:18 ip-******** useradd[2527]: new user: name=ec2-user, UID=1000, GID=1000, home=/home/ec2-user, shell=/bin/bash
Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to group 'adm'
Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to group 'wheel'
Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to group 'systemd-journal'
Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'adm'
Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'wheel'
Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'systemd-journal'
Dec 17 05:35:18 ip-******** sshd[2702]: Server listening on 0.0.0.0 port 22.
Dec 17 05:35:18 ip-******** sshd[2702]: Server listening on :: port 22.
Dec 17 05:38:10 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/tmp/imagebuilder/TaskOrchestratorAndExecutor/awstoe ru
n -d /tmp/imagebuilder/code-deploy-agent_********,/tmp/imagebuilder/apache-2_4_******** -p build,validate
Dec 17 05:38:10 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:10 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum update -y
Dec 17 05:38:10 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:29 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:29 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum install ruby wget -y
Dec 17 05:38:29 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:31 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:32 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/tmp/install auto
Dec 17 05:38:32 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:36 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:36 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum update -y
Dec 17 05:38:36 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:37 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:37 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum install httpd -y
Dec 17 05:38:37 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:38 ip-******** groupadd[11769]: group added to /etc/group: name=apache, GID=48
Dec 17 05:38:38 ip-******** groupadd[11769]: group added to /etc/gshadow: name=apache
Dec 17 05:38:38 ip-******** groupadd[11769]: new group: name=apache, GID=48
Dec 17 05:38:38 ip-******** useradd[11774]: new user: name=apache, UID=48, GID=48, home=/usr/share/httpd, shell=/sbin/nologin
Dec 17 05:38:38 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:38 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/systemctl enable httpd.service
Dec 17 05:38:38 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 17 05:38:39 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:39 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 17 05:38:54 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/shred -zuf /etc/sudoers.d/90-cloud-init-users

sudo無しの場合の/var/log/secure

Dec 16 10:05:35 ip-******** useradd[2527]: new group: name=ec2-user, GID=1000
Dec 16 10:05:35 ip-******** useradd[2527]: new user: name=ec2-user, UID=1000, GID=1000, home=/home/ec2-user, shell=/bin/bash
Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to group 'adm'
Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to group 'wheel'
Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to group 'systemd-journal'
Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'adm'
Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'wheel'
Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'systemd-journal'
Dec 16 10:05:35 ip-******** sshd[2703]: Server listening on 0.0.0.0 port 22.
Dec 16 10:05:35 ip-******** sshd[2703]: Server listening on :: port 22.
Dec 16 10:08:20 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/tmp/imagebuilder/TaskOrchestratorAndExecutor/awstoe run
 -d /tmp/imagebuilder/code-deploy-agent_********,/tmp/imagebuilder/apache-2_4_******** -p build,validate
Dec 16 10:08:20 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Dec 16 10:08:47 ip-******** groupadd[11756]: group added to /etc/group: name=apache, GID=48
Dec 16 10:08:47 ip-******** groupadd[11756]: group added to /etc/gshadow: name=apache
Dec 16 10:08:47 ip-******** groupadd[11756]: new group: name=apache, GID=48
Dec 16 10:08:47 ip-******** useradd[11761]: new user: name=apache, UID=48, GID=48, home=/usr/share/httpd, shell=/sbin/nologin
Dec 16 10:08:48 ip-******** sudo: pam_unix(sudo:session): session closed for user root
Dec 16 10:09:06 ip-******** sudo:    root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/shred -zuf /etc/sudoers.d/90-cloud-init-users

sudo有りの場合、スクリプトの内部でどのようなコマンドが発行されたかしっかりと分かりますね。 この特性を覚えておくとなにかの役に立つかもしれません。

それでは!