本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
设置系统日志提取
本节将引导您完成在日志中设置 syslog 提取的步骤。 CloudWatch 您将为 syslog 服务创建 VPC 终端节点、用于接收消息的日志组、用于授权 syslog 服务的资源策略以及用于将流量从 VPC 终端节点路由到日志组的 syslog 配置。
您可以使用 AWS 管理控制台 AWS CLI、或 AWS 软件开发工具包执行所有这些步骤。以下说明提供了控制台和 AWS CLI 示例。
先决条件
用于设置 syslog 提取的 IAM 身份(用户或角色)必须具有创建 VPC 终端节点、日志组、资源策略和 syslog 配置的权限。以下示例策略显示了所需的最低权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:PutResourcePolicy",
"logs:DeleteResourcePolicy",
"logs:PutSyslogConfiguration",
"logs:ListSyslogConfigurations",
"logs:DeleteSyslogConfiguration"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:CreateVpc",
"ec2:ModifyVpcAttribute",
"ec2:CreateSubnet",
"ec2:CreateSecurityGroup",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateVpcEndpoint",
"ec2:ModifyVpcEndpoint",
"ec2:DescribeVpcEndpoints"
],
"Resource": "*"
}
]
}
如果您已经拥有 VPC、子网和安全组,则只需要执行 EC2 操作的ec2:CreateVpcEndpointec2:ModifyVpcEndpoint、和ec2:DescribeVpcEndpoints权限。
步骤 1:创建或标识 VPC
您需要一个可以从生成系统日志的设备所在的本地网络(通过 VPN 或 Direct Connect)访问的 VPC。如果您已经有一个 VPC 连接到您的数据中心,请跳过此步骤并使用现有的 VPC 和子网 ID。
- Console
-
创建 VPC (控制台)
打开位于 https://console.aws.amazon.com/vpc/ 的 Amazon VPC 控制台。
在导航窗格中,选择您的 VPC,然后选择创建 VPC。
对于要创建的资源,选择 仅 VPC。
对于 IPv4 CIDR 块,请输入10.0.0.0/16(或与您的本地网络不冲突的 CIDR)。
选择创建 VPC。
选择新创建的 VPC,选择操作,编辑 VPC 设置。同时启用 DNS 解析和 DNS 主机名,然后选择保存。
-
为 VPC 终端节点创建子网:
在导航窗格中,选择子网,然后选择创建子网。
对于 VPC ID,请选择您创建的 VPC。
对于可用区,请选择一个可用区。
对于 IPv4 子网 CIDR 块,请输入。10.0.1.0/24
选择创建子网。
- AWS CLI
-
REGION=us-east-1
# Create VPC
VPC_ID=$(aws ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--region $REGION \
--query 'Vpc.VpcId' --output text)
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-support --region $REGION
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames --region $REGION
# Create a subnet for the VPC endpoint
SUBNET_ID=$(aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.1.0/24 \
--availability-zone ${REGION}a \
--region $REGION \
--query 'Subnet.SubnetId' --output text)
echo "VPC: $VPC_ID, Subnet: $SUBNET_ID"
VPC 终端节点在您的子网中创建带有私有 IP 的弹性网络接口 (ENI)。您的本地设备通过您的 VPN 或 Direct Connect 连接访问此 IP。确保您的网络路由允许从您的设备流向子网 CIDR 的流量。
步骤 2:创建安全组
为 VPC 终端节点创建安全组,允许来自您的 VPC 的入站系统日志流量。这控制了哪些资源可以向端点发送 syslog。
- Console
-
创建安全组(控制台)
打开位于 https://console.aws.amazon.com/vpc/ 的 Amazon VPC 控制台。
在导航窗格中,选择安全组,然后选择创建安全组。
对于安全组名称,输入 syslog-vpce-sg。
对于描述,输入 Allow syslog traffic to VPC endpoint。
对于 VPC,请选择您在步骤 1 中创建或标识的 VPC。
-
在入站规则部分,选择添加规则并添加以下规则:
规则 1:类型 = 自定义 TCP,端口范围 =6514,来源 =10.0.0.0/16(您的 VPC CIDR)
规则 2:类型 = 自定义 TCP,端口范围 =1514,来源 = 10.0.0.0/16
规则 3:类型 = 自定义 UDP,端口范围 =514,来源 = 10.0.0.0/16
选择创建安全组。
- AWS CLI
-
VPCE_SG_ID=$(aws ec2 create-security-group \
--group-name syslog-vpce-sg \
--description "Allow syslog traffic to VPC endpoint" \
--vpc-id $VPC_ID \
--region $REGION \
--query 'GroupId' --output text)
# Allow TCP+TLS (port 6514), TCP plaintext (port 1514), and UDP (port 514)
aws ec2 authorize-security-group-ingress --group-id $VPCE_SG_ID \
--protocol tcp --port 6514 --cidr 10.0.0.0/16 --region $REGION
aws ec2 authorize-security-group-ingress --group-id $VPCE_SG_ID \
--protocol tcp --port 1514 --cidr 10.0.0.0/16 --region $REGION
aws ec2 authorize-security-group-ingress --group-id $VPCE_SG_ID \
--protocol udp --port 514 --cidr 10.0.0.0/16 --region $REGION
如果您只打算使用一种协议(例如,端口 6514 上的 TCP+TLS),则只需在安全组中打开该端口即可。
步骤 3:创建 VPC 端点
创建指向 syslog AWS PrivateLink 服务的接口 VPC 终端节点。这为您的 VPC 提供了一个进入 CloudWatch 日志 syslog 服务的私有入口点。
在创建终端节点时,您可以跨不同的可用区指定多个子网 ID。终端节点在每个子网中创建一个 ENI,从而提供更高的可用性,而无需为每个可用区单独的 VPC 终端节点。子网位于多个可用区的单个 VPC 终端节点就足够了。
- Console
-
创建 VPC 终端节点(控制台)
打开位于 https://console.aws.amazon.com/vpc/ 的 Amazon VPC 控制台。
在导航窗格中,选择终端节点,然后选择创建终端节点。
在名称标签中,输入终端节点的名称(例如syslog-vpce)。
对于服务类别,选择 AWS 服务。
在 “服务” 搜索字段中,输入syslog-logs并选择服务com.amazonaws.Region.syslog-logs。
对于 VPC,请选择您在步骤 1 中创建或标识的 VPC。
在子网部分,选择一个或多个可用区,然后选择要在其中创建终端节点网络接口的子网。
对于安全组,请选择您在步骤 2 (syslog-vpce-sg) 中创建的安全组。
(可选)如果您想限制允许通过终端节点的流量,请配置 VPC 终端节点策略。有关更多信息,请参阅 系统日志的 VPC 终端节点策略。
选择创建端点。
在终端节点状态更改为 “可用” 后,选择终端节点并记下 DNS 名称值。这是您的系统日志设备将发送到的地址。
- AWS CLI
-
VPCE_ID=$(aws ec2 create-vpc-endpoint \
--vpc-id $VPC_ID \
--service-name com.amazonaws.${REGION}.syslog-logs \
--vpc-endpoint-type Interface \
--subnet-ids $SUBNET_ID \
--security-group-ids $VPCE_SG_ID \
--region $REGION \
--query 'VpcEndpoint.VpcEndpointId' --output text)
echo "VPC Endpoint: $VPCE_ID"
等待终端节点变为可用(大约 60 秒),然后检索 DNS 名称:
VPCE_DNS=$(aws ec2 describe-vpc-endpoints --vpc-endpoint-ids $VPCE_ID \
--region $REGION --query 'VpcEndpoints[0].DnsEntries[0].DnsName' --output text)
echo "Endpoint DNS: $VPCE_DNS"
保存VPCE_DNS值 — 您将配置您的 syslog 设备以发送到此地址。
步骤 4:创建日志组
创建用于传送 syslog 消息的 Log CloudWatch s 日志组。您可以使用任何日志组名称。为了便于组织清晰起见,我们建议使用/syslog/前缀。
- Console
-
- AWS CLI
-
aws logs create-log-group \
--log-group-name /syslog/my-devices \
--region $REGION
您无需创建日志流。当传送第一条消息时,syslog 服务会自动创建一个名为VPCE_ID_Syslog_Region(例如vpce-0abc123def456_Syslog_us-east-1)的日志流。
步骤 5:添加资源策略
Log CloudWatch s syslog 服务使用syslog.logs.amazonaws.com服务主体写入您的日志组。您必须通过日志组的资源策略向其授予权限。该aws:SourceArn条件可确保只有来自您的特定 VPC 终端节点的流量才能写入此日志组。
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
aws logs put-resource-policy \
--policy-name syslog-ingestion \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "syslog.logs.amazonaws.com"
},
"Action": [
"logs:PutLogEvents",
"logs:CreateLogStream"
],
"Resource": "arn:aws:logs:'$REGION':'$ACCOUNT_ID':log-group:/syslog/my-devices:*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "'$ACCOUNT_ID'"
},
"ArnEquals": {
"aws:SourceArn": "arn:aws:ec2:'$REGION':'$ACCOUNT_ID':vpc-endpoint/'$VPCE_ID'"
}
}
}
]
}' \
--region $REGION
资源策略中的条件提供了以下保护:
要允许多个 VPC 终端节点写入同一个日志组,请使用带通配符的ArnLike条件运算符:
"ArnLike": {
"aws:SourceArn": "arn:aws:ec2:us-east-1:123456789012:vpc-endpoint/*"
}
步骤 6:创建系统日志配置
此步骤告知 Log CloudWatch s syslog 服务,来自您的 VPC 终端节点的流量应路由到您的日志组。如果没有此配置,来自您的终端节点的流量将被拒绝。
- Console
-
创建 syslog 配置(控制台)
打开 CloudWatch 日志控制台,网址为https://console.aws.amazon.com/cloudwatch/。
在导航窗格的 “日志管理” 下,选择 “日志组”。
选择您在步骤 4 中创建的日志组(例如/syslog/my-devices)。
在日志组详细信息中,找到 Syslog Ing estion 部分。
选择配置。
从 VPC 终端节点下拉列表中,选择您在步骤 3 中创建的 VPC 终端节点。
选择创建。
- AWS CLI
-
aws logs put-syslog-configuration \
--log-group-identifier /syslog/my-devices \
--vpc-endpoint-id $VPCE_ID \
--region $REGION
验证配置:
aws logs list-syslog-configurations \
--log-group-identifier /syslog/my-devices \
--region $REGION
您的 syslog 摄取管道现已激活。发送到 VPC 终端节点的任何 syslog 消息都将传送到/syslog/my-devices日志组。
第 7 步:验证交付和字段提取
从任何可以到达 VPC 终端节点的 EC2 主机或设备发送测试消息,然后使用 CloudWatch Log Analytics 验证消息是否已发送以及结构化字段是否正确提取。消息通常会在 10-20 秒内出现。
发送测试消息(TCP 纯文本):
echo "<134>1 $(date -u +%Y-%m-%dT%H:%M:%SZ) myhost myapp 1234 - - Hello from syslog" | \
nc $VPCE_DNS 1514
验证交付和提取的字段:
- Console
-
使用日志分析(控制台)验证传送
打开 CloudWatch 日志控制台,网址为https://console.aws.amazon.com/cloudwatch/。
在导航窗格的 “日志” 下,选择 “日志分析”。
在日志组选择器中,选择您的日志组(例如/syslog/my-devices)。
-
输入以下查询并选择运行查询:
fields @timestamp, facility, severity, hostname, appName, procId, message
| sort @timestamp desc
| limit 10
确认您的测试消息已显示,提取的字段是否填充正确。对于上面的测试消息,您应该看到 facility severity = local0、hostname = info myhost、= myapp、appName = 和 procId = 1234。
- AWS CLI
-
启动日志分析查询以验证交付和字段提取:
QUERY_ID=$(aws logs start-query \
--log-group-name /syslog/my-devices \
--start-time $(date -d '5 minutes ago' +%s 2>/dev/null || echo $(date -v-5M +%s)) \
--end-time $(date +%s) \
--query-string 'fields @timestamp, facility, severity, hostname, appName, procId, message | sort @timestamp desc | limit 10' \
--region $REGION \
--query 'queryId' --output text)
# Wait a few seconds for the query to complete, then retrieve results
aws logs get-query-results \
--query-id $QUERY_ID \
--region $REGION
确认您的测试消息已显示,提取的字段是否填充正确。对于上面的测试消息,您应该看到 facility severity = local0、hostname = info myhost、= myapp、appName = 和 procId = 1234。