More Related Content
Similar to 【ログ分析勉強会】セッションアクティビティログは使えるのか
Similar to 【ログ分析勉強会】セッションアクティビティログは使えるのか (20)
【ログ分析勉強会】セッションアクティビティログは使えるのか
- 2. 自己紹介
後日スライド公開予定
名前: 日比野 恒 (ひびの ひさし)
業務: ログ分析プラットフォームの設計と構築
好きなツール: Logstash
モチベ: ログの活用、分析の敷居を下げること
セキュリティログ分析基盤活用入門(@IT)
https://www.atmarkit.co.jp/ait/series/16525/
クラウド環境のログをどう活かす?先駆者の知見から学ぶ
https://ascii.jp/elem/000/001/697/1697672/
- 11. 【ログストリーム】
【S3バケット】
CloudWatch Logsの嬉しいとこ
• マルチラインのログを1つのイベントとして扱ってくれるため、イベント単位で検索クエリを実行できる。
【ログファイル】
【CloudWatch Logs】
xxxxxxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
xxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
1つのイベント
(マルチライン)
xxxxxxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
xxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
【ファイル(オブジェント)】
xxxxxxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
xxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
S3へ
CWLへ
【ロググループ】
xxxxxxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
xxxxxxxxxxxxxxx
xxx: xxxxxx
xxx: xxxxxx
AthenaやS3 Selectなどで
クエリを実行してもマルチラインの
ログを1つのイベントとして認識しない。
1つのログストリームにマルチラインの
ログが1つのイベントとして格納される
ため、Insightsなどでクエリするとイベ
ント単位で探索が可能になる。
- 12. Elasticsearch Serviceへの転送でハマる
• 複数のロググループから1つのAmazon ESにストリームしようとすると2つ目以降のログの格納に失敗する。
(Lambda関数の改修方法は、Appendixに記載)
サブスクリプションを使用したログデータのリアルタイム処理
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/Subscriptions.html
CloudWatch Logs
CloudTrail
(監査証跡ログ)
Systems Manager
(セッションアクティビティログ)
Lambda
(加工処理)
Elasticsearch
Service
セキュリティ
監視者
Cognito
ssm-logging
cloudtrail
cwl-
YYYY.MM.DD
ロググループ
インデックス
【凡例】
Amazon ESへのストリーム
(サブスクリプションフィルタ)
認証検索②格納
①ログ出力
①’ログ出力
デフォルトでは、「cwl-」という
インデックス名に格納するように
Lamdba関数でセットされている。
そのため、異なるスキーマのデータ格納でコケる
そこは足を引っ張らないでほすい
- 15. 【参考】SSH over Session Managerの接続構成
macOS 10.14.2
python 3.8.2
aws cli 2.0.12
(1.16.12以上)
session manager
plugin 1.1.61
(1.1.22.0以上)
Macbook Pro
Internet
AWS Cloud (@Tokyo)
Systems Manager
EC2
ssm agent 2.3.714.0
(2.3.672.0以上)
IAM
SSH/SCP
aws ssm start
認証認可
SSHキー
AWS
クレデンシャル
Security Group
※インバウンドルール不要
Session Manager で SSH/SCPをトンネリングしてEC2に接続する
https://qiita.com/hayao_k/items/78b5bfe030ad8a053e93
Amazon Linux 2
• Security Groupの開放は不要だが、SSHキーとAWSクレデンシャル情報の配布が必要になる。
- 16. やりたかったことは概ねできたかな...
No 確認項目 結果 詳細内容
1 送信元IPアドレス制御 ◯ IAMポリシーで許可したIPアドレス以外の送信元IPアドレスからAWSマネージメントコンソールにログインしても
全ての操作に権限がないため、アクセス権限エラーとなり、あらゆる操作ができない。(MFA設定すらできない)
2 MFA制御 ◯ 許可された送信元IPアドレスからAWSマネージメントコンソールにログインしても、MFAを有効化してログインしてい
ないとMFA設定以外の操作に権限がないため、アクセス権限エラーとなり、EC2操作ができない。
(スイッチロールもエラーとなる)
3 SSH接続制御 ◯ EC2の操作はSession Manager経由で実施するため、Security GroupでSSH通信を許可しない。
そのため、EC2に対してSSH接続しても拒否される。
また、「SSH over Session Manager」によるSSH接続は、EC2に接続するためのSSH鍵、またAWS CLIコマンド
での操作権限のあるIAMユーザのアクセスキー情報を渡さなければ、ログインできない。
4 スイッチロールによる権限制御 ◯ MFAを利用して、許可された送信元IPアドレスからAWSマネージメントコンソールにログインし、スイッチロールしない
とEC2の操作権限がないため、アクセス権限エラーとなり、EC2操作ができない。
(EC2セッション開始やマシンの起動/停止がエラーとなる)
5 タグによるEC2操作制御(おまけ) ◯ スイッチロール後、EC2のリソースタグに「env: dev」と設定されていないマシンには、セッション開始や起動停止でき
ない。リソースタグが付与されているEC2の操作は可能です。
6 操作ログ取得とログ改ざん防止 △ Session Manager経由のセッション開始/セッション終了でS3バケットとCloudWatch Logsにログが取得された。
しかし、セッション接続中に停止/再起動を行うとログが記録されない。最終的には、EC2の起動と停止権限を付与し、
セッション中に停止/再起動をしない運用とした。(苦肉の策)
スイッチ用IAMロールにセッションアクティビティに関する権限を付与していないため、ログ設定を変更できない。
また、S3およびCloudWatch Logsの権限を付与していないため、ログの参照および改ざんができない。
7 監視イベントのSlack通知 〇 CloudWatch EventsでCloudTrailのログを用いて、AWSコンソールログインとセッション開始のイベントをSlack
通知した。
- 26. コンテンツ
✓ 設定したIAMポリシー
✓ SSH over Session Managerの設定方法
✓ サブスクリプションの改修方法
✓ Slack通知に利用したLambdaの設定
✓ CloudWatch Eventsのイベントパターン
✓ 参考にしたURL集
- 28. IAMグループに割り当てるIAMポリシー(2/5)
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:CreateVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:ChangePassword",
"iam:CreateLoginProfile",
"iam:DeleteLoginProfile",
"iam:GetLoginProfile",
"iam:UpdateLoginProfile“
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"<許可したい送信元IPアドレス1>/32",
"<許可したい送信元IPアドレス2>/32",
"<許可したい送信元IPアドレス3>/32"
]
}
}
},
• AWSコンソールログインを制御する「must-mfalogin」のIAMポリシーの設定内容になります。
- 30. IAMグループに割り当てるIAMポリシー(4/5)
{
"Sid": "VisualEditor3",
"Effect": "Deny",
"NotAction": [
"iam:ListUsers",
"iam:ListVirtualMFADevices",
"iam:ListMFADevices",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:CreateVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:ChangePassword",
"iam:CreateLoginProfile",
"iam:DeleteLoginProfile",
"iam:GetLoginProfile",
"iam:UpdateLoginProfile"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
• AWSコンソールログインを制御する「must-mfalogin」のIAMポリシーの設定内容になります。
- 31. IAMグループに割り当てるIAMポリシー(5/5)
{
"Sid": "VisualEditor4",
"Effect": "Deny",
"Action": [
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:CreateVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:ChangePassword",
"iam:CreateLoginProfile",
"iam:DeleteLoginProfile",
"iam:GetLoginProfile",
"iam:UpdateLoginProfile"
],
"NotResource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
• AWSコンソールログインを制御する「must-mfalogin」のIAMポリシーの設定内容になります。
- 37. SSH over Session Managerの設定
$ brew install awscli
$ aws --version
aws-cli/2.0.12 Python/3.8.2 Darwin/18.2.0 botocore/2.0.0dev19
$ aws configure --profile test_ssm_user
AWS Access Key ID [********************]: <アクセスキーを入力>
AWS Secret Access Key [********************]: <シークレットアクセスキーを入力>
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [None]:
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
$ session-manager-plugin --version
1.1.61.0
$ vi /Users/XXXXXXX/.ssh/config
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p’”
$ cd /Users/XXXXXXX/Downloads
$ chmod 600 ssm_test.pem
$ ssh -i ~/Downloads/ssm_test.pem ec2-user@i-0d624444444444 -v
①
②
③
④
• ①AWS CLI導入、②クレデンシャル設定、③プラグイン導入、④SSH設定、⑤SSHキー配置の順に設定します。
⑤
- 49. Slack通知に利用したLambdaの設定(5/8)
• 以下、AWSコンソールログインの場合のPythonコードになります。
import json
import os
import logging
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
webhook_url = os.environ['WEBHOOK_URL']
message = 'AWSコンソールログインを検知しました。'
slack_message = {
'username': 'AWS Console Login Event Notification',
'icon_emoji': ':logo_amazon_aws:',
'text': message,
'attachments': [
{
'fallback': 'AWS Console Login Event Description.',
'color': 'good',
'title': event['detail']['eventType'],
‘title_link’: https://xxxxxxxxxx',
- 50. Slack通知に利用したLambdaの設定(6/8)
• 以下、AWSコンソールログインの場合のPythonコードになります。
'fields': [
{
'title': 'Account ID',
'value': event['account'],
'short': True
},
{
'title': 'Region',
'value': event['detail']['awsRegion'],
'short': True
},
{
'title': 'Event Time',
'value': event['detail']['eventTime'],
'short': True
},
{
'title': 'User Name',
'value': event['detail']['userIdentity']['userName'],
'short': True
},
{
'title': 'Source IP Address',
'value': event['detail']['sourceIPAddress'],
'short': True
},
{
'title': 'MFA Used',
'value': event['detail']['additionalEventData']['MFAUsed'],
'short': True
},
- 51. Slack通知に利用したLambdaの設定(7/8)
• 以下、AWSコンソールログインの場合のPythonコードになります。
{
'title': 'Auth Results',
'value': event['detail']['responseElements']['ConsoleLogin'],
'short': True
}
]
}
]
}
req = Request(webhook_url, json.dumps(slack_message).encode('utf-8'))
try:
response = urlopen(req)
response.read()
logger.info("Message posted.")
except HTTPError as e:
logger.error("Request failed: %d %s", e.code, e.reason)
except URLError as e:
logger.error("Server connection failed: %s", e.reason)
- 55. 【参考】 ConsoleLoginのサンプルログ(CloudTrail)
{
"eventVersion": "1.05",
"userIdentity": {
"type": "IAMUser",
"principalId": "AIDATCE2DIFWFQUSJBAGB",
"arn": "arn:aws:iam::123456789012:user/h_hibino",
"accountId": “123456789012",
"userName": “h_hibino"
},
"eventTime": "2020-06-23T23:55:18Z",
"eventSource": "signin.amazonaws.com",
"eventName": "ConsoleLogin",
"awsRegion": “ap-northeast-1",
"sourceIPAddress": “xxx.xxx.xxx.xxx",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36",
"requestParameters": null,
"responseElements": {
"ConsoleLogin": "Success"
},
"additionalEventData": {
"LoginTo": "https://us-east-2.console.aws.amazon.com/console/home?region=us-east-2&state=hashArgs%23&isauthcode=true",
"MobileVersion": "No",
"MFAUsed": "Yes"
},
"eventID": "907fcb50-2dbf-4a55-b562-e9315a86511c",
"eventType": "AwsConsoleSignIn",
"recipientAccountId": "210776572268"
}
- 56. 【参考】StartSessionのサンプルログ(CloudTrail)
{
"eventVersion": "1.05",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROATCE2DIFWL3AYFWGB5:h_hibino",
"arn": "arn:aws:sts::210776572268:assumed-role/Dev_Switch_Role/h_hibino",
"accountId": “123456789012",
"accessKeyId": “xxxxxxxxxxxxxxxxxxxxxxxx",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROATCE2DIFWL3AYFWGB5",
"arn": "arn:aws:iam::123456789012:role/Test_Switch_Role",
"accountId": "123456789012",
"userName": “Dev_Switch_Role"
},
"webIdFederationData": {},
"attributes": {
"mfaAuthenticated": "true",
"creationDate": "2020-05-22T05:15:32Z"
}
}
},
"eventTime": "2020-05-22T05:18:33Z",
"eventSource": "ssm.amazonaws.com",
"eventName": "StartSession",
"awsRegion": “ap-nourtheast-1",
"sourceIPAddress": “xxx.xxx.xxx.xxx",
"userAgent": "aws-internal/3 aws-sdk-java/1.11.776 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.252-b09 java/1.8.0_252 vendor/Oracle_Corporation",
"requestParameters": {
"target": "i-0d622f76f722de6b1"
},
"responseElements": {
"sessionId": “h_hibino-05593fa2edf884c0f",
"tokenValue": "Value hidden due to security reasons.",
"streamUrl": "wss://ssmmessages.us-east-2.amazonaws.com/v1/data-channel/test_hibino-05593fa2edf884c0f?role=publish_subscribe"
},
"requestID": "1ff9865a-3342-4ed2-a524-36cbf932dd81",
"eventID": "805d1591-56ff-473f-bbe0-d8a27fe9fb6b",
"readOnly": false,
"eventType": "AwsApiCall",
"recipientAccountId": “123456789012"
}