서버내 dbus -> rsyslogd 에 의해 수집된 시스템 로그는 /var/log 아래에 파일 형태로 저장 된다.
이는 /etc/logrotate.conf 설정에 따라 서버내에 보관이 된다.
다만 보관된 파일의 파일 형태로 저장되어 있기 때문에 구조만 알고 있다면 파일을 삭제 하거나 변조 할 수 있으므로
추후 추적을 용의 하게 하기 위해, 데이터 무결성을 보장하기 위해, 혹은 다중의 서버의 데이터를 모아서 보관 하기위해 log 콜렉팅을 하는것이 일반적인 보안 방법 이다.
단순한 rsyslogd 를 이용한 udp 푸시 및 graylog collecting 은 기존에 설명을 했지만
AWS 상에서는 CloudWatch Log 라는 기능을 제공 한다 이를 통해 지표 형태로 보거나 알람 설정등을 할 수 있다.
서버에서는 CloudWatch log 쪽으로 데이터를 넣어주는 프로그램을 설치해서 운용 하며 이후
Log 파일의 안전한 분리 보관, 보관 주기 설정, 알람 설정 등을 웹 콘솔상에서 편하게 진행할 수 있다.
기존에 centos 7 에서는 yum 을 이용하여 awslogs 라는 프로그램을 설치하여 같은 기능을 사용하고 있었으나
Rockylinux 8 에서는 dnf 패키지가 없는 관계로 RPM 설치를 필요로 한다.
AWS 웹콘솔 에서 IAM 메뉴의 Role (역할) 을 생성 하고 권한을 부여 한다. (중간에 권한은 지정하지 않고 생성 하고 추후 인라인 정책으로 생성 한다.)
인라인 정책을 생성 한다. (생성한 정책이 다른 계정 이나 역할에 공통으로 부여할 필요하 있으면 일반 정책 생성 후 연결 한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:ap-northeast-2:*:log-group:*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "logs:PutLogEvents", "Resource": [ "arn:aws:logs:ap-northeast-2:*:log-group:*:*:*" ] }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "*" } ] } |
위 json 정책은 ap-northeast-2 (서울) 리전에 로그 를 쌓는 기능만 허용 하는것으로 제한 하였다.
생성된 Role (역할) 을 필요한 EC2에 연결 한다.
위에서 이야기 했지만 yum(dnf) 설치가 RockyLinux 8 에서 되지 않는다. 때문에 AWS 에서 배포 하는 rpm 파일을 가지고 설치를 진행 한다. (amazon-cloudwatch-agent 설치 메뉴얼)
1 2 3 4 5 |
~]$ sudo -i ~]# cd /opt ~]# curl https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-agent.rpm -O ~]# rpm -U ./amazon-cloudwatch-agent.rpm |
편리하게 사용하라고 대화식 명령어를 실행 하도록 되어 있다.
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
하지만 문답 형식의 영어를 읽기도 귀찮고(어렵고) Role (정책)을 부여하여 키없이 로그를 쌓게 하고자 했으나
스크립트에서는 필수적으로 Access Key/Secret Key 를 입력 해야 하는 부분이 있기 때문에 스크립트로 진행이 어렵다.
때문에 /opt/aws/amazon-cloudwatch-agent/bin/config.json 파일을 직접 수정 해 준다. (amazon-cloudwatch-agent 설정 메뉴얼)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
{ "agent": { "metrics_collection_interval": 30, "run_as_user": "root", "logfile": "/var/log/aws-cw-agent.logs" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/messages", "log_group_name": "XXXX-syslog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_messages", "timestamp_format": "%b %d %H:%M:%S" }, { "file_path": "/var/log/secure", "log_group_name": "XXXX-syslog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_secure", "timestamp_format": "%b %d %H:%M:%S" }, { "file_path": "/var/log/httpd/access_log", "log_group_name": "XXXX-weblog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_httpd-access_log", "timestamp_format": "%d/%b/%Y:%H:%M:%S %z" }, { "file_path": "/var/log/httpd/error_log", "log_group_name": "XXXX-weblog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_httpd-error_log", "timestamp_format": "%a %b %d %H:%M:%S.%f %Y" }, { "file_path": "/var/log/nginx/access.log", "log_group_name": "XXXX-weblog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_nginx-access_log", "timestamp_format": "%d/%b/%Y:%H:%M:%S %z" }, { "file_path": "/var/log/nginx/error.log", "log_group_name": "XXXX-weblog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_nginx-error_log", "timestamp_format": "%Y/%m/%d %H:%M:%S" }, { "file_path": "/var/log/php-fpm/www-error.log", "log_group_name": "XXXX-weblog", "log_stream_name": "XXXXXXXXXXXX-01_{instance_id}_php-fpm_log", "timestamp_format": "%d-%b-%Y %H:%M:%S" } ] } } } } |
위 예제는 apache, php, nginx 등을 dnf(yum) 설치를 한경우 일반 적인 log 포멧의 timestamp를 인식 하도록 정리한 것이다. (secure, message 로그 및 apache, nginx, php-fpm 로그)
필요에 따라 수정을 해서 사용 하도록 한다.
이후 다음 명령어로 설정된 config.json 을 점검 하고 문제가 없다면 자동으로 서비스가 시작된다.
1 2 |
~]# cd /opt/aws/amazon-cloudwatch-agent/bin ~]# ./amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
****** 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 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 2022/04/07 20:54:16 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ... Valid Json input schema. I! Detecting run_as_user... 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 /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service. Redirecting to /bin/systemctl restart amazon-cloudwatch-agent.service |
웹 콘솔 에서 Cloudwatch > 로그 그룹에서 보관 기간 을 설정 하고 로그 데이터가 잘 적재 되고 있는지 확인 한다.