[목차] 크라켄을 이용한 보안 솔루션 개발 크라켄북

완성할 때까지 블로그 최상단에 위치

1부. 서론

1부에서는 배경지식과 개발환경 설정 방법을 다룬다.

1장. 개요
- 로드맵
- 대상 독자
- 감사의 글

2장. 배경지식
- Maven

- OSGi

- iPOJO
 * iPOJO 핸들러 확장

3장. 개발환경 준비
- m2eclipse 플러그인 설치

2부. 애플리케이션 서버와 기반 모듈

2부에서는 플랫폼을 구성하는 애플리케이션 서버와 인프라 성격의 모듈에 대하여 다룬다.
 
4장. 크라켄 코어
- 로컬 디버깅과 원격 디버깅
- 메모리 덤프 분석
- 크라켄 패키지 시스템
- 작업 스케줄링
- NT 서비스 설치

5장. Hello, OSGi World!
- 헬로월드 프로젝트 생성과 빌드, 설치
- 예제로 이해하는 iPOJO 생명주기: 메타데이터와 어노테이션 기반 설정
- 크라켄 iPOJO를 이용한 컴포넌트 상태 진단
- 크라켄 명령어 확장과 활용
- 크라켄 Cron을 이용한 스케줄링

6장. 크라켄 설정DB
- 파일, RDBMS 저장 방식의 불편함
- 크라켄 설정DB의 특징
- 크라켄 코덱의 구조
- 사용자 정의 타입의 변환 규칙
- 크라켄 설정DB 사용 예제: 커밋, 롤백, 플래시백
- 크라켄 설정DB 명령어
- shrink, export, import

7장. 크라켄 JPA
- 데이터베이스별 JDBC 사용 방법
- 하이버네이트와 OSGi
- 크라켄 JPA 설정과 선언적 트랜잭션
- 크라켄 JPA 명령어
- 크라켄 JPA 활용 예제

8장. 크라켄 도메인 객체 모델 (DOM)
- 개요
- 생명주기 이벤트
- 공통 객체 관리 API
 * 멀티 테넌시 지원
 * 푸시 API
 * 메시지 지역화
 * 사용자 정보 관리
 * 영역 및 호스트 관리

9장. 크라켄 메시지버스
- 개요 및 주요 개념
- 선언적 메시지버스 프로그래밍
- 세션과 인증 처리
- 권한 어노테이션

10장. 크라켄 로그 API
- 개요 및 주요 개념: logger, logger factory, pipe, 네임스페이스 등
- 로그 관리 명령어

11장. 크라켄 로그DB
- 크라켄 로그스토리지의 특징
 * 실시간 압축 및 조회, 비정형 데이터 처리, 읽기 잠금 없음, 비동기 API
- 로그스토리지 명령어
- 로그스토리지 서비스
- 로그 쿼리 문법
- 로그 쿼리 문법의 확장
 * 크라켄 BNF
 * 확장 인터페이스 설명
 * GEOIP 확장 예시
- 로그 쿼리 서비스
- 텍스트 파일 통계 처리 예시
- 표준 출력 (stdout) 처리 예시

3부. 네트워크 프로그래밍

3부에서는 보안 솔루션이 통상적으로 타 시스템과 연동할 때 사용하는 각종 프로토콜을 다룬다.

12장. 크라켄 Syslog
- syslog 개요
- syslog 서버 설정
- syslog 수신 서비스
- syslog parser 목록

13장. 크라켄 SNMP
- snmp 개요
- snmp trap 서버 설정
- snmp trap 서비스
- snmp trap parser 목록

14장. 크라켄 NTP 클라이언트
- NTP 개요
- 자동 시각 동기화 설정

15장. 크라켄 웹서버
- 크라켄 웹서버 명령어 (파일 서버 설정 방법 포함)
- HttpContext 개념
- 서비스 인터페이스

16장. 크라켄 XMLRPC
- XMLRPC 프로토콜 개요
- 선언적 XMLRPC 서비스 프로그래밍
- XMLRPC 프로그래밍 예제

17장. 크라켄 LDAP
- LDAP 인증과 조직도 임포트

18장. 크라켄 RADIUS
- RADIUS 개요
- PAP, CHAP 클라이언트 예제
- PAP, CHAP 서버 예제
- RADIUS 확장 모듈의 구현

19장. 크라켄 메일
- SMTP 서버 설정
- POP3, IMAP 설정
- 자동화된 메일 전송

20장. 크라켄 DHCP
- DHCP 개요
- DHCP 서버 설정

21장. 크라켄 RPC
- 메시지 교환 패턴: request/response, fire-and-forget
- 크라켄 RPC 프로토콜
- 선언적 RPC 서비스 프로그래밍
- 동기적, 비동기적 RPC 호출

4부. 저수준 네트워크 프로그래밍

4부에서는 드라이버 수준에서 수집된 패킷을 필터링하거나 해석하고 조작하는 방법을 다룬다.

22장. 크라켄 PCAP
- PCAP 개요 
- PCAP 파일 포맷
- 802.11 무선랜 패킷의 해석
- DHCP 핑거프린팅을 이용한 장치 식별
- HTTP 이미지 파일 추출 예제
- SMTP 첨부파일 추출 예제

23장. 크라켄 Captive Portal (인증 포탈)
- Captive Portal 개요
- ARP 스푸핑
- DNS 포이즈닝
- 설치 및 연동
- 아이폰 패킷 캡처 예시


4.6. 디버깅 크라켄북

이 절은 이클립스를 이용한 OSGi 애플리케이션 디버깅을 다룬다. 오라클 공식 JVM을 기준으로 하므로 다른 JVM 구현체는 

로컬 디버깅

OSGi 환경의 디버깅도 일반적인 자바 애플리케이션 디버깅과 동일하게 진행할 수 있다. 다만, 진입점(main)이 크라켄 코어에 있으므로, 크라켄 코어 자체를 이클립스에서 디버그 모드로 실행하면 된다. Kraken 클래스를 선택하고 F11 키를 누르면 디버그 모드로 실행된다.


이 상태에서 디버그 하려는 코드에 중단점을 걸어놓고 진행하면, 이클립스 디버그 퍼스펙티브가 열리면서 디버깅을 진행할 수 있을 것이다. 디버깅을 중지하려면 빨간 사각형 버튼을 누른다.

원격 디버깅

JVM에서 제공하는 JDWP (Java Debug Wire Protocol) 지원 기능을 이용하여 원격에서 디버깅을 수행할 수 있다. 


각 옵션은 다음과 같은 의미를 가진다.

이렇게 실행시켜놓은 후, 이클립스에서 아래 순서대로 설정하면 원격지에서 디버거를 동작시킬 수 있다.


디버깅하려는 프로젝트를 선택하여 오른쪽 클릭하고, 컨텍스트 메뉴에서 Debug As, 그리고 Debug Configurations를 선택한다.


Debug Configurations 대화상자에서 Remote Java Application을 오른쪽 클릭한 후 New 버튼을 누른다.




4.5. 스레드 모니터링과 제어 크라켄북

크라켄 코어는 터미널을 통해 실시간으로 스레드 목록을 조회하고, 스택 상태를 추적하며, 강제로 인터럽트를 걸거나 스레드를 정지시킬 수 있도록 지원한다. 스레드 모니터링 기능을 이용하면 교착상태가 발생했을 때 즉시 정확한 발생 위치를 확인할 수 있다.

스레드 목록 조회와 인터럽트


위의 예시는 두 개의 텔넷 터미널을 열어서, 한 쪽에서 account.passwd 명령으로 키보드 입력을 무한히 대기하도록 만들어놓고, 다른 터미널에서 thread.list 명령으로 현재 실행 중인 모든 스레드 목록을 조회한 것이다. 47번 스레드가 account.passwd 명령을 실행 중인 것을 확인할 수 있다. 이 상태에서 thread.interrupt 명령으로 47번 스레드에 인터럽트를 보내면, 대기 중이던 스레드에서 InterruptedException이 발생하여 중단되는 것을 확인할 수 있다. thread.stop 명령어를 이용하면 스레드를 강제로 정지시킬 수 있지만, 이 명령어의 사용은 권장하지 않는다.


스레드가 많을 때는 스레드 상태에 대한 필터링을 걸어서 조회 대상을 줄일 수 있다. 가령, 교착상태가 발생했을 때 대기 중인 스레드 목록만 보려면 위와 같이 thread.list WAITING 명령으로 대기 중인 스레드 목록만 조회할 수 있다.

특정 스레드 스택 조회


15번 스레드의 스택을 thread.stacks 명령으로 조회해보면, 위와 같이 스케줄러 루프에서 일정 시간 잠들어 있는 것을 확인할 수 있다.

스레드 생성 가이드

Thread(Runnable target, String name) 생성자를 이용하여 명시적으로 이름을 부여한 스레드를 생성하도록 권장한다. 스레드에 이름을 부여하지 않으면 Thread-# 형태로 임의로 이름이 부여되기 때문에, 이후에 문제가 발생했을 때 추적하기가 어려워진다. 

또한, Runnable 인터페이스를 구현할 때 반드시 try-catch-finally 구문을 삽입하고, 스레드에서 예외가 발생하거나 종료되는 시점에 로그를 남기도록 한다. 자바 스레드가 예외 발생 등으로 인해 종료되더라도 명시적으로 로깅을 하지 않으면 알아채기가 어렵기 때문에, 로그만 남겼으면 빨리 문제 위치를 확인하고 끝났을 디버깅이 몇 시간씩 소요되는 사태가 발생할 수 있다.

4.4. 중앙집중화 된 로그 제어 크라켄북

크라켄 코어는 slf4j 인터페이스를 표준 로깅 인터페이스로 사용하며, 각 로거들의 로그 레벨을 런타임에 터미널을 이용하여 제어할 수 있다.

로거 목록 조회


logger.list 명령을 사용하면 현재 설정할 수 있는 모든 로거의 목록이 나열된다. 일반적인 경우 시스템 내에 수백 개에 달하는 로거가 존재하므로 실제 사용할 때는 대부분 logger.list의 인자로 필터링 문자열을 넣게 된다.

터미널에 실시간으로 로그 출력하기


예를 들어, logger.list TelnetState 를 치게 되면 TelnetState 문자열을 포함한 로거를 검색해서 출력해준다. logger.on org.krakenapps.console.TelnetStateMachine 명령을 치게 되면 해당 로거의 DEBUG/TRACE 로그까지 활성화하게 된다. 이 상태에서 logger.tail 명령을 치면 실시간으로 로그가 터미널에 출력되는 것을 볼 수 있다. 창 크기를 조절할 때마다 PuTTY가 텔넷 윈도우 크기 조절에 관련된 옵션을 보내는 것을 볼 수 있다. 실시간 로그 출력을 중단하려면 Ctrl-C를 누른다. 더 이상 DEBUG/TRACE 로그가 기록되지 않도록 비활성화 하려면 logger.off 명령어를 사용한다.

로그 레벨별 제어

일반적인 경우는 아니지만, INFO 이상의 로그 레벨에서 발생하는 로그에 대해서도 로그를 끄거나 다시 켜고 싶은 경우가 있다. 그럴 때는 아래와 같이 logger.set 명령을 사용해서 일일이 로깅 여부를 켜거나 끄면 된다.


로그 출력 제어

크라켄 코어를 부팅할 때 보면 아래와 같은 로그 출력을 볼 수 있다.
[2012-05-12 22:53:13,539]  INFO (Kraken) - Default logging enabled. Configure log4j.properties file for custom logging.

크라켄 코어는 slf4j 인터페이스에 log4j를 붙여서 사용한다. 크라켄 코어는 아래와 같이 로그를 기록한다:
  • kraken.log.dir 환경변수로 지정된 로그 디렉터리 (기본값은 크라켄 코어 파일 위치의 log 디렉터리)에 kraken.log.yyyy-MM-dd 이름의 로그 파일을 생성한다. 당일의 로그는 kraken.log 이름으로 저장되고, 하루가 지날 때마다 파일 이름에 날짜가 붙어서 보관된다.
  • 일주일이 지난 로그는 Kraken Log Cleaner 스레드에 의해 자동으로 삭제된다. 즉, 항상 최근 일주일치 로그만 보관된다.
좀 더 세밀한 로그 출력 제어를 원한다면 크라켄 코어 파일 위치에 log4j.properties 설정 파일을 만들어두면 된다.

1 2 3 4 5 6 7 8 9 10 다음