본문 바로가기

Information Security/Other activities

Unix/Linux 기본 이해

반응형

* Unix/Linux 시스템 로그인 과정 : Unix 계열 시스템은 모든 과정이 별개의 프로그램으로 실행됨

- 사용자 계정 ID/PW 입력 후, 로그인을 담당하는 /etc/passwd 파일내 해당 필드를 비교하여 확인 및 쉘이 사용할 변수(HOME, SHELL, USER 또는 LOGNAME)들을 근거로 초기 환경을 설정로그인 쉘을 실행

shell : 사용자가 입력한 명령어를 해석하고 처리하여 프로그램을 실행하는 기능 (명령어를 입력할 수 있는 터미널 환경

 

 

 

* /etc/passwd 파일 : 시스템에서 사용자 관련 정보를 구분자(:)로 7개 필드의 정보를 구분하여 저장

7개 필드로 구성된 /etc/passwd

필드 정보
user_account 사용자 계정명
user_password 사용자 패스워드
(x는 Shadow 패스워드 - 암호화된 패스워드 정보 -> /etc/shadow 파일에 해시로 저장)
UID User ID
- 시스템에서 유일한 정수 값으로 기술됨
- '0'으로 설정 시 root 권한 행사가 가능
GID Group ID
- 시스템에서 유일한 정수 값으로 기술됨
- '0'으로 설정 시 root 권한 행사가 가능
Comment 해당 사용자 정보에 대한 기타 정보
Home Directory 사용자 로그인 성공 후 위치할 홈 디렉터리
Login Shell 사용자가 사용하는 쉘
- 악성 쉘로 설정하는 것이 가능
- 로그인이 불필요한 계정(시스템이나 어플리케이션 계정 등)에 대해서는 '/sbin/nologin 또는 /bin/false'로 설정 권장

계정 확인 명령어 : id 계정명
패스워드 변경 명령어 : passwd 계정명 (일반 사용자는 자신의 비밀번호만 변경 가능)

 

 

 

* /etc/shadow 파일 (해시 패스워드) : 암호화된 패스워드 정보패스워드 에이징(aging) 정보가 저장되어 시간 흐름에 따라 패스워드가 관리

총 8개 필드로 구성된 /etc/shadow

필드 정보
user_account 사용자 계정명
encrypted_password 암호화된 패스워드

- *로 설정 : 패스워드가 잠긴 상태로, 로그인 불가하나, 별도의 인증 방식(ex-SSH 인증키)으로 로그인 가능


- !!로 설정 : 패스워드가 잠긴 상태로, 모든 로그인이 불가능
('passwd -l 계정명' 명령어로 잠그거나, 계정 생성 시 패스워드 설정 하지 않으면 발생)


- 빈값으로 설정 : 패스워드가 설정되지 않은 상태 (패스워드 없이 로그인이 가능)


- 기타 OS 종류에 따라 NP, *LK* 등 상이하게 설정 될 수 있음
last_change 마지막으로 패스워드를 변경한 날
(1970년 1월 1일 기준으로 일수로 표시)
minlife 패스워드 최소 사용 기간
(last_change로 부터 패스워드를 변경할 수 없는 일수를 의미)
- 1일(1주) 설정이 권장됨 (익숙한 패스워드 재사용 문제점 방지)
maxlife 패스워드 최대 사용 기간
(last_change 이후부터 패스워드 만료 일수를 의미)
- 90일(12주) 설정이 권장됨 (지속적 접근을 방지)
warn 패스워드 만료 이전 경고일수
inactive 패스워드 만료 이후 비활성 일수
(Unix : 비활성 기간 내 로그인 하지 않을 시 계정이 잠김 /
Linux : 비활성 기간 내 패스워드를 변경하지 않을 시, 계정이 잠김)
expires 계정 만료일 설정
(1970년 1월 1일을 기준으로 일수로 표시)

* encrypted_password 구성

$ID$Salt$Encrypted_password 형식으로 구성

암호화된 패스워드 구성 설명
$ID - 암호화가 적용된 일방향 해시 알고리즘 식별을 위한 ID
1 : MD5
2 : BlowFish
5 : SHA-256
6 : SHA-512
$Salt - 암호화 강도를 높이기 위한 랜덤값
(사용자 지정 패스워드 + 솔트값 => 레인보우 테이블 공격에 효과적 대응)
$Encrypted_Password - 패스워드에 솔트를 조합하여 해시한 해시값

* 패스워드 저장 정책 변경

pwconv 명령어 - Shadow 패스워드 정책으로 설정
(shadow 파일에 암호화된 패스워드를 저장하는 정책)
pwunconv 명령어 - 일반 패스워드 정책으로 설정
(passwd 파일 내 계정 정보와 함께 저장하는 정책)

 

 

 

* 그룹 정보 (/etc/group) : 시스템의 모든 그룹 정보를 저장되며 4개 필드로 구분되어 저장

- 계정 별 하나의 기본 그룹복수의 보조 그룹에 소속 될 수 있음

- 기본 그룹 : 해당 사용자가 자원 생성 시, 해당 자원의 소유 그룹을 지정할 때 사용

4개 필드로 구성

필드 정보
Group Name 그룹 이름
Group password 그룹의 암호화된 패스워드 (사용안함)
Group ID 기본 그룹의 GID
- 그룹명을 대신하는 정수형 숫자
소속 계정들 소속된 사용자 계정들
- 계정명, 계정명, 계정명 (앞의 방식으로 구분)

 

 

 

* 입출력 재지정(I/O Redirection) : 일반적인 표준 입력/출력/에러 사용이 아닌, 파일로 재지정 하는 것

입력 재지정 : 키보드(표준 입력)을 파일에서 받도록 대체하는 것

출력 재지정 : 실행 결과나 에러를 화면(표준 출력, 표준 에러)에 출력하지 않고, 파일로 대체하는 것

표준 출력 예시 (> , >>)

문법 예문
명령어 0 < 파일명 who < who.txt
- 입력 재지정
명령어 1 >or >> 파일명 who > who.txt
- 출력 신규 재지정 (>는 파일 존재 시 새롭게 덮어씀)
명령어 2 >or >> 파일명 who >> who.txt
- 출력 추가 재지정 (>>는 파일 존재 시, 기존 내용 아래에 내용이 추가됨)

 

 

 

* 파이프(Pipe) : 둘 이상의 명령을 함께 묶어, 출력 결과를 후행 명령의 입력 데이터로 전달하는 기능

- 파이프 (|) 기호 사용

ps -ef 를 파이프 하여 grep 명령의 입력으로 전달 (vsftpd 문자열 포함 시에만 출력)

grep : 지정한 패턴(문자열)을 포함하는 부분에 대해서만 출력하는 명령어

 

 

 

* 쉘 명령 특수 문자(Metacharacter) : 사전에 정의된 기능으로 동작 (다양한 명령어 응용 가능)

특수 문자 사전 정의
~ 홈 디렉터리
. 현재 디렉터리
.. 상위 디렉터리
# 주석
$ 쉘 변수
& 백그라운드 작업
* 문자열 와일드카드(WildCard)
- ex 처음과 끝 문자가 a이고 사이에 모든 문자가 일치되는 목록 출력) ls a*a
? 한 문자 와일드카드
- ex 가운데 a라는 글자가 들어간 3글자 파일 출력) ls ?a?
; 쉘 명령 구분자
| 파이프
< 입력 재지정
> 출력 재지정

 

 

 

* 유닉스/리눅스 파일 시스템 : 물리적 저장장치에 파일을 생성/저장/관리하기 위한 논리적 자료구조
- 물리적 디스크는 논리적 파티션(Partition)으로 나뉘어 지며, 각 파티션 별 고유한 파일 시스템(NTFS, EXT2/3/4 etc)을 생성

* File System 구성

File System 요소 내용
Boot Block - OS 부팅 또는 초기화 목적의 bootstrap 코드를 담고 있는 블럭
Super Block - 해당 FileSystem 관리 정보를 담고 있는 블럭
inode List - 파일들의 속성 정보를 담고 있는 inode 구조체들(리스트)


- inode 구조체 MAC Time을 통해 파일 무결성 확인이 가능


- stat 명령어를 통해 특정 파일의 inode 속성 정보 확인이 가능


* inode는 파일명이 없음 (파일명은 디렉터리를 통해 관리)
Data Block - 실제 파일의 내용(데이터)가 저장되는 고정크기 블럭

inode 속성 정보 조회 명령어 : stat 파일명

* inode 리스트의 속성 (위 stat 기준 설명 부가)

속성 설명
inode number 해당 파일 식별을 위한 고유 식별자
(Inode : 3818)
파일 타입 파일의 유형(일반 파일, 디렉터리, 장치 파일 등)
(일반 파일(regular file) 등)
접근 권한 해당 파일에 대한 접근 권한
(0644/-rw-r--r--)
link count 해당 inode를 참조하는 하드링크 개수
(Links: 1)
소유자 해당 파일 UID
(0/ root)
소유 그룹 해당 파일 GID
(0 / root)
파일 크기 파일의 Size
(Size: 44)
MAC Time 1. M (last Modification Time)
- 파일의 내용을 마지막으로 수정한 시간
(Access: 2021-03-01 11:06:58.104525724 +0900)


2. A (last Access Time)
- 파일을 마지막으로 접근한 시간
(Modify: 2021-03-01 11:06:56.624535366 +0900)


3. C (last Change Time)
- 파일 속성(inode 정보)을 마지막으로 변경한 시간
ex) 소유자, 접근권한 등의 속성
(Change: 2021-03-01 11:06:56.624535366 +0900)
Block index Data blocks에 저장된 파일 내용에 대한 색인 정보
(IO Block: 4096)

* 파일 시스템 관리 명령어

1) 파일 시스템 연결(mount) : 보조기억장치에 설치된 FileSystem을 OS가 인식하도록 특정 디렉터리에 논리적으로 연결

2) 파일 시스템 연결 해제(umount) : 마운트 된 파일 시스템의 연결을 해제

- device is busy : 프로세스가 파일 시스템에 있는 파일을 사용 중 또는 사용자가 파일 시스템에 있는 디렉터리에 있을 시 해당 메세지와 함께 umount 실패

3) 하드디스크 사용량(du) : Disk Usage에 대한 확인

4) 파일 시스템 용량 정보(df) : Disk Free파일 시스템전체 공간 및 사용가능 공간을 출력

 

 

 

* Link File : 기존 파일에 대한 또 다른 접근 포인트를 만드는 것

1) 하드 링크 : 기존 파일과 동일한 inode number를 가지는 파일을 생성하며 동일 FileSystem 내에서만, 하드링크가 가능(디렉터리는 하드링크 불가능)

- 생성 시, inode의 link count가 1 증가

- 삭제 시, inode의 link count가 1 감소, 최종 0이 되었을 때 해당 파일의 inode 정보 및 데이터가 삭제
(즉, inode를 참조하는 파일 하드링크 파일이 있으면, 삭제되지 않음)

하드링크 생성 명령어 : ln 원본파일명 하드링크파일명 (Links 가 동일한 것 확인)

- 하드링크와 원본 파일간 어떤 파일을 수정하더라도 내용은 동기화 되며, 원본 파일만 삭제 시, 하드링크 파일이 원본 역할이 가능

 

 

 

2) 심볼릭 링크 : 하드링크 단점 보완이 목적으로, 원본 파일의 경로를 파일 내용으로 하는 새 파일을 생성

- inode number가 아닌 파일 경로를 기반으로 하여 파일 시스템 제한이 없음(디렉터리도 가능)

- 원본 파일의 삭제 또는 이동 시, 경로가 바뀌어 심볼릭 링크가 끊어짐

심볼릭 링크 생성 명령어 : ln -s 원본File또는Directory 하드링크파일명

 

 

 

* 파일 종류

파일 종류 설명
일반 파일
(Regular file)
- 데이터 또는 프로그램 코드에 해당


- 바이트 스트림으로 표준 파일 입출력 시스템 호출을 통해 참조
디렉터리
(Directory)
- 포함된 파일들의 파일명inode number 목록(매핑 정보)내용으로 가진 특수한 파일


- 명시적인 시스템 호출(ls 등)을 통해 참조
특수 파일
(Special file)
- 표준 입출력 시스템 호출을 통해 참조하며 목적에 따라 다양한 형태로 존재


- IPC(InterProcess Communication) : 파이프, 소켓 등의 파일을 사용


- 버퍼링(블럭 장치 파일) : 주변 장치(디스크, 프린터, 터미널, 키보드 등) 사용을 위한 장치 파일로 블럭 단위로 입출력


- 비 버퍼링(문자 장치 파일) : 문자 단위로 입출력 하는 주변 장치

 

 

 

* list(ls) 명령어 : 디렉터리 파일 목록 및 추가 옵션에 따른 정보를 보여주는 명령어

- inode number를 통해 inode 구조체 정보를 참조하여 상세 내역을 확인

ls -l 로 디렉터리 및 파일 정보 상세 출력

- 총 8개의 필드로 이루어져 있으며 각 필드는 아래와 같음

필드 설명 비고
파일종류 및 접근 권한 * 파일 종류

d : 디렉터리
b : 블록 (block) 장치 파일
c : 문자 (character) 장치 파일
l : 심볼릭 링크 파일
p : 네임드 파이프(Named pipe)
s : 유닉스 도메인 소켓 (Socket)
- : 일반(regular) 파일
- 파일, 디렉터리 생성 시, 접근 권한은 umask 설정값(/etc/profile) 만큼을 제거한 값으로 기본 생성됨


- 파일 기본 접근권한 666(rw_rw_rw_)


- 디렉터리 기본 접근 권한 777 (rwxrwxrwx)


- 통상 umask 권장 값은 022로 설정
* 접근 권한 

r(4) : 읽기 권한 (디렉터리 안의 내용을 볼 수 있는 권한)
w(2) : 쓰기 권한 (디렉터리 안에 자원을 생성, 삭제할 수 있는 권한)
x(1) : 실행 권한 (디렉터리 안으로 이동할 수 있는 권한)
- : r, w, x에 대한 권한이 없는 경우 해당 자리를 대체


* 접근 권한 부여 대상
- user : 소유자 권한
- group : 소유그룹 권한
- others : 기타 사용자 권한
하드 링크 수 링크 카운트를 의미 (동일 inode를 참조하는 파일 개수)  
소유주 해당 자원의 소유주 (생성한 사용자 계정이 지정됨) - 'chown 계정명' 으로 변경 가능
소유 그룹 소유주가 소속된 기본 그룹명 - 'chgrp 그룹명'
으로 변경 가능
크기 KB  
최종 수정일 월 및 일자  
최종 수정시간 수정 시간  
파일명 파일 이름 ->는 심볼릭 링크

 

 

 

* chmod : 접근 권한 변경 명령어로 기호 또는 8진수로 접근권한 지정이 가능

기호 기술 방식
대상 u(user), g(group), o(others), a(all)
연산자 +(추가), -(제거), =(지정)
접근 권한 r(읽기 = 4), w(쓰기 = 2), x(실행 = 1)

예시

 

 

 

* umask : 새로 만들어질 파일 또는 디렉터리에서 제거될 권한을 명시

/etc/profile 또는 umask 명령어로 설정 값 확인 가능

- 통상 umask를 022(w 권한 제거)로 지정하여, Group과 Other 사용자에게 제한을 두는 형태로 운용됨

- 일반 파일은 666 / 디렉터리는 777에서 umask 설정 권한을 제거하고서 자원이 생성됨
(주의 사항은 사칙연산을 하는 것이 아니라, umask 값이 어떤 권한을 빼고서 남는 값인지 잘 확인해야함,
예로 umask가 333이면 w와 x권한을 제거 하여 r만 남는것이지, 333을 빼고서 남는 권한이 생성 시 값이 아님)

 

 

 

* find : 파일을 검색하거나, 찾은 파일에 특정 명령을 실행하는 명령어

명령어 문법 find 경로 expression action
* 지정한 경로 '이하'에서 찾기 때문에, 지정 경로의 하부 디렉터리까지 모두 검색됨
옵션 -name 파일명 파일명 지정 (메타 문자 [], ?, * 함께 사용 가능)
-type 파일 종류 지정
f : 일반(regular) 파일
d : 디렉터리
b : 블록 (block) 장치 파일
c : 문자 (character) 장치 파일
l : 심볼릭 링크 파일
p : 파이프
s : 유닉스 도메인 소켓 (Socket)
-user 유저명 소유자명 또는 UID 지정
-group 그룹명 소유 그룹 또는 GID 지정
-size [+-]num[단위] 파일 크기 지정
* 단위
b(default) : blocks
c : bytes
k : kilobytes
M : megabytes
G : gigabytes
-perm mode 파일 접근권한 지정(8진수로 명시)
* 권한에 -가 있으면 포함하는 파일 검색
/ -가 없으면 정확히 일치하는 파일 검색
-atime [+-]n access time
* +는 초과 / -는 미만
-ctime [+-]n change time (속성 변경 시간)
* +는 초과 / -는 미만
-mtime [+-]n modification time (내용 변경 시간)
* +는 초과 / -는 미만

- find 명령 후미 옵션에 -exec로 추가 명령어를 넣어 실행 가능

- -perm -4000 또는 -perm -2000setuid 및 setgid를 포함하는 파일 검색이 가능하며, -o(or) -a(and/default)의 논리 연산()를 추가(특수문자 앞에 \추가 해서 인식 가능하게)하여, 명령어 우선순위를 지정할 수 있으며, {}를 추가하여 앞의 명령어의 인자로 전달 (| grep 처럼 사용), \;로 명령어 끝 인식

 

 

 

* 유닉스/리눅스 프로세스 자료 구조 : 커널(HardWare와 Process를 잇는 핵심 Interface)에서 총괄되며 아래와 같은 자료구조로 관리 됨

1) 프로세스 생성 시, 커널/OS는 PCB(Process Control Block - 프로세스 별 관리 정보를 담은 블럭)을 생성

Process State - 프로세스의 현재 상태 정보 저장(ready, running, blocked 등)
Process Number - 프로세스 식별 번호(PID)
Program Counter - 문맥교환(Context Switching) 발생 시, 다음에 실행할 명령어의 위치값을 저장
Register - 문맥교환(Context Switching) 발생 시, 현재 프로세스의 실행 상태정보(레지스터 정보) 저장
Memory limits - 사용 메모리 page 또는 segment 테이블 정보

2) FDT(File Descriptor Table - 개별 프로세스별로 Open한 file 관리를 위한 테이블)을 생성

FD(File Descriptor) : 프로세스 내에서 Open한 file을 식별하기 위한 양의 정수값

- 아래의 기본 3개 파일이 자동 Open

stdin - 표준 입력 장치(키보드 등)로 부터의 입력
stdout - 표준 출력 장치(모니터 등)로 부터의 출력
stderr - 표준 에러(오류 발생 시 출력)

3) System open-file tables(여러 프로세스들에 의해 Open된 file들을 관리하기 위한 자료구조)를 참조

open_mode - File의 읽기/쓰기 모드
offset - 현재 file의 I/O를 수행하기 위한 위치값(Position)
reference_count - 해당 file의 참조 개수를 의미
- file 복제(dup) 발생 시, reference_count가 증가하게 됨
vnode ptr 참조할 vnode를 가르키는 pointer

4) Active vonde table(해당 file의 inode 정보를 가지며, 캐시역할을 수행, inode 정보 관리를 위한 중계자 역할)를 추가 참조

 

 

 

* 유닉스/리눅스 프로세스 특징

1) boot 프로세스(0번 프로세스)를 제외 모든 프로세스는, 부모 프로세스(PPID)를 가진다

boot 프로세스(0번 프로세스)

2) 부모(PPID)가 있는, 자식 프로세스가 활성화 된 상태에서 부모 프로세스가 종료될 시, 해당 자식은 고아(Orphan) 프로세스가 되며, 대리모 프로세스(init process - PID 1)가 부모 역할을 수행

3) 프로세스 종료 시, 자신의 종료 상태 정보(ps -l 명령어로 확인 가능한 정보)를 부모에게 반환해야 정상 소멸 가능

좀비 프로세스 : 정상 종료가 되지 않은 프로세스를 좀비 프로세스라고 하며, 좀비 프로세스가 과하게 많아 질 시, 신규 프로세스 생성이 불가한 문제가 생길 수 있음
- 모든 프로세스들은 종료 시, 커널을 통해 부모 프로세스에게 종료를 알리며, 종료 확인이 될 때까지(시그널을 통한 핸들링) 일시적으로 좀비 상태가 되며, 확인 완료 후 소멸됨
- 좀비 프로세스는 종료를 했기 때문에 실행 이미지 정보가 없고, 커널에 관리 정보만 남아있어서 Kill 시그널로 종료가 불가능하며, 시스템 리부팅을 통해 커널 정보 초기화 또는 부모 프로세스 문제를 해결해야 정상화 됨.

총 14개 필드로 구성된 ps -l (프로세스 상태 정보 조회 명령어)

ps -l 필드명
(l 옵션은 f보다 더 많은 정보 출력)
설명
F 프로세스 Flag
- 0 : 프로세스 종료
- 1 : fork()를 통해 자식 프로세스 생성 (exec() 되지 않음)하며, 항상 메인 메모리에 상주
- 4 : 슈퍼유저 권한으로 실행
S 프로세스의 현재 Status
- R : Running 이거나, CPU 점유를 위한 대기(Runnable/Ready) 상태
- S : 인터럽트 가능한 Sleep 상태
- D : 인터럽트 불가능한 Sleep 상태 (보통, IO 대기중인 상태)
- T : 프로세스가 정지된 상태 (Stopped)
- I : Idle 상태
- Z : 좀비 상태
UID 사용자 UID 또는 사용자 명
PID 프로세스 ID
PPID 부모 프로세스 ID
C 스케줄링을 위한 CPU 소모량 (현재 사용되지 않음)
PRI 프로세스 우선순위
NI 프로세스의 우선순위 값을 조절하는 NICE 값 (Default 20)
ADDR 프로세스의 메모리 주소
SZ 프로세스가 차지하는 메모리의 크기
WCHAN Sleeping 상태의 프로세스가 대기하는 커널 함수 명
TTY 프로세스와 연결되어 실행되는 터미널 번호
TIME CPU 사용 시간 (시:분 형식)
CMD 실행되고 있는 프로세스 명

- ps -ef (e : 현재 실행 중인 모든 프로세스 정보 출력 + f : ㅡ로세스 정보가 한 줄씩 출력)의 경우 ps -l 보다 적은 8가지 필드만 출력

총 8개 필드로 구성된 ps -ef

ps -ef 필드명 설명 (공란은 상위 ps -l과 동일)
UID  
PID  
PPID  
C  
STIME Start Time으로, 프로세스가 시작된 시간 의미 (월,일 또는 시:분:초 형식)
TTY 프로세스와 연결되어 실행되는 터미널 번호
(?는 제어 터미널에 연결되어 있지 않음을 의미) 
TIME  
CMD  

 

 

 

* 유닉스/리눅스 프로그램 실행 과정

a.out 프로그램 실행 과정

1) Process 생성 (fork)와 동시에, Process Group도 생성

프로세스 그룹 - 커널이 터미널 제어권 관리 목적으로 사용하는 프로세스들의 집합
(PGID 부여 : 쉘로부터 실행된 해당 그룹의 리더 프로세스의 PID가 PGID로 결정됨)


- 쉘에서 실행된 프로세스와 그 자식들이 하나의 프로세스 그룹으로 관리됨
터미널 제어권 - 터미널에서 입력되는 데이터(Terminal Input : 키보드 입력)와, 터미널에서 발생하는 시그널(Terminal Signal)에 대한 제어권


- 프로세스 그룹 단위로 제어권이 부여됨

2) Foreground Mode & Background Mode

Foreground Mode - 터미널 제어권을 가지고 동작하는 모드
(Foreground Process Group : 터미널 제어권을 가지고 있는 프로세스 그룹)
Background Mode - 터미널에 대한 제어권 없이 동작하는 모드
(Background Process Group : 터미널 제어권이 없는 프로세스 그룹)


- '명령어 &' 입력 시, 해당 명령어가 Background Mode로 실행됨

- 터미널과 연결되어 세션이 생성 될 시, 하나의 Foreground Process Group과, 하나 이상의 Backgroup Process Group 이 생성 됨.

- Sleep 명령어를 백그라운드(&)로 실행 시킨 후 프로세스 식별자들 확인

SID (Session ID) - Session : 터미널과의 논리적 연결 상태


- 세션 내에는, 다수의 프로세스 그룹과 해당 그룹에 속하는 프로세스들이 존재함


- SID는 해당 세션의 리더 프로세스(보통 로그인 쉘)의 PID가 됨

 

 

 

* 프로세스 간 통신(Signal) : SoftWare 인터럽트로, 프로세스 간 전달하는 이벤트를 통신 수단으로 사용

IPC (InterProcess Communication) : OS에서 프로세스 간 통신 방법을 의미하며 Pipe, Signal, MessageQueue, SharedMemory, Semaphore 등이 있음)

프로세스 간 시그널 통신을 통한 발생과 정책 적용

- 시그널 사용 방법

입력 문법 1) SignalName '-signalNumber 또는 -signalName' PID
- 시그널을 적용하고자 할 때

2) Signal -l '번호'
- 번호 없이 -l만 치면 해당 시그널의 모든 목록이 출력됨
옵션 1) '-signalNumber 또는 -signalName'
- 각각 순서 무관하며, signalName의 경우 SIG 접두사는 생략하여 입력(ex- SIGSTOP이 아닌, STOP)

2) -l
- 지원 가능한 시그널 목록을 출력 
예문 $ kill -9 3000 또는 kill -KILL 3000
- 3000PID를 가진 프로세스는 kill Signal 9 (종료) 시그널을 받아서 종료됨

$ kill -19 3000 또는 kill -STOP 3000
- 3000PID를 가진 프로세스는 stop Signal 19 (정지) 시그널을 받아서 정지됨
비고 Signal 옵션이 생략된 경우에 TERM(Default로 종료) 시그널이 발생

UNIX/LINUX 종류에 따라 시그널 번호가 상이할 수 있음 (해당 이미지 CentOS 기준)

 

 

 

* 시스템 부팅 지식

1) 런 레벨(Run level) : 시스템 운영 상태(부팅)를 숫자 혹은 문자로 표현한 것

- init 프로세스가 /etc/inittab 파일에 정의된 RunLevel에 따라, /etc/rc.d/rc[x].d (x는 런레벨) 디렉터리에 나열된 스크립트를 실행, 시스템 운영 상태를 구성함

런레벨 시스템 운영 상태
0 - Unix : PROM (Programmable Read-Only Memory) Mode (BIOS Control)
- Linux : 시스템 종료(halt)
S, s
(Unix 전용)
- 로컬 파일 시스템이 마운트 되지 않은 시스템 싱글 유저 모드
(시스템 유지 보수 모드로 root 암호 필요 - 시스템 문제로 정상 부팅 불가할 시 자동 진입)
1 - Unix  : 단일 사용자 관리 상태에서, 시스템이 실행 되고 있음을 의미
- Linux : 로컬 파일 시스템이 마운트 된 시스템 싱글 유저 모드
(시스템 유지 보수 모드로 root 암호 필요 - 시스템 문제로 정상 부팅 불가할 시 자동 진입)
2 - Unix : 멀티 유저 모드 (NFS 클라이언트 모드 : NFS 서버 데몬 제외한, 모든 시스템 데몬 실행)
- Linux : 멀티 유저 모드 (NFS 지원하지 않음)
3 - Unix : 멀티 유저 모드 (NFS 서버 모드 : NFS 자원 공유 가능)
(Unix 기본 Run level)
- Linux : 모든 기능을 포함한 멀티 유저 모드 (X window 기능 제외)
4 - Unix : 구현되지 않음
- Linux : 사용하지 않음 (사용자가 직접 정의하여 사용)
5 - Unix : 시스템 Power off
- Linux : 멀티 유저 모드 (X window 환경으로 실행)
6 - 시스템 Rebooting

who -r 또는 runlevel 명령어로 현 시스템의 런레벨 확인

2) INIT State : 런 레벨을 이동할 떄, init 명령어를 통해서 제어(이동)

- init 런레벨 명령어를 통해 런레벨 이동 가능

3) 시스템 시작 과정 (순차적으로 아래 과정들이 수행)

Bios 과정 - 전원이 들어오면 Bios가 하드웨어의 이상 유무를 점검하드웨어 정보를 수집
Boot 프로그램 과정 - Boot 프로그램이 하드디스크에서 커널을 읽어들여, 메모리상에 적재시스템 제어권을 커널에 넘김
Kernel 과정 - 메모리상에 커널 적재 시점 부터 OS 구동 시작


- 커널이 하드웨어 점검을 완료하고, 내부 자료구조를 초기화, 시스템 운영을 위해 하드디스크에서 부가적 커널을 메모리상으로 적재
init 과정 * init 프로세스 : 커널에 의해 생성되는 첫 프로세스 (PID 1)로, 모든 프로세스의 부모 프로세스가 되며, 사용자의 시스템 사용을 위해, 초기화 작업을 담당

- OS 구동이 완료되어, 하드웨어 모든 기능 제어 시, init 프로세스가 실행되어 런레벨에 따라 시스템 부팅

4) 시스템 종료 과정

- 종료 시 주의 사항

  • 접속중인 사용자에게 시스템 종료를 공지, 작업 마무리 유도
  • 운영 중인 서비스(프로세스)를 안전하게 종료
  • 하드디스크를 갱신하여 파일 시스템 무결성을 유지

- Unix/Linux 종류 (BSD, System V 계열 등 포함)에 따라 명령어가 상이함 (아래는 대략 공통적인 요소)

시스템 종료 - init 5
- shutdown -y -g0 -i 5
- poweroff
PROM 모드 진입 - init 0
- shutdown -y -g0 -i 0
- halt
시스템 리부팅 - init 6
- shutdown -y -g0 -i 6
- reboot

5) 하드디스크 동기화(Sync) : 하드디스크의 높은 입,출력 효율성을 위해 버퍼를 운영하며, 시스템 비정상 종료 시, 버퍼의 데이터가 하드디스크에 반영되지 않아 파일 시스템의 무결성에 문제를 줄 수 있어, sync 명령어버퍼 내용을 하드디스크로 옮겨 주게됨.

 

 

 

* 프로세스 스케줄 관리

1) 정기적 스케줄 관리(cron) : cron 데몬 프로세스정기적 작업을 지정 시간에 처리하는 용도로 사용. (스케줄링)

cron 데몬 사용 시,
필요 구성 요소
설명
crontab 파일 - 스케줄링 할 작업 목록을 정의하는 파일
crontab 명령 - crontab 파일을 제어(편집)하는 명령
cron 데몬 프로세스 - crontab 파일을 읽어 정의된 대로 작업을 처리

2) crontab 파일 구조 : 각 행은 space나 tab키로 구분6개의 필드로 이루어짐

구분 기술 방법 비고
필드 의미
필드1 0-59 까지 숫자로 기술 * : 모든 값
- : 값의 범위 지정
, : 값을 구분하여 지정
/ : 간격 값 지정
필드2 0-23 까지 숫자로 기술
필드3 1-31 까지 숫자로 기술
필드4 1-12 까지 숫자로 기술
필드5 요일 0-6까지 숫자로 기술
(0 : 일요일)
필드6 작업 - 스케줄링 할 작업을 절대경로로 기술
- 필요 옵션 및 인수를 함께 나열
 

crontab 파일 확인 시 주석 설명 내용 (crontab 파일 구조)
cron 스케줄링 예시

3) crontab 파일 제어 (crontab 명령어)

- 사용자 계정별로 만들어지며, root를 제외한 일반 사용자들은 자신의 crontab 파일만 편집 할 수 있음.

- 개인 유저용 crontab 파일 : /var/spool/cron/crontab

- root 유저용 crontab 파일 : /etc/crontab

- 직접 vi 편집기로 경로에 들어가서 제어하거나, crontab 명령어 (옵션 -e : 편집 / -l : 출력 / r : 삭제)을 사용

4) crontab 명령 접근 제어 : 사용자에 대한 crontab 명령어 실행 권한을 적절히 제한

설정 파일 존재 여부 설명
/etc/cron.allow 만 존재 - 화이트 리스트 방식 (사용자명 기입)
/etc/cron.deny 만 존재 - 블랙 리스트 방식 (사용자명 기입)
allow 및 deny 모두 존재 - allow 파일이 우선하여 적용
allow 및 deny 모두 없음 - root만 crontab 명령어 실행 가능

5) 일시적 스케줄링 (at) : cron과 다르게 정해진 시간에 한 번만 실행되는 at 명령 (한번 작업 처리 후 목록에서 삭제됨)

2021년 03월 10일 12시에 특정 명령어 실행하는 at 설정(예시)

 

 

 

* 프로세스 실행 권한

1) 권한 종류 : 프로세스의 자원에 대한 접근 권한을 판단하기 위해 부여한 ID

종류 의미
RUID
(Real User ID)
- 프로세스를 실행시킨 사용자의 UID
RGID
(Real Group ID)
- 프로세스를 실행시킨 사용자의 GID
EUID
(Effective User ID)
- 자원의 접근권한 판단을 위해 프로세스가 실행중인 동안에만 부여되는 UID
EGID
(Effective Group ID)
- 자원의 접근권한 판단을 위해 프로세스가 실행중인 동안에만 부여되는 GID
SUID
(Set UID)
- 프로세스가 실행 중인 동안(일시적)에 해당 실행파일의 소유자의 권한으로 자원에 접근할 수 있도록 하는 권한
SGID
(Set GID)
- 프로세스가 실행 중인 동안에(일시적)에 해당 실행파일의 소유그룹의 권한으로 자원에 접근할 수 있도록 하는 권한

- SUID, SGID가 설정되지 않은 프로세스를 실행시킬 시, RUID와 EUID / RGID와 EGID가 동일하게 설정됨

- SUID, SGID가 설정된 프로세스를 실행시킬 시, RUID와 RGID실행자의 UID와 GID를 따르며, EUID와 EGID실행파일 소유자의 UID와 GID로 설정

2) 특수권한 비트(SUID, SGID) 설정(8진수/기호) : 파일 종류 및 접근 권한에 총 16bit를 사용
- 각각 파일 종류(4bit), 특수 권한(3bit), User/Group/Other(총 9bit)으로 구분

특수 권한(3bit) user(3bit) group(3bit) other(3bit)
4 2 1 4 2 1 4 2 1 4 2 1
s(suid) s(sgid) t(stick-bit) r w x r w x r w x

- chmod 명령어로 SUID(4000)와 SGID(2000)을 할당 시, 실행 권한(x)부분이 s로 표시

실행(x) 부분 권한이 S로 표시(SUID, SGID 할당)

- 슈퍼 유저(root)의 자원에 대해 일반 사용자의 직접 접근은 차단하면서, 기능상 필요한 부분만 접근하도록 할 경우 SUID와 SGID가 유용

- 단, 슈퍼 유저(root) 권한이 필요 없는 프로그램에 소유주가 root일 시, 오히려 보안 취약점이 될 수 있음

3) root 소유 SUID, SGID 실행파일 주기적 검사

find 명령어를 통해 소유자가 root인 것들에 대해서 SUID와 SGID를 조회

4) 디렉터리 접근 권한(Sticky-bit) : 공유 디렉터리(ex, /tmp, /var/tmp 등)같이 권한이 자유로울 경우, 타 사용자의 자원을 침해할 수 있으므로, Sticky-bit를 설정하여 자원 생성은 자유롭되, 삭제나 파일명 변경(쓰기 권한)소유자 또는 root만 가능하도록 설정

- chmod로 sticky-bit(1000) 할당 시, other의 실행 권한(x) 부분이 T로 표시

실행(x) 부분 권한이 T로 표시(Sticky-bit 할당) / (unix는 other가 아니라 user 할당으로 u+t로 명령어 사용)

 

 

 

* 보안 쉘(SSH) : 네트워크 상 암호 통신을 이용, 원격으로 명령을 실행하는 응용 프로그램 또는 포로토콜

- 암호화된 원격 터미널 서비스 또는 암호화된 파일 송수신 서비스 제공

- 기존 rsh, rlogin, telnet, FTP 등 평문 송수신 서비스 취약점 대체 목적으로 Default Port 22로 사용

 

 

 

* 서버 프로세스(데몬)

1) 슈퍼 데몬(inetd 데몬) : 데몬의 데몬 프로세스로, 개별 서비스를 등록하게 하여 Client 요청은 슈퍼 데몬이 모두 처리하고 개별 서비스를 호출 해주는 방식

데몬 동작 방식 분류 설명
Stand-Alone 방식 - 개별 서비스별 데몬이 동작하는 방식


- 속도는 빠르나, 서버 리소스를 많이 점유함
inetd(xinetd) 방식 - 슈퍼 데몬을 이용하여, 개별 서비스를 동작하는 방식


- N개의 개별 서버를 하나로 통합, 서비스 요청이 올 때마다 서비스별 관련 모듈 실행


- 상대적으로 속도가 느리지만, 서버 리소스를 절약 할 수 있음

- inetd 데몬은 최초 실행 시, /etc/inetd.conf 파일 정보를 참조하여, 서비스할 프로그램들의 정보를 얻음
(서비스할 프로그램 특징을 관리자가 /etc/inetd.conf에 사전 정의)

- TCP Wrapper(tcpd 서비스)와 연동하여, 서비스 별 호스트 접근 제어 수행 가능

xinetd : 리눅스 시스템의 슈퍼 데몬으로, inetd에서 보안과 리소스 관리 등을 향상시킨 것으로, 기능상 큰 차이는 없음
( 현재 페이지에 부가 설명 있음 )

2) inetd.conf 파일 구조

/etc/inetd.conf 내용 설정 예시 (7개 필드)

필드 내용
서비스명
(service_name)
- /etc/services 파일에 등록된, 포트 번호를 참조하여 서비스할 프로세스 포트를 결정
(/etc/inetd.conf와 /etc/services 파일은 서비스명을 인덱스로 하여, 서비스 정보를 서로 연계)
소켓타입
(sock_type)
- TCP 기반 서비스는 stream
- UDP 기반 서비스는 datagram
프로토콜
(proto)
- /etc/protocols 파일에 주어진 프로토콜 중, 사용 가능한 프로토콜을 설정
(/etc/services 파일에 설정한 프로토콜과 일치해야 함)
플래그
(flags)
- nowait (서비스 요청을 받은 이후, 즉시 다음 서비스 요청을 처리할 지), 또는
wait (요청 처리가 완료될 때까지, 대기하였다가 다음 요청을 처리할 지) 설정
사용할 사용자 계정
(user)
- 프로그램을 실행시킬 사용자를 선정
실행 경로명
(server_path)
- 해당 서비스를 처리하는 실행 모듈의 경로를, 절대 경로로 설정
실행 인수
(args)
- 프로그램의 인수를 설정
(첫 번째는 응용 프로그램 자신의 이름)

/etc/services 파일 : 웹 상에서 사용하는 서비스들에 대한 포트/프로토콜 정보를 정의해 놓은 파일
(Well-Know Port 0-1023), (registerd port 1024-49151), (dynamic port 49152-65535)

/etc/services 파일 내용 일부

/etc/protocols 파일 : 웹 상에서 사용하는 프로토콜과 프로토콜 식별 번호를 정의해 놓은 파일

/etc/protocols 파일 내용 일부

- 설정 후 inetd.conf 파일에 실행할 서비스 활성화 (필드에 맞게 정보 삽입 후 # 주석, 제거)는 inetd 데몬 재시작 필요

3) 불필요/취약한 서비스 비활성화

서비스 계열 설명
DoS 공격에 취약한 Simple TCP - echo(7/tcp)
- discard(9/tcp)
- daytime(13/tcp)
- chargen(19/tcp) 등
r 계열 서비스 - rlogin, rsh, rexec 등
(인증 없이 관리자의 원격 접속을 가능하게 하는 명령어들)
불필요한 rpc
(remote procedure call)
- rpc.cmsd, rusersd 등 분산 환경에서, 서버 응용프로그램에 접근하여 작업 호출(call)이 가능한 서비스들
(Buffer OverFlow 등 침해사고 발생 위험 존재)
기타 - finger, tftp, talk 등

불필요/취약한 서비스 확인 및 비활성화(#) 처리

 

 

 

* 접근 통제

1) TCP Wrapper : 외부 유입 클라이언트의 IP를 확인하여, 접근 통제 기능을 제공
- 접근 제어의 판단은 /etc/hosts.allow(1순위 참조)/etc/hosts.deny(2순위 참조) 파일호스트 IP 정보를 기반으로 함

- allow와 deny 모두 없을 시, default는 모든 접근을 허용함

2) TCP Wrapper 적용 전/후의 /etc/inetd.conf 파일 구조 (telnet 서비스 예시)

구분 service_name sock_type proto flags user server_path args
사용 전 Telnet stream TCP nowait root /usr/sbin/in.telnetd in.telnetd
사용 후 Telnet stream TCP nowait root /usr/sbin/tcpd in.telnetd

- inetd 데몬(슈퍼 데몬)은 외부 요청이 올 경우, /etc/inetd.conf 파일을 참조실행경로(server_path)에 설정 된 TCP Wrapper Process를 실행

- tcpd가 hosts.allow와 hosts.deny 파일 참조접근제어를 수행하여, 실행 인수(args)로 설정된 서비스를 실행

3) hosts.allow(접근 허용)와 hosts.deny(접근 금지) 파일

문법 service_list : client_list [: shell_command] - [: shell_command] 는 선택 사항
옵션 service_list 한개 이상의 네트워크 서비스명 또는 예약어 (,로 구분)
clinet_list 한개 이상의 호스트명, 도메인명, IP주소, 네트워크ID 또는 예약어
(,로 구분)
shell_command 일치하는 것이 있을 때 선택적으로 tcpd가 실행하는 쉘 명령

- 아래 설정 예시 참조

hosts.deny
(2순위 참조)
hosts.allow
(1순위 참조)
설명
ALL : ALL ALL : 192.168.1.1 - 192.168.1.1 IP에 대해 모든 서비스가 가능
ALL : ALL in.telnetd : 192.168.1.1
in.ftpd : 192.168.1.1, 192.168.1.2
- 192.168.1.1 IP에 대해 Telnet과 FTP 서비스 가능
- 192.168.1.2 IP에 대해 FTP 서비스가 가능
- 그 외의 모든 호스트는 어떤 서비스도 받을 수 없음
ALL : ALL in.telnetd : test.co.kr - test.co.kr 도메인에 속한 모든 호스트는 Telnet 서비스가 가능
ALL : ALL ALL : 192.18.1.0/255.255.255.0 - 192.168.1.0 네트워크에 속한 모든 호스트는 모든 서비스 가능
ALL : ALL in.telnetd : 192.168.1. - 192.168.1로 시작하는 IP주소를 갖는 모든 호스트는 모든 서비스 가능
(192.168.1. <- 조건 명시 할 시, 끝 부분 '.' 반드시 필요)
ALL : ALL ALL : LOCAL - 동일 네트워크에 있는 모든 호스트에 대해 모든 서비스 가능
ALL : ALL ALL EXCEPT in.telnetd : ALL - 모든 호스트에 대해 Telnet 서비스를 제외한 모든 서비스 가능
ALL : ALL in.telnetd : .test.com EXCEPT www.test.com - www.test.com을 제외한 test.com 도메인의 모든 호스트에 대해 Telnet 서비스 가능
(.test.com <- 조건 명시 할 시, 도메인 앞쪽 끝에 '.' 반드시 필요)

- shell_command : ACL에 일치하는 것이 있으면 실행하며, 일반적으로 hosts.deny 파일에 이를 설정하여, 통보나 경고 메세지를 보내는 용도로 사용

Shell_command
실행 선언
설명 예시 (hosts.deny 파일에 설정)
twist - 명령의 결과를
클라이언트에 전송
in.telnetd : 192.168.0.104 : twist /bin/echo "! 연결 거부 !"


- 192.168.0.104 호스트에서 telnet 요청이 올 시 연결 거부 및 ! 연결 거부 ! 라는 메세지 전송
spawn - 명령의 결과를
클라이언트에게 미전송
in.telnetd : 192.168.0.104 : spawn /bin/mail -s "%a is denied" root


- 192.168.0.104 호스트에서 telnet 요청이 올 시 연결 거부 후, %a is denied 라는 제목으로 root에게 메일 전송

- shell_command 라인에서 사용 가능한 특수 문자

특수 문자 내용
%a - Client IP 주소
%A - Server IP 주소
%c - Client의 정보 (User@Host, User@Address 또는 호스트 네임, IP 주소)
%d - Service name
%h - Client의 호스트 명 또는 IP 주소
%n - Client의 호스트 명
%u - Client의 사용자 이름
%p - 서비스의 데몬 프로세스
%s - 서버의 정보(daemon@host, daemon@address 또는 데몬 이름, IP 주소)
%% - 하나의 % 문자

 

 

 

* xinetd 슈퍼 데몬 : inetd의 비효율적 리소스 관리와 보안성 문제를 개선하여 나온 슈퍼 데몬
- TCP Wrapper 기능 외에도, 자체적으로 서비스별 접근 제어가 가능

1) 서비스 구성

- /etc/xinetd.conf : 글로벌 xinetd 설정 파일

- /etc/xinetd.d/서비스명 : 개별 서비스에 대한 설정 파일

2) 서비스별 설정파일 내부 정보 (/etc/xinetd.d/서비스명)

/etc/xinetd.d/telnet 설정 파일(예시)

지시자 설명
service - 서비스 이름
disable - 해당 서비스 활성화 여부 (yes : 실행 안함 / no : 실행)
socket_type - 서비스 소켓 유형 (TCP : stream / UDP : datagram)
wait - no (서비스 요청 중 다음 요청이 들어올 시 즉시 처리)
- yes (서비스 요청 중 다음 요청이 들어올 시 현재 요청이 완료 될 때 까지 대기 후 실행)
user - 어떤 사용자로 서비스를 실행할 지 설정
server - 서비스 실행 파일 경로 설정 (반드시 절대 경로)
cps
(Connection
per
second)
- 연결 요청을 제한하기 위한 설정
- 첫 인자 : 초당 연결 개수
- 두번째 인자 : 초당 연결 개수를 초과할 시, 서비스 일시 중지 후 재시작 때까지 대기하는 시간(초)

ex) cps = 50 10
- 초당 연결 개수 50개 제한 및 이를 초과 시, 10초간 일시 중지 후 다시 서비스 재개
instances - 동시에 서비스 할 수 있는 서버의 최대 개수 지정
per_source - 출발지 IP 기준으로, 최대 서비스 연결 개수 지정

ex) per_source = 10
- 동일 출발지 IP의 클라이언트는 최대 서비스 연결 개수 10개로 제한
only_from - 특정 주소 또는 주소 대역만 접근을 허용

ex) only_from = 192.168.159.0/24
- 192.168.159.0/24 대역만 접근을 허용
no_access - 특정 주소 또는, 주소 대역의 접근을 차단
- 주소를 나열할 경우, space를 구분자로 함

ex) no_access = 192.168.159.131 192.168.159.132
- 설정한 IP들에 대해 접근 차단
access_times - 지정한 시간 범위 내에서만 접근을 허용 (24시 기준)

ex) access_times = 09:00-12:00 13:00-18:00
- 9~12시, 13~18시 내에서만 접근을 허용
log_on_failure - 서버 접속에 실패했을 경우, 로그파일에 기록할 내용을 설정 (/var/log/messages에 기록)

- PID : xinetd 데몬의 PID
- HOST : 원격 호스트 IP
- USERID : 원격 사용자 ID
- EXIT : 프로세스 종료 상태
- DURATION : 서버 세션 지속 시간
log_on_success - 서버 접속에 성공했을 경우, 로그 파일에 기록할 내용을 설정

 

 

 

* PAM (장착형 인증 모듈 - Pluggable Authentication Modules)

1) PAM : 리눅스 시스템 내 각종 어플리케이션 인증을 위한 인증용 라이브러리들

- 일반적으로 /lib/security 또는 /usr/lib/security 디렉터리에 해당 라이브러리 저장되어 있음

- Softward 개발 시, 인증 모듈을 별도 개발 하지 않거나, 독립적으로 개발할 수 있고, 필요에 따라 인증 체계를 선택적으로 사용할 수 있는 장점

- 즉, 기존 응용 프로그램을 수정할 필요 없이, Plug-in 방식의 PAM으로 인증 서비스 모듈 추가, 사용 가능

2) PAM을 사용한 인증 절차

- 각 서비스 프로그램(Telnet, ftp 등)의 인증이 필요한 부분PAM 라이브러리 호출, PAM 설정파일을 참조, 등록된 PAM 모듈들을 수행, 결과를 응용 프로그램에 반환

- 반환된 결과에 따라 인증 여부를 결정

- 아래는 PAM 라이브러리 관련 경로들

PAM 라이브러리를 이용하는 각 프로그램의 설정파일이 위치 (/etc/pam.d)
PAM 모듈 실행에 필요한 추가 설정 파일 위치(/etc/security) 
PAM 라이브러리에서 제공하는 인증 모듈들 위치(/lib/security 또는 /lib64/security)

3) PAM 설정 파일 (/etc/pam.d/remote 설정파일 일부)

4개 필드로 구성된 설정 파일 (type, control, module-path, module-arguments)

 

필드 필드 설명 구성 요소 구성 요소 설명
type PAM 모듈 종류 account
(계정)
- 사용자 계정 유효성을 검증

- 유효기간(비밀번호 만료), 접속 가능 시간, 서비스 접근 허용 여부 등
auth
(인증)
- 사용자 계정 패스워드 검증

- 다른 인증 모듈과의 연동 등 사용자 신원 확인을 수행

- 패스워드 인증, OTP/보안카드 인증 등
password
(패스워드)
- 사용자 계정 비밀번호 설정 및 변경 조건 지정

- 변경 시, 최소 길이, 복잡도 설정 등
session
(세션)
- 사용자 계정 인증처리 전/후 수행할 작업 지정

- 사용자 홈 디렉터리 마운트, 메일함 생성 등
control 각 모듈 실행 후,
성공 또는 실패에 따른
PAM 라이브러리 행동 결정
requisite - 인증에 실패할 경우, 즉시 인증을 거부
required - 인증에 실패해도 다음 라인의 모듈을 실행하나, 최종 결과는 인증 실패
sufficient - 이전에 요청한 모듈이 실패해도, 여기서 성공할 시, PAM은 인증 성공
(단, 이전에 위치한 required 모듈이 모두 성공일 경우)
optional - 모듈의 성공, 실패 결과 모두 무시
module-path 실제 모듈파일이 위치한 경로 /lib/security - 모듈 이름(*.so 파일)만 명시할 경우에 한하여, /lib/security에서 모듈을 찾음
module-arguments 모듈에게 저달되는 인수    

 

 

 

* PAM 활용 예 (시스템 취약점 분석, 평가 항목)

1) root 계정 원격 접속 제한 : Terminal 접속 시, /etc/securetty 파일에 등록되어 있는 터미널이 아닐 시 접속을 허용하지 않도록 PAM 설정

/etc/securetty 파일 : pam_securetty.so 모듈이 사용하는 파일로, 터미널 접속 시 root 접근 제한 설정 파일

- 터미널 접근 시, root 계정 사용 차단을 위해 /etc/pam.d 디렉터리(PAM 라이브러리를 이용하는 프로그램 설정 파일 위치)의 remote 서비스(또는 login) 설정 파일에 pam_securetty.so 모듈 추가
(목적 지정 -> 특정 서비스 설정 파일 접근 -> 필요 모듈 추가)

/etc/pam.d/remote 설정파일에 pam_securetty.so 모듈 추가

- (모듈이 사용하는 파일) /etc/securetty 파일에 "pts/~" 터미널모두 제거(또는 주석처리)

/etc/securetty 파일에 pts 터미널 주석 처리

tty (terminal-teletype) : 서버와 연결된 모니터, 키보드 등을 통해 사용자가 콘솔로 직접 로그인

pts(pseudo-terminal, 가상터미널) : Telnet, 터미널 등을 통해 접속하는 가상 터미널

- /var/log/secure에서 pam모듈 로그 확인

tty, pts, PAM 등의 로그 주의해서 확인

- 유닉스/리눅스 OS 별 root 계정 원격 접속 제한 설정

SOLARIS #cat /etc/default/login
CONSOLE=/dev/console
- CONSOLE 라인 주석 처리 시, 외부에서 root 접근 가능
(주석 처리 하지 말것)
LINUX #cat /etc/pam.d/login
auth required /lib/security/pam_securetty.so

#cat /etc/securetty
pts/0 ~ pts/x
- PAM 라이브러리 경로의 login 서비스에서 pam_securetty.so 모듈 추가

- securetty에서 외부 가상터미널 pts에 대한 설정 확인
(주석 처리 또는 삭제 필요)
AIX #cat /etc/securetty
rlogin = false
- /etc/securetty/user 파일의 rlogin 설정 변경
(true : root 계정 접속 가능 / false : root 계정 접속 불가)
HP-UX #cat /etc/securetty
console
- CONSOLE 라인 주석 처리 시, 외부에서 root 접근 가능
(주석 처리 하지 말것)

- 현재 접속중인 root 사용자 정보 조회(w 명령어)

w 명령어

- SSH root 원격 접속 제한 설정

/etc/ssh/sshd_config 파일의 PermitRootLogin를 no로 설정

2) 계정 잠금 임계값 설정 : BruteForce Attack 또는 Dictionary Attack 발생 시, 암호입력 실패 횟수를 적절히 제한, 공격 시간을 지체시키며, 계정 잠금 임계값을 지정(권장 5회 이하) 초과 시, 패스워드를 일정 시간 잠금

- 계정 임계값 설정 시, /etc/pam.d 디렉터리(PAM 라이브러리를 이용하는 프로그램 설정 파일 위치)의 system-auth 서비스 설정 파일에, pam_tally2.so(또는 pam_tally.so) 모듈을 추가
(목적 지정 -> 특정 서비스 설정 파일 접근 -> 필요 모듈 추가)

/etc/pam.d/system-auth 설정 파일에 pam_tally2.so 모듈 추가

- 리눅스의 pam_tally.so 모듈 옵션

deny=횟수 - 횟수에 따른 입력 실패 시 패스워드 잠금 설정
ex) deny=5
unlock_time=초 - 계정 잠김 후 설정 시간 후 잠금 해제
ex) unlock_time=120
no_magic_root - root 계정은 패스워드 잠금 설정 적용하지 않음
reset - 접속 시도 성공 시, 실패한 횟수 초기화
(단, account required /lib/security/pam_tally.so 에 reset 옵션 설정

- 나머지 과정 유사(/var/log/secure 로그 확인, OS별 설정 방식 차이 존재 등)

- pam_tally2 명령을 통해 실패 횟수 확인 및 초기화

pam_tally2 명령어 : '-u 계정명'으로 실패 횟수 확인 / '-r'로 횟수 reset

3) root 계정 su 제한 설정 : 권한 없는 사용자가 su 명령으로 root 권한을 획득할 수 없도록 설정

- su 명령어 사용을 허용할 사용자를 추가하는 방식 (wheel 그룹)

- 필요 시 'usermod -G wheel 계정명' 명령어로 추가 또는, /etc/group의 wheel 끝에 직접 계정 추가 (필요 계정의 보조그룹을 wheel로 변경)

root와 pamtest라는 계정을 wheel 그룹에 추가

- wheel 그룹의 사용자만 su 명령어가 허용 되도록 /etc/pam.d/su 서비스 설정 파일pam.wheel.so 모듈 추가 및 설정 변경

/etc/pam.d/su 파일에 pam_wheel.so 모듈 추가 및 설정 확인 (설정 주석 해제)

- 나머지 과정 유사(/var/log/secure 로그 확인, OS별 설정 방식 차이 존재 등)

- sudo (superuser do 또는 substitute user do) : 다른 사용자 계정(root 포함)의 권한으로 명령어 실행할 수 있는 명령어
- su 명령어의 root 비밀 번호를 알려줘야하는 부담 대신, 최소 권한의 원칙에 따라 관리자 로그인은 차단, 권한이 필요한 경우에만 sudo 명령을 사용하여 제한적으로 관리자 권한 명령어 실행하도록 함

문법 sudo [-u 실행 권한 계정명] 명령어
옵션 -u - 명령어 실행 때 가질 권한의 계정명 입력
- 생략 시 root 권한으로 자동 지정
예문 $ sudo /batch/log_batch.sh
$ sudo -u test /batch/log_batch.sh

- /etc/sudoers (sudo 명령어 설정 파일) 설정 : 5가지 요소 설정 가능

/etc/sudoers 설정 파일 설정 예시

1. 계정명 - sudo 명령을 실행할 계정명이나, 그룹명 지정 (그룹명은 %를 앞에 붙임)
- 모두에게 줄 경우 ALL 지정
2. 호스트명 - sudo 명령을 실행할 호스트의 호스트명 또는 IP
- 모든 서버가 대상이면 ALL 지정
3. 실행 권한 계정명 - 명령어를 실행할 때 가질 권한의 계정명 (생략 시 root 권한 부여)
- root 포함 모든 계정 권한을 부여할 시 ALL 지정
4. NOPASSWD - 해당 옵션을 설정할 경우 sudo 명령을 실행하는 계정의 비밀번호를 물어보지 않음
5. 명령어 - 실행을 허용할 명령어의 경로
- 모든 명령어를 허용할 경우 ALL 지정

 

 

 

* Unix/Linux 로그

1) 시스템 로그 설정 : 로그 저장 경로는 OS마다 상이하나, 유닉스의 경우 보통 /var/adm, 리눅스의 경우 보통 /var/log 디렉터리에 주로 저장

- /etc/syslog.conf 파일에서 시스템 로그 파일들의 위치를 지정 (현재는 rsyslog로 개선됨)

2) 유닉스/리눅스 주요 로그 파일

로그 파일 명
(사용 OS 정보)
저장 용도 조회 명령어 경로
utmp(x)
(Linux/Unix(SunOS)
- 현재 로그인한 사용자의 상태 정보 w, who, finger - Unix(SunOS)) : /var/adm/utmpx


- Linux : /var/run/utmp
wtmp(x)
(Linux/Unix(SunOS)
- 사용자의 성공한 로그인/로그아웃 정보

- 시스템의 Boot/Shutdown 정보
last - Unix(SunOS)) : /var/adm/wtmpx


- Linux : /var/log/wtmp
lastlog
(Linux/Unix(SunOS)
- 가장 최근(마지막)에 성공한 로그인 lastlog (Linux),


finger (Linux/Unix(SunOS))
- Unix(SunOS)) : /var/adm/lastlog


- Linux : /var/log/lastlog
btmp
(Linux)

loginlog
Unix(SunOS)
- 실패한 로그인 시도에 대한 기록 정보 lastb (Linux),


파일 직접 확인
Unix(SunOS)
- Unix(SunOS)) : /var/adm/loginlog
* 단, System V 계열(SunOS 등)은 5회 이상 로그인 실패 시 기록 남김


- Linux : /var/log/btmp
sulog
Unix(SunOS)
- su(switch user) 명령을 사용한 결과 저장 (Unix 계열만 확인 가능) 파일 직접 확인
Unix(SunOS)
- Unix(SunOS)) : /var/adm/loginlog


- Linux의 경우 /var/log/secure에 su 명령 사용 결과가 남음
acct
(Linux)

pacct
Unix(SunOS)
- 시스템에 로그인한 모든 사용자가,
로그아웃 할 때까지 입력한,
명령어/터미널 종류/프로세스 시작 시간 등 기록
lastcomm - Unix(SunOS)) : /var/adm/pacct
* 기본 생성 파일이 아니므로, /usr/lib/acct/accton /var/adm/pacct 명령 실행 필요


- Linux : /var/account/pacct
* 기본 생성 파일이 아니므로,
accton /var/account/pacct
명령 실행 필요
history
(Linux/Unix(SunOS)
- 각 계정별 실행한 명령어 기록

- history 로그 파일은 ".쉘종류_history"
형식으로 생성
history - 각 계정별 홈디렉터리에 존재
secure
(Linux)
- 주로 사용자/그룹 생성/삭제, 로그인 등의 사용자 인증에 대한 정보 기록

- 원격에서 접속한 내역 및 su 명령
수행한 내역 등 저장
파일 직접 확인(Linux) - Linux : /var/log/secure
messages
(Linux)
- 주로 시스템 데몬들의 실행 상황/내역

- 사용자들의 접속 정보

- TCP Wrapper 접근 제어 정보 등

- 시스템 운영에 대한 전반적 메세지
저장 (리눅스 기본 시스템 로그 파일)
파일 직접 확인(Linux) - Linux : /var/log/messages
dmesg
(Linux)
- 리눅스 부팅 시, 출력되는 모든 메세지

- 부팅 에러나 조치 사항 참조용
파일 직접 확인 또는
dmesg 명령(Linux)
- Linux : /var/log/dmesg
boot.log
(Linux)
- 리눅스 부팅 시, FileSystem에 대한 체크, 서비스 데몬들 실행 상태 등 기록

- 성공/실패 여부 확인 가능
파일 직접 확인(Linux) - Linux : /var/log/boot.log
xferlog
(Linux)
- 리눅스 내 FTP 로그 파일

- proftpd 또는 vsftpd 데몬들의 서비스 내역을 기록

- FTP 로그인 사용자 기록 및 어떤 파일 업/다운로드 하는지 기록
파일 직접 확인(Linux) - Linux : /var/log/xferlog
cron
(Linux)
- cron (시스템 정기 작업)에 대한 로그

- /etc 디렉터리에
cron.hourly, cron.daily, cron.weekly, cron.monthly 디렉터리들은
각각 시간별, 일별, 주별, 월별로 정기적으로 자동 실행할 작업 스크립트 파일들이 존재
파일 직접 확인(Linux) - Linux : /var/log/cron
maillog
(Linux)
- sendmail 또는 qmail 등의 메일 송수신 관련 내역들과 ipop, imap 등의 수신 내역들 기록 파일 직접 확인(Linux) - Linux : /var/log/maillog
mail
(Linux)
- 사용자들에 대한 메일을 보관하는 디렉터리

- 메일을 한번 이상 사용한 사용자는 계정ID와 동일한 파일이 하나씩 존재

- 사용자 계정 생성 시, /var/spool/mail 디렉터리 내 생성하는 계정명과 동일한 메일 파일이 생성

- 메일을 읽고 사용자 메일 디렉터리로 저장하거나, 메일을 삭제 했을 경우에 이 파일에서 메일 내용이 삭제됨
파일 직접 확인(Linux) - Linux : /var/spool/mail

3) 로그 조회 명령어 분석

- w (utmp) 명령

w (utmp)

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
로그인
계정
사용
터미널
원격 호스트
주소
로그인 한 
시간
아무 입력도
수행하지 않은
시간
현재 background의 TTY 필드 내,
터미널에서 사용하는
모든 프로세스의
CPU 사용 시간
what 필드
프로세스의
CPU 총
사용 시간
접속자 별
현재 사용
명령어

- who (utmp) 명령 : 사용자명 / 접속 터미널 / 접속 시각 / 접속 IP

who (utmp)

- finger (utmp, lastlog) 명령 : 원격지에서도 사용자 정보 조회가 가능해 보안상 주의 필요

finger (utmp, lastlog)

- last (wtmp) : 모든 계정의 로그인/로그아웃 정보 출력

(계정명 / 접속 장치명 / 접속 주소 / 접속 기간(요일,월,일 시간-종료시간) / (머문 시간)

last (wtmp)

- lastlog (lastlog) : 모든 계정의 최근 접속 기록 확인 가능 (주로 'lastlog -u 계정명', 'lastlog -t 일수이내' 사용)

lastlog (lastlog)

- lastb (btmp) : 모든 사용자의 로그인 실패 기록 확인 가능 ('lastb 계정명' 으로 특정 계정 조회 가능)

lastb (btmp)

- lastcomm (acct/pacct) : 실행한 명령어 / 플래그 /실행 유저명 / 터미널 타입 / 프로세스 시작 시간

lastcomm (acct/pacct)

(flag 정보에는 S(슈퍼유저/root에 의한 실행), F(exec 없이 fork에 의해 실행), X(SIGTERM 시그널에 의해 종료) 등 있음)

- history (history) : 각 계정별, 계정 사용자(접속자)가 실행한 명령어 출력

history (history)

- dmesg (dmesg) : 시스템 부팅 메세지를 확인하는 명령어

dmesg (dmesg)

 

 

 

* syslog 설정 및 관리

1) syslog 동작 방식

syslog 구성 요소 내용
syslog API - 커널 및 응용 프로그램들에 의해 발생하는 로그를 체계적으로 생성, 관리
- syslog API 사용 구문 : syslog(priority, "%s", "로그 문자열")
syslogd - syslog API에서 생성한 로그들을, syslog.conf 설정 파일을 참조하여 지정한 위치(로그 파일, 콘솔, 외부 서버 등)에 로그를 기록
syslog.conf - syslogd가 참조하는 로그 설정 파일
- 어떤 로그를 어디에 남길 지에 대한 저장 규칙을 정의

2) syslog 보안 특성 : 기밀성, 무결성, 가용성 등 정보보호 특성을 고려하지 않고 개발되어, UDP로 로그를 전송할 시, syslog 메세지 모니터링에 취약하여, RFC 3195(Reliable Delivery for syslog)에서 보안 기능 제공을 권고

  • UDP 프로토콜 대신, 로그 전송 신뢰성 보장을 위해, 연결 지향 프로토콜인 TCP 이용 권고
  • syslog 메세지 기밀성 보장을 위해, syslog 서버 및 log 수집 대상 서버의 IP를 제외한 payload 보호를 위해 BEEP Framework 이용을 권고

BEEP(the Blocks Extensible Exchange Protocol) : 연결 지향적, 비동기 적 연결을 위한 응용 프로그램 프로토콜 프레임워크 (내부적으로 인증, 프라이버시, 재전송을 통한 신뢰성 등을 보장)

3) syslog.conf 파일 내부 포맷

syslog.conf 파일에 정의된 각 행의 포맷

- facility : 로그 생성 서비스 (어떤 대상에서 발생하는지 분류)

facility 설명
* - 모든 서비스를 의미
auth
authpriv
- 인증(authentication) 및 보안 관련 메세지
cron - crond 와 atd 데몬에 의해 발생되는 메세지
daemon - telnet, ftp 등 같은 데몬에 의한 메세지
kern - kernel에 의한 메세지
lpr - lpd(프린터 데몬)에 의한 메세지
mail - sendmail, pop, qmail 등의 메일 시스템에서 발생하는 메세지
news - USENET 등의 뉴스 시스템에서 발생하는 메세지
uucp - Unix-to-Unix Copy Protocol을 사용하여 발생하는 메세지
user - 사용자에 의해 생성된 프로세스
syslog - syslogd에 의해 발생되는 메세지
local0 ~ local7 - 시스템 부팅 메세지 기록, 기타 여분 서비스(확장)에 사용하기 위함

- priority : 로그 수준(Level) (심각도에 대한 설정)


높음







레벨







낮음
Priority
(단축 형태)
설명
Emergency
(emerg)
- 시스템이 전면 중단되는 panic condition으로 전체 공지가 필요한 상황
- system is unusable
alert
(alert)
- 즉각적인 조치가 필요한 상황(시스템 DB 오류 등)
- action must be taken immediately
Critical
(crit)
- 하드웨어 등의 심각한 오류가 발생한 상황
- critical condition
Error
(err)
- 일반적인 에러/오류가 발생한 상황
- error condition
Warning
(warning)
- 경고 메세지
- warning condition
Notice
(notice)
- 에러/오류는 아니지만, 관리자의 조치가 필요한 상황
- normal, but significant condition
Information
(info)
- 의미 있는 정보 관련 메세지
- information message
debug
(debug)
- 디버깅용 메세지
- debug-level message
  * - 모든 로그 수준
  none - 기록하지 않도록 설정

- 세미콜론(;)으로 여러 facility.priorty 설정 가능
(ex. *.info;mail.none;authprive.none;)

- action : 로그를 남길 위치 결정

action 위치 설명
로그 파일 - 파일명(경로) 지정
(ex. /var/log/secure)
콘솔 - /dev/console로 지정 시 콘솔 출력
원격 로그 서버 - "@호스트 주소"를 통해 지정 호스트로 로그를 보냄
(ex. @192.168.10.10)
user - 지정 사용자의 스크린으로 메세지 전송
(ex. root)
* - 현재 로그인되어 있는 모든 사용자의 스크린으로 메세지 전송

 

 

 

* 로그파일 순환(rotate) 관리

- syslog나 데몬 프로세스의 로그를 그대로 방치할 시, 사이즈 확장, 관리의 문제 등으로 디스크 사용률이 100%가 되는 등 시스템 장애를 유발할 수 있음

1) logrotate : 시스템 로그 파일 관리를 위한 도구로 로그 파일 순환(rotate) 압축(compress) 등의 기능을 보유

구분 위치 및 실행방법 설명
데몬(위치) /usr/sbin/logrotate - logrotate 데몬 위치 및 데몬 프로그램
데몬 설정 파일 /etc/logrotate.conf - logrotate 데몬 설정 파일
설정 디렉터리 /etc/logrotate.d - logrotate를 적용할 프로세스/데몬 설정 파일
상황 파일 /var/lib/logrotate.status - logrotate 한 작업내역을 보관한 파일
cron (일단위) /etc/cron.daily/logrotate - logrotate는 주기적 실행이 필요하여 cron에 의해
일 단위로 실행이 됨

2) logrotate 설정 파일(logrotate.conf) 주요 옵션

/etc/logrotate.conf 파일 내용

순환 일자 단위 - daily : 일 단위
- monthly : 월 단위
- weekly : 주 단위
순환 로그파일 개수 - rotate n
( 개수 n)
순환 시, 새롭게 생성되는 로그파일 속성 설정 - create [퍼미션] [소유자] [소유그룹]
ex) create 600 root root
로그파일 확장자 - dateext
(날짜를 붙여서 보관)
로그파일 압축 여부 - compress : 압축하여 보관
- uncompress : 압축없이 보관
로그파일 용량에 따른 순환 지점 - size n
ex) 100K, 100M
포함 설정 - include /etc/logrotate.d
(해당 디렉터리에 있는 개별 데몬/프로세스 설정 파일을 포함)

include 경로인 /etc/logrotate.d (설정 디렉터리)에 있는 파일들 (서비스 추가 설치 시, 더 생길 수 있음)

 

반응형