【小ネタ】CloudWatch Agentの cwagent ユーザーについて

2020.03.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

私がWindows案件ばかりやっていたせいなのかもしれませんが、Linuxインスタンス向けにCloudWatch Agentの設定ファイルをウィザードから作ろうとしたところ、

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:

と、CloudWatch Agentの実行ユーザーを選ぶ項目がある事に気が付きました。

ご存知の方にとってはいまさらな話かもしれませんが本記事ではこのcwagentユーザーについて調べてみたことを書いていきます。

CloudWatch エージェントを別のユーザーとして実行する

CloudWatch Agentの実行ユーザーについてはユーザーガイドにきちんと詳細が記載されています。

LinuxインスタンスのCloudWatch Agentはデフォルトでrootユーザーで実行されますが設定により実行ユーザーを変えることが可能です。
(※Windowsインスタンスではサービスの実行ユーザーを変えることはできません)

cwagent ユーザーの作成タイミング

ユーザーガイドに

  1. 新しい Linux ユーザーを作成するか、RPM ファイルまたは DEB ファイルで作成した cwagent という名前のデフォルトユーザーを使用します。

とある様にCloudWatch Agentをインストールすると自動でcwagentユーザーが作成されます。
本日時点で最新のRPMパッケージの中身を覗いてみると

# CloudWatch AgentのRPMパッケージ(amazon-cloudwatch-agent-1.237768.0-1.x86_64.rpm)を
# インストール済みのAmazon Linux 2環境で実施
$ rpm -q --scripts amazon-cloudwatch-agent-1.237768.0-1.x86_64
preinstall scriptlet (using /bin/sh):
# Stop the agent before upgrades.
if [ $1 -ge 2 ]; then
    if [ -x /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl ]; then
        /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a stop
    fi
fi

if ! grep "^cwagent:" /etc/group >/dev/null 2>&1; then
    groupadd -r cwagent >/dev/null 2>&1
    echo "create group cwagent, result: $?"
fi

if ! id cwagent >/dev/null 2>&1; then
    useradd -r -M cwagent -d /home/cwagent -g cwagent >/dev/null 2>&1
    echo "create user cwagent, result: $?"
fi
preuninstall scriptlet (using /bin/sh):
# Stop the agent after uninstall
if [ $1 -eq 0 ] ; then
    if [ -x /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl ]; then
        /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a preun
    fi
fi

とあり、RPMパッケージのインストール時にcwagentユーザーおよびcwagentグループを追加する様になっています。

また、cwagentユーザーに特別な権限は与えらえておらず普通のシステムアカウントとして追加されていることもわかります。
このため

  1. 新しい Linux ユーザーを作成するか

とある様に独自のユーザーでも構わない様です。

cwagent ユーザーを使う設定

cwagentユーザーを利用するにはCloudWatch Agent設定ファイルの"agent"セクションに

"run_as_user": "<実行ユーザー(cwagent)>"

を追加してやればOKです。

// 設定例
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "cwagent"
    },
    // ・・・(後略)・・・
}

他の設定はrootユーザーで実行する場合と全く同じです。

対象インスタンスに適切なIAMロール(CloudWatchAgentServerPolicyなど)がアタッチされていれば追加の設定は不要ですし、IAMロールがアタッチされていないインスタンスの場合は/home/<実行ユーザー>/.aws/credentialsなどの認証情報ファイルを設定してやればOKです。
認証情報ファイルの詳細についてはユーザーガイドを参照してください。

その他注意点

CloudWatch Agentを実行するだけであればこれで問題ありませんが、ログの収集を行う場合はユーザーガイドにある様にログファイルに対するアクセス権が必要になります。

  1. 必要なアクセス許可をユーザーに付与します。ユーザーには、収集するログファイルの読み取り (r) アクセス許可と、ログファイルのパス内のすべてのディレクトリに対する実行 (x) アクセス許可が必要です。

この機能はいつから導入された?

CloudWatch Agentは更新履歴がドキュメント化されていない様でこの機能がいつ導入されたのかわかりませんでした。
(CloudWatchサービス全体としての更新履歴しかない)

ただ、CloudWatch Agentが登場した当時(2017年12月)のDevelopers.IOの記事を見るとウィザードにも登場しておらず最初からあった機能では無かった模様です。

新しいCloudWatch Agentでメトリクスとログの収集が行なえます

もう少し調べてみたところGitHubのこんなコミットログを発見し、2018年11月の少し前、秋ごろにこの機能が増えた様に見受けられます。

ドキュメントの更新履歴もGitHubにあったのですが、こちらでは2019年7月の更新で実行ユーザーの変更関連の記述が増えていましたが、あまり役に立たなそうな情報でした。

最後に

ざっとこんな感じです。

CloudWatch Agentに限りませんが、デーモンプロセスを実行するユーザーの権限は少ない方がセキュリティ上よろしいので可能な限りcwagentユーザーを使っていくのが良いと思います。