본문 바로가기

보안

보안기사 - 시스템 문제편

Windows Server 운영체제에서 사용자 계정관리방식은 워크그룹 방식도메인 방식이 있으며, 로컬 사용자 계정은 %SystemRoot%\System32\config\SAM에 저장되고 있고, 도메인 방식은 Active Directory 데이터베이스에 저장된다

윈도우 OS 이벤트 로그
윈도우 OS는 기본적으로 시스템을 관리할 수 있는 다양한 유틸리티들을 제공하는데, 그 중 이벤트 뷰어는 로그를 조회하고 관리할 수 있는 도구이다.

  • 응용프로그램 로그
    응용프로그램이 남기는 다양한 이벤트가 저장
    어떤 상황에 어떤 로그를 남길지는 해당 응용프록램을 개발한 개발사에 의해 결정
    application.evtx 파일에 저장
    Application error, Start service, Add/Del member in group
  • 시스템 로그
    윈도우 운영체제의 구성요소가 기록하는 로그
    운영체제가 시작될 때 장치 드라이버가 로드되지 않는 여부나 시스템 서비스의 시작, 오류 등의 이벤트를 저장
    system.evtx 파일에 저장
    System start/halt, RDP(Remote Desktop Protocol) connection
  • 보안 로그
    로그온 시도 및 로그온 성공 또는 실패, 사용자 계정의 추가 및 삭제, 사용자 권한 변경 등의 시스템 보안 관련 이벤트가 저장
    어떤 상황에 어떤 로그를 남길지는 감사 로그 설정에 의해 결정
    security.evtx 파일에 저장
    Attempt login, Login Success/Fail, Network Login, Create Process, Service install, Start Windows, Off the Windows

윈도우즈 감사정책

  • 시스템 이벤트 정책
    시스템 시작 또는 종료, 보안 로그에 영향을 미치는 이벤트 등을 감사할지 여부 결정
  • 계정 로그온 이벤트 정책
    도메인 컨트롤러에서 도메인 사용자 계정을 인증할 때마다 감사할지 여부 결정
  • 프로세스 추적 정책
    프로세스 생성, 프로세스 종료, 핸들 복제 및 간접 개체 액세스 같은 프로세스 관련 이벤트를 감사할지 여부 결정

비트로커 (BitLocker)
마이크로소프트사의 윈도우 시스템에서 하나 이상의 볼륨(드라이브)을 암호화하는 기능으로 TPM(Trusted Platform Module)을 사용하여 초기 시작 구성 요소의 무결성을 검사하는 암호화 방식
노트북 분실, 디스크 분리 후 중요 데이터 탈취 등의 이유로 기밀 자료가 유출될 상황을 대비한 디스크 암호화 기술
TPM이란 하드웨어와 SW, 펌웨어 인증을 검사하는 전용 칩. 승인 없는 변경을 감지했을 경우 PC는 제한된 모드로 부팅되어 잠재적 공격자의 악의적인 행위를 차단

윈도우 net 명령어

  • net    user    algisa    algisaPW    /ADD
    계정명'algisa', 비밀번호 'algisaPW'인 계정 생성
  • net    user
    계정 리스트 확인
  • net    localgroup    administrators    algisa    /ADD
    algisa 계정을 administrators 그룹에 추가
  • net share C$ /delete
    C 드라이브의 기본 공유를 제거하기 (공유 이름이 C$ 일 때)

보안 운영체제 (Secure OS)

  • Secure OS
    컴퓨터 운영체제 상에 내재된 보안상의 결함으로 발생 가능한 각종 침해로부터 시스템을 보호하기 위해 기존의 운영체제 내에 보안 커널을 추가로 이식한 운영체제

    - 보안커널 : 주체, 객체 간의 모든 접근과 기능을 중재하는 보안 절차를 구현한 하드웨어, 펌웨어, 소프트웨어
    - 참조모니터 : 보안커널의 가장 중요한 부분. 주체, 객체간의 접근통제 기능을 수행하는 핵심 모듈

  • 참조모니터 (reference monitor)
    보안 운영체제에서 주체(프로세스, 사용자)와 객체(파일, 프로그램) 사이의 정보 흐름을 감시하는 보안모듈
    주체와 객체의 접근 권한을 정의한 SKDB(Security Kernel Database)를 참조하여 보안정책을 수행
    주체와 객체 사이에 정보 흐름의 통로가 되는 시스템 콜을 감시
    운영체제의 커널과 독립적으로 동작할 수 있도록 모듈 형태로 구현

인터럽트에 의한 입출력은 프로그램에 의한 입출력의 단점을 개선하기 위한 방식
CPU가 계속해서 입출력 사애를 검사하고 있는 것이 아니라 입출력 장치가 데이터를 전송할 준비가 되면 CPU에 인터럽트를 발생시킴
따라서 CPU가 다른 프로그램을 수행하고 있는 동안에 인터페이스가 외부소자를 모니터.
CPU가 인터럽트 신호를 받으면 프로그램 카운터(PC 레지스터)에 있는 복귀주소를 메모리 스택에 저장한 다음, 입출력 전송을 위한 인터럽트 서비스 루틴(인터럽트 핸들러)으로 제어를 이동

유닉스 시스템의 세가지 핵심 컴포넌트
참고 : https://gusudss.tistory.com/4

  • 커널
    유닉스 운영체제의 핵심 중의 핵심. 메인 메모리에 상주하여 컴퓨터 자원 관리

  • 커널과 사용자 간의 인터페이스를 담당. 사용자 명령의 입출력을 수행하며 프로그램을 실행
  • 파일시스템
    디렉터리, 서브 디렉터리, 파일 등의 계층적인 트리구조를 제공
    1. Boot block
      운영체제를 부팅하거나 초기화하기 위한 bootstrap 코드를 담고 있음
    2. Super block
      해당 파일시스템을 관리하기 위한 정보를 담고 있음
    3. inode list
      해당 파일시스템의 파일들에 대한 속성정보를 담고 있는 inode 구조체 리스트
    4. data blocks
      실제 파일의 내용(데이터)이 저장

MAC time
침해사고 발생시, 피해 시스템의 로그에 대한 무결성 확인을 위해 타임라인 분석시 활용 가능

mtime(last Modify Time) : 파일의 내용이 마지막으로 수정된 시간
atime(last Access Time) : 파일에 마지막으로 접근한 시간
ctime(last Change Time) : 파일의 속성정보(소유자, 접근권한 등)가 마지막으로 변경된 시간


로더
어떤 프로그램을 실행하기 위해 해당 목적 프로그램을 메모리에 적재하고 배치주소를 옮기는 프로그램. 메모리할당, 링크, 재배치 등의 기능을 수행

링커
프로그램을 실행가능한 상태로 만들기 위해 목적 모듈 간의 상호 참조를 해결하고, 여러 개의 목적 모듈을 하나로 만들기 위해 사용되는 프로그램

컴파일
사용자가 작성한 소스 프로그램을 컴퓨터가 이해할 수 있는 기계어로 번역하는 과정. 과정이 종료되면 기계어 코드로 변환된 목적 프로그램이 생성

세션 타임아웃 설정하기
리눅스 시스템의 '/etc/profile'에 TMOUT=600; export TMOUT를 설정하면, 지정한 시간(초) 동안 접속된 상태로 아무런 작업도 수행하지 않을 경우 세션/연결을 종료

init 프로세스
시스템 부팅 과정이 마지막에 수행되어 /etc/inittab 파일을 읽어 시스템의 런 레벨에 따른 초기화 작업 수행
고아 프로세스를 위한 대리모 역할 수행
pid가 1

좀비 프로세스 발생 이유
좀비 프로세스가 지속적으로 발생하는 이유는 부모 프로세스의 프로그램 오류로 인하여 종료한 자식 프로세스의 종료 시그널 처리를 적절하게 수행하지 않았거나 커널 오류에 의한 비정상적인 상태일 가능성이 매우 높다

출력 방향 재지정(Output Redirection)
표준출력(STDOUT), 표준에러(STDERR)를 구분하여 재지정 가능

  1. 표준출력 재지정하기
    ls -l 1>> output.log
    ls -l >> output.log
  2. 표준에러 재지정하기
    ls -l 2>> error.log

파일 디스크립터(숫자)를 생략하면 표준출력(1)을 재지정하는 것

'>'은 출력 파일 존재 시 그 내용을 지우고 새롭게 출력, '>>'는 기존 내용에 추가하여 출력


process
관리하는 최소 단위의 작업으로 주기억장치에 저장된 프로그램, 즉 실행중인 프로그램

CPU 스케줄링
시스템은 프로세스에게 CPU를 할당해야 하는데, CPU는 한 순간에 한 가지 작업만이 가능하기 때문에 이를 분할하여 여러 프로세스에게 나누어 주어야 한다
시스템의 성능을 높이기 위해 CPU 사용 순서를 결정하기 위한 정책을 스케줄링이라 한다
선점형과 비선점형이 있다

  • 선점 스케줄링
    한 프로세스가 CPU를 차지하고 있을 때 다른 프로세스가 현재 프로세스를 중지시키고 자신이 CPU 차지할 수 있다
    시분할 시스템에 유용
    선점으로 인한 오버헤드 발생
    RR(Round-Robin), SRT(Shortest-Remaining-Time), MLQ(MultiLevel Queue), MFQ(Multilevel Feedback Queue)
  • 비선점 스케줄링
    한 프로세스가 CPU를 할당받으면 다른 프로세스는 CPU를 그 프로세스로부터 뺐을 수 없다
    짧은 작업이 긴 작업을 기다리는 때가 종종 발생
    FIFO(First-In-First-Out), SJF(Shortest-Job-First), HRN(Highest Response-ratio Time)

Context는 보통 특정 프로세스와 관련된 정보들의 총집합을 의미
Context Switching은 실행 상태의 프로세스를 다른 프로세스로 교체하기 위하여 그들의 context를 각각 저장하고 재적재하는 경우를 의미

PCB(Process Control Block)
OS가 프로세스를 관리하는데 필요한 모든 정보를 유지하는 자료구조 테이블
프로세스가 생성할 때 만들어지며, 모든 프로세스는 각각 고유한 PCB (= process descriptor)를 가짐
OS가 CPU를 다른 프로세스에 넘겨주고자 할 때, 프로세스에 관한 모든 정보를 PCB에 저장시키고나서 다시 실행하고자 할 때에는 PCB에 보관된 정보를 재사용(context switching)
수행이 완료된 프로세스는 해당 PCB도 함께 삭제, PCB의 내용은 프로세스의 상태 변화가 일어났을 때 프로세스 관리자가 그 내용을 변경
프로세스 고유 번호, 문맥 저장 영역, 프로세스 현재 상태, 프로세스 우선순위, 프로세스 할당 메모리 정보 등을 관리

프로세스 상태

  • Ready
    프로세스가 CPU를 사용하여 실행될 수 있는 상태로, CPU 할당을 대기하는 상태
  • Running
    프로세스가 CPU를 차지하여 실행 중인 상태
  • Blocked
    어떤 사건이 발생하기를 기다리는 상태
    프로세스가 CPU를 차지하고 실행되다가 입출력처리와 같은 사건이 발생하게 되면 CPU를 양도하고 입출력 처리가 완료될 때까지 대기 큐에서 대기하는 상태
  • Terminated
    프로세스가 CPU를 할당받아 주어진 시간 내에 완전히 수행을 종료한 상태
    종료된 프로세스는 시스템에서 제거되고 그 프로세스와 관련된 PCB도 삭제

Dead Lock
상호 배제에 의해 나타나는 문제점.
둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상

  • 4가지 필요조건
    1. 상호배제 (mutual exclusion)
      한 번에 한 프로세스만 자원을 사용할 수 있으며 다른 프로세스가 그 자원을 요구하면, 자원을 요구한 다른 프로세스는 자원이 해제될 때까지 임계구역 밖에서 대기
    2. 점유와 대기 (hold & wait)
      프로세스가 다른 자원을 요구하면서, 자신에게 할당된 자원을 해제하지 않을 때 발생
    3. 비선점 (non-preemption)
      프로세스에게 일단 할당된 자원을 모두 사용하기 전에는, 그 프로세스로부터 도중에 회수 불가
    4. 환형 대기 (circular wait)
      프로세스와 자원들이 원형을 이루며, 각 프로세스는 자신에게 할당된 자원을 가지면서 상대방 프로세스의 자원을 상호 요청하는 경우
  • 해결방안
    1. 예방
    2. 회피
    3. 탐지
    4. 복구

Mutual Exclusion(상호배제)
둘 이상의 프로세스 또는 스레드가 동일한 자원에 동시에 접근하는 것을 차단하기 위한 동기화 기법(자원의 접근 순서를 제어)
상호 배제의 방식은 프로세스가 특정 자원을 사용하려고 할 때 lock을 획들한 후 사용하고 사용이 끝나면 lock을 해제하여 다른 프로세스가 사용 가능하도록 하는 방식.
접근 순서에 따라서는 프로세스 간에 서로 락이 걸린 자원을 무한정 대기하는 교착상태(dead lock)이 발생할 수 있는 문제가 있다

Thrashing (스래싱)
프로세스의 처리시간보다 페이지 교체시간이 더 많아지는 현상
페이지 부재(page fault)로 프로세스의 실행에 필요한 수만큼 충분한 페이지를 갖지 못해 실행 중에 계속 페이지를 교체하면서 발생
다중 프로그래밍 정도가 증가할수록 CPU 이용률은 증가하지만, 최대지점 이후부터는 스래싱이 발생하고 CPU 이용률은 급격히 감소

  • 해결
    각 프로세스들에게 충분한 페이지 프레임을 할당할 수 있게 다중 프로그래밍의 정도를 낮추거나, 주기억장치 내에 워킹세트를 유지

Locality (구역성)
어떤 프로세스의 계산 영역은 지역화된다는 이론
프로세스들은 기억장치 내의 정보를 균일하게 액세스 하는 것이 아니라, 어느 한 순간에는 특정 부분을 집중적으로 참조한다

  • 시간 구역성(temporal) : 최근 참고된 기억장소가 계속 참고될 가능성이 높다
  • 공간 구역성(spatial) : 근처의 기억장소가 계속 참고될 가능성이 높다
    => 캐시 메모리, 연관기억장치의 성립 이유가 되고, working set, LRU 등의 페이지 교체 기법을 뒷받침


Working Set (워킹세트)
실행 중인 프로세스가 일정 시간 동안 참조하는 페이지들의 집합
한 프로그램이 효율적으로 수행되려면 그 프로그램의 워킹세트가 주기억장치 내에 유지되어야 함
그렇지 않으면 그 프로그램이 보조기억 장치로부터 계속 페이지를 요구하게 되어 스래싱 현상 발생

리눅스 서버의 프로세스 관리 위한 명령어

  • top
    시스템의 전체적인 운영상황을 모니터링할 수 있음
    시스템의 CPU, memory, disk 이용 상황과 전체 프로세스의 운영상황 실시간으로 모니터링 가능
  • pstree
    현재 실행중인 프로세스들의 부모-자식 관계를 트리구조로 보여주는 명령어
    프로세스의 상호관계를 파악할 때 유용
  • renice (nice)
    프로세스의 실행 우선순위를 조절하기 위하여 NICE값을 변경하는 명령어
  • vmstat
    시스템의 프로세스 정보, 메모리 사용량, CPU사용률 등의 정보 출력
    CPU, 메모리, 디스크I/O 등 다양한 자원에 대한 모니터링 지원

Swap space
실제 메모리가 부족할 경우 디스크 부분을 마치 메모리처럼 사용하는 공간

페이지 교체 알고리즘

  • LRU (Least Recently Used)
    널리 사용되는 방법으로 한 프로세스에서 사용되는 각 페이지마다 카운터를 두어 현시점에서 가장 오랫동안 사용되지 않은 페이지를 제거하는 방법
    오랜 기간 동안 참조되지 않았기 때문에 앞으로도 사용되지 않을 것이라는 가정에 근거
  • LFU (Least Frequently Used)
    가장 사용 횟수가 적은 페이지를 교체
  • NUR (Not Used Recently)
    최근에 사용하지 않은 페이지를 교체
  • FIFO (First In First Out)
    가장 먼저 적재한 페이지부터 교체


UNIX/Linux 시스템의 디렉터리 구조

디렉터리 내용
/ root 디렉터리나 최상위 디렉터리
/etc 시스템 설정 파일 저장
/dev 특수 파일(장치파일) 저장
/usr/bin 디폴트 사용자 명령어 저장
/usr/include C언어 라이브러리 헤더 파일 저장
/usr/lib C언어 라이브러리 저장
/usr/sbin 시스템 관리 명령어 저장
/home 사용자 홈 디렉터리 저장
/tmp 임시 파일 저장
/var 시스템 로그 저장



저널링 (Jounrnaling)
Ext2 파일시스템에서 사용하는 fsck(file system Check)의 시간이 오래 걸리는 단점 보완한 파일시스템 복구 기술
복구 시간을 단축하기 위해 데이터를 디스크에 쓰기 전에 로그에 데이터를 남겨 시스템의 비정상 종료 시에도 로그를 사용해 fsck보다 빠르고 안정적인 복구 기능 제공
Ext2 파일 시스템에서는 파일 시스템을 복구하기위해 슈퍼블록, 아이노드 등을 모두 검사해야 했지만 저널링 기술이 도입된 Ext3파일 시스템의 경우에는 파일을 실제로 수정하기 전에 우선 로그에 수정된 내용을 저장하기 때문에 로그만을 검사하여 속도와 복구 안정성을 향상


버퍼 오버플로우 공격
연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생
버퍼 오버플로우가 발생하면 프로그램의 오작동을 유발하거나 악의적 코드를 실행하여 공격자가 프로그램을 통제할 수 있는 권한을 획득

  • 예방책
    1. 스택가드
      메모리 상에서 프로그램의 복귀주소와 변수 사이에 특정 값(Canary Word)을 저장해 두었다가 그 값이 변경되었을 경우를 오버플로우로 가정하여 프로그램 실행을 중단
    2. 스택쉴드
      함수 시작시 리턴 주소를 Global RET라는 특수 스택에 저장해두었다가 함수 종료 시 저장된 값과 스택의 RET 값을 비교해 다를 경우 프로그램 종료
    3. ASLR (Address Space Layout Randomization)
      메모리 공격을 방어하기 위해 주소 공간 배치를 난수화하는 기법
      실행시마다 메모리 주소를 변경시켜 악성코드에 의한 특정주소 호출을 방지
    4. 프로그램 개발시 버퍼 오버플로우에 취약하지 않은 함수(strncpy 등)를 사용하거나 입력값에 대한 적절한 크기 검증하기

스택 버퍼 오버플로우 공격
스택은 함수 처리를 위해 지역변수 및 매개변수가 위치하는 메모리 영역
스택에 할당된 버퍼들이 문자열 계산 등의 의해 정의된 버퍼의 한계치를 넘는 경우 버퍼 오버플로우 발생

공격자에 의해 버퍼 오버플로우가 발생하여 스택의 RET 영역이 변조되면 악성코드의 실행이 가능
특히 root 소유의 SUID 설정 프로그램에 버퍼 오버플로우 취약점이 존재하면 root 권한으로 악성 프로그래밍 실행될 수 있는 위험 존재

  • 대책
    운영체제의 커널 패치
    함수로부터 복귀하기 전에 스택의 무결성 검사
    스택에서의 쓰기 권한 제한
    스택에서의 프로그램 실행 금지
    가능성이 있는 SUID 프로그램 제한
[stack buffer overflow]


힙 버퍼 오버플로우 공격
힙에 할당된 버퍼들에 문자열 등이 저장되어질 때 최초 정의된 힙의 메모리 사이즈를 초과하여 저장되는 경우 발생
이를 이용해 악의적 코드를 실행하여 공격하는 기법

힙 (heap)
메모리 영역 중 프로그래머가 필요시 할당하고 해제하여 동적으로 관리할 수 있는 영역 ~ 효율적 관리가 가능

보안적 관점에서, 힙은 linked-list 구조이므로 스택과 달리 모든 변수가 연속된 메모리 공간에 할당되는 것이 아니기 때문에 소스코드 및 메모리 분석을 하더라도 변수의 기능이나 주소를 쉽게 예측하기 어려워 상대적으로 버퍼 오버플로우 빈도는 낮다


포맷 스트링 공격
출력문에서 올바르지 못한 방법을 악용하여 크래커들이 실제 메모리 번지를 공격하여 원하는 값으로 변경하거나 시스템의 루트 권한을 획득하는 공격
printf() 같은 포맷 스트링을 인자로 하는 함수를 사용할 때 포맷 스트링을 지정하지 않고 사용자 입력을 통해 포맷 스트링이 결정된다면 공격자는 이를 조작하여 메모리 내용을 참조하거나 특정 영역의 값을 변경할 수 있다
=> 포맷 스트링을 함수의 입력 파라미터로 직접 사용하는 것이 아니라 이를 지정하여 사용해야 한다!


레이스 컨디션 공격
레이스 컨디션은 둘 이상의 프로세스나 스레드가 공유자원에 동시에 접근할 때 접근하는 순서에 따라 비정상적(원치 않는) 결과가 발생하는 조건/상황
실행되는 프로세스가 임시파일을 만드는 경우 악의적 프로그램을 통해 그 프로세스의 실행 중에 끼어들어 임시파일을 심볼릭 링크하여 악의적 행위를 수행하는 공격
피해 프로그램에서 파일을 먼저 생성하면 공격은 실패

  • 대응방안
    가능하면 임시파일 만들지 않기
    동일한 파일 이미 존재하면 파일 생성 또는 쓰기 금지
    사용하고자하는 파일에 링크가 걸려 있으면 실행 중단
    umask 최하 022 정도로 유지하여 임시로 생성한 파일이 공격자에 의해 악의적으로 삭제되지 않도록 한다


심볼릭 링크 파일 생성하기
ln    -s    source_file    target_file
source_file을 원본으로 하는 심볼릭 링크파일 target_file을 만드는 과정


chown (chgrp)
파일 또는 디렉터리의 소유자/그룹를 수정하는 명령어
chmod
기존 파일의 접근권한을 변경할 때
umask
새롭게 만들어질 파일의 권한을 설정하기 위한 명령
명령 시 지정한 8진수는 새로 만들어질 파일의 기본접근권한에서 제거할 권한을 명시

  • 기본 접근 권한 : 644 (파일), 755 (디렉토리)


SUID, SGID
리눅스 시스템에서 4자리 퍼미션 값이 4000인 SUID(setuid)와 2000인 SGID(setgid)는 파일을 실행할 때 그 파일의 소유자 또는 그룹의 권한으로 실행되도록 하는 것
만일 어떤 프로그램이 SUID가 설정되어 있으면 user 접근권한의 execute항목(x)이 s글자로 바뀌어 표시
만일 어떤 프로그램이 SGID가 설정되어 있으면 group 접근권한의 execute항목(x)이 s글자로 바뀌어 표시

  • SUID, SGID 설정하기
    • ex) 777 접근권한 test 파일에 SUID 설정하기
      chmod u+s test
      chmod 4777 test
    • ex) 777 접근권한 test 파일에 SGID 설정하기
      chmod g+s test
      chmod 2777 test

Saved UID
프로세스의 권한을 낮게 변경했다가 원래대로 복구할 때 사용되는 UID
프로세스의 권한이 낮게 변경될 때, 변경 전의 Effective UID가 Saved UID에 저장됨
이후, 낮은 권한이 원래의 권한으로 복귀될 때 Saved UID가 Effective UID에 저장

* setuid(uid_t uid) 함수
호출한 프로세스의 EUID를 변경
단, 호출한 프로세스의 EUID가 0일 경우 RUID와 SUID를 모두 변경

Sticky bit
공유 디렉터리에서 파일의 소유자만이 해당 파일을 삭제하거나 이름 변경을 할 수 있게 설정하는 특수권한
모든 사용자가 자유롭게 파일을 생성할 수 있지만 소유자 또는 root 만이 파일 삭제 및 파일명 변경이 가능
sticky bit가 설정된 /tmp 디렉터리 파일의 권한은 'drwxrwxrwt'이며, otehrs 접근권한의 execute항목이 't'인 것이 sticky bit를 의미

root 소유로 SUID 권한 부여한 파일 탐색하기
find    /    -user    root    -perm    -4000    -print


PAM(Pluggable Authentication Module)
리눅스 시스템에서 사용되는 각종 어플리케이션 인증을 위해 제공되는 다양한 인증 라이브러리
리눅스용 프로그램 개발 시 인즈웁분을 독립적으로 개발할 수 있고 필요에 따라 관리자에 의해 인증체계를 선택적으로 가져갈 수 있어 중앙통제가 가능
프로그램 개발시 인증모듈을 별도로 개발하지 않고 플러그인 방식의 공유 라이브러리를 사용하여 인증을 할 수 있음
보안과 인증을 위한 공통 프레임워크로서 라이브러리들을 제공하는 모듈
사용자 정보의 저장방법과 관계없이 프로그램들이 투명하게 사용자를 인증하고 중앙통제가 가능


/etc/services
인터넷 상에서 사용하는 다양한 서비스에 대한 포트, 프로토콜 정보를 정의해 놓은 파일
IANA 기구를 통해 관리
서비스와 이에 대응하는 포트번호를 가지고 있는 파일

/etc/protocols
인터넷 상에서 사용하는 프로토콜과 프로토콜 식별 번호를 정의해 놓은 파일
IANA 기구를 통해 관리


TCP-Wrapper
inetd 데몬과 클라이언트 사이에서 미리 정의되어있는 서비스들에 대한 접근통제목록을 이용하여 서비스의 허용 및 거부, 로그를 기록할 수 있는 보안강화 도구

  • 장점
    존재하는 SW나 설정파일을 바꿀 필요가 없고 CS 응용 프로그램 사이의 실질적인 통신에 부하를 주지 않음
  • 원리
    hosts.allow 파일과 hosts.deny 파일을 통해 들어오는 패킷의 출발지 IP와 접근통제목록의 조건을 비교하여 서비스의 허용 및 거부를 수행
  • /etc/inetd.conf 파일 변경
    TCPwrapper를 사용하면 /etc/inetd.conf 파일에서 실행경로를 /usr/sbin/tcpd로 설정해야 함

xinetd 설정 예시

service telnet {
    disable            = no
    flags            = REUSE
    socket_type        = stream
    wait            = no
    user            = root
    server            = /usr/sbin/in.telnetd
    log_on_failure    += USERID
    only_from        = 192.168.10.0/24        //192.168.10.0/24 IP 대역의 접속만 허용
    no_access        = 192.168.10.22            //192.168.10.22의 접속은 허용하지 않음
    access_time        = 9:00-18:00            //서비스를 오전 9시부터 오후 6시까지만 접속 가능
    cps                = 20 5                    //초당 연결 개수를 20개로 제한하고, 이를 초과시 5초간 일시 중지 후 다시 서비스 개시
    instances        = 5                        //최대 동시 접속 수는 5 (동시에 서비스할 수 있는 서버의 최대 개수)
    per_source        = 10                    //동일 출발지 IP 클라이언트의 최대 서비스 연결 개수 10개로 제한
}



Unix/Linux 로그

  • utmp(x)
    시스템에 현재 로그인한 사용자들에 대한 상태 기록
    'who', 'w', 'finger' 명령으로 내용 확인

  • wtmp(x)
    사용자가 로그인 또는 로그아웃할 때마다 그 정보가 기록, boot/shutdown 정보 기록
    'last' 명령으로 내용 확인

  • btmp (linux), loginlog (unix)
    로그인 실패정보 기록
    btmp는 'lastb' 명령으로 내용 확인, loginlog는 텍스트이고 5번 이상 실패한 기록

  • acct/pacct
    시스템에 로그인한 모든 사용자가 로그아웃할 때까지 입력한 명령어와 터미널 종류, 프로세스 시작 시간 등을 저장
    'lastcomm' 명령으로 내용 확인

  • lastlog (Unix)
    가장 최근에(마지막에) 성공한 로그인 시간 등의 정보를 바이너리 형태로 저장
    'lastlog' 명령으로 내용 확인

  • sulog (unix)
    su 명령어 사용한 결과를 저장
    linux 계열은 /var/log/secure 로그 파일에 su 명령 사용 결과 남음

  • xferlog (linux)
    FTP 로그파일로 proftpd, vsftpd 등 FTP 데몬들의 서비스 내역을 기록
    FTP로 로그인하는 사용자에 대한 내역, 파일을 업로드/다운로드한 내역 기록

  • /var/log/messages (linux)
    리눅스 시스템의 가장 기본적인 시스템 로그 파일
    시스템 운영에 대한 전반적인 메시지를 저장
    주로 시스템 데몬들의 실행상황과 내역, 사용자들의 접속 정보, TCPWrapper 접근제어 정보 등을 저장

  • /var/log/secure (linux)
    사용자들의 원격접속 즉, 원격로그인 정보를 기록. 서버보안에 아주 민감하고 중요한 파일
    tcp wrapper(xinetd)의 접속제어에 관한 로그파일로 언제, 누가, 어디에서, 어떻게 접속했는가에 대한 로그를 기록
    시스템의 불법 침입 등이 있었다고 의심이 될 때는 반드시 이 로그를 확인해야 함
    주로 sshd 데몬과 su 관련 실행, 그리고 telnet 관련 원격접속 실행내용들이 기록되는 로그 파일

  • /var/log/boot.log (linux)
    리눅스가 부팅될 때 파일 시스템에 대한 체크와 서비스 데몬들의 실행 상태를 기록하고 있는 로그 파일로 성공/실패 여부 확인 가능

로그 실시간으로 모니터링 하기
tail  -f  /var/log/secure
tail  -f  /var/log/messages


syslogd
리눅스에서 시스템로그, 보안로그, 메일로그, 부팅로그 등 시스템의 다양한 로그들을 생성/저장하는 데몬
/etc/syslog.conf 파일로 설정 변경 (저장위치, 내용 등)
종류별로 /var/log 디렉터리 아래에 생성

syslog 로그 수준
emerg - alert - crit - err - warning - notice - info - debug

syslog 프로토콜
분삼 시스템 및 프로세스의 로그를 중앙 수집기로 보내 로깅과 분석을 수행하기 위한 UDP 기반의 인터넷 표준 프로토콜

syslog 보안 대책
syslog는 기밀성, 무결성, 가용성 등 정보보호 특성 고려하지 않고 개발되었다
따라서 UDP를 통해 로그를 전송할 때 공격자가 syslog 메시지를 모니터링하여 중요 정보를 알아낼 수 있다
때문에 RFC 3195에서는 다음과 같은 보안 기능 제공을 권고한다

  • TCP 를 이용해 로그를 전송하여 신뢰성을 보장
  • syslog 메시지 전송 시 기밀성 보장을 위해 syslog 서버 및 log 수집대상 서버의 IP를 제외한 payload를 보호할 수 있는 BEEP 이용

syslog 예시
원격 로그 서버(192.168.133.20)를 구축하여 관리 대상 장비의 syslog를 로컬 및 원격 로그 서버에 모두 남기려 할 때, 관리 대상 장비와 원격 로그 서버에 설정할 것

[관리 대상 장비 - /etc/syslog.conf 내용 일부]
authpriv.*            /var/log/secure
authpriv.*            @192.168.133.20            //원격 로그 서버로 인증관련 로그를 전송하도록 설정

[원격 로그 서버 - 방화벽(iptables) 설정]
#iptables -A INPUT -p udp --dport 514 -j ACCEPT        
//원격 로그 서버에 관리 대상 장비의 로그를 전송 받을 수 있도록 방화벽(iptables)설정



logrotate
리눅스 서버에서 생성된 로그 파일은 시간이 오래 지나면, 그 파일의 크기가 계속 커지게 되어 파일 시스템의 제한을 벗어나게 된다.
때문에 효율적 관리를 위해 logrotate를 사용

로그 파일의 순환, 압축 기능을 제공
시스템에 있는 모든 로그 파일들을 관리할 수 있으며, 적당한 크기로 보관, 삭제, 압축, 메일로 전송하는 등의 작업이 가능
cron을 이용해 주기적으로 작업 수행 가능

설정 파일은 logrotate.conf
적용할 프로세스의 개별 설정파일은 /etc/logrotate.d 디렉터리에 위치
(daily, weekly, monthly, yearly -> 주기 설정)


root 원격접속 금지 설정

(telnet의 root 접속 차단)

OS 점검 파일 및 방법
SunOS(Solaris) /etc/default/login 파일
CONSOLE=/dev/consle
AIX /etc/security/user 파일
rlogin = false
Linux /etc/securetty 파일
pts/~ 제거 또는 주석처리

* securetty 파일은 pam_securetty.so 모듈이 참조하는 파일

  • ssh의 root 접속 차단
    sshd_config 파일의 PermitRootLogin 옵션을 no로 설정


OS별 패스워드 정책 설정 파일
Linux : /etc/login.defs
SunOS(Solaris) : /etc/default/passwd
AIX : /etc/security/user
HP-UX : /etc/default/security


crtab 파일 작성하기
crontab -e를 입력하면 나오는 편집창에서 작업 등록

[분]    [시]    [일]    [월]    [요일]    [작업]

  • example
    0 18-23/2 * * 1-5 /usr/local/scripts/backup
    월요일부터 금요일까지 매일 저녁 6시부터 11시까지 2시간마다 /usr/local/scripts/backup 스크립트 실행시키기

    0 3 * * 0 /bin/rm -rf /home/* >/dev/null 2>&1
    cron 테이블에 '/bin/rm -rf'명령어를 사용해 /home 디렉터리 밑에 있는 모든 디렉터리와 파일을 삭제하기 위한 명령어. 매주 일요일 오전 3시에 동작하며 표준 출력은 /dev/null로 보내고 표준에러는 표준출력으로 재입력하여 등록한 것


명령어
passwd user1    games 계정 패스워드 설정하기
passwd -l user1    user1 패스워드 잠금 설정
passwd -u user1    user1 패스워드 잠금 해제
pwconv    패스워드를 shadow 형태로 저장하기

find /etc/apache/conf -mtime -10    마지막으로 수정한지 10일 이내의 파일 검색
find / -type f -perm -4000    전체 디렉터리에서 정규 파일 중 SUID가 설정된 파일 찾기
find / -type f -perm -2000    전체 디렉터리에서 정규 파일 중 GUID가 설정된 파일 찾기

find / -mtime -3    3일 이내에 생성되거나 내용이 수정된 파일 검사
find / -type f\( -perm -4000 -o -perm -2000 \) -exec ls -al {} \;
루트 디렉터리 이하 모든 일반파일에 대해서 SUID 또는 SGID가 설정된 파일을 검사.
SUID, SGID가 설정된 파일은 (특히 root 소유자, 소유그룹) 실행 시 소유자 권한 획득을 통해 시스템 장애나 추가적 공격에 활용될 수 있는 위험이 존재

find / -type f -nouser -o -nogroup -print
루트 디렉터리 이하 모든 일반 파일에 대해서 소유자와 소유그룹이 설정되지 않은 파일을 검사
현재 권한이 없는 자의 소유였거나 관리 소홀로 인해 생긴 불필요한 파일일 가능성이 높기 때문에 중요 파일인 경우 관리가 되지 않는 위험이 존재

find / -type f -perm -2 -print
루트 디렉터리 이하 모든 일반파일에 대해서 others에 쓰기 권한이 있는 파일(world writable 파일)을 검사
중요 파일인 경우 소유자나 소유그룹의 사용자가 아닌 기타 사용자에 의해 악의적으로 변경되어 시스템 장애나 추가적 공격에 활용될 수 있는 위험이 존재

crontab -l    crontab에 예약된 작업 확인하기
crontab -u sys -e    sys라는 사용자의 cron 테이블을 생성하기

lsof -u user    lsof 명령어는 유닉스에서 실행 중인 프로세스가 참조하는 파일의 정보를 보여주는 도구, -u user 옵션으로 user계정이 사용중인 프로세스를 확인

in.ftpd : 192.168.1.    192.168.1로 시작하는 IP주소에 대해 ftp 서비스가 가능
in.telnetd : .com EXCEPT www.abc.com    www.abc.com을 제외한 모든 .com 도메인의 호스트에 대해서 telnet 서비스가 가능하다
ALL EXCEPT in.telnetd : ALL    모든 호스트에 대해서 telent을 제외한 모든 서비스를 허용

finger 계정명    비인가자도 계정의 활동 정보를 파악할 수 있어 비활성화하는 것이 좋다. who나 w와는 달리 해당 계정의 홈 디렉터리, 사용 쉘, 네트워크 정보 등 세부적인 정보까지 확인 가능
-> /etc/xinetd.d/finger (xinetd의 finger 서비스 설정파일)에서 disable = yes로 설정한 후 xinetd 서비스를 재시작

lastlog -u algisa    algisa 계정의 최근 로그인 기록 추적
lastlog -t 5    5일 이내에 접근한 로그인 기록 추적

last reboot    wtmp 파일에 저장된 정보 중 시스템 재부팅 기록 추적

lastb    btmp 파일에 저장된 로그인에 실패한 기록 추적

lastcomm --command useradd    useradd 명령어를 사용한 사용자 정보와 시간 출력