본문 바로가기

자격증/정보보안기사 - 시스템보안

리눅스 서버 보안

728x90

리눅스 특징

다중 사용자

다중 작업

다중 처리기 : 한 개 이상의 CPU가 탑재되어 있는 경우 여러 개의 CPU를 지원

다중 플랫폼 : 리눅스는 여러 종류의 CPU를 지원

계층형 파일 시스템 : 루트를 기반으로 하위 디렉터리를 이룸

POSIX와 호환

우수한 네트워킹

가상 콘솔

가상 기억장치

 

리눅스 운영체제

-- 기능 --

태스크 관리자 : 태스크의 생성, 실행, 상태관리 등 서비스 제공

메모리 관리자 : 물리 메모리와 가상 메모리 관리

파일 시스템 관리자 : 파일 생성, 삭제, 접근제어, 슈퍼블록 관리 등 서비스 제공

네트워크 관리자 : 소켓, TCP/IP, 프로토콜 스택 관리 등 서비스

장치 관리자 : 디스크, 외부 인터페이스 등을 제어하는 드라이버 관리 서비스 제공

 

-- 핵심요소 --

커널 : 주기억장치에 상주 / 사용자 프로그램을 관리하는 운영체제의 핵심 / 프로세스, 메모리, 입출력, 파일 관리 수행

셸 : 명령어 해석기(번역기) / 시그널 처리 / 프로그램 실행 등

파일 시스템 : 여러 가지 정보를 저장 / 시스템 관리를 위한 기본 환경 제공 / 계층적인 트리 구조 형태

 

셸 환경변수

유용하게 사용될 변수 및 설정해야 하는 값을 설정해 두는 것

 

-- 환경변수 종류 --

SHELL : 사용자의 로그인 셸의 절대경로

HOME : 홈 디렉토리에 대한 경로 이름

PATH : 실행할 명령어를 찾을 경로

USER : 사용자 이름

LOGNAME : 로그인 할때 사용할 이름

TERM : 사용중인 단말기 설명

MAIL : 전자메일 우편함

HOSTNAME : 호스트 명

TMOUT : 이 시간동안 명령 등의 입력이 없으면 연결이 종료됨

 

-- 셸 종류 --

C Shell : .cshrc 파일에 필요한 환경 변수를 저장하여 사용자가 로그인 시 지정 명령들을 자동 수행

Bourne Shell : .profile 파일에 환경변수 저장( .cshrc 파일과 동일한 역할 )

Korn Shell : .kshrc에 환경변수 저장( .cshrc 파일과 동일한 역할 )

Bash Shell : C Shell과 Korn Shell의 특징을 결합한 것 / 리눅스에서 가장 많이 사용 / 명령 편집 기능

TC Shell : C Shell의 기능을 강화한 것

 

파일 종류

루트 파일 시스템 : 시스템 프로그램과 디렉토리들이 포함

일반 파일 : 프로그램 파일, 텍스트 파일, 데이터 파일 등이 있음

디렉토리 파일 : 파일명인 문자열과 inode 번호를 연결하는 부분

특수 파일 : 주변 장치에 연결된 파일로 하나 이상의 특수 파일을 가지고 있어야 함

 

리눅스 파일 시스템 구조

부트 블록 : 파일 시스템으로부터 리눅스 커널을 적재시키기 위한 프로그램

슈퍼 블록 : 파일 시스템 크기, 이용 가능한 빈 블록 리스트, inode 목록의 크기, 파일 시스템 이름

파일 시스템에 있는 빈 inode의 수와 목록, 파일 시스템 디스크의 이름

inode : 파일이나 디렉토리에 대한 모든 정보를 가지고 있는 구조

-> 파일 소유자의 사용자ID, 그룹ID, 파일 크기, 파일이 생성된 시간, 최근 사용된 시간, 변경된 시간, 접근모드

데이터 블록 : 실제 데이터가 저장되어 있는 파일 형태

 

inode의 기능

할당 및 적용 : 파일 구성 블록에 대한 물리적 위치 정보

파일 생성 : 파일 생성시 해당하는 inode가 i-list에 만들어지며 inode Number와 파일이름, 디렉토리가 등록됨

파일 링크 : 기존 파일과 링크할 경우 디렉토리에 새로운 이름이 등록되고 inode Number는 기존 것이 복사됨

-> 심볼릭 링크 : 윈도우의 바로가기와 비슷한 기능, 원본파일 삭제시 이용 X

-> 하드링크 : 두개의 파일 이름이 하나의 INODE와 같은 데이터 블럭을 가르킴, 원본파일 삭제시 이용 O

파일 삭제 : inode의 파일 링크 수가 하나 감소되고 디렉토리 엔트리에서 해당 파일의 inode Number가 0로 변경됨

 

리눅스 Booting

로더 :  보조기억장치에 있는 운영체제의 커널을 주기억장치에 올리는 작업

LILO : 리눅스에서 로더의 역할을 수행( 리눅스의 부트로더 ), /etc/lilo.conf 파일을 읽어 들여 실행

GRUB : 최근에 리눅스 부팅에 사용하는 부트로더, /boot/grub/grub.conf 설정파일을 읽어 들여 실행

 

-- /boot/grub/grub.conf 설정 값 --

default = 0 : 부트 순서를 지정하는 번호, 멀티부트의 경우 운영체제 레이블 번호를 선택

timeout = 0 : 지정된 시간이 지나면 default로 지정된 운영체제로 부팅

splashimg = (hd0,0), /grub/splash.xpm.gz : 부팅 이미지를 지정하는 부분

hiddenmenu : 부트로더를 보여주지 않음

title Fedora : 부팅되는 부트 엔트리를 의미

 

-- GRUB 특징 --

부트정보를 사용자가 임의로 변경할 수 있음

여러 운영체제를 사용할 수 있는 멀티부팅 지원

커널 경로 및 파일명만 알고 있다면 부팅이 가능함

 

-- 리눅스 Booting 순서 --

서버 전원 키기 -> ROM BIOS를 읽고 디스크의 MBR에 있는 부트로더가 실행 ->

부트로더는 보조 기억장치에 저장되어 있는 리눅스 커널을 찾고 실행 ->

리눅스 커널은 하드웨어를 확인하고 root의 읽기 전용으로 마운트를 수행 ->

디스크 검사 후 root의 쓰기 전용으로 재마운트 -> 리눅스 커널은 init 프로세스를 실행하고 PID 1번 할당 ->

init 프로세스는 자신의 설정파일인 /etc/initab 파일을 읽어 디바이스 및 프로세스 활성화

 

-- Run Level --

실행 시 init 숫자 입력

0 : PROM 감사 단계

1 : 관리상태의 단계, 암호를 변경할 때 사용, 단일 사용자 단계( 사용자 로그인의 접근 불가 )

2 : 공유된 자원을 갖지 않은 다중 사용자 단계

3 : 기본 실행단계, 공유 자원을 가진 다중 사용자 단계, 텍스트 유저 모드

4 : 사용 X

5 : 기본적으로 level 3과 같음, 그래픽 유저 모드라는 차이점

6 : 재부팅 단계, 실행단계 3의 상태로 재부팅

 

리눅스 디렉토리 구조

/ : 루트 디렉토리

/bin : 기본적인 실행 명령

/boot : LILO 등 부팅에 관련된 파일

/dev : 장치 파일 모음

/etc : 시스템 설정 파일

/home : 사용자 홈 디렉토리

/lib : C 라이브러리

/mnt : 임시 마운트용 디렉토리

/proc : 시스템 정보를 가진 가상 디렉토리

/root : 루트 사용자의 홈 디렉토리

/sbin : 시스템 관리용 실행파일

/tmp : 임시파일 디렉토리

/usr : 애플리케이션이 설치되는 디렉토리

/var : 시스템에서 운영되는 임시파일 및 로그파일

 

리눅스 dev 파일 시스템( 장치 파일 시스템 )

/dev/fd : 플로피 디스크

/dev/had : 마스트 IDE 하드 디스크

/dev/sda : SCSI 및 SATA 하드 디스크 

/dev/cdrom : CD ROM 드라이버

/dev/mouse : 마우스

/dev/hdb : 슬레이브 IDE 하드 디스크

/dev/hd : 하드 디스크

 

/etc/passwd 파일구조

1번째 필드( Login Name ) : 사용자 계정을 의미

2번째 필드( Password ) : 사용자 암호가 들어갈 자리( x로 되어 있으면 /etc/shadow 파일에 패스워드가 저장됨 )

3번째 필드( User ID ) : 사용자 ID를 의미( root의 경우 0 )

4번째 필드( User Group ID ) : 사용자가 속한 그룹 ID를 의미( root 그룹의 경우 0 )

5번째 필드( Comments ) : 사용자의 코멘트 정보를 적는 곳

6번째 필드( Home Directory ) : 사용자의 홈 디렉토리를 지정

7번째 필드( Shell ) : 사용자가 기본으로 사용하는 셸 종류가 지정됨

 

리눅스 권한 관리

리눅스의 권한 관리는 소유자, 그룹, 다른 사용자로 이루어진다.

그리고 각각 읽기( r ), 쓰기( w ), 실행( x ) 권한을 가질 수 있다.

위의 그림을 보면 빨간 네모가 권한을 나타내는 곳이다.

rwx앞에 d나 l, -는 파일 타입을 나타내는 용어이다.

 

-- 파일 타입 --

d : 디렉토리

l : 링크 카운터

s : 소켓

p : 파이프

- : 일반

c : 특수문자

b : 특수블럭

 

-- full 접근권한 --

file의 접근권한 : 666

디렉토리의 접근권한 : 777

이유 : r = 4, w = 2, x = 1을 의미하지만 file의 경우 기본적으로 r, w의 권한만 부여되기 때문이다.

 

로그파일

공격자가 임의적으로 시스템에 접근하여 어떤 작업을 수행했는지 알 수 있는 것으로

침해사고 발생 시 누가 무엇을 수행했는지 증명하는 책임추적성 역할을 수행

위치 : /var/log 디렉토리에 존재

 

WORM Storage

시스템에 공격자가 침입하면 자신의 공격 행위를 삭제하기 위해 중요한 로그파일에 대한 삭제를 시도한다.

따라서 WORM Storage는 한 번만 기록할 수 있으며, 그 다음은 읽기만 가능한 스토리지이다.

 

wtmp 로그파일

사용자의 로그인과 로그아웃 정보를 가지고 있는 로그파일( 접속 정보를 계속 기록한다. )

wtmp가 기록하고 있는 정보 : 로그인 및 로그아웃, 시스템 종료 및 부팅, 재부팅 정보

위치 : /var/log 디렉토리에 존재

 

btmp 로그파일

리눅스 로그인 시 실패한 정보를 가지고 있는 로그파일( 바이너리로 되어 있음 )

 

syslog

컴퓨터 시스템의 관리, 보안 알림, 분석, 디버깅 메세지 제공

프린터나 라우터, 다양한 플랫폼 지원( -> 다양한 타입의 시스템들의 로그 데이터의 저장소로 사용 )

-- 주체별 분류 --

kern : kernel에서 요청하는 경우 로그를 기록

mail : mail subsystem 요청하는 경우 로그를 기록

lpr : Printing subsystem에서 요청하는 경우 로그를 기록

daemon : System server processes에서 요청하는 경우 로그를 기록

auth : login authentication system에서 요청하는 경우 로그를 기록

 

-- 로그 --

시스템의 처리 내용이나 이용상황을 시간의 흐름에 따라 기록한 것

 

-- 시스템 위험성에 따른 syslog 유형 및 강도 순서 --

1. emerg : 가장 위험, 심각한 상황을 모든 사용자에게 경보하는 메세지

2. alert : 변조된 시스템 등과 같이 곧바로 정정해야 하는 것, 즉시 주의를 요하는 심각한 에러가 발생한 경우의 메세지

3. crit : 디바이스와 관련하여 심각한 오류 메세지

4. err : 일상적으로 발생 할 수 있는 에러 메세지

5. warn : 시스템 수행 시 주의사항 및 경고 메세지

6. notice : 오류는 아니나, 특수한 방법으로 수행해야 할 메세지

7. debug : 오류를 검출하거나 해결 시 도움이 될 만한 외부 정보들을 표시하는 메세지

8. none : 로깅 주체에서 무시하는 정보 메세지

 

리다이렉션

표준 스트림으로 사용자가 지정한 곳을 변경할 수 있는 것

종류 명령어 > 파일1 명령어 >> 파일1 명령어 < 파일1
설명

명령어를 실행하여 나오는 출력물을 파일1로 보낸다.

기존에 파일1이 존재하는 경우 기존의 파일1의 내용은 지우고 새롭게 추가된다.

명령어를 실행하여 나오는 출력물을 파일1의 내용 뒤에 추가한다. 파일1의 데이터를 명령어에 입력

파이프

어떤 명령어의 실행 결과를 다른 명령어의 입력으로 전달하는 것

ex. 명령어1 | 명령어2

-> 명령어1의 결과를 명령어2의 입력으로 전달

 

공격자가 리눅스 시스템에 침입했을 때 하는 행위

1. 다음에 쉽게 침입하기 위해서 백도어( Backdoor ) 프로그램 설치

2. 자신의 침입 흔적을 삭제하기 위해 로그파일 삭제 및 변경

3. 공격자의 컴퓨터로 연결을 시도하는 리버스( Reverse ) 연결 시도

4. 자신이 설치한 파일이나 특정 파일에 과도한 권한 부여

5. 특정 디렉토리에 다른 사용자도 읽고 쓰고, 실행 하는 권한 부여

 

파일 무결성 검사

단순하게 시간을 기준으로 파일이 변경되었는지 확인하기 어렵다.( 시간은 변경이 가능하기 때문 )

따라서 초기 상태의 파일 정보에 대해서 해시 값을 저장하고 원하는 시점에 초기의 해시값과

비교해서 변경 여부를 확인한다.

 

tripwire

해시 값을 사용해서 파일의 무결성을 검사하는 도구

-- 명령어 --

tripwire --init : 해시 값을 저장한 데이터베이스를 초기화

tripwire --check : 무결성 검사 수행

 

취약점 점검 도구

Nessus : 상용 취약점 스캐너( 비 기업 환경에서 개인은 무료로 사용 가능 )

NMAP : 포트 스캔 프로그램( 호스트나 네트워크를 스캐닝 )

nikto2 : 웹 서버 취약점 점검 툴

 

iptables 도구

1. 리눅스에서 특정 패킷을 분석해 패킷을 차단하거나 허용할 수 있다.

-> 모든 것을 허용한 후 일부 패킷을 제한한다.

-> 모든 것을 거부한 후 일부 패킷을 허용한다.

2. 패킷 필터링 정책을 수립하여 적용한다.

 

-- 체인 종류 --

INPUT : 리눅스로 들어오는 패킷

OUTPUT : 외부로 나가는 패킷

FORWARD : INPUT과 OUTPUT 역할, 라우터에 방화벽을 적용할 때 쓰인다.

 

-- 명령어 --

-A( --append ) : 새로운 규칙을 추가한다.

-D( --delete ) : 규칙을 삭제한다.

-C( --check ) : 패킷을 테스트한다.

-R( --replace ) : 새로운 규칙으로 교체한다.

-I( --insert ) : 규칙을 출력한다.

-L( --list ) : 등록된 접근제어를 출력한다.

-F( -- flush ) : Chain으로부터 규칙을 모두 삭제한다.

-Z( --zero ) : 모든 Chain의 패킷과 바이트 카운터 값을 0으로 만든다.

-N( -- new ) : 새로운 Chain을 만든다.

-X( --delete-chain ) : Chain을 삭제한다.

 

-- 매치 --

iptables에서 패킷을 처리할 때 만족해야 하는 조건을 가리킨다.( 이 조건을 만족시키는 패킷들만 규칙을 적용 )

-s : 출발지 IP주소나 네트워크와의 매칭

-d : 목적지 IP주소나 네트워크와의 매칭

-p : 특정 프로토콜과의 매칭

-i 인터페이스명 : 입력 인터페이스

-o 인터페이스명 : 출력 인터페이스

-y : SYN 패킷을 허용하지 않는다.

-j 명령 : 규칙에 맞는 패킷을 어떻게 처리할 것인가

 

패스워드를 크래킹 하기 위한 도구

L0phtcrack : 사용자의 패스워드를 평문으로 변환 시켜주는 툴

pwdump : 보안 계정 관리자에서 로컬 사용자 계정의 LM, NTLM 암호 해쉬들을 출력하는 윈도우 프로그램들의 이름

John the ripper