【小ネタ】CloudWatch Agentの cwagent ユーザーについて
しばたです。
私がWindows案件ばかりやっていたせいなのかもしれませんが、Linuxインスタンス向けにCloudWatch Agentの設定ファイルをウィザードから作ろうとしたところ、
Which user are you planning to run the agent?
- root
- cwagent
- others
default choice: [1]:
と、CloudWatch Agentの実行ユーザーを選ぶ項目がある事に気が付きました。
ご存知の方にとってはいまさらな話かもしれませんが本記事ではこのcwagent
ユーザーについて調べてみたことを書いていきます。
CloudWatch エージェントを別のユーザーとして実行する
CloudWatch Agentの実行ユーザーについてはユーザーガイドにきちんと詳細が記載されています。
LinuxインスタンスのCloudWatch Agentはデフォルトでroot
ユーザーで実行されますが設定により実行ユーザーを変えることが可能です。
(※Windowsインスタンスではサービスの実行ユーザーを変えることはできません)
cwagent ユーザーの作成タイミング
ユーザーガイドに
- 新しい 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
ユーザーに特別な権限は与えらえておらず普通のシステムアカウントとして追加されていることもわかります。
このため
- 新しい 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を実行するだけであればこれで問題ありませんが、ログの収集を行う場合はユーザーガイドにある様にログファイルに対するアクセス権が必要になります。
- 必要なアクセス許可をユーザーに付与します。ユーザーには、収集するログファイルの読み取り (r) アクセス許可と、ログファイルのパス内のすべてのディレクトリに対する実行 (x) アクセス許可が必要です。
この機能はいつから導入された?
CloudWatch Agentは更新履歴がドキュメント化されていない様でこの機能がいつ導入されたのかわかりませんでした。
(CloudWatchサービス全体としての更新履歴しかない)
ただ、CloudWatch Agentが登場した当時(2017年12月)のDevelopers.IOの記事を見るとウィザードにも登場しておらず最初からあった機能では無かった模様です。
もう少し調べてみたところGitHubのこんなコミットログを発見し、2018年11月の少し前、秋ごろにこの機能が増えた様に見受けられます。
ドキュメントの更新履歴もGitHubにあったのですが、こちらでは2019年7月の更新で実行ユーザーの変更関連の記述が増えていましたが、あまり役に立たなそうな情報でした。
最後に
ざっとこんな感じです。
CloudWatch Agentに限りませんが、デーモンプロセスを実行するユーザーの権限は少ない方がセキュリティ上よろしいので可能な限りcwagent
ユーザーを使っていくのが良いと思います。