* Unix/Linux 시스템 로그인 과정 : Unix 계열 시스템은 모든 과정이 별개의 프로그램으로 실행됨
- 사용자 계정 ID/PW 입력 후, 로그인을 담당하는 /etc/passwd 파일내 해당 필드를 비교하여 확인 및 쉘이 사용할 변수(HOME, SHELL, USER 또는 LOGNAME)들을 근거로 초기 환경을 설정 후 로그인 쉘을 실행
shell : 사용자가 입력한 명령어를 해석하고 처리하여 프로그램을 실행하는 기능 (명령어를 입력할 수 있는 터미널 환경
* /etc/passwd 파일 : 시스템에서 사용자 관련 정보를 구분자(:)로 7개 필드의 정보를 구분하여 저장
필드 | 정보 |
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'로 설정 권장 |
* /etc/shadow 파일 (해시 패스워드) : 암호화된 패스워드 정보와 패스워드 에이징(aging) 정보가 저장되어 시간 흐름에 따라 패스워드가 관리됨
필드 | 정보 |
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 | - 암호화가 적용된 일방향 해시 알고리즘 식별을 위한 ID 1 : MD5 2 : BlowFish 5 : SHA-256 6 : SHA-512 |
$Salt | - 암호화 강도를 높이기 위한 랜덤값 (사용자 지정 패스워드 + 솔트값 => 레인보우 테이블 공격에 효과적 대응) |
$Encrypted_Password | - 패스워드에 솔트를 조합하여 해시한 해시값 |
* 패스워드 저장 정책 변경
pwconv 명령어 | - Shadow 패스워드 정책으로 설정 (shadow 파일에 암호화된 패스워드를 저장하는 정책) |
pwunconv 명령어 | - 일반 패스워드 정책으로 설정 (passwd 파일 내 계정 정보와 함께 저장하는 정책) |
* 그룹 정보 (/etc/group) : 시스템의 모든 그룹 정보를 저장되며 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) : 둘 이상의 명령을 함께 묶어, 출력 결과를 후행 명령의 입력 데이터로 전달하는 기능
- 파이프 (|) 기호 사용
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 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를 참조하는 파일 하드링크 파일이 있으면, 삭제되지 않음)
- 하드링크와 원본 파일간 어떤 파일을 수정하더라도 내용은 동기화 되며, 원본 파일만 삭제 시, 하드링크 파일이 원본 역할이 가능
2) 심볼릭 링크 : 하드링크 단점 보완이 목적으로, 원본 파일의 경로를 파일 내용으로 하는 새 파일을 생성
- inode number가 아닌 파일 경로를 기반으로 하여 파일 시스템 제한이 없음(디렉터리도 가능)
- 원본 파일의 삭제 또는 이동 시, 경로가 바뀌어 심볼릭 링크가 끊어짐
* 파일 종류
파일 종류 | 설명 |
일반 파일 (Regular file) |
- 데이터 또는 프로그램 코드에 해당 - 바이트 스트림으로 표준 파일 입출력 시스템 호출을 통해 참조 |
디렉터리 (Directory) |
- 포함된 파일들의 파일명과 inode number 목록(매핑 정보)을 내용으로 가진 특수한 파일 - 명시적인 시스템 호출(ls 등)을 통해 참조 |
특수 파일 (Special file) |
- 표준 입출력 시스템 호출을 통해 참조하며 목적에 따라 다양한 형태로 존재 - IPC(InterProcess Communication) : 파이프, 소켓 등의 파일을 사용 - 버퍼링(블럭 장치 파일) : 주변 장치(디스크, 프린터, 터미널, 키보드 등) 사용을 위한 장치 파일로 블럭 단위로 입출력 - 비 버퍼링(문자 장치 파일) : 문자 단위로 입출력 하는 주변 장치 |
* list(ls) 명령어 : 디렉터리 파일 목록 및 추가 옵션에 따른 정보를 보여주는 명령어
- inode number를 통해 inode 구조체 정보를 참조하여 상세 내역을 확인
- 총 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 : 새로 만들어질 파일 또는 디렉터리에서 제거될 권한을 명시
- 통상 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 -2000로 setuid 및 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)를 가진다
2) 부모(PPID)가 있는, 자식 프로세스가 활성화 된 상태에서 부모 프로세스가 종료될 시, 해당 자식은 고아(Orphan) 프로세스가 되며, 대리모 프로세스(init process - PID 1)가 부모 역할을 수행
3) 프로세스 종료 시, 자신의 종료 상태 정보(ps -l 명령어로 확인 가능한 정보)를 부모에게 반환해야 정상 소멸 가능
좀비 프로세스 : 정상 종료가 되지 않은 프로세스를 좀비 프로세스라고 하며, 좀비 프로세스가 과하게 많아 질 시, 신규 프로세스 생성이 불가한 문제가 생길 수 있음
- 모든 프로세스들은 종료 시, 커널을 통해 부모 프로세스에게 종료를 알리며, 종료 확인이 될 때까지(시그널을 통한 핸들링) 일시적으로 좀비 상태가 되며, 확인 완료 후 소멸됨
- 좀비 프로세스는 종료를 했기 때문에 실행 이미지 정보가 없고, 커널에 관리 정보만 남아있어서 Kill 시그널로 종료가 불가능하며, 시스템 리부팅을 통해 커널 정보 초기화 또는 부모 프로세스 문제를 해결해야 정상화 됨.
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가지 필드만 출력
ps -ef 필드명 | 설명 (공란은 상위 ps -l과 동일) |
UID | |
PID | |
PPID | |
C | |
STIME | Start Time으로, 프로세스가 시작된 시간 의미 (월,일 또는 시:분:초 형식) |
TTY | 프로세스와 연결되어 실행되는 터미널 번호 (?는 제어 터미널에 연결되어 있지 않음을 의미) |
TIME | |
CMD |
* 유닉스/리눅스 프로그램 실행 과정
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 이 생성 됨.
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로 종료) 시그널이 발생 |
* 시스템 부팅 지식
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 |
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 | 작업 | - 스케줄링 할 작업을 절대경로로 기술 - 필요 옵션 및 인수를 함께 나열 |
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 명령 (한번 작업 처리 후 목록에서 삭제됨)
* 프로세스 실행 권한
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로 표시됨
- 슈퍼 유저(root)의 자원에 대해 일반 사용자의 직접 접근은 차단하면서, 기능상 필요한 부분만 접근하도록 할 경우 SUID와 SGID가 유용함
- 단, 슈퍼 유저(root) 권한이 필요 없는 프로그램에 소유주가 root일 시, 오히려 보안 취약점이 될 수 있음
3) root 소유 SUID, SGID 실행파일 주기적 검사
4) 디렉터리 접근 권한(Sticky-bit) : 공유 디렉터리(ex, /tmp, /var/tmp 등)같이 권한이 자유로울 경우, 타 사용자의 자원을 침해할 수 있으므로, Sticky-bit를 설정하여 자원 생성은 자유롭되, 삭제나 파일명 변경(쓰기 권한)은 소유자 또는 root만 가능하도록 설정
- chmod로 sticky-bit(1000) 할당 시, other의 실행 권한(x) 부분이 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 파일 구조
필드 | 내용 |
서비스명 (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/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/서비스명)
지시자 | 설명 |
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 라이브러리 관련 경로들
3) PAM 설정 파일 (/etc/pam.d/remote 설정파일 일부)
필드 | 필드 설명 | 구성 요소 | 구성 요소 설명 |
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/securetty 파일에 "pts/~" 터미널을 모두 제거(또는 주석처리)
tty (terminal-teletype) : 서버와 연결된 모니터, 키보드 등을 통해 사용자가 콘솔로 직접 로그인
pts(pseudo-terminal, 가상터미널) : Telnet, 터미널 등을 통해 접속하는 가상 터미널
- /var/log/secure에서 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 명령어)
- SSH root 원격 접속 제한 설정
2) 계정 잠금 임계값 설정 : BruteForce Attack 또는 Dictionary Attack 발생 시, 암호입력 실패 횟수를 적절히 제한, 공격 시간을 지체시키며, 계정 잠금 임계값을 지정(권장 5회 이하) 초과 시, 패스워드를 일정 시간 잠금
- 계정 임계값 설정 시, /etc/pam.d 디렉터리(PAM 라이브러리를 이용하는 프로그램 설정 파일 위치)의 system-auth 서비스 설정 파일에, pam_tally2.so(또는 pam_tally.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 명령을 통해 실패 횟수 확인 및 초기화
3) root 계정 su 제한 설정 : 권한 없는 사용자가 su 명령으로 root 권한을 획득할 수 없도록 설정
- su 명령어 사용을 허용할 사용자를 추가하는 방식 (wheel 그룹)
- 필요 시 'usermod -G wheel 계정명' 명령어로 추가 또는, /etc/group의 wheel 끝에 직접 계정 추가 (필요 계정의 보조그룹을 wheel로 변경)
- wheel 그룹의 사용자만 su 명령어가 허용 되도록 /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가지 요소 설정 가능
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) 명령
USER | TTY | FROM | LOGIN@ | IDLE | JCPU | PCPU | WHAT |
로그인 계정 |
사용 터미널 |
원격 호스트 주소 |
로그인 한 시간 |
아무 입력도 수행하지 않은 시간 |
현재 background의 TTY 필드 내, 터미널에서 사용하는 모든 프로세스의 CPU 사용 시간 |
what 필드 프로세스의 CPU 총 사용 시간 |
접속자 별 현재 사용 명령어 |
- who (utmp) 명령 : 사용자명 / 접속 터미널 / 접속 시각 / 접속 IP
- finger (utmp, lastlog) 명령 : 원격지에서도 사용자 정보 조회가 가능해 보안상 주의 필요
- last (wtmp) : 모든 계정의 로그인/로그아웃 정보 출력
(계정명 / 접속 장치명 / 접속 주소 / 접속 기간(요일,월,일 시간-종료시간) / (머문 시간)
- lastlog (lastlog) : 모든 계정의 최근 접속 기록 확인 가능 (주로 'lastlog -u 계정명', 'lastlog -t 일수이내' 사용)
- lastb (btmp) : 모든 사용자의 로그인 실패 기록 확인 가능 ('lastb 계정명' 으로 특정 계정 조회 가능)
- lastcomm (acct/pacct) : 실행한 명령어 / 플래그 /실행 유저명 / 터미널 타입 / 프로세스 시작 시간
(flag 정보에는 S(슈퍼유저/root에 의한 실행), F(exec 없이 fork에 의해 실행), X(SIGTERM 시그널에 의해 종료) 등 있음)
- history (history) : 각 계정별, 계정 사용자(접속자)가 실행한 명령어 출력
- 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 파일 내부 포맷
- facility : 로그 생성 서비스 (어떤 대상에서 발생하는지 분류)
facility | 설명 |
* | - 모든 서비스를 의미 |
auth authpriv |
- 인증(authentication) 및 보안 관련 메세지 |
cron | - crond 와 atd 데몬에 의해 발생되는 메세지 |
daemon | - telnet, ftp 등 같은 데몬에 의한 메세지 |
kern | - kernel에 의한 메세지 |
lpr | - lpd(프린터 데몬)에 의한 메세지 |
- 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) 주요 옵션
순환 일자 단위 | - daily : 일 단위 - monthly : 월 단위 - weekly : 주 단위 |
순환 로그파일 개수 | - rotate n ( 개수 n) |
순환 시, 새롭게 생성되는 로그파일 속성 설정 | - create [퍼미션] [소유자] [소유그룹] ex) create 600 root root |
로그파일 확장자 | - dateext (날짜를 붙여서 보관) |
로그파일 압축 여부 | - compress : 압축하여 보관 - uncompress : 압축없이 보관 |
로그파일 용량에 따른 순환 지점 | - size n ex) 100K, 100M |
포함 설정 | - include /etc/logrotate.d (해당 디렉터리에 있는 개별 데몬/프로세스 설정 파일을 포함) |
'Information Security > Other activities' 카테고리의 다른 글
[Python] 2.x / 3.x 동시 사용 및 Library 버전 관리(requirements.txt) (2) | 2023.03.29 |
---|---|
Cloud Computing 보안 (0) | 2021.02.10 |
e-Discovery (Electronic Discovery) (0) | 2021.02.07 |
IOT 보안 가이드라인 (0) | 2021.02.07 |
개인정보 비식별화 (Privacy De-Identification) (0) | 2021.02.07 |