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 다.

 

유스케이스

    *** 유스 케이스

 – 시스템이 제공하는 각 기능

   ** 유스케이스 이름

  * 명명 규칙1 : 행위 또는 동작을 뜻하는 명사 사용
 – 시스템의 기능을 나타내어야 함
 – ex) 수강 -> 수강신청, 출석부 -> 출석부 조회

  * 명명 규칙2 : 사용자가 얻고자 하는 목적이 명확히 나타나야 함.
 – ex) 수강 과목 선택 -> 수강 신청

  * 명명 규칙3 : 사용자(액터)의 입장에서 명명되어야 함
 – ex) 성적 관리 -> 성적 등록
 – ex) 수강 신청 관리 -> 수강 신청

  * 요약 : 사용자의 관점에서 바라보고 시스템이 제공하는 기능을 이용하여 궁극적으로 하고자 하는 행위를 나타내는 명사를 사용한다.

   ** 유스케이스 설명

  * 유스케이스를 이용하는 사용자에게 이 유스케이스를 통해서 시스템이 어떤 기능을 제공하는 지를 한/두 문장으로 간단하고 명확하게 기술하는 것

   ** 유스케이스의 특성

  * 특성 1 : 하나의 유스케이스는 일련의 액션들로 표현

  * 특성 2 : 하나의 유스케이스는 여러 variants를 포함
 – 기본 흐름(basic flow) : 가장 전형적이고, 정상적인 경우
 – 대안 흐름(alternative) : 기본 흐름을 벗어나는 다른 상황을 나타냄
 – 각 대안 흐름 별로 별도의 유스케이스를 정의하지 않음
 – ex) 카드 판독 실패 이벤트 흐름
+ 카드 판독이 불가능함을 사용자에게 알리고 카드를 배출시킨다.
+ 사용자는 카드를 회수한다.
 – ex) 잔액 부족 이벤트 흐름
+ 잔액 부족을 사용자에게 알리고, 카드를 배출하고, 영수증을 인자한다.
+ 사용자는 카드와 영수증을 회수한다.

  * 특성 3 : 유스케이스는 시스템이 제공하는 기능
 – 시스템에서 제공하지 않을 기능이 유스케이스에 포함되어서는 안됨
 – 수작업을 통해서하는 작업을 유스케이스에 포함시켜서는 안됨
 – ex) 학교에서 배포된 성적표로 성적 확인은 유스케이스에 포함시켜서는 안됨

  * 특성 4 : 유스케이스는 액터가 관찰할 수 있는 결과를 산출
 – ex) 현금 자동 인출기 시스템의 출금 유스케이스
+ 카드 판독의 성공 표시 및 거래 종류의 일력을 요청하는 화면
+ 암호의 입력을 요청하는 화면
+ 암호의 확인 성공 표시 및 인출할 금액의 입력을 요청하는 화면
+ 출금이 진행 중임을 표시하는 화면
+ 출금 시 배출된 현금과 영수증
 – 유스케이스는 액터가 궁극적으로 원하는 결과를 내야 한다.

  * 특성 5 : 유스케이스는 액터에 의해서 수행이 시작
 – ex) 출금 유스케이스 : 사용자 액터가 카드를 삽입함으로써 수행
 – 유스케이스의 이벤트 흐름은 반드시 액터에 의해서 시작된다.

  * 특성 6 : 한 유스케이스 내의 액션들을 트랜젝션처럼 수행
 – 한 유스케이스의 이벤트 흐름을 구성하는 각 이벤트들은 유스케이스가 수행될 때 모두 발생하는 것이며 부분적인 발생은 허용되지 않음.
 – 이벤트 흐름의 부분만을 수행하는 것이 가능하면 그것을 하나의 유스케이스라고 볼 수 없음.
 – ex) 성적 등록
 – ex) 출석부 조회

   ** 유스케이스 찾기

 – 질문1 : 사용자 액터가 시스템이 제공하기를 원하는 기능은 무엇인가?
+ ex) ATM : 입금, 출금, 조회, 이체, 통장 정리
+ ex) 대학 정보 시스템 : 학생(수강신청, 성적조회), 교수(출석부 조회, 성적 등록)
 – 질문2 : 시스템이 어떤 기능을 제공하면 사용자 액터의 일상 작업이 효율적이고 편해지는가?
+ 수업 담당자 : 수강료 청구서 발급
 – 질문3 : 사용자 액터가 시스템에 어떤 정보를 생성/조회/수정/삭제하고 싶어 하는가?
 – 질문4 : 시스템의 입력과 출력은 무엇인가?

액터

    *** 요구사항 정리

 – 기초공사
 – 사용자로부터 필요
 – 시스템 구축의 첫 과정
 – 요구사항 도출, 기술, 확인하는 활동
+ 유스케이스 모델링 기법 이용
+ 체계적인 요구사항 도출
+ 명확한 기술 방법 설명

   ** 요구사항의 유형

  * 기능적 요구사항 : 시스템이 제공해야 하는 동작/행위에 대한 요구사항
 – 교수/학생 정보를 등록, 검색, 수정, 삭제, 조회할 수 있는 기능
 – 강좌/강의를 등록, 검색, 수정, 삭제, 조회할 수 있는 기능
 – 수강 신청, 성적 등록, 성적 조회, 출석부 조회 기능
 – 로그인, 로그아웃, 암호 변경 기능

  * 비기능적 요구사항 : 동작/행위와 관련된 제약사항
 – 성능
 – 신뢰도
 – 사용 편의성
 – 유지 보수성

   ** 비기능적 요구사항

  * 성능
 – 정해진 특정 시간 내에 결과가 나와야 한다는 조건
 – ex) “학번, 이름을 입력한 후에 검색 명령을 내리고 검색 결과를 2초 이내에 화면에 보여 주어야 한다.”
 – 설계 활동의 중요한 요소로 작용
 – ex) JDBC로 직접 데이터베이스 조작, 무상태 세션 빈 사용, 성능 향상을 위한 프로그래밍 기술 사용

  * 신뢰도
 – 오류가 발생하지 않으면서 시스템이 동작할 확률
 – ex) 항공기 제어 시스템, 미사일 추적 시스템 등의 실시간 시스템
 – 특별한 기술 사용

  * 사용 편의성
 – 사용자들이 얼마나 편리하고 쉽게 시스템을 사용할 수 있는가
 – ex) 효과적인 메뉴 체계 정의
 – ex) UI화면의 일관되고 효과적인 정의
 – ex) 도움말 온라인 제공

  * 유지 보수성
 – 얼마나 유지 보수를 쉬우면서 효율적으로 할 수 있는가의 정도
 – 설계 시 약속된 기능을 정확히 제공
 – 설계 시 유지 보수 측면 고려

   ** 요구사항 정의의 중요성

  * 요구사항 정의 활동의 산출물
 – 개발자들에게 구축할 시스템의 정보 제공
 – 개발할 시스템 파악(개발자)

  * 요구사항 정의 활동 개발자와 분석/설계 개발자가 다른경우
 – 산출물을 바탕으로 한 작업 진행
 – 정확성과 완전성이 중요함

  * 요구사항의 명확한 정의 이후 개발 진행

  * 결정된 요구사항에 대한 사용자와 개발자 간의 합의 필요

   ** 요구사항 정의 활동

 – 시스템이 제공할 기능과 범위 밖을 명확하게 구분
 – 시스템의 결계 결정

  ** 유스케이스 모델링

 – Ivar Jacobson에 의해서 제안
 – 요구사항 도출 및 기술에 사용
 – 액터 : 개발할 시스템 외부의 존재
 – 유스케이스 : 시스템 범위 안에서 개발될 시스템의 단위 기능

    *** 액터

  * 개발될 시스템과 상호 작용을 하는 모든 대상
 – 사용자 액터
 – 시스템 액터

  * 사용자 액터
 – 개발될 시스템의 기능을 이용하는 사용자

  * 시스템 액터
 – 개발될 시스템과 연동 되는 또 다른 시스템
 – ex) 신용 대출 시스템 : 신용 정보 제공 시스템
 – ex) 대학 정보 시스템 : 수강료 청구서 발급 시스템

   ** 액터 이름

  * 액터의 이름
 – 액터의 의미를 명확히 애해할 수 있는 단어 사용

  * 사용자 액터
 – 시스템 관점의 사용자 역할
 – ex) 교수, 학생, 학사 담당자, 수업 담당자
 – 역할 추측 가능한 구체적인 단어 사용

  * 시스템 액터
 – 해당 시스템의 이름 사용
 – 문제 기술서에 시스템의 이름이 명시되어 있음
 – ex) 수강료 청구서 발급 시스템, 신용 평가 시스템

   ** 액터 설명

  * 액터가 할 수 있는 일 기록
 – ex) 학사 담당자 : 교수 및 학생 정보를 관리한다.

   ** 액터의 특성

  * 개발될 시스템 범위 밖에 존재
 – 개발자가 개발할 범위가 아니라는 것.
 – ex) 대학 정보 시스템 : 수강료 청구서 발급 시스템

  * 역할을 나타내야 함
 – 구체적인 실제 사용자가 아님
 – 시스템의 관점에서 바라본 그 사용자의 역할
 – 한 명이 두 개 이상의 역할을 하는 경우 : 대응되는 각각 사용자 액터를 정의
 – ex) 1명(도서 관리, 학생/교수 관리) : 사서, 학사 담당자 액터

   ** 액터 찾기

  * 질문 :  누가 개발될 시스템의 주요 기능을 이용하는가?
 – 문제 기술서 활용
 – 학적과의 학사 담당자는 학생 및 교수 정보를 관리해야 한다.
 – 수업 담당자는 새로운 강좌를 등록할 수 있다.
 – 학생을 수강 신청을 온라인 상으로 직접 할 수 있다.
 – 교수는 매 학기마다 자신이 강의하는 강좌를 신청한 학생 명단을 확인할 수 있다.

  * 질문 : 누가 이 시스템을 통해서 자신의 업무를 지원 받을 수 있는가
 – ex) 대학 정보 시스템 : 학사 담당자

  * 질문 : 누가 시스템이 만들어 낸 결과에 관심을 가지는가?

  * 질문 : 누가 시스템이 잘 운영될 수 있도록 유지 보수 및 관리를 하는가?
 – Primary actor : 시스템 본연의 기능을 이용하는 사용자
 – Secondary : 시스템의 유지 보수 기능을 이용하는 사용자
 – 음료수 자동 판매기 : 청소 및 관리자
 – 현금 자동 인출기 : 유지 보수 담당자
 – 시스템이 유지 보수 기능을 제공하지 않으면 유지 보수 담당자는 액터로 표기될 수 없음

  * 질문 : 개발할 시스템과 연동되는 다른 시스템에는 어떤 것이 잇는가?
 – 시스템 액터를 찾을 때 유용
 – ex) 대학 정보 시스템 : 기존에 존재하는 수강료 청구서 발급 시스템

프로그램 작성 방식

   ** 구조체와 클래스

  * 프로그램 작성 방식
 – 구조화되지 않은 프로그래밍
 – 절차식 프로그래밍
 – 모듈식 프로그래밍
 – 객체지향 프로그래밍

  * 구조체 VS 클래스

   ** 구조화되지 않은 프로그래밍

 – 메인 프로그램 속에 모든 것이 포함된 프로그램
 – C나 C++의 경우 프로그램 전체가 main 함수 하나로 작성된 경우

   ** 절차식 프로그래밍

 – 메인 함수 외에 여러 개의 함수로 구성
 – 프로그래밍 초기에 C만으로 코드를 작성할 때 효율적

   ** 모듈식 프로그래밍

 – 메인 함수 외에 여러 개의 함수로 구성
 – 각각의 모귤은 메인 함수와 관계를 가지며, 각각 별개의 객체로 존재

   ** 객체지향 프로그래밍

 – 메인 함수 없이 여러 개의 객체로 구성
 – 각각의 객체는 생성하고 소멸하는 일을 자체적으로 담당
 – 같은 종류의 객체가 여러 개 존재 가능
 – 메인 함수의 관리하에 데이터를 관리하고 처리하는 것이 아니라 객체들 간에 메시지가 교환

   ** 비 구조체

 – ex) 이름, 나이, 주민등록번호 등을 기록하는 신상카드의 코드화
 – 각가의 배열을 만들어 저장
+ 복잡하다.
+ 배열간에 서로 연결된 정보라는 어던 신호도 존재하지 않음.

   ** 구조체

 – 관리를 쉽게 하기 위해 구조체 도입
 – 구조체 : 다루고 싶은 데이터를 하나의 덩어리로 묶어주는 것.

   ** 클래스

 – 클래스 : 구조체와 같이 단순히 데이터를 묶어주는 것에 만족하지 않고 객체지향 프로그래밍의 특성을 살린 개념
 – Abstraction : 실제 상황으로부터 프로그램내에서 이용하는 모델을 얻어내는 것.
 – ADT(Abstract Data Type) : 사람자체가 아닌 사람의 몇가지 특징만을 뽑아 낸 모델
 – C++에서 사용하는 클래스라는 개념이 ADT의 개념
 – 클래스 : 여러 개의 데이터(abstract data structure)와 그 데이터를 사용하는 함수들(Operation)로 구성