🙌

LinuxのログをCloudWatchLogsに保管する方法

2023/01/22に公開

はじめに

2022年11月27日に、re:InventでCloudWatchLosの データ保護機能 が発表されました。
セキュリティをやっている身としては、押さえておきない機能だと思ったので色々触ってみたいと思いますが、まずはそもそもログをCloudWatchLogsに渡す方法をきちんと整理しておきたいなと思って記事にしました。
※データ保護機能の検証は、別の記事にします。

本記事の目標

以下の構成を構築して、CloudWatchLogsからログが閲覧できる。

EC2の構成

OS: AmazonLinux2(kernel-5.10.157)
ミドルウェア: Apache(2.4.54-1.amzn2)

AWSで利用するサービス

  1. IAMロール
  2. CloudWatchLogs
  3. AWS Systems Manager(パラメータストア)

1. EC2用のIAMロール作成・アタッチ

※VPCやEC2は事前に作成されている前提で話を進めます。
EC2からCloudWatchLogsにログを送信するためには、EC2にIAMロールをアタッチしておく必要があります。
以下の流れでIAMロールを作成して、EC2にIAMロールをアタッチします。

  1. 「IAM」-「ロール」から「ロールを作成」をクリック
  2. 以下の設定で「次へ」
項目 設定値
信頼されたエンティティタイプ AWSのサービス
ユースケース EC2

  1. 「許可ポリシー」で【CloudWatchAgentAdminPolicy】を選択して「次へ」をクリック

  1. 「ロール名」に任意の名前を入力して、「ロールを作成」をクリック

ここまでで必要なIAMロールが作成されたので、作成したIAMロールをEC2にアタッチします。

  1. 「EC2」から「アクション」-「セキュリティ」-「IAMロールを変更」をクリック

  2. 先ほど作成したIAMロールを選択して、「IAMロールの更新」をクリック

以上でIAMロール作成とEC2へのアタッチは完了です。

EC2の事前設定(Apacheのインストール)

  1. 今回ログ出力を検証するApacheをインストールします。
$ sudo yum install httpd -y
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core
・・・・
  1. 自動起動を有効化して、サービスを起動します。
### 自動起動有効化
$ sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

### 自動起動設定確認
$ sudo systemctl is-enabled httpd
enabled

### httpdサービスの起動
$ sudo systemctl start httpd
$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-01-21 13:47:06 UTC; 4s ago
     Docs: man:httpd.service(8)
 Main PID: 3655 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─3655 /usr/sbin/httpd -DFOREGROUND
           ├─3656 /usr/sbin/httpd -DFOREGROUND
           ├─3657 /usr/sbin/httpd -DFOREGROUND
           ├─3658 /usr/sbin/httpd -DFOREGROUND
           ├─3659 /usr/sbin/httpd -DFOREGROUND
           └─3660 /usr/sbin/httpd -DFOREGROUND

Jan 21 13:47:06 ip-192-168-1-244.ap-northeast-1.compute.internal systemd[1]: Starting The Apache HT...
Jan 21 13:47:06 ip-192-168-1-244.ap-northeast-1.compute.internal systemd[1]: Started The Apache HTT...
Hint: Some lines were ellipsized, use -l to show in full.

EC2にCloudWatchエージェントのインストール・設定

EC2にCloudWatchエージェントをインストールして、ウィザードを使用して設定も行っていきます。
参考は、以下のAWSユーザーガイド
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/UseCloudWatchUnifiedAgent.html

CloudWatchエージェントのインストール

以下コマンドを実行してインストールします。

$ sudo yum install amazon-cloudwatch-agent -y 
・・・
Dependencies Resolved

===========================================================================================
 Package                     Arch      Version                     Repository     Size
===========================================================================================
Installing:
 amazon-cloudwatch-agent     x86_64    1.247354.0b251981-1.amzn2   amzn2-core     45 M

Transaction Summary
===========================================================================================
Install  1 Package

Total download size: 45 M
Installed size: 201 M

・・・

ウィザードを使用したエージェントの設定

以下コマンドを実行して、ウィザードに沿って設定します。
今回は、まずは以下ログをCloudWatchLogsに送信する設定をしたのち、手動でhttpdのログも送信するようにします。

  • ウィザードで設定するログ
    • /var/log/secure
    • /var/log/audit/audit.log
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
=                                                              =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply.                                           =
================================================================
### OSのタイプを選択(今回はLinuxのためデフォルト)
On which OS are you planning to use the agent? 
1. linux
2. windows
3. darwin
default choice: [1]:

### サーバの設置場所を選択(今回はEC2のためデフォルト)
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:

### エージジェントを実行するユーザー(今回はrootを選択)
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:

### StatsD daemonを利用するか(今回はログの監視だけなので不要)
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
### CollectDを利用してメトリクスを監視するか(今回はログの監視だけなので不要)
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
2
### CPUとかメモリなどのメトリクスを監視するか(今回は監視しないので不要)
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
2
### すでにCloudWatchLogエージェントが存在しているか(今回はまっさらな状態から設定しているので存在しない)
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
### ログを監視したいか(監視したい)
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:

### 監視するログファイルのパス
Log file path:
/var/log/secure
### CloudWatchLogsのロググループ名
Log group name:
default choice: [secure]
test-secure
### CloudWatchLogsのログストリーム名
Log stream name:
default choice: [{instance_id}]

### ログの保管期間
Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1827
18. 2192
19. 2557
20. 2922
21. 3288
22. 3653
default choice: [1]:
3
### 追加で監視したいログがあるかどうか(なければ2で終了する)
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:

### 追加で監視するログのパス
Log file path:
/var/log/audit/audit.log
### 追加で監視するログのロググループ
Log group name:
default choice: [audit.log]
test-audit.log
### 追加で監視するログのログストリーム
Log stream name:
default choice: [{instance_id}]

### 追加で監視するログの保管期間
Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1827
18. 2192
19. 2557
20. 2922
21. 3288
22. 3653
default choice: [1]:
3
### 追加でログを監視したいか(今回はとりあえず2つなので追加しない)
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/secure",
                                                "log_group_name": "test-secure",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": 3
                                        },
                                        {
                                                "file_path": "/var/log/audit/audit.log",
                                                "log_group_name": "test-audit.log",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": 3
                                        }
                                ]
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
### 設定値を、SSMのパラメータストアに保存するか(今回はする)
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

### SSMのパラメータストア上の名称
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]

### SSMを利用するリージョン
Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

### パラメータストアに保存するときに利用するクリデンシャル(何を参照しているかが不明のためデフォルト)
Which AWS credential should be used to send json config to parameter store?
1. ASIA6PGIA5TPVQOR5VNQ(From SDK)
2. Other
default choice: [1]:

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

以上で、設定ファイル「config.json」が自動で作成されました。
設定ファイルは以下のパスに作成されています。

$ ll /opt/aws/amazon-cloudwatch-agent/bin/config.json
-rwxr-xr-x 1 root root 467 Jan 21 14:27 /opt/aws/amazon-cloudwatch-agent/bin/config.json

httpdのログ監視設定を手動登録

httpdのログファイル監視の設定を手動で登録します。

config.json
@@ -17,9 +17,21 @@
                "log_group_name": "test-audit.log",
                "log_stream_name": "{instance_id}",
                "retention_in_days": 3
-           }
+           },
+           {
+               "file_path": "/var/log/httpd/access_log",
+               "log_group_name": "test-httpd",
+               "log_stream_name": "accesslog-{instance_id}",
+               "retention_in_days": 3
+           },
+           {
+               "file_path": "/var/log/httpd/error_log",
+               "log_group_name": "test-httpd",
+               "log_stream_name": "errorlog-{instance_id}",
+               "retention_in_days": 3
+           }
        ]
    }

CloudWatchエージェントのサービス起動

以下コマンドを実行してサービスを起動します。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html#start-CloudWatch-Agent-EC2-commands-fleet

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
****** processing amazon-cloudwatch-agent ******
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
I! Trying to detect region from ec2
D! [EC2] Found active network interface
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
2023/01/21 14:57:16 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
2023/01/21 14:57:16 I! Valid Json input schema.
I! Detecting run_as_user...
I! Trying to detect region from ec2
D! [EC2] Found active network interface
No csm configuration found.
No metric configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
amazon-cloudwatch-agent has already been stopped
Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service to /etc/systemd/system/amazon-cloudwatch-agent.service.
Redirecting to /bin/systemctl restart amazon-cloudwatch-agent.service

CloudWatchLogsでログ出力確認

AWSのコンソール画面で「CloudWatch」-「ログ」-「ロググループ」から、指定したロググループが作成されて、各ロググループ内にログストリームおよびログが出力されていることを確認します。

ロググループ

ログストリーム

httpdのアクセスログ

おわりに

EC2からCloudWatchLogsへのログ転送設定までが完了しました。
次回は、もともと想定していた「データ保護機能」について検証してみたいと思います。
パラメータストアに設定を入れた件も、詳細はまた別記事で書きたいと思います。

Discussion