跳至内容

如何查找在我的日志中但不在我的 Amazon VPC 中的 IP 地址?

6 分钟阅读
0

我想查找一个 IP 地址,它在我的日志中,但不在我的 Amazon Virtual Private Cloud (Amazon VPC) 中。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

查看 CloudTrail 事件

要使用 AWS CloudTrail 事件查找您的 IP 地址,请完成以下步骤:

要使用 AllocateAddress 事件检查您是否向 AWS 账户分配了弹性 IP 地址,请运行以下 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=AllocateAddress \
--start-time example-yyyy-mm-dd \
--query 'Events[].Resources[?ResourceName == 'example-eip-address'].{ResourceType:ResourceType,IP:ResourceName}[]' --output table

**注意:**将 example-eip-address 替换为您的弹性 IP 地址,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的 AWS 区域。前面的 CloudTrail 命令中未列出 Amazon Elastic Compute Cloud (Amazon EC2) 公共 IPv4 地址。

要使用 AssociateAddress 事件和 AllocationID 筛选器来查看使用弹性 IP 地址的服务,请运行以下 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=ResourceName,AttributeValue=example-allocation-id \
--start-time example-yyyy-mm-dd \

**注意:**将 example-allocation-id 替换为您的弹性 IP 地址 ID,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。前面的命令显示了弹性 IP 地址分配的完整历史记录。它根据您选择的日期从最晚到最早的分配开始。

要使用 CreateNetworkInterface 事件来检查您是否为弹性网络接口分配了私有 IP 地址,请运行 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=CreateNetworkInterface \
--start-time example-yyyy-mm-dd \
--query 'Events[].CloudTrailEvent' --output text | jq -r "select(.responseElements.networkInterface.privateIpAddressesSet.item[].privateIpAddress == \"example-private-ip-address\")"

**注意:**将 example-private-ip-address 替换为您的私有 IP 地址,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。如果前面的命令没有返回匹配的事件,则您不会得到输出。

要使用 AttachNetworkInterface 事件来检查资源过去是否使用过网络接口,请运行以下 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=AttachNetworkInterface \
--start-time example-yyyy-mm-dd \
--query 'Events[].CloudTrailEvent' --output text | jq -r "select(.requestParameters.networkInterfaceId == \"example-eni-id\")"

**注意:**将 example-eni-id 替换为您的网络接口 ID,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。

要检查 CloudTrail 能否找到这些事件,请在没有 jq 筛选器的情况下运行以下 lookup-events 命令:

aws cloudtrail lookup-events \
--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=CreateNetworkInterface \
--start-time example-yyyy-mm-dd

**注意:**将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。

要使用 RunInstances 事件检查您在实例启动时是否将私有 IP 地址与实例相关联,请运行以下 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances \
--start-time example-yyyy-mm-dd \
--query 'Events[].CloudTrailEvent' --output text | jq -r "select(.responseElements.instancesSet.items[].privateIpAddress == \"example-private-ip-address\") | [.responseElements.instancesSet.items[].networkInterfaceSet.items[]] "

**注意:**将 example-private-ip-address 替换为您的私有 IP 地址,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。

要使用 AssignPrivateIpAddresses 事件来检查您是否将私有 IP 地址与网络接口相关联,请运行以下 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=AssignPrivateIpAddresses \
--start-time example-yyyy-mm-dd \
--query 'Events[].CloudTrailEvent' --output text | jq -r "select(.responseElements.assignedPrivateIpAddressesSet.assignedPrivateIpAddressSetType[].privateIpAddress == \"example-private-ip-address\" ) | {requestParameters,responseElements}"

**注意:**将 example-private-ip-address 替换为您的私有 IP 地址,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。

要使用 AssignIpv6Addresses 事件来检查您是否将 IPv6 地址分配给了指定的网络接口,请运行以下 lookup-events 命令:

aws cloudtrail lookup-events \--region example-region \
--lookup-attributes AttributeKey=EventName,AttributeValue=AssignIpv6Addresses \
--start-time example-yyyy-mm-dd \
--query 'Events[].CloudTrailEvent' --output text | jq -r "select(.responseElements.AssignIpv6AddressesResponse.assignedIpv6Addresses.item == \"example-IPv6-address\") | [.responseElements.AssignIpv6AddressesResponse] "

**注意:**将 example-IPv6-address 替换为您的 IPv6 地址,将 example-yyyy-mm-dd 替换为您的开始日期,将 example-region 替换为您的区域。

使用 CloudWatch Logs 分析您的日志数据

**注意:**要向 Amazon CloudWatch Logs 发送日志事件,请配置您的跟踪。有关详细信息,请参阅使用 Amazon CloudWatch Logs 监控 CloudTrail 日志文件

检查是否为您的账户分配了 IPv4 地址

要查看过去的弹性 IP 地址分配和使用公共 IP 地址的服务,请使用以下事件:

fields      eventTime as Time,
     userIdentity.accountId as AccountID,
     userIdentity.principalId as Principal,
     awsRegion as Region,
     eventName as Action,
     requestParameters.allocationId as AssociateAddress_AllocationID,
     requestParameters.instanceId as InstanceID,
     requestParameters.privateIpAddress as PrivateIP,
     responseElements.allocationId as AllocateAddress_AllocationID,
     responseElements.publicIp as EIP
| filter

     eventName = "AllocateAddress" or
     eventName = "AssociateAddress" and
     # AssociateAddress does not indicate resources outside EC2 instances.
     (
          EIP = "example-public-ip-addresses" or
          AssociateAddress_AllocationID = "example-allocation-id"
     )
| sort @timestamp desc

**注意:**将 example public ip-addresses 替换为您的公共 IP 地址,将 example-allocation-id 替换为您的分配 ID。

要查找先前的私有 IP 地址分配,请使用以下事件:

CreateNetworkInterface 事件:

parse @message '"privateIpAddressesSet":{"item":[{"privateIpAddress":"*"' as PrivateIP| fields
eventTime as Time,
userIdentity.accountId as AccountID,
userIdentity.principalId as Principal,
awsRegion as Region,
eventName as Action,
responseElements.networkInterface.networkInterfaceId as ENI
| filter
eventName = "CreateNetworkInterface" and
(
PrivateIP = "example-private-ip-addresses"
)
| sort @timestamp desc

**注意:**将 example-private-ip-addresses 替换为您的 IP 地址。

RunInstances 事件:

parse @message '{"privateIpAddress":"*"' as PrivateIP|fields
     eventTime as Time,
     userIdentity.accountId as AccountID,
     userIdentity.principalId as Principal,
     awsRegion as Region,
     eventName as Action
| filter
     eventName = "RunInstances" and
     (
          PrivateIP = "example-private-ip-addresses"
     )
| sort @timestamp desc

**注意:**将 example-private-ip-addresses 替换为您的 IP 地址。

AssignPrivateIpAddress 事件:

parse @message '"assignedPrivateIpAddressSetType":[{*}]' as PrivateIpAddress| fields
     eventTime as Time,
     userIdentity.accountId as AccountID,
     userIdentity.principalId as Principal,
     awsRegion as Region,
     eventName as Action
| filter
     eventName = "AssignPrivateIpAddresses" and
     (
          PrivateIpAddress like "example-private-ip-addresses"
     )
| sort @timestamp desc

Note: Replace example-private-ip-addresses with your IP

**注意:**将 example-private-ip-addresses 替换为您的 IP 地址。

查看使用网络接口的资源:

fields      eventTime as Time,
     userIdentity.accountId as AccountID,
     userIdentity.principalId as Principal,
     awsRegion as Region,
     eventName as Action,
     requestParameters.instanceId as InstanceID,
     requestParameters.networkInterfaceId as ENI
| filter
     eventName = "AttachNetworkInterface" and
     (
          ENI = "example-eni-id"
     )
| sort @timestamp desc

**注意:**将 example-eni-id 替换为您的网络接口 ID。

检查是否为您的账户分配了 IPv6 地址

要查找先前的私有 IP 地址分配,请使用以下事件:

AssignIpv6Addresses 事件:

fields    eventTime as Time,
    userIdentity.accountId as AccountID,
    userIdentity.principalId as Principal,
    awsRegion as Region,
    eventName as Action,
    responseElements.AssignIpv6AddressesResponse.assignedIpv6Addresses.item as IPv6
| filter
    eventName = "AssignIpv6Addresses" and
    (
        IPv6 = "example-ipv6-addresses"
    )
| sort @timestamp desc

**注意:**将 example-ipv6-addresses 替换为您的 IP 地址。

RunInstances 事件:

fields    eventTime as Time,
    userIdentity.accountId as AccountID,
    userIdentity.principalId as Principal,
    awsRegion as Region,
    eventName as Action,
    responseElements.AssignIpv6AddressesResponse.assignedIpv6Addresses.item as IPv6
| filter
    eventName = "RunInstances" and
    (
        PrivateIP = "example-private-ip-addresses"
    )
| sort @timestamp desc

**注意:**将 example-private-ip-addresses 替换为您的 IP 地址。

CreateNetworkInterface 事件:

parse @message '"ipv6AddressesSet":{"items":[{"ipv6Address":"*"' as IPv6| fields
     eventTime as Time,
     userIdentity.accountId as AccountID,
     userIdentity.principalId as Principal,
     awsRegion as Region,
     eventName as Action,
     responseElements.instancesSet.items.0.instanceId as InstanceID
| filter
     eventName = "CreateNetworkInterface" and
     (
         IPv6 = "example-ipv6-addresses"
     )
| sort @timestamp desc

**注意:**将 example-ipv6-addresses 替换为您的 IP 地址。

查看使用网络接口的资源:

fields      eventTime as Time,
     userIdentity.accountId as AccountID,
     userIdentity.principalId as Principal,
     awsRegion as Region,
     eventName as Action,
     requestParameters.instanceId as InstanceID,
     requestParameters.networkInterfaceId as ENI
| filter
     eventName = "AttachNetworkInterface" and
     (
         ENI = "example-eni-id" or
     )
| sort @timestamp desc

**注意:**将 example-eni-id 替换为您的网络接口 ID。

(可选)要检查公共 IP 地址的 BGP 前缀ASN 是否为 AWS IP 地址,请运行以下 whois 命令:

whois -h whois.cymru.com " -v example-public-ip-address"

**注意:**将 example-public-ip-address 替换为您的公共 IP 地址。

查看 IP 地址历史记录

您可以使用 ip-ranges.json 文件、Amazon VPC IP 地址管理器 (IPAM) 或 AWS CLI 在您的 IP 地址历史记录中查找 IP 地址。

ip-ranges.json

完成以下步骤:

  1. 要查看属于 AWS 服务的所有公共 IP 地址的列表,请查看 ip-ranges.json 文件。
  2. 要筛选列表,请使用以下变量:
    "ip_prefix"
    "region"
    "service"

IPAM

要使用 IPAM 跟踪一段时间内使用特定 IP 地址的 VPC 或资源,请完成以下步骤:

  1. 打开 IPAM 控制台
  2. 在导航窗格中,选择 Search IP history(搜索 IP 历史记录)。
  3. 输入您的 IP 地址。
  4. 选择 Search(搜索)。

搜索结果显示以下项目:

  • 与 IP 地址关联的 VPC 或网络接口
  • 分配 IP 地址的时间范围
  • 相关资源

AWS CLI

要使用 AWS CLI 获取 IP 地址信息,请运行以下 get-ipam-address-history 命令:

aws ec2 get-ipam-address-history \
 --ipam-scope-id ipam-scope-###### \
 --cidr 10.0.1.5 \
 --region us-east-1

**注意:**如果您使用 AWS Organizations,则可以在组织级别扩展对 IP 地址的搜索范围,以集中跟踪多个成员账户。

指定 IPAM 管理员账户

完成以下步骤:

  1. 在您的组织中,选择一个 AWS 账户作为管理账户
  2. 要将您的账户 ID 设为组织的 IPAM 管理员,请在您的管理账户中运行以下 enable-aws-service-access 命令:
    aws organizations enable-aws-service-access \
     --service-principal ipam.amazonaws.comaws ec2 enable-ipam-organization-admin-account \
     --delegated-admin-account-id YOUR_ACCOUNT_ID

**注意:**请将 YOUR_ACCOUNT_ID 替换为您的 AWS 账户 ID。

在管理员帐户中创建 IPAM

在您的 IPAM 管理员账户中完成以下步骤:

  1. 要创建 IPAM,请运行以下 create-ipam 命令:

    aws ec2 create-ipam \
     --description "Org-wide IPAM" \
     --operating-regions RegionName=us-east-1 RegionName=us-west-2

    **注意:**将 us-east-1us-west-2 替换为您的区域。

    此 IPAM 现在可以收集和管理多个账户的 CIDR 使用情况。

  2. 要创建资源发现,请运行以下 create-ipam-resource-discovery 命令:

    aws ec2 create-ipam-resource-discovery \
    --description "Org-wide Discovery" \
    --operating-regions RegionName=us-east-1 \
    --tag-specifications ResourceType=ipam-resource-discovery,Tags=[{Key=Org,Value=Enabled}]

    **注意:**请将 us-east-1 替换为您的区域。

  3. 要将资源发现与 IPAM 相关联,请运行以下 associate-ipam-resource-discovery 命令:

    aws ec2 associate-ipam-resource-discovery \
     --ipam-id ipam-######## \
     --ipam-resource-discovery-id ipam-res-disco-####

您可以与其他账户共享资源发现

**注意:**组织中的每个成员账户都必须与 IPAM 共享资源数据。如果您使用同一个组织并设置了集中式发现,则资源数据将自动共享。使用 IPAM 控制面板监控发现的资源,例如 VPC 和 IP 地址。

重要事项:

  • 您在组织中的任何账户或 VPC 中分配的所有 IP 地址都会显示在 IPAM 的 IP 地址历史记录中。
  • 您可以使用 IPAM 控制台或 AWS CLI 查询 IP 地址过去的使用情况。
  • 如果 IPAM 历史记录中的 IP 地址来自 AWS 且存在恶意活动,请报告 AWS 资源滥用情况
AWS 官方已更新 5 个月前