소개
이 문서에서는 ASA(Adaptive Security Appliance)에서 BotNet 트래픽 필터 기능을 트러블슈팅하는 단계에 대해 설명합니다. BotNet 트래픽 필터 컨피그레이션에 대한 지원은 이 컨피그레이션 가이드: BotNet 트래픽 필터 구성을 참조하십시오.
배경 정보
BotNet 트래픽 필터는 내부 DNS 클라이언트와 외부 DNS 서버 간의 DNS(Domain Name Server) 요청 및 응답을 모니터링합니다. DNS 응답이 처리되면 응답과 연결된 도메인이 알려진 악성 도메인의 데이터베이스에 대해 확인됩니다. 일치하는 항목이 있으면 DNS 응답에 있는 IP 주소에 대한 추가 트래픽이 차단됩니다. 이 다이어그램을 참조하십시오.

- 동적 필터 데이터베이스를 확인합니다. ASA는 알려진 악성 도메인 및 IP 주소의 현재 데이터베이스를 주기적으로 다운로드합니다. Cisco의 SIO(Security Intelligence Operations)는 이 데이터베이스의 도메인 및 IP 주소가 악성코드 또는 기타 악성 콘텐츠를 제공하는지 확인합니다.
- DNS 트래픽이 ASA를 통과하는지 확인합니다. 내부 네트워크의 사용자 또는 내부 네트워크의 감염된 시스템이 악성코드를 다운로드하거나 BotNet에 참여하기 위해 악성 서버에 액세스하려고 시도합니다. 악성 서버에 연결하려면 호스트 시스템에서 DNS 조회를 수행해야 합니다. 이 예에서 시스템은 badmhost.cisco.com 액세스를 시도합니다. 호스트 시스템은 로컬 DNS 서버에 DNS 요청을 보내거나 외부 DNS 서버에 직접 전송합니다. 두 경우 모두 DNS 요청이 ASA를 통과해야 하며 DNS 응답도 동일한 ASA를 통과해야 합니다.
- DNS-snoop 캐시를 확인합니다. DNS 검사의 DNS-snoop 기능(활성화된 경우)은 DNS 트래픽을 모니터링하고 DNS 서버에서 DNS A-record 응답이 반환되었음을 확인합니다. DNS-snoop 기능은 A-Record 응답에 있는 도메인 및 IP 주소를 가져와 DNS-snoop 캐시에 추가합니다. 1단계에서 다운로드한 데이터베이스에 대해 도메인이 확인되고 일치하는 항목이 있습니다. DNS 응답은 삭제되지 않으며 통과가 허용됩니다.
- 트래픽으로 BotNet 트래픽 필터를 테스트합니다. 3단계에서 일치하는 항목이 있으므로 badmsite.cisco.com과 연결된 IP의 모든 트래픽이 삭제됨을 나타내는 내부 규칙이 ASA에 추가됩니다. 감염된 컴퓨터가 URL badmsite.cisco.com 서버에 액세스하려고 시도하면 트래픽이 삭제됩니다.
워크플로 문제 해결
이 단계를 사용하여 문제를 해결하고 기능이 작동하는지 확인합니다.
1단계: 동적 필터 데이터베이스 확인
데이터베이스가 다운로드되었는지 확인하고 show dynamic-filter data 명령을 입력합니다. 다음 샘플 출력을 참조하십시오.
# show dynamic-filter data
Dynamic Filter is using downloaded database version '1404865586'
Fetched at 21:32:02 EDT Jul 8 2014, size: 2097145
Sample contents from downloaded database:
dfgdsfgsdfg.com bulldogftp.com bnch.ru 52croftonparkroad.info
paketoptom.ru lzvideo.altervista.org avtovirag.ru cnner.mobi
Sample meta data from downloaded database:
threat-level: very-high, category: Malware,
description: "These are sources that use various exploits to deliver adware,
spyware and other malware to victim computers. Some of these are associated
with rogue online vendors and distributors of dialers which deceptively
call premium-rate phone numbers." threat-level: high, category: Bot
and Threat Networks, description: "These are rogue systems that
control infected computers. They are either systems hosted on
threat networks or systems that are part of the botnet itself
threat-level: moderate, category: Malware,
description: "These are sources that deliver deceptive or malicious anti-spyware,
anti-malware, registry cleaning, and system cleaning software."
threat-level: low, category: Ads,
description: "These are advertising networks that deliver banner ads,
interstitials, rich media ads, pop-ups, and pop-unders for websites,
spyware and adware. Some of these networks send ad-oriented HTML emails
and email verification services."
Total entries in Dynamic Filter database:
Dynamic data: 80677 domain names , 4168 IPv4 addresses
Local data: 0 domain names , 0 IPv4 addresses
Active rules in Dynamic Filter asp table:
Dynamic data: 0 domain names , 4168 IPv4 addresses
Local data: 0 domain names , 0 IPv4 addresses
이 출력에서 ASA는 마지막으로 성공한 데이터베이스 가져오기 시간과 이 데이터베이스의 콘텐츠 샘플을 나타냅니다. show dynamic-filter data 명령을 실행하면 다운로드된 데이터베이스가 없다는 명령이 표시되면 먼저 이 문제를 해결하십시오. ASA가 동적 필터 데이터베이스를 가져오지 못하게 하는 일반적인 문제는 다음과 같습니다.
- ASA에 DNS 컨피그레이션이 없거나 잘못되었습니다. 동적 필터 업데이터 클라이언트가 업데이트 서버의 호스트 이름을 확인해야 합니다. ASA에서 DNS를 구성하고 작동해야 합니다. 명령줄에서 잘 알려진 도메인을 ping하고 ASA에서 호스트 이름을 확인할 수 있는지 확인합니다.
- ASA에서 인터넷에 액세스할 수 없습니다. ASA가 인터넷에 액세스할 수 없는 네트워크에 있거나 업스트림 디바이스에서 ASA의 외부 IP 주소가 인터넷에 액세스하는 것을 차단하는 경우 업데이트가 실패합니다.
- 업데이터 클라이언트를 사용할 수 없습니다. ASA가 데이터베이스를 다운로드할 수 있도록 dynamic-filter updater-client enable 명령을 구성해야 합니다.
데이터베이스를 디버깅하려면 debug dynamic-filter updater-client 명령을 입력합니다. 다음 명령의 샘플 출력을 참조하십시오.
Dynamic Filter: Updater client fetching dataDynamic Filter: update
startingDBG:01:2902417716:7fff2c33ec28:0000: Creating fiber
0x7fff2c4dce90 [ipe_request_fiber], stack(16384) =
0x7fff2c505c60..0x7fff2c509c58 (fc=2),
sys 0x7fff20906038 (FIBERS/fibers.c:fiber_create:544)
DBG:02:2902417779:7fff2c4dce90:0000: Jumpstarting ipe_request_fiber 0x7fff2c4dce90,
sys 0x7fff2c33eba0 (FIBERS/fibers-jumpstart.c:_fiber_jumpstart:36)
Dynamic Filter: Created lua machine, launching lua script
DBG:03:2902422654:7fff2c4dce90:0000: Connecting to 00000000:1591947792
(SAL/netsal.c:netsal_client_sock_connect:323)
DBG:04:2902422667:7fff2c4dce90:0000: otherPifNum 3, nexthop4 17c12ac
(SAL/netsal.c:netsal_client_sock_connect:374)
DBG:05:2902422691:7fff2c4dce90:0000: about to call netsal__safe_encapsulate for
(sal-np/ssl/CONNECT/3/208.90.58.5/443/M/0/NOTUNGW)
(SAL/netsal.c:netsal_client_sock_connect:446)
DBG:06:2902422920:7fff2c4dce90:0000: connection timeout set for 10 seconds
(SAL/netsal.c:netsal_client_sock_connect:473)
DBG:07:2902750615:7fff2c4dce90:0000: SALNPCLOSENOTIFY: p=0x0 0/0 more buffered
(SAL/channel-np.c:_sal_np_ioctl:1312)
Dynamic Filter: Processing updater server response
Dynamic Filter: update file url1 =
http://updates.ironport.com/threatcast/1.0/blacklist/2mb-1file/1404865586
Dynamic Filter: update file url2 =
http://updates.ironport.com/threatcast/1.0/blacklist/2mb-1file/1404865586
Channel NP p=0x0000000000000000 0/0 more bufferedchannel-np.cDBG:08:2902784011:
7fff2c4dce90:0000: Connecting to 00000000:538976288
(SAL/netsal.c:netsal_client_sock_connect:323)
DBG:09:2902784026:7fff2c4dce90:0000: otherPifNum 3, nexthop4 17c12ac
(SAL/netsal.c:netsal_client_sock_connect:374)
DBG:10:2902784051:7fff2c4dce90:0000: about to call netsal__safe_encapsulate for
(sal-np/tcp/CONNECT/3/208.90.58.25/80/M/0/NOTUNGW)
(SAL/netsal.c:netsal_client_sock_connect:446)
DBG:11:2902784241:7fff2c4dce90:0000: connection timeout set for 10 seconds
(SAL/netsal.c:netsal_client_sock_connect:473)
DBG:12:2902914651:7fff2c4dce90:0000: SALNPCLOSENOTIFY: p=0x0 0/0 more buffered
(SAL/channel-np.c:_sal_np_ioctl:1312)
DBG:13:2902914858:7fff2c4dce90:0000: Connecting to 00000000:25465757
(SAL/netsal.c:netsal_client_sock_connect:323)
DBG:14:2902914888:7fff2c4dce90:0000: otherPifNum 3, nexthop4 17c12ac
(SAL/netsal.c:netsal_client_sock_connect:374)
DBG:15:2902914912:7fff2c4dce90:0000: about to call netsal__safe_encapsulate for
(sal-np/tcp/CONNECT/3/208.90.58.25/80/M/0/NOTUNGW)
(SAL/netsal.c:netsal_client_sock_connect:446)
DBG:16:2902915113:7fff2c4dce90:0000: connection timeout set for 10 seconds
(SAL/netsal.c:netsal_client_sock_connect:473)
Channel NP p=0x0000000000000000 0/0 more bufferedchannel-np.cDBG:17:2907804137:
7fff2c4dce90:0000: SALNPCLOSENOTIFY: p=0x0 0/0 more buffered
(SAL/channel-np.c:_sal_np_ioctl:1312)
Dynamic Filter: Successfully downloaded the update file from url1
Dynamic Filter: Successfully finished lua script
DBG:18:2907804722:7fff2c4dce90:0000: Fiber 0x7fff2c4dce90 finished leaving 3 more
(FIBERS/fibers-jumpstart.c:_fiber_jumpstart:64)
DBG:19:2907804746:7fff2c4dce90:0000: Exiting fiber 0x7fff2c4dce90
(FIBERS/fibers.c:fiber__kill:1287)
DBG:20:2907804752:7fff2c4dce90:0000: Fiber 0x7fff2c4dce90 terminated, 2 more
(FIBERS/fibers.c:fiber__kill:1358)
Dynamic Filter: Downloaded file successfully
Channel NP p=0x0000000000000000 0/0 more bufferedchannel-np.cDynamic Filter: read
ramfs bytes 2097152
Dynamic Filter: file MD5 verification check succeeded
Dynamic Filter: decrypt key succeeded
Dynamic Filter: decrypt file succeeded byte = 2097145
Dynamic Filter: updating engine bytes = 2097145
Dynamic Filter: meta data length = 2987
INFO: Dynamic Filter: update succeeded
이 출력에서는 업데이터가 새 데이터베이스를 가져올 때 수행하는 다음 단계를 확인할 수 있습니다.
- 업데이터는 다운로드할 데이터베이스를 확인하기 위해 URL http://update-manifests.ironport.com에 도달합니다.
- 매니페스트 서버는 다운로드에 사용할 수 있는 두 개의 URL을 반환합니다.
- 업데이터 클라이언트가 데이터베이스를 다운로드합니다.
- 데이터베이스는 동적 필터 프로세스에서 사용할 수 있도록 해독되고 메모리에 저장됩니다.
이 출력의 오류로 인해 다른 업데이트 서버에 대한 연결 문제가 발생하여 더 많은 문제를 해결하는 데 도움이 됩니다. updater 클라이언트가 dynamic-filter 데이터베이스 fetch 명령을 사용하여 수동으로 실행되도록 합니다.
2단계: DNS 트래픽이 이 ASA를 통과하는지 확인
ASA의 BotNet 트래픽 필터 기능은 도메인과 일치하는 IP 주소를 기반으로 하므로 ASA는 네트워크를 통과하는 DNS 요청 및 응답과 연계되어야 합니다. 일부 토폴로지는 DNS 트래픽이 문제의 ASA를 포함하지 않는 경로를 사용하게 할 수 있습니다. 대부분의 네트워크에는 내부 사용자를 위한 DNS 전달자 및 캐시 역할을 하는 내부 DNS 서버가 있습니다. 이러한 서버가 소유하지 않거나 응답할 수 없는 도메인에 대한 DNS 요청을 전달할 경우 ASA를 통과해야 하는 서버로 요청을 전달하면 아무 문제가 발생하지 않습니다. 내부 DNS 서버를 사용하거나 사용하지 않는 이러한 토폴로지를 확인하십시오.
이 샘플 토폴로지는 외부 DNS 서버로 전달되는 내부 DNS 서버를 가리키는 사용자를 보여줍니다.

이 샘플 토폴로지는 외부 DNS 서버를 직접 가리키는 사용자를 보여줍니다.

두 가지 토폴로지 예에서 기능적 BotNet 트래픽 필터 구축의 핵심은 외부 도메인에 대한 DNS A-record 요청이 DNS-snoop 기능을 실행하는 ASA를 통과해야 한다는 것입니다. 내부 서버 예에서 내부 DNS 서버가 사용자 시스템과 인터넷에 연결하기 위해 다른 네트워크 경로를 사용하며 이 프로세스에서 ASA를 통과하지 않으면 DNS-snoop 테이블에는 사용자 머신 DNS 요청으로 인해 발생한 IP-도메인 맵이 포함되지 않으며 사용자 시스템이 예상대로 필터링되지 않을 수 있습니다.
DNS 트래픽이 ASA를 통과하는지 확인하려면 다음 방법을 사용합니다.
- service-policy를 확인합니다. DNS 검사가 적용되는지 확인하고 dynamic-filter-snoop 키워드로 구성하며 트래픽을 확인할 수 있도록 show service-policy의 출력을 확인합니다. DNS 검사와 연결된 패킷 수는 DNS 요청을 할 때 증가해야 합니다.
- 캡처를 사용합니다. DNS-snoop 기능은 ASA를 통과하는 DNS 패킷을 조사하므로 패킷이 ASA에 도달하는지 확인하는 것이 중요합니다. DNS 트래픽이 이 ASA로 들어오고 나가도록 하려면 ASA의 내장형 캡처 기능을 사용합니다.
3단계: DNS Snoop 캐시 확인
DNS-snoop 현금은 IP-to-domain 맵으로 채워야 합니다. 단일 IP 주소에는 연결된 도메인이 무한대로 포함될 수 있습니다. 이는 웹 사이트를 호스팅하는 기업이 몇 개의 IP 주소로 수천 개의 도메인을 제공할 수 있는 방법입니다. show dynamic-filter dns-snoop detail 명령을 입력하고 현재 DNS-snoop 캐시에 있는 데이터의 덤프를 확인합니다. DNS 검사의 DNS-snoop 기능을 사용하여 ASA가 얻는 모든 IP-도메인 맵의 레코드입니다. 다음 샘플 출력을 참조하십시오.
DNS Reverse Cache Summary Information: 3 addresses, 3 names
Next housekeeping scheduled at 22:28:01 EDT Jul 8 2014,
DNS reverse Cache Information:
[198.151.100.77] flags=0x1, type=0, unit=0 b:u:w=0:1:0, cookie=0x0
[cisco.com] type=0, ttl=31240
[198.151.100.91] flags=0x23, type=0, unit=0 b:u:w=1:1:0, cookie=0x0
[magnus.cisco.com] type=1, ttl=0
[raleigh.cisco.com] type=0, ttl=0
[198.151.100.1] flags=0x2, type=0, unit=0 b:u:w=1:0:0, cookie=0x0
[badsite.cisco.com] type=1, ttl=0
이 예에서 ASA는 3개의 IP 주소에 대한 정보를 학습하지만 4개의 도메인에 대한 정보를 학습합니다. magnus.cisco.com과 raleigh.cisco.com 모두 198.151.100.91으로 확인됩니다. 이 예에서는 두 도메인(magnus.cisco.com 및 badsite.cisco.com 목록)을 유형 1로 찾습니다. 이는 도메인이 데이터베이스에 블랙리스트 도메인으로 검색됨을 의미합니다. 다른 도메인은 유형 0으로 나열됩니다. 즉, 도메인이 블랙리스트 또는 화이트리스트에 포함되지 않으며 일반 도메인일 뿐입니다.
- 사용자 시스템의 DNS 요청이 방화벽을 통과하여 DNS-snoop에서 처리되고 DNS 요청을 수행하는지 확인합니다. 일치하는 항목이 있는지 캐시를 확인합니다. 확인되지만 이해하기 어려우므로 최근에 쿼리되지 않았고 이미 테이블에 있는 도메인을 테스트하고 사용합니다. 예를 들어 도메인 asa.cisco.com이 선택됩니다. 명령줄 도구 nslookup 은 해당 호스트 이름을 쿼리하는 데 사용됩니다. 다음 예를 참조하십시오.
$ nslookup asa.cisco.com
Name: asa.cisco.com
Address: 198.151.100.64
- DNS-snoop 캐시를 확인합니다. 다음 예를 참조하십시오.
DNS Reverse Cache Summary Information: 5 addresses, 7 names
Next housekeeping scheduled at 22:48:01 EDT Jul 8 2014,
DNS reverse Cache Information:
[198.151.100.64] flags=0x11, type=0, unit=0 b:u:w=0:1:0, cookie=0x0
[asa.cisco.com] type=0, ttl=86359
DNS-snoop 캐시에 항목이 있습니다. nslookup 테스트 전에 항목이 없으면 DNS-snoop 기능이 작동하며 ASA가 DNS 요청 및 응답에서 올바르게 작동함을 의미합니다.
항목이 표시되지 않으면 DNS 트래픽이 ASA를 통과하는지 확인합니다. 요청이 캐시에서 처리되지 않도록 하려면 호스트 시스템 또는 내부 DNS 서버의 DNS 캐시를 플러시해야 할 수 있습니다(해당하는 경우).
DNS-snoop 기능은 EDNS0을 지원하지 않습니다. DNS 클라이언트 또는 서버가 EDNS0을 사용하는 경우 응답에 추가 리소스 레코드가 있는 경우 DNS-snoop 캐시를 IP-to-domain 맵으로 채우지 않을 수 있습니다. 이 제한은 Cisco 버그 ID CSCta36873에 의해 추적됩니다.
4단계: 트래픽을 사용하여 BotNet 트래픽 필터 테스트
3단계에서 DNS-snoop 캐시는 도메인 badmhost.cisco.com이 블랙리스트에 있음을 표시합니다. 봇넷 기능을 테스트하기 위해 문제의 도메인을 ping합니다. 도메인을 ping할 때 웹 브라우저에서 도메인을 로드하려고 시도하는 것보다 안전합니다. 브라우저에서 악성 콘텐츠를 로드하면 컴퓨터가 손상될 수 있으므로 웹 브라우저를 사용하여 동적 필터 기능을 테스트하지 마십시오. ICMP(Internet Control Message Protocol)는 안전한 방법이며 IP를 기반으로 차단하며 포트 또는 프로토콜에 특정한 것이 아니므로 BotNet 트래픽 필터의 유효한 테스트이므로 사용합니다.
블랙리스트 사이트를 모르는 경우 쉽게 찾을 수 있습니다. dynamic-filter database find <search_term> 명령을 입력하여 블랙리스트에 추가된 도메인을 찾고 제공된 검색 조건과 일치시킵니다. 다음 예를 참조하십시오.
ASA# dynamic-filter database find cisco verybadsite.cisco.com
m=44098 acmevirus.cisco.com m=44098Found more than 2 matches,
enter a more specific string to find an exact match
반환하는 도메인 중 하나를 ping합니다. 이 도메인을 ping하면 다음 작업이 발생합니다.
- 호스트가 해당 도메인에 대한 DNS 요청을 생성합니다.
- DNS 요청은 호스트 시스템에서 직접 또는 내부 서버에서 ASA를 통과합니다.
- DNS 응답은 ASA를 통과하며, 호스트 시스템 또는 내부 서버로 돌아갑니다.
- DNS-snoop 기능은 DNS-snoop 캐시에서 이 IP-to-domain 맵을 채웁니다.
- ASA는 도메인을 동적 필터 데이터베이스와 비교하고 일치를 결정합니다. ASA는 악성 도메인과 연결된 IP에서 추가 인바운드 및 아웃바운드 트래픽을 차단합니다.
- 호스트 시스템은 ASA가 악성 도메인과 연결된 IP로 이동되기 때문에 삭제되는 ICMP 에코 요청을 보냅니다.
ASA가 ICMP 테스트 트래픽을 삭제하면 다음 예와 유사한 시스템 로그(syslog)를 로깅합니다.
Jul 08 2014 23:14:17: %ASA-4-338006: Dynamic Filter dropped blacklisted
ICMP traffic from inside:192.168.1.100/23599 (203.0.113.99/23599) to
outside:198.151.100.72/0 (198.151.100.72/0), destination 198.151.100.72
resolved from dynamic list: acmevirus.cisco.com, threat-level: very-high,
category: Malware
show dynamic-filter statistics 명령의 출력은 분류되고 삭제될 수 있는 연결을 나타냅니다. 다음 예를 참조하십시오.
ASA(config)# show dynamic-filter statistics
Enabled on interface inside
Total conns classified 163, ingress 163, egress 0
Total whitelist classified 0, ingress 0, egress 0
Total greylist classified 8, dropped 0, ingress 8, egress 0
Total blacklist classified 155, dropped 154, ingress 155, egress 0
Enabled on interface outside
Total conns classified 0, ingress 0, egress 0
Total whitelist classified 0, ingress 0, egress 0
Total greylist classified 0, dropped 0, ingress 0, egress 0
Total blacklist classified 0, dropped 0, ingress 0, egress 0
Enabled on interface management
Total conns classified 0, ingress 0, egress 0
Total whitelist classified 0, ingress 0, egress 0
Total greylist classified 0, dropped 0, ingress 0, egress 0
Total blacklist classified 0, dropped 0, ingress 0, egress 0
블랙리스트, 화이트리스트 또는 그레이리스트 IP 주소에 대한 연결을 시도한 경우에만 분류된 카운터가 증가합니다. 다른 모든 트래픽은 분류된 카운터가 증가하지 않습니다. 분류된 목록의 숫자가 낮다고 해서 ASA가 BotNet 트래픽 필터에 대한 새 연결 시도를 평가하지 않았음을 의미하지는 않습니다. 대신 이 낮은 숫자는 소수의 소스 또는 목적지 IP 주소가 블랙리스트, 화이트리스트 또는 그레이리스트 처리됨을 나타냅니다. 이 문서의 지침을 사용하여 기능이 제대로 작동하는지 확인합니다.
테스트 트래픽이 삭제되지 않으면 컨피그레이션을 확인하여 적절한 위협 레벨의 트래픽을 삭제하도록 구성되어 있는지 확인합니다. ASA에서 전역적으로 BotNet 트래픽 필터를 활성화하는 이 샘플 컨피그레이션을 참조하십시오.
dynamic-filter updater-client enable
dynamic-filter use-database
dynamic-filter enable
dynamic-filter drop blacklist