Tech Juny

[01]-03 리눅스 서버 보안 본문

정보보안기사 필기

[01]-03 리눅스 서버 보안

태크주니 2021. 2. 13. 22:15

1. 리눅스 (Linux)

: 유닉스를 기반으로 만든 공개용 운영체제

- 다중 사용자 (Multi User) : 여러 사용자가 이용 가능, 사용자별 권한 부여

- 다중 작업 (Multi Tasking) : 여러개의 프로세스 동시 실행, 시불할 스케줄링 지원

- 다중 처리기 (Multi Processor) : 작업을 병렬적으로 처리하여 효율적

- 다중 플랫폼 (Multi Platform) : 여러 종류의 CPU 지원

- 게층형 파일 시스템 (File System) : 루트를 기반으로 하위 디렉토리를 갖는 계층형 파일 시스템

- POSIX 호환 : POSIX는 유닉스 표준 인터페이스를 정의 한것으로 리눅스도 지원

- 우수한 네트워킹 (Networking) : TCP/IP, IPX/SPC, Appletalk, Bluetooth 등 다양한 프로토콜 지원

- 가상 콘솔 (Virtual Console) : 각 창마다 다른 작업 가능(기본적으로 6개의 가장 콘솔 존재)

- 가상 기억 장치 (Virtual Memory) 

 

2.  리눅스 구조

1) 리눅스 운영체제 

  • 리눅스 운영체제의 기능
구성 요소 기능 및 역할
작업 관리자
(Task Manager)
작업의 생성, 실행, 상태 관리, 스케줄링, 프로세스 간 통신 서비스 제공
메모리 관리자
(Memory Manager)
세그먼테이션, 페이징, Swap 서비스를 통한 물리 메모리와 가상 메모리 관리
파일 시스템 관리자
(File System Manager)
파일 생성, 삭제, 접근 제어, 디렉토리 관리, 슈퍼블록 관리
네트워크 관리자
(Network Manager)
소켓, TCP/IP, 프로토콜 관리
장치 관리자
(Device Manager)
디스크, 각종 카드, 외부 인터페이스 등 드라이버 관리

 

  • 리눅스 운영체제 핵심 요소
구성 요소 내용
커널 (Kernel) - 주기억장치에 상주하며 사용자 프로그램을 관리하는 운영체제 핵심 역할
- 프로세스, 메모리, 입출력, 파일관리 실행
- 셸과 커널은 독립된 프로그램
셸 (Shell) - 명령어 해석/번역하여 사용자 명령 수행
- 리눅스 표준 셸은 bash
- boure 셸, C 셸, korn 셸 등등 존재
파일 시스템 (File System) 계층적인 트리 구조 형태

# bash 셸 : 리눅스 기본 셸로 /bin 디렉토리에 존재

 

2) 리눅스 파일 시스템

: 최상위 루트부터 그 하위 디렉토리로 구성되며 파일시스템은 오직 한개만 존재

- 텍스트 파일 (Text File) : vi 같은 에디터 프로그램 생성

- 바이너리 파일 (Binary File) : C언어 컴파일러(gcc)를 사용해 생성한 실행 파일

  • 리눅스 파일 종류
종류 내용
루트 파일 시스템 - 하드디스크에 적어도 하나의 파일 시스템 존재
- 시스템 프로그램 및 디렉터리 포함
일반 파일 컴퓨터가 수행 가능한 파일, 원시 프로그램 파일, 텍스트 파일, 바이너리 파일, 데이터파일
디레터리 파일 다른 파일과 디렉터리 정보를 저장하는 논리적인 파일
특수 파일 - 주변 장치에 연결된 파일 (USB, CDROM, CPU, Memory)
- 하나 이상에 특수파일 존재
- /dev 디렉터리에 위치

 

  • 리눅스 파일 시스템 구조
구조 내용
부트 블록
(Boot Block)
- 리눅스 시스템은 부트블록으로 시작 (컴퓨터 시스템 부팅 관련)
- 파일 시스템으로부터 리눅스 커널을 적재 시키기 위한 프로그램
슈퍼 블록
(Super Block)
- 부트블록 다음에 슈퍼블록 실행
- 파일 시스템 크기, 여유공간, 파일 시스템 이름, 디스크 이름, inode 정보 등등 정보 보유
아이노드
(inode)
파일이나 티렉터리에 관한 모든 정보 보유
데이터 블록
(Data Block)
실제 데이터가 저장되어 있는 파일 형태

# inode : 리눅스 커널이 현재 사용하는 파일 정보를 유지하는 구조체

- 리눅스(유닉스)만 가지고 있는 파일 관련 정보

- 단일 간접 블록, 이중 간접 블록, 삼중 간접 블록으로 블록 관리

- 심볼릭 링크, 하드 링크로 파일 링크

# 단일 간접 블록 : 실제 데이터 블록을 가리키는 포인터

# 이중 간접 블록 : 첫번째 인덱스 블록은 두번째 인덱스 블록을 가리키는 포인터, 두번재 인덱스 블록은 실제 데이터를                          가리키는 포인터 

# 삼중 간접 블록 : 이중과 비슷, 첫번째 두번째가 다른 블록, 세번째가 실제 데이터를 가리킴

# 심볼릭 링크 : 윈도우의 바로가기 기능과 비슷 , Ex)파일 명이 긴 파일을 짧은 명으로 만들어서 사용

# 하드 링크 : 원본 파일을 복사해서 동일한 inode를 만듬, 원본 파일 삭제 이동해도 하드 링크는 존재

  • inode 보유 정보

- 파일 소유자 ID

- 파일 소유자 그룹 ID

- 파일 크기

- 파일 생성 시간

- 파일 최근 사용 시간

- 파일 최근 변경 시간

- 파일 링크 수

- 접근 모드

- 데이터 블록 주소

 

3) 리눅스 파일 시스템 생성

  • 디스크 파티션
    - fdisk [-l] [-v] [-s 파티션] [장치명]

 

  • 파일 시스템 생성
    - mkfs [옵션] [장치이름]

 

  • 파일 시스템 무결성 검사
    - fsck : 부팅 단계에서 자동적으로 실행되는 무결성 검사 But. 수동 실행도 가능

 

  • 파일 시스템 마운트
    - mount : 리눅스에서 특정 디렉터리 연결할 경우 사용
    - fstab : 마운트 관련 정보를 가지며, mount를 수행할때 참조하는 파일
    - umount : 마운트 해제

 

  • 리눅스 파일 시스템 종류
  • EXT2
    - 단일 파일 크기 2GB
    - 파일명 256Byte
    - 최대 지원 파일 시스템 4TB
    - 디렉터리 당 저장 가능 파일 수 25,500개
  • EXT3
    - 단일 파일 크기 4GB
    - 파일명 256Byte
    - 최대 지원 파일 시스템 16TB
    - 디렉터리 당 저장 가능 파일 수 65,565개
    - 저널링 파일 시스템 지원
  • ETX4
    - 1Exa byte 블록 지원

    - 단일 파일 크기 16TB
    - EXT2, EXT3 호환, 마운트 가능
    - fsck 파일 무결성 성능 향상
    - Extends 지원 : 큰 용량 파일 삭제 시간 단축
    - 하위 디렉터리 개수 확대

    - 조각모음 : EXT3 저널링 파일 시스템에서 발생되는 단편화 개선

 

4) 리눅스 Booting

1) 리눅스 Boot Master

  • Loader : 컴퓨터 시스템에 전원 인가 시 가장 먼저 보조기억 장치에 있는 운영체제 커널을 주기억 장치에 전송
  • LILO (LInux LOader) : 리눅스 Loader
    - /etc/lilo.conf 로 실행
  • GRUB : 최근 리눅스 부팅 시 LILO 대신 사용
    - 부트 정보 사용자 임의 변경 가능
    - 여러 운영체제 사용 가능한 멀티부팅 지원
    - 커널 경로 및 파일 명만 알아도 부팅 가능

2) 리눅스 부팅 순서

① ROM BIOS 일고 디스크 MBR에 있는 부트로더 실행

② 부트로더 (LILO, GRUB)는 보조 기억장치에 있는 리눅스 커널을 실행

③ 리눅스 커널은 하드웨어를 확인 하고 root 읽기전용으로 Mount 수행

④ 디스크 검사하고 root 쓰기 전용을 다시 Mount 수행

⑤ 여끼까지 작업 완료 시 init 프로세스 실행 후 PID 1번 할당

⑥ init 프로세스 작업 수행은 리눅스 Run 레벨에 따리 다르게 부팅

 

  • Run Level
실행 단계 내용
0 PROM 검사 단계
1 관리 상태 단계 -> 암호 변경 시 사용
2 공유된 자원을 갖지 않는 다중 사용자 단계
3 기본 실행 단계로, 공유된 자원을 가진 다중 사용자 단계
4 현재 사용 X
5 Run Level 3 가동 후 그래픽 모드 X-Window 실행
6 재부팅 단계 -> Level 3 상태로 재부팅

 

  • init 명령어
    - init [Run Level]
    - Ex) init 6 -> 재부팅

 

5) 리눅스 디렉터리 구조

  • 리눅스 디렉터리 구조
디렉터리 구조 설명
/ 루트 디렉토리
/bin 기본 적인 실행 명령
/boot LILO 등 부팅에 관련한 파일
/dev 장치 파일 모음
/etc 시스템 설정 파일
/home 사용자 홈 디렉터리
/lib C 라이브러리
/mnt 임시 마운트용 디렉터리
/proc 시스템 정보를 가진 가상 디렉터리
/root 루트 사용자 홈 디렉터리
/sbin 시스템 관리용 실행 파일
/tmp 임시파일 디렉터리
/usr 애플리케이션 설치 되는 디렉터리
/var 시스템 운영되는 임시파일 및 로그파일

 

3. 리눅스 안증과 권한 관리

1) 패스워드 파일

- /etc/passwd 파일에 패스워드 해시 값 저장하여 비교

- /etc/shadow에 패스워드 저장 가능 (pwunconv 명령어로 이동)

- 일반 사용자가  패스워드 수정 시 직접 /etc/passwd 파일 변경 X (root가 아니기때문)

- usr/bin/passwd 파일 실행하여 변경후 setuid를 통해 /etc/passwd 변경

 

2) 권한 관리

  • 디폴트 권한 umask

Ex)  umask 값이 002 면 777 - 002 = 775가 디폴트 권한

  • 권한 부여 및 변경

- chmod [User] [Group] [Other] [파일명]

Ex) chmod 755 [파일명]

Ex) chmod u+x, g+w, o-r [파일명]

명령 기호 설명
u user
g group
o other
a all
+ 권한 추가
- 권한 삭제
r 읽기
w 쓰기
x 실행

 

- chown : 사용자와 그룹 변경 명령어

Ex) chown [option] [UID:GID]

  • option 값

- R : 하위 디렉토리 모든 권한 변경

- c : 권한 변경 파일 내용 출력

Ex) chown root: test

: test 파일 소우자 그룹을 root로 변경

 

3) 특수 권한 관리

  • setuid

: 파일이 실행될때 그 파일의 소유자 권한으로 실행

- s : 실행 파일에 setuid를 설정하면 소문자 s -> 실행 가능

- S : 실행 파일이 아닐 경우 setuid 설정하면 대문자 S -> 실행 X

 

  • setgid

: 파일 생성자의 급룹 소유권을 얻음

 

  • sticky bit

: 공용 디렉터리를 만들어 누구나 자유롭게 사용가능 하도록 권한 부여 1000 으로 설정

- 권한 마지막에 t로 표기

- 인가된 사용자만 write 가능 하도록 설정 가능

- 누구나 사용가능 But. 소유자만 삭제 가능

Ex) find / -perm -4000 -print  : suid, sgid, sticky -> 검색하면 40000보다 큰 모든 파일 검사

Ex) find / -perm -4755 -print -> 실행 권한을 가지고 있는 setuid 검색

 

4. 로그파일 및 주요 명령어 사용

1) 리눅스 로그파일

- /var/log 디렉토리에 로그 적제

# WORM (Write Once Read Many) Storage : 한번만 기록 할수 있고 이후에는 읽기만 가능

  • 현재 로그인 사용자 확인

- who or w :  현재 로그인한 사용자 정보를 터미널에 출력

- utmp 로그 파일 : 현재 로그인한 사용자 정보를 기록 (/var/run/utmp)

- who로 utmp 로그 파일을 읽음

 

  • 사용자의 로그인 및 로그아웃 정보 확인

- last : wtmp 로그 파일을 읽음

- wtmp 로그 파일 : 사용자의 로그인 및 로그아웃 정보를 기록 (/var/log/wtmp)

  •  wtmp가 기록하고 있는 정보
    - 로그인 및 로그아웃 정보
    - 종료 및 부팅 정보
    - 재부팅 정보
    - telnet 및 ftp 등을 통한 원격 로그인 정보

 

  • 로그인 실패 정보 확인

- lastb : btmp 로그 파일을 읽음

- btmp 로그 파일 : 리눅스 로그인 실패 정보 기록

 

  • Syslog

: 리눅스 운영체제에 대한 로그를 기록하는 데몬 프로세스로 syslogd라는 프로그램에 의해 로그 기록

- /etc/syslogd.conf 파일을 읽어서 로그 기록 수준(위험성, 주체별) 결정

 

  • 주체별 분류

- kern : 커널 요청 로그

- mail : mail subsytem 요청 로그

- lpr : Printing subsystem 요청 로그

- daemon : System server porcesses 요청 로그

- auth : Login authentication system 요청 로그

 

  • 위험성 강도 순서

- emerg > alert > crit > err > warm > notice > info > debug

 

2) 작업 스케줄 관리

  • cron

: 일정한 날짜 시간에 반복적인 작업을 수행하는 프로세스

- cron으로 매일 보안 점검 가능 

- 반대로 crontab에 악성 코드를 설정해 놓으면 반복적으로 악성 코드 실행

- /etc/crontab 파일을 읽어서 실행

- 분, 시, 일, 월, 요일(0~6), 사용자, 실행명령 순으로 나타냄 (0 =일요일, * = all)

- Ex. 30 * * * * root /home/user/test -> 30분에 맞춰 test 실행

- Ex. */10 2-5 * * * root /home/user/test -> 2시부터 5시까지 10분 마다 test 실행

- Ex. 20 1 * * * root rm -rf /home/tmp/* -> 매일 1시 20분에 /home/tmp 하위 모든 파일 및 디렉토리 삭제

- Ex. 30 3 * * 2 root /home/show.sh -> 매주 화요일 3시 30분에 show.sh 실행

- Ex. * * 1 1-10/2 * /home/user/test -> 1월부터 10월까지 두달 주기로 매월 1일 test 실행

  • crontab 옵션

- l : 현재 로그인 된 게정에 잡혀있는 스케줄 확인

- e : 현재 로그인 중인 계정에 작업 등록

- r : 현재 crontab에 등록된 작업 삭제

- u [User 명] : 작업 실행 시킬 유저명 설정

 

  • at 

: cron과 다르게 예약한 명령어를 한번만 실행

 

3) 리눅스 악성코드 탐지

  • 리다이렉션 (Redirection)

: 명령의 결과를 파일에 저장 시키거나 추가 하는 것

- Ex) ls -al > ls.txt -> ls -al 출력을 ls.txt에 저장

- Ex) ls -al >> ls.txt -> ls -al 출력을 ls.txt에 추가

 

  • 파이프 (Pipe)

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

 

  • find

: 파일을 찾는 명령어

- 악성코드 탐지 가능 (특정 권한 및 실행 권한 검색 또는 최근 변경된 파일 검색)

- 중요 파일 검색 가능

- Ex) find . -name "*.txt" -> 현재 디렉토리에서 .txt 확장자인 파일 찾기

- Ex) find / -name "[A-Z]*" -> 전체 디렉토리에서 파일명의 첫 글자가 영문자 대문자인 것 찾기

 

  • 특수 권한 파일 검색

- setuid는 4000, setgid는 2000, sticky Bit는 1000의 권한을 가짐

- setuid와 setgid 모두 부여된 것을 찾으려면 6000(4000+2000)으로 검색

- perm 으로 권한 검색

- Ex) find / -perm +6000

 

  • 최근에 변경된 파일 검색
구분 내용
-atime (access time) 파일을 열거나 접근한 시간 기준
-mtime (modify time) 파일이 변경된 시간 기준
-ctime (change time) 파일 속성이 변경된 시간 기준

- Ex) find / -mtime +5 -> 최근 5일 동안 변경되지 않은  파일 찾기

- Ex) find / -mtime -2 -> 최근 2일동안 변경되지 않은 파일 찾기

 

  • 특정 사용자가 소유자인 파일 검색

- user 옵션으로 검색

- nouser, nogroup으로 소유자나 그룹이 없는 파일 검색

- Ex) find / -user root -> root 소유자 파일 검색

 

  • 파일 무결성 검색

: 해시 값을 사용해서 파일의 무결성 검사

- tripwire 옵션으로 검색

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

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

 

5. iptables

: 리눅스 방화벽 정책을 수립하는 도구

 

  • iptables 체인 종류
구분 내용
INPUT 입력 패킷 (목적지가 호스트인 패킷)
FORWARD 통과 패킷 (목적지가 호스트가 아닌 패킷)
OUTPUT 출력 패킷 (출발지가 호스트인 패킷)

 

  • iptables 명령어
구분 설명
-A 규칙 추가
-N 체인 생성
-X 체인 제거
-P 체인 정책 변경
-L 체인 규칙 상태 보기
-F 체인 내 모든 규칙 제거 (방화벽 초기화)
-Z 체인 내 모든 규칙의 패킷 바이트 카운트 0으로 초기화
-D 규칙 삭제
-R 새로운 규칙으로 대체
-I 체인 가장 처음에 규칙 추가
-E 체인 이름 변경

- Ex) iptables -A OUTPUT -o lo -j DROP -> loopback 인터페이스 출력 패킷 Drop

- Ex) iptables -A INPUT -s 192.168.0.3 -j DROP -> 192.168.0.3에서 오는 패킷 Drop

- Ex) iptables -A FORWARD -p udp -m udp --dport 52 -j DROP -> 목적지 udp 포트 52인 패킷 Drop

 

Comments