불법 로그인 시도 차단을 위한 fail2ban

Apache, SSL, SSH, telnet, ftp, webmin과 같이 로그인이 필요한 다양한 응용프로그램에 대해서

불법적인 로그인을 시도하면 이를 자동으로 감지해서 자동으로 차단시켜준다.

iptable을 이용하기 때문에 커널을 직접 빌드할 때는 Socket Filtering이 활성화되어 있어야 한다.

이와 같은 구현을 성능상의 문제로 커널단에서 직접 구현해서 최적화하는 경우도 있지만

범용성 보다는 프로토타입 형태인 경우가 많다.
(시도해보고 싶은 분들은 SSH 로그인시도, DoS 공격 시도 같은 것을 탐지해서 차단하는 기능을
커널단에서 직접 구현해보면 된다. 한 가지만 골라서 하는 것이 좋다)

fail2ban은 정규식을 이용한다. 정규식은 학습이 필요하지만 필터를 만들 필요가 있다면 그때가서 사용하고,

기본으로 대부분의 것들을 지원하니 공부하지 말자.

apt-get install fail2ban

한 방이면 된다. 데몬으로 실행되면서 설정까지 끝난다

/etc/fail2ban/jail.conf

에 보면 maxretry 3인데 5로 늘려서, 최대 5번 정도는 봐주자.

bantime은 시도횟수를 초과하면 600초 동안 금지한다. 좀 가혹하게 하고 싶다면 3600으로 설정해서

한시간 동안 접근금지 시키자.

jail.conf에 보면

[ssh]

enabled = true
port  = ssh,sftp
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 6

[apache]

enabled = false
port  = http,https
filter  = apache-auth
logpath = /var/log/apache*/*access.log
maxretry = 6

# default action is now multiport, so apache-multiport jail was left
# for compatibility with previous (<0.7.6-2) releases
[apache-multiport]

enabled   = false
port    = http,https
filter    = apache-auth
logpath   = /var/log/apache*/*access.log
maxretry  = 6

[apache-noscript]

enabled = false
port    = http,https
filter  = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 6

이렇게 되어 있는데, 각각의 섹션은 [section]으로 되어 있다.

ssh와 apache에도 적용하고 싶다면 enabled = true로 전부 바꿔주자.

출처 : http://www.jiny.kr/jiny/253

psad 설정

 모든 psad 데몬은 /etc/psad 에 잇는 파일 psad.conf 를 참조하며, 이 파일은 간단한 규약을 따른다. 주석은 # 기호로 시작하며 설정 매개변수는 키-값 형식으로 명시한다. 예를 들어 psad.conf 의 HOSTNAME 변수는 psad 가 설치된 시스템의 호스트 명을 정의한다.

 ### Machine hostname
HOSTNAME                    Ultra60.kongju.ac.kr;

 모든 설정 변수 값은 값을 의미하는 문자열의 끝을 나타내기 위해 세미콜론으로 끝나야 한다. 그러므로 다음과 같이 문서화를 위해 세미콜론 다음에 주석을 포함시킬 수 있다.

SCAN_TIMEOUT                3600;  ### seconds

 끝으로 psad 변수 값은 psad 가 설정을 구문 분석할 때 확장되는 하위 변수를 포함할 수 있다. 예를 들어 psad 의 주요 로깅 디렉토리는 PSAD_DIR 변수가 정의하며, 기본적으로 /var/log/psad 로 설정된다. 다른 설정 변수는 $PSAD_DIR 변수를 참조할 수 있다.

 * /etc/psad/psad.conf

 psad.conf 파일은 psad의 주요 설정 파일로 psad 동작의 다양한 면을 제어하기 위한 100개 이상의 설정 변수를 포함한다.

 * http://www.cipherdyne.org/psad/docs/index.html 에서 자세한 설명을 볼 수 있다.

 – EMAIL_ADDRESSES
 EMAIL_ADDRESSES 변수는 psad 가 스캔 경고, 정보 메시지, 기타 공지를 전송할 메일 주소를 정의한다. 콤마을 사용해서 여러 개의 메일 주소를 함께 나타낼 수도 있다.

EMAIL_ADDRESSES             root@localhost;

 – DANGER_LEVEL{n}
 psad 는 경고에 우선순위를 두기 위해 악의적인 모든 활동을 위험 수준에 따라 나눈다. 위험 수준은 1에서 5까지(5가 가장 안 좋은 것)이며, 공격이나 스캔이 탐지된 각 IP 주소에 할당된다. 위험 수준 값은 스캔의 특성(패킷 수, 포트 범위, 시간 간격), 특정 패킷이 /etc/psad/signatures 파일에 정의된 서명과 일치하는지 여부, 패킷이 /etc/psad/auto_dl 파일에 있는 IP 나 네트워크로부터 시작됐는지 여부와 같은 세 가지 요소에 기반해 할당된다.

 포트 스캔의 경우 스캔의 패킷 수에 따라 DANGER_LEVEL{n} 변수 값이 달라지며, psad.conf 파일에 다음과 같이 정의돼 있다.

DANGER_LEVEL1               5;    ### Number of packets.
DANGER_LEVEL2               15;
DANGER_LEVEL3               150;
DANGER_LEVEL4               1500;
DANGER_LEVEL5               10000;

 – HOME_NET
 psad 는 의심스러운 네트워크 트래픽을 탐지하기 위해 수정된 스노트 규칙을 사용하기 때문에 psad.conf 파일에서 psad 가 사용하는 변수는 스노트가 사용하는 변수와 유사하다. HOME_NET 변수는 실행 중인 psad 가 설치된 시스템의 로컬 네트워크를 정의한다. 그러나 psad 와 스노트가 HOME_NET 변수를 처리하는 데에는 한가지 차이점이 있다. psad 는 INPUT 체인에 기록된 모든 패킷의 목적지를 출발지 주소와 무관하게 홈 네트워크로 취급한다. 이는 패킷이 iptables 방화벽 자체에서 라우팅됐기 때문이다. ENABLE_INTF_LOCAL_NETS 변수를 N 으로 설정해서 이러한 동작을 재정의할 수 있다. 이 경우 홈 네트워크를 다음과 같이 정의할 수 있다.

### HOME_NET                192.168.10.4/24;
### HOME_NET                10.1.1.0/24, 192.168.10.4/24;
### HOME_NET                NOT_USED;  ### only one interface on box
HOME_NET                    _CHANGEME_;

 – EXTERNAL_NET
 EXTERNAL_NET 변수는 외부 네트워크를 정의한다. 기본 값은 any 지만 HOME_NET 변수처럼 임의의 네트워크 목록으로 설정할 수 있다. 대부분의 경우 기본 값이 가장 좋은 것이다.

 – SYSLOG_DAEMON
 SYSLOG_DAEMON 변수는 psad 에게 로컬 시스템에서 실행 중인 syslog 데몬이 무엇인지 알려준다. 이 변수는 syslogd, syslog-ng, ulogd, metalog 중 하나의 값을 가진다. psad 는 이 변수 값을 이용해서 해당 syslog 설정 파일이 kern.info 메시지를 명명된 파이프 /var/lib/psad/psadfifo 에 기록하게 적절히 설정됐는지 확인한다. 단, psad 가 ulogd 를 통해 iptables 로그 메시지를 얻는 경우는 예외인데 ulogd 가 메시지를 직접 디스크에 기록하기 때문에 syslog 데몬이 실행 중이지 않아도 된다. 이 경우 psad 는 kmsgsd 데몬을 시작하지 않는다.

 * ulogd 는 넷필터 프로젝트에서 제공하는 사용자 공간 로깅 데몬으로 표준 LOG 타겟이 제공하는 것보다 유연하게 로깅 옵션을 설정할 수 있다. 특히 패킷은 다양한 ulogd 플러그인에 의해 관리되며, 플러그인은 다양한 동작을 지원하는데 예를 들어 패킷을 pcap 형식으로 디스크에 기록하거나 MySQL 데이터베이스에 기록할 수도 있다. ulogd는 http://www.gnumonks.org/ 프로젝트에서 받을 수 있다.

 – CHECK_INTERVAL
 psad 는 대부분의 시간을 대기하면서 보내며 새로운 iptables 로그 메시지가 /var/log/psad/fwdata 파일에 기록될 때만 활성화된다. 확인 시간 간격을 CHECK_INTERVAL 변수로 정의하며 초로 나타낸다. 기본 값은 5초다. 이 간격은 최소 1초까지 설정할 수 있지만 경고가 최대한 빨리 생성되길 원하는 경우가 아니라면 보통 이렇게 작은 값으로 설정할 필요는 없다.

 – SCAN_TIMEOUT
 리본적으로 SCAN_TIMEOUT 변수는 3600초(1시간)로 설정되며 psad는 이 값을 스캔이 추적되는 시간 간격으로 사용한다. 즉, 특정 IP 주소에서 악의적인 트래픽이 이 시간 간격동안 위험 수준 1에 도달하지 않으면 psad 는 경고를 생성하지 않는다. ENABLE_PERSISTENCE 를 Y로 설정하면 psad는 SCAN_TIMEOUT 변수를 무시한다.

### This is used only if ENABLE_PERSISTENCE = “N”;
SCAN_TIMEOUT                3600;  ### seconds

 – ENABLE_PERSISTENCE
 포트 스캔 탐지 소프트웨어는 일반적으로 포트 스캔을 잡기 위해 두 개의 임계치를 설정해야 하는데, 조사되는 포트 수와 시간 간격이 그것이다. 공격자는 스캔되는 포트의 수를 줄이거나 스캔의 속도를 줄여서 포트 스캔이 이 임계치에 도달하지 않게 할 수 있다. ENABLE_PERSISTENCE 변수는 psad가 SCAN_TIMEOUT 변수를 스캔 탐지의 요소로 사용하지 않게 해준다. 이는 스캐너가 수일이나 수주에 걸쳐 목표 시스템을 천천히 스캔함으로써 시간 만료 임계치보다 낮은 수준에 머물게 하려는 시도를 무력화하는 데 유용하다. 스캔이 최소 DANGER_LEVEL1 변수에 의해 정의된 패킷 수에 도달하면(이 수에 도달하는 데 걸린 시간이 얼마나 긴지에 무관하게) psad는 경고를 전송한다.

### If “Y”, means that scans will never timeout.  This is useful
### for catching scans that take place over long periods of time
### where the attacker is trying to slip beneath the IDS thresholds.
ENABLE_PERSISTENCE          Y;

 – PORT_RANGE_SCAN_THRESHOLD
 이 변수를 통해 psad가 위험 수준을 포트 스캔에 할당하기 전에 스캔돼야 하는 포트의 최소 범위를 정의할 수 있다. 기본적으로 PORT_RANGE_SCAN_THRESHOLD 는 1로 설정되며, 이는 위험 수준 1에 이르기 전에 최소한 두 개의 서로 다른 포트가 스캔돼야 함을 의미한다. 한 IP 주소가 한 포트만을 반복적으로 스캔할 수 있는데, 이 경우 psad는 경고를 전송하지 않는다(최소 위험 수준 1이 할당되지 않은 활동에 대해서는 절대 경고가 전송되지 않으며, psad에서는 경고가 전송되는 최소 위험 수준을 1에서 5까지로 설정할 수 있다. “EMAIL_ALERT_DANGER_LEVEL” 참조). psad가 스캔되는 포트의 범위를 탐지 요소로 사용하게 하고 싶지 않다면 PORT_RANGE_SCAN_THRESHOLD 를 0으로 설정하면 된다.

### Set the minimum range of ports that must be scanned before
### psad will send an alert.  The default is 1 so that at
### least two port must be scanned (p2-p1 >= 1).  This can be set
### to 0 if you want psad to be extra paranoid, or 30000 if not.
PORT_RANGE_SCAN_THRESHOLD   1;

 – EMAIL_ALERT_DANGER_LEVEL
 이 변수는 어떤 IP 주소가 최소 이 값과 동일한 위험 수준으로 할당되지 않는 한 psad 가 메일 경고를 전송하지 않게 하는 위험 수준의 최소 값을 설정하는데 쓰인다. 기본 값은 1이다.

### Send email alert if danger level >= to this value.
EMAIL_ALERT_DANGER_LEVEL    1;

 – MIN_DANGER_LEVEL
 MIN_DANGER_LEVEL 임계치는 psad가 수행하는 모든 경고와 추적 기능을 위한 전역 임계치이다. 예를 들어 MIN_DANGER_LEVEL이 2로 설정되면 psad는 특정 IP 주소가 위험 수준 2에 도달하기 전에는 이를 /var/log/psad/ip 디렉터리에 기록하지도 않는다. 그러므로 MIN_DANGER_LEVEL 변수는 항상 EMAIL_ALERT_DANGER_LEVEL 변수의 값보다 작거나 같게 설정해야 한다. 기본 MIN_DANGER_LEVEL 값은 1이다. (psad 1.4.8 버전의 경우 MIN_ARCHIVE_DANGER_LEVEL 지시어로 나타나 있었다.)

### Only archive scanning ip directories that have reached a danger
### level greater than or equal to this value.  Archiving old
### scanning ip directories only takes place at psad startup.
MIN_ARCHIVE_DANGER_LEVEL    1;

 
 – SHOW_ALL_SIGNATURES
 이 변수는 psad가 모든 경고에서 IP 주소와 관련된 모든 서명 경고 정보를 포함하게 할지 여부를 결정한다. 이 변수를 화설화할 경우 특정 IP 주소가 오랫동안 의심스러운 트래픽으로 한 사이트에 접속할 때 매우 긴 메일 경고가 초래될 수 있기 때문에 이는 기본적으로 비활설화된다. 그러나 SHOW_ALL_SIGNATURES 가 비활성화된 경우에도 psad 메일 경고는 마지막 CHECK_INTERVAL 에서 새로 촉발된 서명은 모두 포함한다.

### If “Y”, means all signatures will be shown since
### the scan started instead of just the current ones.
SHOW_ALL_SIGNATURES         N;

 – ALERT_ALL
 이 변수가 Y로 설정되면 psad는 어떤 IP 주소로부터의 새로운 악의적인 활동이 위험수준 1에 도달하는 한 이러한 활동이 탐지될 때마다 메일이나 syslog 경고, 또는 둘 모두를 생성한다. N으로 설정되면 IP 주소에 할당된 위험 수준이 증가할 때만 경고를 생성한다.

### If “Y”, send email for all newly logged packets from the same
### source ip instead of just when a danger level increases.
ALERT_ALL                   Y;

 – SNORT_SID_STR
 이 변수는 어떤 iptables 로그 메시지가 스노트 규칙 하나를 완전하게 기술하는 iptables 규칙에 의해 생성됐는지 알아보기 위해 iptables 로그 메시지와 매칭시킬 부분 문자열을 정의한다. 이런 iptables 규칙은 fwsnort가 생성하며 일반적으로 로깅 접두어 SID{n}을 포함한다. 여기서 {n}은 원본 스노트 규칙에서 얻은 스노트 ID 번호이다. SNORT_SID_STR의 기본 값은 단순히 SID다.

### Search for snort “sid” values generated by fwsnort
### or snort2iptables
SNORT_SID_STR               SID;

 – ENABLE_AUTO_IDS
 이 변수는 Y로 설정되는 경우 psad를 수동적 모니터링 데몬에서, (INPUT 체인과 OUTPUT 체인을 통해) 로컬 시스템과 (FORWARD 체인을 통해) 로컬 시스템에 의해 보호되는 모든 시스템과 연동해서 공격자 IP 주소를 차단하기 위해 로컬 iptables 정책을 동적으로 재설정함으로써 공격에 능동적으로 응답하는 프로그램으로 변환한다.

### If “Y”, enable automated IDS response (auto manages
### firewall rulesets).
ENABLE_AUTO_IDS             N;

 – IMPORT_OLD_SCANS
 psad가 포트 스캔과 기타 의심스러운 활동에 대해 수집하는 정보는 /var/log/psad 디렉터리에 기록된다. 위험 수준 1에 도달한 모든 IP 주소에 대해 새 디렉터리 /var/log/psad/ip 가 생성된다. 이 디렉터리에 저장되는 다양한 파일에는 가장 최근의 메일 경고, whois 출력, 서명 매칭, 위험 수준, 패킷 수가 포함된다. 처음 시작 시 psad는 보통 기존의 /var/log/psad/ip 디렉터리를 제거하지만 IMPORT_OLD_SCANS를 Y로 설정해서 기존의 디렉터리로부터 모든 데이터를 가져올 수 있다.이 기능을 통해 이전 psad 인스턴스의 스캔 데이터를 일지 않고 psad를 재시작하거나 전체 시스템을 재부팅할 수 있다.

### If “Y”, then psad will import old scan source ip directories
### as current scans instead of moving the directories into the
### archive directory.
IMPORT_OLD_SCANS            N;

 – ENABLE_DSHIELD_ALERTS
 이 변수를 Y로 설정하면 psad는 스캔 데이터를 DSHIELD 분산 침입 탐지 시스템으로 전송한다. 스캔 정보는 민감한 정보일 수 있기 때문에 스캔 데이터를 DSHIELD로 넘기면 해당 스캔 데이터는 더 이상 여러분의 제어 하에 있지 않으며 상대적으로 열린 데이터베이스로 구문 분석된다는 점을 알아야 한다. 그러나 DSHIELD는 가장 일반적으로 공격당하는 서비스나 현재 대부분의 시스템을 공격하는 어떤 IP 주소가 무엇인지(이런 IP 주소는 엄격한 방화벽 규칙의 좋은 후보가 된다.)에 대한 정보를 사용자가 좀 더 잘 이해할 수 있게 해준다. 많은 사람들이 이 기능을 활성화할수록 인터넷은 좀 더 안전해진다.

### Send scan logs to dshield.org.  This is disabled by default,
### but is a good idea to enable it (subject to your site security
### policy) since the DShield service helps to track the bad guys.
### For more information visit http://www.dshield.org
ENABLE_DSHIELD_ALERTS       N;

 – IGNORE_PORTS
 많은 침입 탐지 시스템의 주요 기능은 관리자가 IDS로 하여금 완전히 무시하게 하고 싶은 데이터 조각을 필터링하는 기능이다. IGNORE_PORTS 변수는 psad가 목적지 포트 번호와 프로토콜(TCP나 UDP)에 기반해서 iptables 로그 메시지를 무시하게 한다. 포트 범위와 다중 포트, 프로토콜 조합은 다음과 같이 지정할 수 있다.

 ### define a set of ports to ignore (this is useful particularly
### for port knocking applications since the knock sequence will
### look to psad like a scan).  This variable may be defined as
### a comma-separated list of port numbers or port ranges and
### corresponding protocol,  For example, to have psad ignore all
### tcp in the range 61000-61356 and udp ports 53 and 5000, use:
### IGNORE_PORTS        tcp/61000-61356, udp/53, udp/5000;
IGNORE_PORTS                NONE;

 IGNORE_PORTS 변수를 사용하기보다는 무시하고 싶은 포트로의 패킷이 LOG 규칙과 일치되기 전에 다른 규칙과 매칭되게 iptables 정책을 조절하는 것이 낫다.

 – IGNORE_PROTOCOLS
 IGNORE_PROTOCOLS 변수를 사용하면 psad는 전체 프로토콜을 무시할 수 있다. 대개는 iptables 정책을 조정해서 무시하고 싶은 프로토콜을 기록하지 않는 것이 더 좋지만 예를 들어 psad가 모든 ICMP 패킷을 무시하게 하고 싶다면 IGNORE_PROTOCOLS 지시어를 설정하면 된다.

### allow entire protocols to be ignored.  This keyword can accept
### a comma separated list of protocols.  Each protocol must match
### the protocol that is specified in a Netfilter log message (case
### insensitively, so both “TCP” or “tcp” is ok).
### IGNORE_PROTOCOL             tcp,udp;
IGNORE_PROTOCOLS            NONE;

 – IGNORE_LOG_PREFIXES
 iptables 정책은 매우 복잡할 수 있으며, 다수의 여러 가지 로깅 규칙을 포함할 수 있다. 또 각 로깅 규칙은 자신만의 로깅 접두어를 가질 수도 있다. IGNORE_LOG_PREFIXES 지시어를 이용하면 무시하고 싶은 특정 로깅 접두어를 설정할 수 있다.

### Ignore these specific logging prefixes
IGNORE_LOG_PREFIXES         NONE;

 – EMAIL_LIMIT
 어떤 경우에는 iptables 정책이 특정 트래픽을 기록하게 설정되는데, 이 트래픽이 네트워크상에서 여러 번 반복될 수 있다(예를 들어 특정 DNS 서버로의 DNS 요청). 이러한 트래픽이 스캔이라고 해석되면 해당 트래픽 자체가 반복되기 때문에 psad는 이 트래픽에 대해 다량의 메일 경고를 전송할 수 있다. EMAIL_LIMIT 변수를 사용하면 psad가 스캐닝 IP 주소에 대해 전송되는 메일 경고의 수에 제한을 두게 강제할 수 있다. 기본 값은 0으로 이는 제한이 없다는 것을 의미한다. 그러나 EMAIL_LIMIT 값을 50으로 설정하면 psad는 특정 IP 주소에 대해 50개 이상의 메일 경로를 전송하지 않는다.

### Send no more than this number of emails for a single
### scanning source IP.  Note that enabling this feature may cause
### alerts for real attacks to not be generated if an attack is sent
### after the email threshold has been reached for an IP address.
### This is why the default is set to “0”.
EMAIL_LIMIT                 0;

 – ALERTING_METHODS
 대부분의 관리자는 psad가 제공하는 메일과 syslog 보고 모드를 모두 사용한다. 그러나 ALERTING_METHODS 변수를 이용하면 psad가 메일 경고와 syslog 경고 중 어떤 것을 생성하게 할지 제어할 수 있다. ALERTING_METHODS 변수는 noemail, nosyslog, ALL과 같은 세 가지 값을 가질 수 있다. noemail과 nosyslog 값은 psad가 메일이나 syslog 경고를 전송하지 않게 한다. 이 값들을 조합해서 모든 경고를 비활성화할 수도 있다. 기본 값은 두 모두를 생성하는 것이다.(psad 1.4.8 버전의 경우 /etc/psad/alert.conf 파일에 이 지시어가 나타나있다.)

### Allow reporting methods to be enabled/restricted.  This keyword can
### accept values of “nosyslog” (don’t write any messages to syslog),
### “noemail” (don’t send any email messages), or “ALL” (to generate both
### syslog and email messages).  “ALL” is the default.  Both “nosyslog”
### and “noemail” can be combined with a comma to disable all logging
### and alerting.
ALERTING_METHODS            ALL;

 – FW_MSG_SEARCH
 FW_MSG_SEARCH 변수는 psad가 iptables 로그 메시지를 어떻게 검색할지 정의한다. psad가 (iptables에 주는 –log-prefix 인자를 사용해 iptables LOG 규칙에 정의된) 특정 로그 접두어를 포함하는 로그 메시지만을 분석하게 제한하려면 FW_MSG_SEARCH 변수로 접두어를 정의하면 된다. iptables는 패킷에 FW_MSG_SEARCH 변수 값과 다른 로그 접두어를 할당하게 설정할 수 있으며 이 경우 psad는 해당 패킷을 분석하지 않는다.

### The FW_MSG_SEARCH variable can be modified to look for logging messages
### that are specific to your firewall configuration (specified by the
### “–log-prefix” option.  For example, if your firewall uses the
### string “Audit” for packets that have been blocked, then you could
### set FW_MSG_SEARCH to “Audit”;  The default string to search for is
### “DROP”.  Both psad and kmsgsd reference this file.  NOTE: You can
### specify this variable multiple times to have psad search for multiple
### strings.  For example to have psad search for the strings “Audit” and
### “Reject”, you would use the following two lines:
#FW_MSG_SEARCH               Audit;
#FW_MSG_SEARCH               REJECT;

FW_MSG_SEARCH               DROP;

 * /etc/psad/auto_dl

 모든 IDS는 항상 높은 확률로 긍정 오류를 범한다. 그러므로 IDS는 특정 시스템, 네트워크, 프로토콜이 모든 탐지 동작과 (가장 중요하게는)자동화된 모든 응답 기능에서 제외될 수 있게 해주는 허용 목록 기능을 갖춰야 한다. 또 특정 IP 주소나 네트워크가 공격자로 알려질 수도 있으므로 이들을 차단할 차단 목록 기능도 필요하다.
 이러한 요구 사항은 다음과 같은 구문을 따르는 psad의 auto_dl 파일이 충족시킨다.

#  <IP address>  <danger level>  <optional protocol>/<optional ports>;
#
# Examples:
#
#  10.111.21.23    5;          # Very bad IP.
#  127.0.0.1       0;          # Ignore this IP.
#  10.10.1.0/24    0;          # Ignore traffic from this entire class C.
#  192.168.10.4    3    tcp;   # Assign danger level 3 if protocol is tcp.
#  10.10.1.0/24    3    tcp/1-1024;  # Danger level 3 for tcp port range

# 82.96.96.0/24   0; # please.read.http.proxyscan.freenode.net

 위험 수준이 0으로 설정되면 psad는 해당 IP주소나 네트워크를 완전히 무시한다. 반대로 특정 IP 주소나 네트워크가 극도로 악의적이라고 알려지는 경우에는 위험 수준을 5로 설정할 수 있다.

 * /etc/psad/signatures

 /etc/psad/signatures 파일은 약간 수정된 스노트 규칙을 약 200개 정도 포함한다. 이 규칙들은 psad가 iptables 로그 메시지로부터 바로 탐지할 수 있는 공격을 나타낸다. 이 규칙 중 어떤 것도 네트워크 트래픽에 대한 애플리케이션 계층 검사를 필요로 하지 않는다. 애플리케이션 계층 검사는 fwsnort 가 수행한다. 이 파일에 있는 규칙을 하나 예로 들면 다음과 같다.

alert tcp $EXTERNAL_NET any -> $HOME_NET 1080 (msg:”SCAN SOCKS Proxy attempt”; flags:S; reference:url,help.undernet.org/proxyscan/; classtype:attempted-recon; sid:615; rev:3; psad_dlevel:2)

 * /etc/psad/snort_rule_dl

 /etc/psad/auto_dl 과 유사하게 snort_rule_dl 파일은 psad가 스노트 규치고가 매칭되는 모든 IP 주소의 위험 수준을 자동으로 설정하게 한다. 이 파일의 구문은 다음과 같다.

# Syntax: Each non-comment line of this file contains a snort ID number, and
#         the corresponding psad danger level like so: <sid> <danger level>.

  위험 수준이 0이라면 psad는 해당 서명 매칭을 무시하고 어떤 경고도 전송하지 않는다. 일부 서명 매칭은 다른 것보다 더 안 좋을 수 있다. 예를 들어 psad가 스노트 규칙 ID 1812(EXPLOIT gobbles SSH exploit attempt)와 매칭되는 트래픽을 탐지 했다면 이는 잠재적으로 스노트 규칙 ID 469(ICMP PINGN MAP)에 대한 매칭보다 훨씬 더 위험하다. 물론 고블스(Gobbles) SSH 공격의 효과를 제한하는 가장 좋은 전략은 애초에 취약한 SSH 데몬을 실행하지 않는 것이지만 이 공격을 탐지하는 것은 여전히 중요하다. 다음과 같이 스노트 규칙 2284와 매칭되는 IP 주소의 위험 수준을 3으로 설정할 수 있다.

### The following example illustrates the syntax for Snort SID 2284
#2284   3;

 * /etc/psad/ip_options

 IP 헤더의 옵션 부분이 IP 통신에서 자주 사용되지는 않지만 iptables는 –log-ip-options 명령 행 인자를 이용해서 IP 옵션을 기록할 수 있다. iptables 로그 메시지가 IP 옵션을 포함하는 경우 psad는 소스 라우팅(source routing) 시도와 같은 수상한 활동에 대해 이 옵션은 구문 분석한다. 일부 스노트 규칙은 IP 옵션의 의심스러운 사용을 정의하며, psad는 iptables 로그 메시지의 IP 옵션을 해석하기 위해 /etc/psad/ip_options 파일을 참조한다.

 * /etc/psad/pf.os

 psad는 원격 운영체제를 수동적으로 핑거프린팅하기 위해 p0f 프로젝트의 OS 데이터베이스를 사용한다. 이 데이터베이스는 psad가 /etc/psad/pf.os 파일에 설치하며, psad는 처음 시작할 때(또는 psad가 kill 명령어나 psad -H를 통해 중단[hangup]이나 HUP 신호를 받았을 때) 이를 불러온다.

 다음은 리눅스에 대한 p0f 핑거프린트의 예다.

S20:64:1:60:M*,S,T,N,W0:        Linux:2.2:20-25:Linux 2.2.20 and newer
S22:64:1:60:M*,S,T,N,W0:        Linux:2.2::Linux 2.2
S11:64:1:60:M*,S,T,N,W0:        Linux:2.2::Linux 2.2

psad 관리

 * psad 의 시작과 종료

 psad 와 함께 제공되는 초기화 스크립트는 레드햇, 페도라, 슬랙웨어, 데비안, 맨드레이크, 젠투 리눅스 시스템에서 동작한다. 다수의 다른 세스템 데몬(syslog나 아파치)처럼 psad는 보통 init 스크립트를 통해 시작하고 종료한다.

User image
 psad가 init 스크립트를 통해 시작되면 주 psad 데몬, kmsgsd, psadwatch와 같은 세 개의 데몬도 시작된다. kmsgsd는 psad가 iptables 로그를 실시간으로 분석할 수 있게 /var/lib/psad/psadfifo 명명된 파이프로부터 모든 iptables 로그 메시지를 읽어 와서 별도의 파일인 /var/log/psad/fwdata 에 기록한다. 이를 통해 psad는 iptables 로그 메시지만을 포함하는 데이터 스트림을 제공받는다.

 * psad는 설치 시에 시스템 syslog 데몬이 info 우선순위를 가지는 모든 커널 메시지(또는 syslog 용어로 kern.info 메시지)를 명명된 파이프 /var/lib/psad/psadfifo 에 기록하게 재설정한다.

 psadwatchd 데몬은 단순히 psad와 kmsgsd 데몬이 실행 중인지 확인하고 그렇지 않으면 이들을 재시작한다. psadwatchd 는 두 데몬 중 하나를 재시작해야 하면 /etc/psad/psad.conf 파일에 있는 메일 주소로 경고 메일을 전송한다.

 * 데몬 프로세스의 유일성

 psad 가 시작되면 세 개의 psad 데몬은 각기 자신만의 프로세스 ID(PID)를 /var/run/psad 내의 파일에 기록한다. 명령 행에서 수동으로 데몬을 시작하면 해당 데이몬은 우선 ㅇ다른 인스턴스가 실행 중인지 확인하고 실행 중이라면 새로운 인스턴스는 바로 종료한다. 이를 통해 이미 존재하는 psad 프로세스를 그대로 유지할 수 있다.

 * iptables 정책 설정

 기본적으로 psad 는 로그 분석기다. psad는 자신이 설치된 시스템상의 iptables 정책이 기록 후 버리기 전략으로 설정됐다고 가정한다. 이는 iptables 가 네트워크의 동작을 위해서 꼭 필요한 패킷만을 수용하게 보장해주며 다른 모든 패킷은 기록 후 버린다. 포트 스캔, 백도어 프로그램을 위한 탐사, 시스템을 전복시키는 애플리케이션 명령(iptables 는 애플리케이션 계층 데이터를 필터링할 수 있다.), 기타 불법적인 것들이 수용 가능한 네트워크 트래픽 목족에서 제외되므로 이런 정책으로부터 나온 iptables 기록은 보통 전용 침입 탐지 시스템에 가치 있는 데이터를 제공할 수 있다.

 psad 는 로컬 iptabels 정책이 INPUT 과 FORWARD 체인 모두에서 기본 LOG와 DROP 규칙으로 설정됐는지 확인해주는 자동 기법을 제공한다. 이 기법은 /usr/sbin/fwcheck_psad 에 위치한 전용 스크립트로(psad 실행 시 –no-fwcheck 명령 행 스위치를 주거나 psad 가 별도의 syslog 서버에서 실행 중이지 않는 한) psad가 시작할 때 실행한다. fwcheck_psad 스크립트는 IPTables::Parse 펄 모듈을 사용해 로컬 iptables 정책의 표현(representation)을 얻어오며 LOG와 DROP 규칙이 포함됐는지 알아보기 위해 이를 해석한다. 포함돼 있지 않다면 psad 는 iptables 정책이 알맞게 설정되지 않았다는 것을 알려주기 위해 설정 경고 메일을 전송한다.

 예를 들어 현재 어떤 iptables 규칙도 인스턴스화돼있지 않다면 fwcheck_psad 는 경고 메일을 생성한다.

 * iptables 정책은 매우 복잡할 수 있기 때문에 정책이 로그와 버리기 전략을 가지는지 결정하는데에 IPTables::Parse 모듈의 구문 분석 기능이 항상 충분하지는 않다. 검사가 실패하더라도 psad 는 여전히 동작할 수 있으며, psad 의 효과는 iptables 가 기록하는 패킷의 유형에 따라 달라진다. 실제로 SMB 와 같은 프로토콜은 필요 없는 내용을 너무 많이 포함하기 때문에 기록하기에 부적절하며, 이런 프로토콜을 통해 전송된 패킷은 주로 LOG 규칙과 일치될 수 있기 전에 받아들이거나 버린다. fw_check_psad 가 올바로 구문 분석할 수 없을 정도로 복잡한 iptables 정책을 실행 중이라면 /etc/psad/psad.conf 의 ENABLE_FW_LOGGING_CHECK 변수를 N으로 설정해서 이 검사를 비활성화할 수 있다.

 * syslog 설정

 psad를 위해 iptables 정책 설정에 반드시 필요한 것을 잘 이해했다면 이제 psad가 iptables 로그 메시지를 얻는 과정을 살펴보자. 패킷이 iptables 내에서 LOG 규칙에 매칭되면 커널은 커널 로깅 데몬인 klogd 를 통해 이 사실을 보고한다. 이렇게 전달된 커널 로그 메시지는 보통 보고서 파일에 기록되기 위해 명명된 파이프나 버클리 소켓 인터페이스를 통한 별도의 시스템으로 전달된다. 이는 모두 syslog 데몬이 제공하는 기능과 syslog 이 어떻게 설정됐는지에 따라 달라진다.

 syslogd와 syslog-ng 데몬은 psad와 호환되며, psad는 metalog도 제한된 방식으로 지웒ㄴ다. syslogd와 syslog-ng 는 명명된 파이프로 로그 메시지를 기록할 수 있으며, psad 는 이를 이용하기 위해 모든 kern.info 로그 메시지가 명명된 파이프 /var/lib/psad/psadfifo 에 기록되게 설정한다. 이곳으로 전달된 로그 메시지는 kmsgsd 가 이용한다. kmsgsd 는 psadfifo 를 통해 syslog 메시지를 받으면 이 syslog 메시지가 iptables 에 의해 생성됐다는 것을 보장하기 위해 두 개의 부분 문자열(IN= 과 OUT=)을 포함하는지 확인한다. 메시지가 이 검사를 통과하면 kmsgsd는 이를 psad 가 볼 수 있게 파일 /var/log/psad/fwdata 에 기록한다. 많은 kern.info syslog 메시지가 iptables 와 아무런 관계도 없는 커널 일부에 의해 생성될 수 있으며, kmsgsd 는 iptables 메시지만이 psad 에 의해 분석되게 보장한다.

 * syslogd

 syslogd 가 설치된 시스템에서 psad 가 실행 중이라면 설치 시 /etc/syslog.conf 설정파일에 다음과 같은 내용이 추가된다. 이는 syslogd 가 kern.info 메시지를 /var/lib/psad/psad 에 기록하게 설정한다.

User image
 * syslog-ng

 반명 로컬 시스템의 syslog 데몬이 syslog-ng 라면 설치 시 /etc/syslog-ng/syslog-ng 설정파일에 추가된다.

 * whois 클라이언트

 마르코 디트리(Marco d’Itri)가 만든 훌륭한 whois(후이즈) 클라이언트가 psad 소스와 함께 제공된다. 이 클라이언트는 주어진 IP 주소에 대해 거의 항상 올바른 넷블록(netblock)을 질의하며, psad는 (–no-whois 명령 행 스위치를 주지 않는 한) IP 주소 소유 정보를 질의해서 메일 경고에 포함시키기 위해 이 클라이언트를 이용한다. 이런 정보를 가지면 스캔이나 기타 다른 공격이 탐지된 네트워크의 관리자 식별 과정이 단순해진다.

psad 설치

 * 역사

 psad 소프트웨어 프로젝트는 1999년 가을, 바스티유 개발팀이 바스티유가 경량의 네트워크 침입 탐지 컴포넌트를 제공해야 한다고 결정했을 때 Bastille 리눅스의 일부로 시작했다. 당시 피터 왓킨스는 지금까지도 Bastille와 함께 제공되는 매우 뛰어난 방화벽 스크립트를 개발 중이었으므로 방화벽 로그가 제공하는 정보에 기반한 IDS 도구를 개발하는 것은 자연스러운 다음 작업이었다. 또 당시 PortSentry(http://sourceforge.net/projects/sentrytools 참조)에는 기본 버리기 전략으로 설정된 방화벽과 함께 사용하기에는 부적절한 구조적 설계 문제가 있었다.

 이에 2001년 마이클 래쉬(이 글의 원 저자)는 바스티유-NIDS 프로젝트가 바스티유를 설치할 필요 없이 독립적으로 실행될 수 있게 별도의 프로젝트로 분리시키고 포트 스캔 공격 탐지기(Port Scan Attack Detector)라고 명명했다. psad의 개발 주기는 매우 활발하며 평균 3~4달에 한 번씩 새로운 배포판이 나온다.

 * 방화벽 로그를 분석하는 이유

 좋은 네트워크 보안은 기본 네트워크 연결성과 서비스를 허용하기 위해 절대적으로 필요한 만큼만 허용하게 적절히 설정된 방화벽에서 시작된다. 방화벽은 인라인 장치이므로 네트워크 트래픽에 필터링 로직을 적용하기 좋다. 컴퓨터 네트워킹의 문맥에서 인라인 장치란 네트워크를 통해 패킷이 라우팅될 때 패킷의 직접적인 경로에 존재하는 하드웨어를 의미한다. 인라인 장치 내의 하드웨어나 소프트웨어가 오작동해서 기기의 네트워크 트래픽 전달 기능에 영향을 미친다면 네트워크 통신은 더 이상 동작하지 못한다. 인라인 장치의 예로는 라우터, 스위치, 브리지, 방화벽, 네트워크 침입 방지 시스템(IPS)이 있다.

 방화벽의 기능이 좀 더 완전해지고 복잡해짐에 따라 점차적으로(애플리케이션 계층 검사와 같이) 전통적으로 침입 탐지 시스템의 범주였던 기능을 제공하고 있다. 이런 기능이 트래픽을 필터링하는 기능에 더해지면서 방화벽은 명백한 침투와 복잡한 정탐 시도로부터 서비스를 보호하고 웜 트래픽으로부터의 잠재적인 피해를 제한할 수 있는 효과적인 기법을 제공할 수 있는 양질의 침입 탐지 데이터를 생성할 수 있게 됐다. 광범위한 로깅과 필터링 기능을 갖춘 iptables와 같은 방화벽은 무시해선 안 되는 가치 있는 보안 데이터를 제공할 수 있다.

 스노트와 같은 전용 침입 탐지 시스템이 굉장히 많은 기능과 네트워크 공격을 기술하기 위한 광범위한 규칙 언어를 제공하는 반면 iptables는 항상 네트워크 트래픽에 인라인되서 자세한 패킷 해더 로그를 제공한다. 철저한 방어의 원리가 적용되므로 iptables의 로그를 주의 깊게 보는 것이 좋다.

 * psad의 기능

 현 버전의 psad는 Nmap과 같은 도구를 이용한 포트 스캔, 다양한 백도어 프로그램을 위한 탐사, 분산 서비스 거부 공격(DDoS) 도구, 네트워킹 프로토콜을 악용하려는 시도와 같이 다양한 유형의 의심스러운 트래픽을 탐지할 수 있다. psad는 fwsnort와 함께 사용하는 경우 애플리케이션 계층 데이터를 조사해야 하는 규칙을 포함해서 스노트 2.3.3 전체 규칙의 60% 이상을 탐지하고 경고할 수 있다.

 psad의 좀 더 흥미로운 기능 가운데 하나는 스캔이나 기타 악의적인 트래픽이 시작되는 원격 운영체제를 수동적으로 핑거프린팅할 수 있는 기능이다. 예를 들어 누군가가 윈도우 머신에서 TCP connect() 스캔을 시작하면 psad는 (대개) 스캔이 윈도우 XP, 2000, NT 중 어떤 시스템으로부터 온 것인지 구분할 수 있다. 심지어 일부 경우 psad는 원격 시스템의 서비스 팩 버전까지 탐지할 수 있다. psad가 사용하는 핑거프린트는 p0f에서 나온 것이다. 더욱이 psad는 자세한 메일과 syslog 경고, 위험 수준 임계치에 기반한 IP 자동 차단 기능(이 기능은 기본적으로 비활성화되어 있다.), 통합된 whois 지원, DShield 보고 등을 제공한다.

 * psad의 설치

 psad 설치에 관련한 자세한 내용은 http://www.cipherdyne.org/psad/download 를 참고하기 바란다. 참고로 우분투/데비안 시스템의 경우 아래의 명령어 하나만으로 psad의 설치를 진행할 수 있다.

 # apt-get install psad

 직접 소스를 다운받아 설치를 하는 경우 install.pl 스크립트를 이용하게 되는데, install.pl 스크립트는 메일 경고가 전송될 메일 주소, 시스템에서 현재 실행 중인 syslog 데몬의 유형(syslogd, syslog-ng, metalog), psad가 특정 로깅 접두어를 포함하는 iptables 로그 메시지만을 분석하게 할지에 대한 결정, 로그 데이터를 DShield 분산 IDS로 전송할지에 대한 결정 등과 같은 몇 가지 사용자 입력을 필요로 한다. 직접 정보를 입력하거나 기본 값(그냥 엔터 키를 누름)을 그대로 사용할 수 있다.

 * psadsms iptables 방화벽과 긴밀히 연계하기 때문에 아직 리눅스 이외의 운영체제로는 포팅되지 않았다. 그러나 psad의 능동적 응답 기능을 사용할 생각만 없다면 다른 운영체제를 실행 중이지만 별도의 리눅스 시스템으로부터 iptables 로그 메시지를 받아들이고 있는 syslog 서버에는 psad를 설치할 수 있다.

 리눅스에 psad를 성공적으로 설치하고 나면 로컬 파일시스템에 다량의 새 파일과 디렉토리가 생성된다.

 펄은 주요 psad 데몬을 개발하는데 쓰인 프로그래밍 언어로, 핵심 펄 모듈에는 포함되지 않는 몇 개의 펄 모듈이 사용된다. 이러한 펄 모듈을 /usr/lib/psad 에 모두 설치함으로써 psad는 이미 시스템 펄 라이브러리 트리에 설치된 펄 모듈과 psad가 필요로 하는 모듈을 완전히 분리시켜 유지할 수 있다.

 psad에는 다음과 같은 모듈이 필요하다.

 Data:Calc
 Net::Ipv4Addr
 Unix::Syslog
 IPTABLES::Parse
 IPTABLES::ChainMgr

 psad, kmsgsd, pasdwatchd 와 같은 세 개의 시스템 데몬이 psad 를 구성한다. 이 데몬은 모두 /usr/sbin 에 설치되면 /etc/psad 의 psad.conf 파일을 참조한다.

 psad 설치 프로그램은 /etc/psad/archive 디렉토리도 생성해서 현재의 psad 데몬 설정 파일을 복사한다. 이는 psad 를 재설치할 때 이전의 설정을 보존하기 위한 것이다. install.pl 프로그램은 현재의 psad 설정 값을 새로운 설정 파일로 통합할 수 있으며, 이를 통해 업그레이드 비용을 최소화할 수 있다.

 설치 프로그램은 /var 에도 몇 개의 파일과 디렉터리를 생성한다. 우선 /var/lib/psadfifo 에 명명명 파이프를 생성하고 /var/log/psad 디렉토리와 파일 /var/log/psad/fwdata 를 생성한다. 끝으로 install.pl 스크립트는 설치 로그를 /var/log/psad/install.log 에 유지한다. 실행 시 psad 의 주요 동작 디렉토리(수상한 네트워크 트래픽과 관련된 IP 주소를 기록하는 디렉토리)도 /var/log/psad 다.

 

Nmap 사용하기

 * Nmap 사용하기

 * 당신은 Nmap을 네트웍에 침입하는 도구로 생각할 지도 모른다. 처음에 Nmap이 나왔을 때는, 이 툴은 해킹 툴로 사용됐지만, 곧 IT 전문가도 이 툴을 사용하기 시작했다. 왜냐하면,  이 툴은 네트웍에 대한 훌륭한 정보를 제공해 주기 때문이다. IT전문가가 이툴을 사용해서 할 수 있는 일은 다음과 같다.

 – 자신의 네트워크 감사(audit) : 이 애플리케이션을 사용하면, 안전하지 못한 포트를 사용하고 있는 호스트를 빠르게 찾아낼 수 있다.
 – 방화벽 설정 테스트 : Nmap을 사용하면 방화벽이 특정 포트들을 잘 막고 있는지 여부를 확인할 수 있다.
 – 수상한 원격지 시스템 파악 : 비록 당신을 스캐닝한 시스템에 대해 역으로 포트 스캔을 하는 것이 바람직한 것은 아니지만, 이것을 함으로써 누가 당신의 시스템에 침입하려는지를 빠르게 알 수 있다.
 – 라우터와 스위치 설정 검사 : TCP/IP 에는 하나의 echo 요청을 보내서, 모든 호스트가 그것에 응답하게 하는 내장 기능이 있다. 이 기능을 사용하면 모든 호스트가 기본 게이트웨이에 접근할 수 있는지를 테스트 할 수는 있지만, 악의의 사용자가 이것을 악용할 수 있다. 악의적인 사용자는 여러 툴을 사용해서 당신의 네트워크에서 다른 네트워크로 공격하게 할 수 있다.

 그러니까 누군가가 Nmap을 사용해서 당신의 시스템을 스캔할 수도 있다.
 그렇지만 이 툴을 잘만 이용하면 당신의 네트워크를 보호하는데 큰 도움이 된다.

 * Nmap은 단지 포트 스캐너일까?

 Nmap은 본질적으로 GSS(Gnome Service Scan)와 같은 호스트 스캐너이다. 그렇지만 사람들이 Unix 기반의 스캐너 중에서 이 툴을 가장 많이 쓰는 이유는 다음과 같은 부가 기능이 있기 때문이다.

 – 빠른 핑(ping) 및 포트 스캔 기능 : 당신은 시스템이 살아있는지 여부와 어떤 포트를 사용하고 있는지를 알 수 있다.
 – 운영체제 핑거프린팅(fingerprinting) : Nmap은 자신이 스캔하는 호스트의 운영 체제를 추측하는 기능이 있다. 이것은 비록 추측이긴 하지만, 많은 정보에 기반을 둔 추측이므로 매우 정확하다. 왜냐하면, Nmap은 수 많은 운영체제에서 뽑아낸 TCP, UDP, IP 응답 데이터베이스를 갖고 있기 때문이다. Nmap은 원격지 시스템에 특정 패킷을 보내 본 다음, 거기서 돌아오는 응답을 데이터베이스와 비교한다. 운영 체제 벤더들이 TCP/IP를 구현할 때, Request for Commecnts(RFCs)라고 불리는 문서들을 참고한다. 이 문서는 www.faqs.org/rfcs/index.html 에서 구할 수 있다. 그렇지만 이 문서에 따라 구현한 TCP/IP가 각 벤더마다 조금씩 다르다.
 Nmap은 이 차이점을 구분해서 운영 체제를 판단한다.
 – 순서 번호 추측(sequence prediction) : 모든 TCP 통신에서는, 각 시스템이 자신이 보내는 패킷의 순서 번호를 관리한다. 이 순서 번호는 TCP 3-way handshake 과정에서 결정된다. Nmap은 이 순서 번호를 추측할 수 있다. Windows NT 4.0 서비스 팩 5 이전 버전과 같은 시스템에서는, 이 순서 번호가 랜덤 값이 아니었기 때문에 쉽게 추측할 수 있었다. 과거게, 해커들은 이런 시스템들의 간단한 TCP 순서 번호를 추측해서, TCP 연결을 가로채는데 사용했다.
 Nmap은 이런 순서 번호를 추측할 수 있는지를 검사해 준다. 리눅스 최근 버전과 같은 운영체제들은, 순서 번호를 랜덤으로 생성하기 때문에 이 번호를 추측하기가 매우 어렵다.
 – TCP 기반 연결을 다양하게 흉내냄 : TCP 연결을 맺을 때, 일정 시간(수 밀리초)동안 handshake를 수행한다. 많은 방화벽에서는, 특정 내부 시스템으로 향하는 초기 SYN 패킷을 버린다. 왜냐하면 네트워크 관리자들은 외부 호스트에서 내부 호스트로 접속하는 것(방화벽을 통하지 않고)을 바라지 않을 경우가 많기 때문이다. 대부분의 스캐너는 SYN 패킷을 사용해서 검사를 하기 때문에, 중간에 패킷이 버려지는 경우가 많다.
 Nmap은 방화벽에서 허용하는 패킷을 사용해서 포트 스캔을 할 수 있기 때문에, 방화벽 내부에 있는 호스트 들고 검사할 수 있다.
 – 스푸핑(spoofing) 기능 : 많은 네트워크 관리자는 누가 자신의 네트워크를 스캔했는지 알려고 한다. Nmap의 스푸핑 기능을 사용하면, 악의적인 사용자는 자신의 시스템을 다른 호스트인것처럼 가장할 수 있다. 그래서 시스템 관리자들은 무고한 사람을 공격자로 착각할 수도 있다. IT 전문가들은 이 기능을 사용해서 방화벽 구성을 테스트할 수 있다.
 – 스캔 속도와 순서 조절 기능 : 많은 침입 탐지 시스템(Instrusion Detection System, IDS)애플리케이션은 네트워크 호스트들이 순서대로 스캔 공격을 받고 있을 때 경고를 발생한다. 또, 몇몇 호스트가 짧은 시간 안에 스캔을 받을 경우에도 경고를 발생한다. Nmap을 사용하면, 당신은 공격을 천천히 할 수 있다. 악의적인 사용자는 이 기능을 사용해서 침입 탐지 시스템을 피할 수 있다.
 IT 전문가는 방화벽이나 침입 탐지 시스템을 감사(audit)하는데 이 기능을 사용한다.
 – 출력을 텍스트 파일에 저장하는 기능 : 이 기능을 사용하면, Nmap의 출력을 다른 프로그램에서도 사용할 수 있고, 나중을 위해 저장해 둘 수도 있다.
 – 텍스트 파일에서 입력 정보를 읽는 기능 : 이 기능을 사용하면 입력 정보를 텍스트 파일로부터 읽을 수 있다.

 * Nmap을 받아 설치하기

 Nmap은 별다른 라이브러리를 사용하지 않기 때문에, 여러 Unix 시스템에서 동작할 수 있다. 일반적으로, Red hat 시스템에서는 tarball보다 RPM을 사용하는 것이 좀 더 안정적이다. Nmap의 경우는, 컴파일시 줄 수 있는 옵션이 없기 때문에, tarball 파일을 쓰는 장점이 없다. 그래서 당신의 배포판용 RPM이 나와 있다면 RPM을 사용하는 것이 좋다. 참고로 우분투에서는 다음의 명령어를 사용한다.

 $ sudo apt-get install nmap

 * 자주 사용하는 Nmap 옵션

 Nmap의 장점의 하나는, 여러 용도로 사용할 수 있다는 것이다. 당신은 이 툴을 내부 네트워크에 있는 시스템의 포트를 검사할 때 사용할 수도 있고, 외부 네트워크에 있는 원격지 시스템의 운영체제를 알아내느느데 사용할 수도 있다.이 툴을 사용해서 시스템을 한번만 검사할 수도 있고, 대화형 모드에서 여러번 검사할 수도 있다.
 다음절에 나오는 두가지 스캔 옵션은, 다양한 스캐닝 어플리케이션에서 많이 사용하는 것들이다. 그렇지만 이 옵션들은 SYN을 사용하기 때문에 방화벽에서 버려질 수 있다. 또한, 방화벽이나 IDS 애플리케이션에서 이 스캔 정보를 로그로 기록할 수도 있다.

 P0 : 기본적으로 Nmap은 ICMP 메시지를 각 원격지 호스트에 전송한다. 이 옵션을 사용하면 Nmap은 ICMP 메시지를 전송하지 않는다. 이 옵션은 ICMP 메시지에 응답하지 않는 시스템들이 실제로 네트워크와 연결돼 있지 않은지 검사할 때 유용하다. 당신이 이 옵션을 사용할 때는, Nmap에서 제공하는 정보가 정확하지 않을 수도 있다는 것을 염두에 두어야 한다.

 -sP : Nmap에서 오직 ICMP 만을 사용하여 표준 핑(ping) 스캔을 하게 한다. Nmap 옵션중에, 앞에 -s가 분은 것은 스텔스(stealth)옵션이라고 하는데, 이것은 방화벽이나 IDS에 발각되지 않게 패킷을 보내는 것을 의미한다.

 -PT : Nmap에서 다른 호스트를 핑(ping)할 때, ICMP대신 TCP 패킷을 사용하게 한다. 이 옵션은 방화벽에서 ICMP와 TCP 패킷을 제대로 막는지 테스트할 때 유용하게 쓸 수 있다. 당신이 -PT 옵션을 사용하면, Nmap은 TCP ACK 패킷을 보낸다. 그리고 상대방 호스트에서 RST 패킷을 보내기를 기다린다. 많은 방화벽에서는 ACK와 RST 패킷을 지나가도록 허용하기 때문에, 당신은 스캔을 잘 수행할 수 있을 것이다.

 -sT : 원격지 시스템의 각 포트에 완전한 TCP 연결을 맺는다.(3-way handshake를 모두 수행한다.)

 -sS : TCP의 SYN 기능을 사용한다. TCP에서 연결을 시작할 때, 한 호스트는 다른 호스트에게 연결을 원한다는 의미로 SYN 패킷을 보낸다. Nmap이 SYN 패킷을 보내면, 이 때는 half-open 연결이 성립된다.(-sT에서 수행하는 3-way handshake를 모두 수행하지 않았다는 뜻이다.). 다른 호스트가 그 연결을 계속 진행하고 싶지 않다는 메시지를 보낼 경우에도, Nmap은 포트가 열려 있는지를 판단할 수 있는 많은 정보를 얻을 수 있다.

 -O : Nmap이 운영 체제 버전을 추측하도록 한다. 이 기능을 사용하면 악의적인 사용자들이 호스트의 운영체제를 파악할 수 있고, 그 운영체제와 관련된 공격들을 수행할 수 있다. 그래서 이 기능은 Nmap을 유명하게 만든 이유의 하나가 되었다. Nmap은 운영 체제 서명(Signature)데이터베이스를 사용한다. Nmap은 스캔을 한 뒤 정보를 얻어서, 데이터베이스에 있는 정보와 비교한다. Nmap의 개발자들은 이 서명(Signature) 데이터베이스를 최신의 것으로 유지하기 위해 많은 노력을 하고 있다. 각 운영 체제마다 TCP/IP 구현이 조금씩 다른데, Nmap은 이 정보를 운영체제를 판단하는 기준의 하나로 사용한다.

 -v : Nmap을 verbose 모드로 만든다. 이 모드에서는 Nmap이 원격지 호스트에 보내는 정보, 원격지 호스트에서 응답하는 정보들을 자세히 알 수 있다. 당신이 -v -v 옵션을 사용하면, Nmap에서는 더 많은 정보를 출력할 것이다.

 * 적용 예제

 당신의 로컬 네트워크에 있는 호스트 중에서 동작하고 있는 호스트들을 알고 싶다고 하자. 당신의 네트워크 주소가 10.100.100.0 이고, 서브넷 마스크가 255.255.255.0 이라고 하자.
 그러면 다음의 명령을 실행하면 된다.

 $ nmap -sP 10.100.100.0/24

 당신이 -v 옵션을 사용하면, 동작하지 않는 시스템의 목록도 볼 수 있따. 만약 원격지 호스트에 핑(ping)을 보내려 하는데 중간에 있는 라우터나 방화벽에서 ICMP 패킷을 허용하지 않는다면, -sT 옵션을 사용하는 것이 좋다.
 다음 명령은 TCP half-open 스캔을 수행하고, 운영 체제의 정보를 알아낸다. 이 때, 호스트에 핑(ping)을 보내지는 않는다.

 $ nmap -sS -O -p0 host

 당신이 -v 옵션을 추가하면, Nmap이 어떻게 동작하는가에 대한 더 많은 정보를 얻을 수 있다.

 * 전체 네트워크와 서브넷 스캔하기

 당신이 전체 네트워크를 스캔하고 싶을 때는, Nmap에서 지원하는 와일드 카드(*)와 Classlwss Internet Domain Routing(CIDR) 표기법을 사용하면 된다. Nmap은 표준 와일드 카드인 “*.”을 사용한다. CIDR 표기법이란, class C 서브넷 마스크인 255.255.255.0 을 나타내기 위해 /24 를 사용하는 방법이다. 이 숫자의 의미는, 서브넷 주소의 시작 비트부터 24개가 1 이라는 뜻이다. 나머지 8bit 는 네트워크의 각 노드를 구분하는데 사용된다. 172.16.0.0/18 은 서브넷은 하나의 class B 네트워크(172.16)을 4개의 서브넷(172.16.0, 172.16.64, 172.16.128, 172.16.192)으로 나눈다.
 이 때, 각 서브넷은  14 bit의 노드 번호를 사용할 수 있다.

 $ nmap -P0 -oN output.txt 172.167.0.0/16 .”*.*”
 $ nmap -P0 -oN output.txt 192.168.0.0/24

 위 예제와 같이, 와일드 카드를 사용할 때는 큰 따옴표를 사용해서 묶어야 한다. 그렇지 않으면 리눅스는 이것을 파일 이름 와일드 카드로 해석하기 때문에, 현재 디렉토리에 있는 파일 중 이 패턴에 맞는 파일을 덮어 쓸 수 있다. 당신이 원한다면 작은 따옴표를 써도 된다.
 위 명령들은 특정 네트워크 전체를 스캔한 뒤, 결과를 output.txt에 저장한다. CIDR 표기법을 사용하면 커스텀(custom) 서브넷 마스크를 사용하는 네트워크를 스캔할 수 있다. 예를 들어, 당신의 네트워크 주소가 172.16.0.0/8 이고, 서브넷 마스크가 255.0.0.0 이라 하자.
 이 서브넷을 스캔하려면, 다음 명령을 실행하면 된다.

 $ nmap -P0 -oN output.txt 172.168.0.0/8

 * 선별적인 스캔

 당신이 전체 서브넷에 있는 특정 포트들만을 검사하고 싶다고 하자. 그러자면 웹 서버나 DNS 서버와 같은, 특정 서비스만을 선ㅌㅊ택해서 스캔할 수 있더ㅏ. 다음 명령을 실행하면 된다.

 $ nmap -sX -p 22,53 -oN acornpub.txt 192.168.0.0/24

 * 참고

 다음 운영체제들은 “Xmas”스캔에 제대로 응답하지 않는다.(Xmas 스캔이란, Nmap에서 사용하는 스캔 방법의 하나로, TCP의 여러 bit(FIN, PSH, URG 등)를 모두 설정한 패킷을 보내는 방법이다. 이렇게 모든 비트를 설정한 모양이, 크리스마스 트리에 붙어 있는 전구 모두에 불이 켜진 모습과 비슷하다고 해서 Xmas 스캔이 됐다.) 왜냐하면, 이들은 표준 RFC를 따르지 않기 때문이다.
 Microsoft, CISCO, FreeBSD나 NetBSD가 아닌 모든 BSD 시스템, IRIX, HP/UX

 * 스텔스 기능을 추가
 위에서, Nmap이 스캔하는 것을 방화벽에 들키지 않기 위해 스텔스(stealth)기능을 사용하는 것을 봤다. 위에서 소개한 방법 말고도, 여러가지 스텔스 옵션이 있다.

 -sF : FIN 비트가 설정된 TCP 패킷을 사용해서, Nmap은 호스트의 모든 포트에 패킷을 보낼 수 있다.

 -sX : “Xmas 트리” 옵션으로 불리는데, 이 옵션을 사용하면 TCP의 FIN, URG, PUSH 플래그가 설정된다.

 -sN : “Null 스캔”이라 불린다. 이 옵션을 사용하면 TCP의 모든 플래그를 끈 패킷을 보낸다. 만약 시스템에서 이 패킷에 대한 응답을 하면, Nmap은 이 호스트가 동작중인지 알 수 있고, 돌아온 패킷을 분석하여 여러 정보를 얻어낼 수 있다. Microsoft 시스템들은 이 패킷에 응답하지 않기 때문에, 이 옵션을 사용하면 Microsoft 시스템과 다른 시스템들을 구분할 수 있다.

 -D : 이 옵션을 사용하면 스캔의 출발지 주소를 당신이 지정하는 주소들로 바꿀 수 있다. 해커들은 이 옵션을 사용해서, 시스템 관리자들이 스캔 공격의 출발점을 알지 못하게 한다. 당신이 관리자라면, 이 기능을 사용해서 침입 탐지 시스템이나 방화벽이 스캔 공격을 잘 찾아내는지 테스트할 수 있다. -D 옵션을 사용할 때에는, 가짜 호스트들을 쉼표로 구분해야 한다.

(Language : xml)
pchero@MyNote:~$ sudo nmap -sF -v 192.168.3.0/24 -D 21.125.23.122

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 14:56 KST
Initiating ARP Ping Scan at 14:56
Scanning 215 hosts [1 port/host]
Completed ARP Ping Scan at 14:56, 2.31s elapsed (215 total hosts)
Initiating Parallel DNS resolution of 215 hosts. at 14:56
Completed Parallel DNS resolution of 215 hosts. at 14:56, 0.01s elapsed
Initiating Parallel DNS resolution of 1 host. at 14:56
Completed Parallel DNS resolution of 1 host. at 14:56, 0.01s elapsed
Initiating FIN Scan at 14:56
Scanning 192.168.3.1 [1714 ports]
Completed FIN Scan at 14:56, 14.18s elapsed (1714 total ports)
Host 192.168.3.1 appears to be up … good.
Interesting ports on 192.168.3.1:
Not shown: 1712 closed ports
PORT   STATE         SERVICE
22/tcp open|filtered ssh
23/tcp open|filtered telnet
MAC Address: 00:11:88:4D:3D:82 (Enterasys)

Initiating ARP Ping Scan at 14:56
Scanning 40 hosts [1 port/host]
Completed ARP Ping Scan at 14:56, 0.85s elapsed (40 total hosts)
Initiating FIN Scan at 14:56
Scanning 192.168.3.215 [1714 ports]
Completed FIN Scan at 14:56, 0.14s elapsed (1714 total ports)
Host 192.168.3.215 appears to be up … good.
All 1714 scanned ports on 192.168.3.215 are closed

Read data files from: /usr/share/nmap
Nmap done: 256 IP addresses (2 hosts up) scanned in 18.069 seconds
           Raw packets sent: 8021 (321.858KB) | Rcvd: 6918 (287.378KB)

 당신이 ME 옵션을 지정한다면, 당신의 시스템 정보가 IDS 로그에 남을 가능성을 더욱 적어진다.

 192.168.3.0/24 네트워크를 스캔하려고 하는데, 이 네트워크에 있는 방화벽에서 모든 SYN 패킷을 거부한다면, 다음 명령을 실행한다.

(Language : xml)
$ nmap -sF -v 192.168.3.0/24

 다음 명령은 위와 똑같지만, 스캔 공격을 하는 시스템의 주소를 다른 호스트의 주소로 바꿔 놓는다.

(Language : xml)
$ nmap -sF -v 192.168.3.0/24 -D www.hostname.com,www.hostwebserver.com,ME

 Nmap을 사용하면서, -sX와 -sN 옵션이 당신이 스캔하고자 하는 호스트에 맞는지를 테스트하기 바란다. TCP 옵션을 사용할 때는, 한번에 하나의 옵션만을 사용할 수 있다는 것도 알아두자.
 그러니까 당신은 한 명령에서 -sF 와 -sS 옵션을 모두 사용할 수 없다.

 * 텍스트 파일에 저장하고 텍스트 파일에서 읽기

 스캔을 하면 그 결과가 상당히 길 때가 있다. 예를 들어, 당신이 253개의 호스트가 있는 네트워크의 모든 포트를 스캔한다면, 당신은 화면에서 그 결과를 다 볼 수 없을 것이다. 결과가 너무 많기 때문에, 터미널을 아무리 스크롤해도 모자랄 것이다.
 Nmap에서는 다음과 같은 옵션을 사용해서 출력을 텍스트 파일에 저장할 수 있다.
 -oN filename : 스캔 결과를 텍스트 파일에 저장해서 나중에 볼 수 있게 한다.
 -oM filename : 스캔 결과를 바이너리 포맷으로 저장한다. 당신이 네트워크를 스캔한 다음, 이 결과 파일을 Cheops나 IDS에서 사용할 수 있다.
 -iL : Nmap에서 텍스트 파일을 읽어들이게 한다. 예를 들어, 당신이 여러 IP주소나 호스트 이름이 저장된 텍스트 파일을 갖고 있다면, 명령행에서 주소를 지정하는 대신 이 파일 이름을 지정할 수 있다.
 예를 들어, 당신이 Nmap 출력을 file.txt에 저장하고 싶을 때, 다음과 같이 실행하면 된다.

(Language : xml)
$ nmap -v -oN file.txt -O host.yourhosrt.com

 * 방화벽과 침입 탐지 시스템 테스트

 당신은 방화벽이나 IDS가 설치된 네트워크에서 Nmap을 사용하고 싶을 때도 있을 것이다. 그럴 경우에, 당신의 스캔 정보가 쉽게 탐지되지 않고, 또 방화벽에서 버려지지 않기를 바랄 것이다.
 이런 경우 다음 옵션을 사용할 수 있다,
 -f : 스캔하는 패킷을 작은 IP 조각으로 나눈다. 이렇게 하면, 방화벽에서 패킷들을 잡아내서 로그로 남기기가 어려워진다.
 -S address 이 옵션을 사용하면, 스캔 공격이 시작된 출발지 주소를 지정할 수 있다. 원래 이 옵션을 만든 이유는, 어떤 운영체제는 자신의 주소를 Nmap에게 알려주지 않았기 때문이다. 그렇지만 이 옵션은 자신의 주소를 속이는 데도 사용될 수 있다. 일반적으로, 이 옵션을 사용해서 공격 출발지 주소를 속일 때, -e -P0 옵션을 같이 사용한다. -e 옵션은 사용할 인터네이스를 지정한다(보통은 eth0). -P0 옵션은, 앞에서 본 것처럼 핑(ping)스캔을 수행하지 않도록 한다.
 -D 옵션도 스캔 공격의 출발지 주소를 속일 수 있다는 면에서 이 옵션과 유사하다.
 -g port : 기본적으로 Nmap은 스캔 공격을 하기 위해 임시 포트(즉, 1024 위의 포트)를 사용한다. 많은 방화벽에서는 이 포트들을 막고 있다. 그렇지만 방화벽에서 내부로 들어오는 트래픽 중 특정한 포트(80, 110, 53과 같은)를 허용할 때도 많다. 이 옵션을 사용하면 방화벽에서 허용하는 포트를 사용할 수 있다. 그래서 방화벽을 통과해서 스캔 공격을 할 수 있다.

 * 스캔을 공격한 출발지 주소 속이기

 당신 시스템의 IP 주소가 192.168.3.4 라고 하자. 그런데 당신을 스캔 공격을 할 때 출발지 주소를 20.20.20.20으로 속이고 싶다. 이렇게 주소를 속여서 pchero라는 시스템을 스캔하려면 다음과 같이 한다.

(Language : xml)
$ nmap -S 20.20.20.20 -e eth0 -P0 -sS -v pchero

 -P0(ping을 보내지 않음)와 -sS(TCP SYN 스텔스 포트 스캔) 옵션을 사용하면, Nmap은 ping 패킷을 보내지 않고 TCP 기반의 스캔을 한다. -sS 옵션을 사용했기 때문에, 방화벽에서 스캔을 탐지할 확률이 낮아진다. 물론, 많은 방화벽에서 초기 SYN 패킷을 필터링 하긴 하지만.
 스캔을 할 때, 출발지 포트를 53으로 하고 싶다면 다음 명령을 실행한다.

(Language : xml)
$ nmap -g 53 -S 20.20.20.20 -e eth0 -P0 -sS -v pchero

 * 스캔 속도 조절하기

 많은 침입 탐지 시스템에서는, 포트 스캔을 발견할 경우 경고를 발생시킨다. 당신은 Nmap의 -T 옵션을 사용해서 IDS를 테스트 할 수 있다. 이 옵션을 사용하면, 패킷을 일정 시간 간격으로 보낸다. 이렇게 긴 시간에 걸쳐서 스캔을 수행하면, IDS는 스캔을 판단하기가 어려울 것이다.
 이 옵션에 인자로 올 수 있는 것은 다음의 6개 이다.
 paranoid : Nmap이 패킷을 5분 간격으로 보내게 한다. paranoid 대신 숫자 0을 써도 된다.
 sneaky : Nmap이 패킷을 15초 간격으로 보내게 한다. sneaky 대신 숫자 1을 써도 된다.
 plite : Nmap이 패킷을 0.4초 간격으로 보내게 한다. polite 대신 숫자 2를 써도 된다.
 normal : 기본 설정으로, 목적지 호스트로부터 응답을 받는 즉시 다른 패킷을 보낸다. normal 대신 숫자 3을 써도 된다.
 aggressive와 insane : 이 옵션들을 사용하면 스캔을 빠르게 수행할 수 있다. 그래서 핑(ping)이나 포트 스캔을 빠르게 하고자 할 때는 이 옵션을 사용할 수 있다. 그렇지만 이 옵션을 사용하면 너무 많은 트래픽을 발생시켜서 네트워크에 많은 부담을 준다는 것을 염두에 두기 바란다. aggressive 대신 숫자 4를 사용해도 되고, insane 대신 숫자 5를 사용해도 된다.

 * Paranoid 옵션으로 스캔하기.

 특정 호스트에 대해 paranoid 스캔을 하려면, 다음 명령을 실행한다.

(Language : xml)
$ nmap -S 20.20.20.20 -e eth0 -P0 -sS -v T paranoid pchero

 이 스캔은 시간이 많이 걸린다는 것을 알아두자. 왜냐하면, paranoid 옵션은 패킷을 5분 간격으로 보내기 때문이다.

(Language : xml)
– 당신이 Nmap을 실행할 때, 스캔이 끝날 때까지 많은 시간이 걸릴 경우가 있을 것이다. 보통, 이렇게 되는 이유는 당신이 Nmap에서 일정 시간을 기다리라는 옵션을 줬기 때문이다. 때때로, 당신과 스캔 대상이 되는 호스트 사이에 있는 방화벽이나 라우터 때문에 스캔이 느려지기도 한다. 당신이 Nmap을 사용할 때 여러 옵션을 사용하거나, 또는 여러 원격지 시스템을 스캔한다면, 스캔하는데 몇 분이 걸릴 것이다.

 * Nmap을 대화형(interactive)모드에서 사용

 지금까지, 당신은 Nmap을 사용해서 하나의 명령만을 실행했다. Nmap의 대화형(interactive) 모드를 사용하면, 다음과 같은 두 가지 일을 할 수 있다.

(Language : xml)
– 여러 Nmap 스캔을 수행할 수 있다.
– 시스템에서 Nmap이 실행중이라는 것을 숨길 수 있다. 이 모드에서 제공하는 스푸핑 기능을 이용하면, Nmap을 다른 프로그램(vi, named, sendmail 등)인 것처럼 속일 수 있다.

 Nmap을 대화형 모드로 실행하려면 다음 명령을 실행한다.

(Language : xml)
$ nmap –interactive

 그러면 당신은 다음 프롬프트를 보게 될 것이다.

(Language : xml)
nmap>

 여기서, 당신은 Nmap 명령들을 실행할 수 있다.
 대화형 모드는 paranoid 옵션을 사용할 때 매우 유용하다. 예를 들어, 당신은 몇 개의 paranoid 스캔을 동시에 진행할 수 있다. 이 작업은 며칠이 걸릴지 모르는 일이다. 그래서 이것을 백그라운드에서 실행한 다음, 나중에 스캔이 끝났을 때 결과 파일만 확인하면 된다. 이런 스캔을 하려면 상당히 오랜 시간이 필요하기 때문에, 해커의 입장에서는 스캔을 수행하는 프로세스를 숨길 필요가 있다. 시스템 관리자들은, Nmap의 대화형 모드에서 제공하는 스푸핑 기능을 사용할 일은 없을 것이다.
 그렇지만 관리자들은 겉으로는 정상적인 것처럼 보이는 프로세스도 Nmap 프로세스일 가능성이 있다는 사실을 알아둬야 한다.