1. 윈도우 기본 학습
(1) 윈도우 인증과정
1) 윈도우 인증 구성요소
① 윈도우 인증과정에서 사용되는 주요 서비스에는 LSA(Local Security Authority), SAM(Security Account Manager), SRM(Security Reference Monitor) 등이 있다.
② LSA 서비스 기능
- 모든 계정의 로그인에 대한 검증 및 시스템 자원에 대한 접근 권한을 검사(로컬 및 원격 로그인 포함)
- 계정명과 SID를 매칭하며 SRM이 생성한 감사 로그를 기록
- NT 보안의 중심 서비스이며 보안 서브시스템(Security Subsystem)이라 불린다.
③ SAM 서비스 기능
- 사용자/그룹 계정 정보에 대한 데이터베이스를 관리
- 사용자 로그인 정보와 SAM 파일에 저장된 사용자 패스워드 정보를 비교해 인증 여부를 결정
- SAM 파일은 사용자, 그룹 계정 및 암호화된 패스워드 정보를 저장하고 있는 데이터베이스로 윈도우 설치 디렉터리(C:\Winnt 또는 C:\Windows)에 위치하고 있다.
④ SRM 서비스 기능
- 인증된 사용자에게 SID(Security ID)를 부여
- SID를 기반으로 하여 파일이나 디렉터리에 대한 접근을 허용할 지 여부를 결정하고 이에 대한 감사 메시지를 생성
2) 로컬 인증
- 윈도우 부팅 후 로그인창(Winlogon 화면)에서 아이디와 패스워드를 입력하면 LSA 서브시스템이 인증 정보를 받아 NTLM 모듈에 넘기고 이를 다시 SAM이 받아 로그인 처리를 한다.
[로그인(아이디, 패스워드 입력) Winlogon화면에 입력 -> LSA 서브시스템이 인증 정보를 받아 NTLM 모듈에 넘긴다. -> 다시 SAM이 받아 로그인을 처리]
#NTLM(NT LAN Manager) : window NT 제품군의 모든 구성원이 사용하는 인증 절차다.
클라이언트의 신원을 확인하기 위해 암호를 전송하지 않고 Challenge/response 절차를 사용한다.
3) 원격(도메인) 인증
① 윈도우 부팅 후 로그인 창에서 아이디와 패스워드를 입력하면 LSA 서브시스템이 인증 정보를 받아 로컬 인증용인지 도메인 용인지 확인하고 커버로스 프로토콜을 이용해 "도메일 컨트롤러"에 인증을 요청한다.
[윈도우 부팅 후 로그인(아이디, 패스워드)Winlogon 화면에 입력 -> LSA 서브시스템이 인증 정보를 받아 로컬인지, 도메인용인지 확인 -> 커버로스 프로토콜로 도메인 컨트롤러 인증 -> 인증 확인 후 사용자에게 접근 토큰 부여 -> 실행]
② 도메인 컨트롤러는 인증 정보를 확인하여 접속하고자 하는 사용자에게 접근 토큰을 부여하고 해당 권한으로 프로세스를 실행한다.
4) SAM 파일 접근 통제 설정(시스템 취약점 분석/평가 항목)
① SAM 파일은 사용자와 그룹 계정의 패스워드를 관리하고 LSA를 통한 인증을 제공하는 중요한 파일이므로 적절한 접근 통제가 필요
② 공격자로부터 SAM 파일에 대한 패스워드 공격 시도에 따른 정보 노출의 위험이 있다.
③ 보안설정[system\config에서 SAM 속성 -> SAM의 사용권한]
- Administrators 및 System 그룹 외에는 SAM 파일에 대한 접근을 제한한다.
- 불필요한 그룹 및 계정에 대해서는 권한을 제거한다.
(2) 윈도우 보안 식별자(SID:Security Identifier)
1) 개요
① : 윈도우의 각 사용자나 그룹에 부여되는 고유한 식별 번호
② 사용자가 로그인을 수행하면 접근 토큰(액세스 토큰)이 생성되며, 해당 토큰에는 로그인한 사용자와 그 사용자가 속한 모든 작업 그룹들에 관한 보안 식별자(SID)정보가 담겨있다.
③ 접근 토큰의 사본은 그 사용자에 의해 시작된 모든 프로세스에게 할당된다.
④ 사용자 계정 및 패스워드 정보를 담고 있는 SAM 파일(C:\windows\system32\config)에 SID 정보가 저장되어있다.
2) SID 구조
① 계정별 SID구조
계정 | SID |
Administrator | S-1-5-21-42~-317~-416~-500 |
Guest | S-1-5-21-42~-317~-416~-501 |
일반 사용자 | S-1-5-21-42~-317~-416~-1001 |
- S-1 : 윈도우 시스템을 의미
- 5-21 : 시스템이 도메일 컨트롤러 이거나 단독 시스템임을 의미
- 42~416~ : 해당 시스템의 고유한 식별자로, 동일한 컴퓨터에 다시 윈도우를 설치해도 동일한 값을 가지지 않는다.
- 500, 501, 1001 : 사용자 식별자(ID)
- 500 : 관리자 식별자
- 501 : 게스트 식별자
- 1001 이상 : 일반 사용자 식별자
② SID 실습
wmic에 useraccount list brief 명령어 입력
실행 -> wmic -> useraccount list brief 명령 입력
#wmic란?
(3) 윈도우 인증구조[Challenge & Response 방식]
1) 개요
① 단순히 아이디와 패스워드를 전달하여 인증하는 방식은 정보 노출 및 패스워드 재사용 공격에 매우 취약하기 때문에 운영체제 인증과 같은 높은 수준의 인증이 필요한 경우에는 적절하지 않다.
② 윈도우는 "Challenge & Response 방식"의 인증 구조를 사용한다.
- 1. 인증 요청 : 인증하고자 하는 사용자가 윈도우 시스템에 인증 요청
- 2. Challenge 값 생성 및 전송 : 인증 요청을 받은 서버는 특정 규칙 또는 랜덤한 Challenge 값을 생성하여 사용자에게 전달
- 3. Response 값 생성 및 전송 : 사용자는 전달 받은 Challenge 값과 사용자 패스워드 정보를 이용해 Response 값을 생성하여 서버에 전달
- 4. Response 값 확인 및 인증 성공 : 사용자가 전달한 Response 값을 확인하여 인증 성공 여부를 전달
2) 인증 암호 알고리즘
① LM(Lan Manager) 해시 : 윈도우 2000, XP의 기본 알고리즘으로 구조적으로 취약한 알고리즘이다.(윈도우 비스타 이후 버전부터 사용할 수 없게 함)
② NTLM : LM 해시에 MD4 해시가 추가된 형태
③ NTLMv2 해시 : 윈도우 비스타 이후 윈도우 시스템의 기본 인증 프로토콜로 기존 인증 알고리즘과는 전혀 다른 알고리즘으로 해시값을 생성하며 현재까지 복잡도가 충분히 크래킹이 어렵다.
3) Lan Manager 인증 수준(시스템 취약점 분석·평가 항목)
로컬 보안 정책 -> 보안성정 -> 보안 옵션(LAN Manager 인증 수준 속성)
① LAN Manager는 네트워크를 통한 파일 및 프린터 공유 등과 같은 작업 시 인증을 담당하는 서비스다.
② LAN Manager 인증 수준 설정을 통해 네트워크 로그온에 사용할 Challenge/Response 인증 프로토콜을 결정하면, 이 설정은 클라이언트가 사용하는 인증 프로토콜 수준, 협상된 세션 보안 수준 및 서버가 사용되는 인증 수준에 영향을 주기 때문에 보다 안전한 인증을 위해 NTLMv2사용을 권장한다.
(4) 패스워드 크래킹
1) 사전공격/사전 대입 공격(Dictionary)
패스워드로 자주 사용되는 사전에 있는 단어, 키보드 자판의 일련순, 주민등록번호, 이름 등을 미리 사전 파일로 만든 후 이를 하나씩 대입하여 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법
2) 무차별 공격/무작위 대입 공격(Brute Force Attack)
패스워드에 사용될 수 있는 문자열의 범위를 정하고, 그 범위 내에서 생성 가능한 모든 패스워드를 생성하여 이를 하나씩 대입, 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법
일반적으로 사전 대입 공격 실패 후 무차별 공격을 진행한다.
3) 혼합 공격(Hybrid Attack)
사전 대입 공격과 무작위 대입 공격을 혼합한 방법으로 사전 파일에 있는 문자열에 문자, 숫자 등을 추가로 무작위 대입하여 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법
- 일반적으로 사전 파일에 나오는 문자열 뒤에 나오는 숫자나 문자를 추가하는 형태의 패스워드가 많이 사용되는 점을 악용
4) 레인보우 테이블을 이용한 공격
레인보우 테이블은 하나의 패스워드에서 시작해 특정한 변이 함수를 이용해 여러 변이된 형태의 패스워드를 생성한다. 그리고 각 변이된 패스워드의 해시를 고리처럼 연결하여 일정 수의 패스워드를 생성한다. 그리고 각 변이된 패스워드의 해시를 고리처럼 연결하여 일정 수의 패스워드와 해시로 이뤄진 체인을 무수히 만들어 놓은 테이블이다.
- 해시 테이블과 R함수의 반복 수행을 통해 일치하는 해시값을 통해서 패스워드를 찾아내는 방식이다.
2. UNIX/Linux 기본 학습
(1) 시스템 기본
1) 시스템 접근
(가) 로그인 과정
① 사용자 계정과 패스워드를 입력하면 로그인을 담당하는 프로그램은 입력한 패스워드와 /etc/passwd 파일의 해당 필드를 비교한다.
② 패스워드 확인 후 로그인 프로그램은 쉘이 사용할 변수들을 근거로 초기 환경을 설정한다. HOME, SHELL, USER, LOGNAME 변수들은 /etc/passwd 파일에 기록된 정보로 값이 설정된다.
- HOME : 사용자의 홈 디렉터리 지정
- SHELL : 로그인 쉘 지정
- USER 또는 LOGNAME : 사용자의 사ㅏ용자 계정을 지정
③ 모든 절차가 끝나면 로그인 쉘 실행
④ 로그인 쉘(/bin/sh, /bin/csh, /bin/ksh 등)은 일반적으로 /etc/passwd파일의 마지막 필드에 정의 되어 있다. 쉘은 사용자가 입력한 명령어를 해석하고 처리하는 기능을 한다.
(나) 로그아웃
- UNIX 시스템에서 ㄹ그아웃할 때 사용하는 명령어로는 logout과 exit이 있다. [Ctrl + d]
2) 사용자 정보
(가) /etc/passwd 파일
① UNIX는 시스템 관리자가 사용자 계정을 만들 때마다 해당 사용자와 관련된 정보를 /etc/passwd 파일에 저장한다.
② passwd파일에는 UNIX 시스템을 이용하는데 필요한 기본 정보들이 담겨 있다.
③ 형식
[1]:[2]:[3]:[4]:[5]:[6]:[7]
- 1 : useraccount -사용자 계정명
- 2 : x - 사용자 패스워드
- 3 : 0 - 사용자 ID(UID)
- 4 : 0 - 기본 그룹 ID(GID)
- 5 : root - 사용자 관련 기타 정보
- 6 : /root - 로그인에 성공한 후에 사용자가 위치할 홈 디렉터리
- 7 : /bin/bash - 로그인 쉘
④ 해킹 시 주로[3], [4]번을 0으로 변경한다. 0이면 root이기 때문에 위험
(나) 사용자 확인 - id
① UNIX에 접속 중인 사용자를 확인하려면 id 명령 사용한다. 여기서 id는 identification으로 실행 시 UID와 GID를 출력해 준다.
② 문법
id[user_account]
(다) 패스워드 변경 - passwd
① : 사용하던 패스워드를 변경하거나 패스워드가 없는 사용자 계정에 패스워드를 부여할 때 passwd 명령을 사용한다.
② 일반 사용자는 자신의 패스워드만 변경할 수 있지만 슈퍼 유저(root)는 자신을 포함하여 시스템에 등록된 모든 사용자들의 패스워드를 변경할 수 있다.
③ 입력 문법
passwd [user_account]
3) 그룹 정보
(가) 그룹명과 그룹 ID
① UNIX 시스템은 자원에 대한 접근 권한 및 보안 등의 관리를 위하여 사용자와 사용자가 소속된 그룹에 대한 식별이 필요하다.
② 사용자 ID와 그룹 ID는 사용자와 그룹을 식별하는 식별자로 시스템에 유일한 정수 값으로 기술된다.
(나) 기본 그룹과 보조 그룹
① UNIX 시스템은 자원의 소유주가 소속된 그룹에 별도의 접근권한을 지정할 수 있다. 같은 그룹에 소속된 사용자는 자원에 대하여 동일한 접근권한을 갖는다.
② UNIX 시스템의 사용자 계정은 하나의 기본 그룹과 복수의 보조 그룹에 소속될 수 있다.
(다) /et/group 파일
① /etc/group파일은 현재 시스템에 정의되어 있는 모든 그룹의 정보를 저장하고 있다.
② 형식
[group_name]:[unvariable]:[group_ID]:[user_account_entry_in_group]
- bin : 그룹명
- x : 그룹의 암호화된 패스워드(사용안함)
- 1 : 기본 그룹 ID로 그룹명을 대신하는 숫자
- root, bin, daemon : 소속된 사용자 계정들
4) 입출력 재지정(I/O Redirection)
① 입출력 대상으로 표준 입력, 표준 출력, 표준 에러를 사용하지 않고 다른 경로인 파일로 재지정하는 것을 말한다.
② 키보드에서 들어오는 입력을 파일에서 받도록 대체하는 것을 입력 재지정(Input Redireciton)이라 한다.
③ 명령의 실행 결과나 에러 상황을 화면에 출력하지 않고 파일로 대체하는 것을 출력 재지정(Output Redirection)이라 한다.
④ 입력 문법
command [0]< file_name 입력 재지정
> : 출력 재지정
>> : 출력 재지정(출력 파일 존재 시 추가하여 출력한다.)
5) 파이프(pipe)
① 둘 이상의 명령을 함께 묶어 출력의 결과를 다른 프로그램의 입력으로 전환하는 기능이다.
② 명령어와 명령어 연결은 "|" 기호를 사용. 선행 명령의 출력 데이터가 후행 명령의 입력 데이터로 전달된다.
③ 문법
ls -l | more // ls -l 명령의 결과를 몇줄 끊어서 보여준다
ps -ef | grep vsftpd //ps -ef 명령 결과에서 vsftpd를 필터링한다
6) 특수 문자(Metacharacter)
쉘 명령에서 일부 문자들은 사전에 정의된 특별한 기능이 있다. 이런 문자들을 Shell Metacharacter라고 하며 정의된 기능대로 동작한다.
특수문자 | 사전 정의 | 특수문자 | 사전 정의 |
~ | 홈 디렉터리 | * | 문자열 와일드카드로 전체글자 |
. | 현재 디렉터리 | ? | 한 문자 와일드카드 |
.. | 상위 디렉터리 | ; | 쉘 명령 구분자 |
# | 주석 | | | 파이프 |
$ | 쉘 변수 | < | 입력 재지정 |
& | 백그라운드 작업 | > | 출력 재지정 |
(2) 파일시스템 응용
1) 개요
믈리 디스크 : partition | partition | partition
파일 시스템 : / Boot block | Super block | i-node list | Data blocks \
/ i-node | i-node | i-node | i-node \
- 물리적인 저장장치에 파일을 생성, 저장, 관리하기 위한 논리적인 자료구조를 파일시스템이라 한다.
- 물리적인 디스크는 논리적인 파티션으로 나누어지며, 각 파티션별로 고유한 파일시스템을 생성한다. (NTFS, EXT2, EXT3, EXT4)
[나] 파일시스템 구성
① 부트 불록
- 운영체제를 부팅하거나 초기화하기 위한 부트스트랩 코드를 담고 있는 블록
② 슈퍼블록
- 해당 파일시스템을 관리하기 위한 정보를 담고 있는 블록
③ 아이노드 리스트
속성 | 설명 |
inode number | 파일시스템 내에서 해당 파일을 식별하기 위한 고유한 식별자 |
파일타입 | 일반파일, 디렉터리, 장치파일 등 파일 유형 |
접근권한 | 파일에 대한 접근권한 |
link count | 해당 inode를 참조하는 링크 개수 |
소유자 | 파일의 소유자/UID |
소유 그룹 | 파일의 소유그룹/GID |
파일크기 | 파일의 크기 |
MAC Time | - last Modification Time : 파일의 내용을 마지막으로 수정한 시간 - last Access Time : 파일을 마지막으로 접근한 시간 - Last Change Time : 파일의 속성을 마지막으로 변경한 시간 파일의 속성은 inode 정보를 의미한다. 즉 소유자, 접근권한 등의 속성이 변경되면 last change time이 변경된다. |
Block index | Data blocks에 저장되어 있는 파일 내용에 대한 색인 정보 |
- 파일들에 대하 속성정보를 담고 있는 inode 구조체 리스트로 이뤄져 있다.
- 각 파일의 속성정보는 위와 같다. 주의할 점은 inode에는 파일명이 없으며 파일명은 디렉터리를 통해 관리된다.
- 침해 사고가 발생하게 되면 피해 시스템 파일에 대한 무결성 확인을 위한 타임라인 분석을 수행한다. 이 때 파일시스템 inode 구조체의 MAC Time을 점검한다.
- 특정 파일의 inode에 대한 속성정보는 stat 명령을 통해 확인할 수 있다.
④ Data blocks
- 실제 파일의 내용이 저장되는 블록
- 고정크기 block들로 이뤄져 있다.
2) 파일시스템과 링크 파일
(가) 개요
① 링크는 윈도우의 바로가기 아이콘처럼 기존 파일에 대한 또 다른 접근 포인트를 만들어주는 기능이다.
② 링크에는 하드 링크와 심볼릭 링크가 있다.
③ 입력 문법
In [-s] source_file | source_directory target_file //이 옵션이 있으면 심볼릭 링크를, 없으면 하드 링크를 만든다.
(나) 하드링크
① 하드 링크는 유닉스 초기시절부터 지원해주던 방식으로 기존파일과 동일한 inode number를 가지는 파일을 생성하여 접근하는 방식을 말한다.
② inode number는 파일시스템별 고유한 값이기 때문에 동일 파일시스템 내에서만 하드링크가 가능하고 디렉터리는 하드 링크가 불가능하다.
③ 하드 링크 파일을 생성하면 inode 의 링크 카운트가 1증가한다.
파일 삭제 시에는 링크 카운트를 1 감소시킨 후 그 값이 0이 되었을 때 해당 파일의 inode 정보 및 데이터가 삭제된다. 즉, inode를 참조하는 파일이 있으면 삭제하지 않는다.
(다) 심볼릭 링크
① 동일 파일시스템 내에서만 링크가 가능한 하드링크의 단점을 보완
② 원본 파일에 대한 파일 경로를 파일 내용으로 하는 새로운 파일을 생성해서 접근하는 방식으로 하드 링크와 달리 inode number가 아닌 파일 경로를 기반으로 하므로 파일시스템에 제한이 없으며 디렉터리도 가능하다.
③ 원본 파일이 삭제되거나 이동하게 되면 해당 경로가 바뀌게 되므로 심볼링 링크 파일은 링크가 끊어지게 된다.
3) 디렉터리 관리
(가) 파일의 종류
① 일반 파일 : 일반적으로 데이터 또는 프로그램 코드에 해당하는 일련의 바이트 스트림으로 되어 있다. 이러한 정규 파일은 표준 파일 입출력 시스템 호출을 통해 참조된다.
② 디렉터리 : 디렉터리에 포함된 파일명과 해당 파일에 대한 정보를 담고 있는 inode number 목록을 내용으로 가지고 있는 특수한 파일로 디렉터리 파일은 디렉터리 명시적인 시스템 호출을 통해서 참조된다.
③ 특수 파일 : 특수 파일은 기능에 따라 다양한 형태로 존재하며 표준입출력 시스템 호출을 통해 참조된다.
- 프로세스 간 통신(IPC: InterProcess Communication)을 위해 파이프, 소켓 등의 파일을 사용한다.
- 디스크, 프린터, 터미널, 키보드 등의 주변장치를 사용하기 위한 장치파일로 블록단위로 입출력하는 블록 장치 파일(버퍼링)과 문자 단위로 입출력하는 문자 장치 파일(비 버퍼링)로 구분한다.
(나) 디렉터리 내용 출력 ls
① 특정 디렉터리에 있는 디렉터리와 파일목록을 보여주고 추가 옵션으로 이들에 관한 여러 가지 정보(크기, 만든 시간, 변경 시간, 이름, 접근 권한 등)도 알 수 있다.
② 디렉터리에 파일명과 해당 파일의 inode number에 대한 매핑 정보만을 가지고 있으며 ls 명령의 추가 옵션을 통해 해당 파일에 대한 상세 내역을 볼 수 있는 것은 해당 inode number를 통해 inode 구조체 정보를 참조하기 때문이다.
③ 입력문법
ls
-l : 목록 형태로 디렉터리 및 파일의 정보를 자세히 보여준다.
-a : 도트(.)파일을 포함하여 디렉터리 내에 있는 모든 디렉터리 및 파일을 보여준다.
-R : 하위 디렉터리에 있는 내용까지 보여준다.
-f : 디렉터리인지 어떤 종류의 파일인지를 알려준다.
-i : 디렉터리 및 파일에 지정된 inode number를 보여준다.
④ 파일 종류
d : 디렉터리
b : 블록 장치 파일
c : 문자 장치파일
| : 심볼릭 링크 파일
p : 네임드 파이프
s : 유닉스 도메인 소켓
- : 일반 파일
⑤ 접근 권한
⑥ 하드 링크 개수 : 링크 카운트라고도 하며, 동일한 inode를 참조하는 파일의 개수를 의미한다.
⑦ 소유주 : 해당 디렉터리 및 파일의 소유주를 의미하며 디렉터리 및 파일을 생성한 사용자 계정이 지정된다.
⑧ 소유 그룹 : 소유주가 소속된 기본 그룹명이 지정된다. 소유 그룹은 생성 후에도 변경이 가능하며 이 때 chgrp 명령을 사용.
(다) 디렉터리 간의 이동 - cd(change Directory)
① 파일시스템 내의 특정 디렉터리로 이동할 때 사용한다.
② 입력 문법
cd [directory_name]
{.} : 현재 디렉터리, {..} : 상위 디렉터리, {~} : 홈디렉터리, {/} : 루트 디렉터리
③ 절대 경로명과 상대 경로명
절대 경로명 : 루트 디렉터리를 기준으로 기술(/home/algisa/work)
상대 경로명 : 현재 디렉터리 기준으로 기술(./work)
(라) 새로운 디렉터리 생성 - mkdir(Make Directory)
① 디렉터리를 새로 만들 경우 사용
② 입력 문법
mkdir [-m mode] [-p] dir_name
-m : 새로 만들 디렉터리의 접근권한을 명시적으로 선언한다.
-p : 계층적인 구조를 갖는 디렉터리를 한꺼번에 만든다.
(마) 기존 디렉터리 삭제 - rmdir remove directory
① 기존 디렉터리 삭제.
② 단, {.}와 {..}는 비어 있어야 하는 하위 디렉터리 개념에서 제외되며 삭제 되지 않는다.
③ 입력 문법
rmdir [-p] dir_name
-p : 계층적인 구조를 갖는 디렉터리를 한꺼번에 삭제한다.
4) 파일 권한 관리
(가) 접근권한 변경 - chmod
① 기존 파일 또는 디렉터리에 대한 접근권한을 변경할 때 사용
② 입력 문법
chmod [-R] permission file_name1 | dir_name1 [file_name2 | dir_name2]
permission : 기호나 8진수로 접근권한을 지정한다. rwx ugo..
③ 접근권한을 기호로 기술하는 방법
- 대상 : u(user),g(group),o(others),a(all)
- 연산자 : +(추가), -(제거), =(지정)
- 접근권한 : r, w, x
(나) 소유주 또는 소유그룹 변경(chown/chgrp)
① 파일이나 디렉터리의 소유주나 소유그룹을 변경할 때 사용 명령을 실행하고 나면 파일에 대한 이전 소유주는 해당 파일에 이 명령을 다시 실행할 수 없다.
② 입력문법
chown [-hR] owner file_name1 | dir_name1 [file_name2 | dir_name2]
chgrp [-hR] group file_name1 | dir_name1 [file_name2 | dir_name2]
-h : 심볼릭 링크 파일 자체의 소유주나 그룹을 변경
chown root daemon.c //daemon.c파일의 소유주를 root로 변경
(다) 접근권한 마스크 - umask
① chmod는 기존 파일의 접근권한을 변경할 때 사용한다. 이때 8진수로 지정하는 접근권한은 해당 파일이 가져야 할 권한을 명시한 것이다.
그러나 umask는 앞으로 만들어질 파일에 영향을 미치는 명령으로 명령 시 지정한 8진수는 새로 만들어질 파일에서 제거 될 권한을 명시한다.
기본 접근권한에서 설정된 권한만큼을 제거하는 방식.
② 시스템 관리자가 /etc/profile 파일에 umask를 지정하여 시스템 전체 사용자에게 획일적인 umask 값을 적용시킬 수 있다.
③ umask 가 333일 때 일반 파일 생성 시 최종 접근권한
umask 333 : 기본 접근권한에서 write(2)와 execute(1)권한을 제거하라는 의미다. 따라서 일반 파일 666기본 접근권한에서 user, group, others에 권한을 제거하면 접근권한은 최종적으로 444가 된다.
5) 파일 검색 - find
(가) 개요
① : 시스템 내에 있는 파일 중에서 사용자가 원하는 파일을 찾을 때 사용한다. 단순히 찾아줄 뿐만 아니라 찾은 파일에 특정 명령을 실행하도록 명령할 수 있어 편리하다.
② 이 명령은 사용할 때 지정하는 검색경로는 파일의 최상위 디렉터리인 루트 디렉터리부터 시작하는 절대 경로나 현재 디렉터리(.)로 표시하는 상대 경로를 주로 이용한다.
(나) 입력 문법
find path [expression] [action]
- name file_name : 파일명을 지정
- type : 파일 종류를 지정
- user uname : 소유자명
- group gname : 소유그룹
- perm mode : 파일의 접근권한을 지정
ex)
find . \( -perm -4000 -o -perm -2000 \) -exec ls -al {} \;
- -perm mode : -가 없으면 정확히 mode 권한과 일치하는 파일, -가 있으면 mode 권한을 포함하는 파일을 검색한다.
- -perm 4000이면 setuid만 설정되어 있는 파일을 검색하고, -4000이면 setuid를 포함하는 파일을 검색한다.
- -exec 옵션을 통해 검색 결과 파일에 대한 추가적인 명령을 실행할 수 있다. {}의 의미는 검색 결과 파일들을 "ls -al" 명령의 인자로 전달하기 위한 기호이고 \;는 명령어의 끝을 의미한다.
- 검색 조건이 둘 이상일 경우 -o(or) -a(and/default)의 논리 연산 및 ()를 추가하여 우선순위를 지정할 수 있다.
③ 시간 관련
ex) date
- 파일 시간 속성에 따라 atime(access time), mtime(modification time), ctime(change time)으로 구분
- -mtime [+-]n : +-가 없으면 정확히 n일, +n이면 n일 초과, -n이면 n일 미만인 파일을 검색한다.
- -mtime -4이면 마지막 수정일이 4이 미만인 파일을 검색한다.
④ 크기 관련
ex) ls -al
- -size [+-]n : +-가 없으면 정확히 n size, +n이면 n size 초과, -n이면 n size 미만인 파일을 검색한다.
- size의 단위는 b:block, c:bytes, k:kilobytes, M:megabytes, G:gigabytes 등이 있다.
- -size +3M이면 크기가 3Mbytes를 초과하는 파일을 검색한다.
ex)
find . -name "*.c" -> -name 옵션과 함께 확장자가 '.c'로 끝나는 파일을 검색한다.
find . -name "ip*.c" -print -> 파일명의 첫 두 글자가 ip로 시작하는 c프로그램을 현재 디렉터리 이하에서 찾는다.
(3) 프로세스 응용
1) 개요
① 프로세스가 생성되면 커널/운영체제는 개별 프로세스별로 관리정보를 담고 있는 프로세스 제어 블록(PCB:Process Control Block)을 생성한다.
- 프로세스 상태(Process state) : 프로세스의 현재 상태정보를 저장(ready, running, blocked 등)
- 프로세스 번호(Process number) : 프로세스를 식별하기 위한 번호
- 프로세스 카운터(process counter) : 문맥교환이 발생할 경우 다음에 실행할 명령어의 위치값을 저장
- 레지스터(register) : 문맥교환이 발생할 경우 현재 프로세스의 실행 상태정보를 저장
- 메모리 정보(memory limits) : 프로세스가 사용하는 메모리 page 또는 segment 테이블 정보
② 프로세스가 생성되면 개별 프로세스별로 오픈한 파일을 관리하기 위한 파일 디스크립터 테이블(FDT:File Descriptor Table)이 생성된다.
- 기본적으로 3개의 파일이 자동 오픈된다.
표준입력(stdin)은 표준입력장치(키보드 등)로부터의 입력을 의미하고,
표준출력(stdout)은 표준출력장치(모니터 등)로의 출력을 의미하고,
표준에러(stderr)는 오류 발생 시 출력을 의미한다. - 프로세스 내에서 오픈한 각각의 파일을 식별하기 위한 양의 정수값을 파일 디스크립터(FD: File Descriptor)라고 한다.
③ 커널/운영체제가 시스템 내에서 여러 프로세스들에 의해 오픈된 파일들을 관리하기 위한 자료구조가 System open-file tables다.
- open_mode : 파일의 읽기/쓰기 모드
- offset : 현재 파일 I/O를 수행하기 위한 위치값
- reference_count : 해당 파일의 참조 개수를 의미한다. 파일 복제(dup)가 발생하게 되면 reference_count가 증가한다.
④ Active vnode table은 파일의 inode 정보를 가지고 있는 일종의 캐시역할을 수행한다. 다양한 파일시스템의 inode 정보를 관리하기 위한 중계장 역할을 수행한다.
(나) 프로세스 기본 조건
① 프로세스 테스트 코드
- fork()함수는 자식 프로세스를 생성하는 시스템 함수로 반환 값을 통해 부모 프로세스의 수행코드와 자식 프로세스의 수행코드를 식별할 수 있다.
- 부모 프로세스와 자식 프로세스는 pid(프로세스 ID), ppid(부모 프로세스 ID)를 각각 출력하고 1000초 동안 대기(sleep)한다.
② 모든 프로세스는 부모 프로세스를 가진다.
- 시스템 부팅을 담당하는 boot 프로세스(0번 프로세스)를 제외한 모든 프로세스는 부모 프로세스를 가진다.
- 자식 프로세스가 살아있는 상태에서 부모 프로세스가 종료하게 되면 자식 프로세스는 고아 프로세스(orphan Process)가 되며, 이 경우 대리모 프로세스(pid가 1인 init process)가 부모 역할을 수행한다.
③ 프로세스 종료 시에는 자신의 종료상태정보를 부모 프로세스에 반환해야 정상적으로 소멸할 수 있다.
- 종료상태정보는 자신의 pid, exit code(종료 시 반환하는 값), cpu time(cpu 사용시간) 등의 정보를 말한다.
- 프로세스 수행을 종료했지만 부모 프로세스가 종료상태정보를 확인하지 않아서 소멸하지 않고 남아있는 상태의 프로세스를 좀비 프로세스라 한다. 시스템/커널 입장에서 프로세스는 제한된 자원이므로 좀비 프로세스가 과도하게 많아지만 더 이상 프로세스를 생성하지 못하는 문제가 발생할 수 있다.
- 자식 프로세스는 종료했지만 소멸하지 않고 남아있으면 상태정보가 (S필드)Z(Zombie상태)이다.
- 상태 정보 S는 대기상태, R은 실행 중 또는 실행 대기 상태를 의미한다.
- "ps -l" 주요 필드
F : 프로세스 플래그
1은 fork()를 통해 생성, exec() 되지 않는다. / 4는 슈퍼유저 권한으로 실행
S : 프로세스 현재 상태
R: 프로세스가 실행 중 이거나 CPU를 점유하기 위해 대기(Runnable/Ready) 중인 상태 / S: 인터럽트 가능한 sleep 상태 / D: 인터럽트가 불가능한 sleep 상태 / T: 프로세스가 정지된 상태 / Z: 좀비 상태의 프로세스
PRI : 프로세스의 우선순위(낮을 수록 우선순위가 높음)
NI : 프로세스의 우선순위를 계산할 때 사용하는 값(nice value)
ADDR : 프로세스의 메모리 주소
SZ : 프로세스가 차지하는 메모리의 크기
WCHAN : Sleeping상태의 프로세스가 대기하는 커널 함수 명
(다) 프로그램 실행 과정
① 프로세스 생성과 동시에 프로세스 그룹도 생성된다.
- 프로세스 그룹은 커널이 터미널 제어권을 관리하기 위한 목적으로 사용하는 프로세스들의 집합으로 쉘에서 실행된 프로세스와 그 자식프로세스들이 하나의 프로세스 그룹으로 관리된다.
- 터미널 제어권이란? 터미널로부터 입력되는 데이터(키보드 입력)와 터미널로부터 발생하는 시그널에 대한 제어권으로 프로세스 그룹 단위로 제어권이 부여된다.
- 커널이 프로세스 그룹을 식별하기 위한 식별자로 PGID를 부여하며, PGID는 별도로 부여하는 식별자가 아니고 해당 그룹의 리더 프로세스의 PID를 PGID로 설정한다.
② 포그라운드 모드와 백그라운드 모드
- 터미널에 대한 제어권을 가지고 동작하는 모드를 포그라운드 모드, 제어권을 가지고 있는 프로세스 그룹을 포그라운드 프로세스 그룹이라 한다.
- 터미널에 대한 제어권 없이 동작하는 모드를 백그라운드 모드라고 하며, 제어권이 없는 프로세스 그룹을 백그라운드 프로세스 그룹이라 한다.
- 터미널과 연결되어 세션이 생성되면, 해당 세션 내에서는 하나의 포그라운드 프로세스 그룹과 하나 이상의 백그라운드 프로세스 그룹이 생성된다.
(라) 프로세스 관련 식별자
① Process ID(PID) : 시스템/커널 내에서 프로세스를 식별하기 위한 고유한 ID
- sleep 명령 - 지정한 시간 동안 대기하는 명령으로 &는 백그라운드 모드 프로세스를 동작시키기 위한 특수문자다.
- bash shell로부터 새로운 sleep 프로세스가 시작되었으며 4490의 새로운 pid가 부여된 것을 볼 수 있다.
② Parent Process ID(PPID) : 부모 프로세스를 식별하기 위한 ID
- ppid가 3130이면 3030을 sleep을 실행시킨 부모 프로세스인 bash shell 의 pid임을 알 수 있다.
③ Process Group ID(PGID) : 프로세스 그룹을 식별하기 위한 ID
- 모든 프로세스는 생성과 동시에 하나의 프로세스 그룹에 속하게 되면, pgid는 해당 프로세스 그룹의 리더 프로세스 pid가 된다. 따라서 자신의 pid로 pgid로 설정된 것을 볼 수 있다.
④ Session ID(SID) : 세션을 식별하기 위한 ID
- 터미널과의 논리적인 연결 상태를 세션이라 하며, 세션 내에는 다수의 프로세스 그룹과 프로세스 그룹에 속하는 프로세스들이 존재한다.
- sid는 해당 세션의 리더 프로세스(일반적으로 로그인 쉘) pid가 된다. 따라서 bash shell의 pid가 sid로 설정되었으며 동일한 세션에 속해있는 sleep 프로세스의 sid도 동일한 것을 볼 수 있다.
2) 프로세스 정보 확인 - ps(Process status)
① 시스템에 상주하는 프로세스 정보를 알려준다.
② 입력 문법
ps []
-f(full listing) : 전체 칼럼을 보여주는 명령으로 이 옵션을 사용하면 프로세스 정보가 한 줄씩 다음 예처럼 출력된다.[username pid ppid c stime tty time cmd]
-l : 이 옵션은 -f옵션보다 더 많은 정보를 출력하며 다음과 같은 형식을 따른다.[F S uid pid ppid c pri ni addr sz wchan tty time cmd]
-a : 최근에 많이 실행된 제어 터미널을 가진 프로세스의 정보를 출력한다.
-A, -e(every) : 현재 시스템에서 실행 중인 모든 프로세스 정보를 출력한다.
③ "ps -ef" 명령
- PID : User ID, 프로세스의 EUID
- PID : Process ID
- PPID : parent Process ID
- C : 프로세스 스케줄링을 위한 CPU 사용량(현재 사용되지 않음)
- STIME : Start TIME, 프로세스가 시작된 시간을 의미
- TTY : 프로세스와 연결된 터미널 타입, "?"는 제어 터미널에 연결되어 있지 않음을 의미
- TIME : cpu 사용 시간으로 "시:분"형식으로 표현
- CMD : 프로세스 명
3) 프로세스 간 통신 - 시그널
① UNIX 시스템은 다양한 종류의 프로세스 간 통신방법을 지원한다.
② 그 중에서 시그널은 UNIX 시스템에서 지원하는 소프트웨어 인터럽트이다. 이를 이용하여 프로세스는 다른 프로세스에게 이벤트를 전달할 수 있으며, 전달된 이벤트를 프로세스 간 통신수단으로 사용할 수 있다.
③ 시그널이 발생하는 경우는 외부에 의해서, 에러에 의해서, 이벤트에 의해서, 인위적으로 네가지
④ 입력 문법
kill [signal_number] PID
- signal_number | -signal_name : 시그널 번호 또는 시그널명이다.
-l : 지원 가능한 시그널 목록을 출력한다.
⑤ 시그널들
SIGINT(2)- Ctrl+c 조합키를 누르면 포그라운드 프로세스 그룹 내 모든 프로세스에게 이 시그널이 전달된다. 이 시그널을 받은 프로세스는 디폴트로 종료
SIGKILL(9) - 무시하거나 임의로 처리할 수 없는 시그널이다. 이 시그널을 받으면 종료
SIGSTOP(23) - 프로세스를 정지시키는 프로세스 제어 시그널이며 무시하거나 임의로 처리할 수 없다.
SIGTERM(15) - 이 시그널을 받은 프로세스는 디폴트로 종료된다
SIGFPE(8) - 커널에 의해 발생하며 산술연산 에러를 내는 프로세스에게 이 시그널이 전달된다.
SIGCHLD(18) - 프로세스의 종료나 정지의 경우에 부모 프로세스에게 이 시그널이 전달된다.
SIGALRM(14) - alarm() 함수가 설정된 타이머에 의해 발생한다.
SIGQUIT(3) - ctrl+\ 조합키를 누르면 전위 프로세스 그룹 내 모든 프로세스에게 이 시그널이 전달된다. 이 시그널을 받은 프로세스는 디폴트로 종료되며 core 파일을 생성한다.
SIGSEGV(11) - 커널에 의해 발생하며 잘못된 메모리를 참조하는 프로세스에게 이 시그널이 전달된다.
SIGHUP(1) - 터미널 연결이 끊어지면 경우에 프로세스에게 이 시그널이 전달된다. 최근에는 환경설정 파일의 재설정에 사용된다.
3. Unix/Linux 시스템 관리
(1) 시스템 시작과 종료
1) 부팅 관련 용어 정의
(가) 런 레벨
① 시스템에서 런레벨의 의미는 시스템의 운영 상태를 숫자 혹은 문자로 표현한 것이다.
유닉스/리눅스 시스템 관리자가 시스템 관리의 편의성을 증대하기 위해서 사용되는 것으로 필요 시 유닉스 부팅을 변경하여 네트워크를 사용하지 못하게 하거나, 다른 사용자가 접근하지 못하게 하는 역할을 수행할 수 있다.
② init 프로세스는 /etc/inittab 파일에 정의된 런 레벨에 따라 /etc/rc.d/rc[x].d 디렉터리에 나열된 스크립트를 실행하여 시스템의 운영 상태를 구성한다.
③ 각 런 레벨
0 - PROM 모드
S, s - 시스템 싱글유저모드, 로컬 파일 시스템이 마운트 되지 않은 상태
1 - 시스템 싱글 유저 모드, 로컬 파일 시스템이 마운트된 상태
2 - 멀티 유저 모드
3 - 멀티 유저 모드, unix 기본 run level
4 - 사용 안함
5 - 시스템 power off 모드
6 - 시스템 리부팅
④ 서버용 unix 시스템은 일반적으로 3 또는 5의 런 레벨로 운영된다. 현재 운영 중인 시스템의 런 레벨을 알고 싶은 경우, who -r 또는 runlevel 명령을 사용한다.
(나) INIT 상태
① INIT 상태란? 런 레벨과 같은 의미로 시스템이 런 레벨을 이동할 때 init 명령어를 통해서 이동한다.
② 예를 들어 현재 런 레벨이 멀티유저 모드인 3번인데, 싱글 유저모드로 이동하고 싶으면 'init S' 명령어를 이용하면 된다.
(다) 시스템 런 레벨 단계 구성
① INIT의 상태는 런 레벨을 옮겨 다니며 각 레벨마다의 역할을 수행한다
② init 명령어 다음에 런 레벨을 쓰면 해당 런 레벨로 이동할 수 있다.
2) 시스템 시작
바이오스 과정 -> 부트 프로그램 과정 -> 커널과정 -> init 프로세스 과정
① 바이오스 과정
- 시스템 전원이 들어오면 바이오스는 시스템의 기본적인 하드웨어의 이상 유무를 점검하고 시스템의 하드웨어 정보를 수집한다.
② 부트 프로그램 과정
- 부트 프로그램은 하드디스크에서 커널을 읽어 들여 메모리상에 적재하고 시스템 제어권을 커널에 넘긴다.
③ 커널 과정
- 커널이 메모리상에 적재되면 그때부터 운영체제가 구동되기 시작한다.
커널은 부팅 과정의 일부인 하드웨어 점검을 완료하고 내부 자료구조를 초기화하여 시스템을 운영하기 위한 부가적인 커널 모듈을 하드디스크에서 메모리상으로 적재한다.
④ init 프로세스 과정
- init프로세스는 커널에 의해 생성되는 첫 번째 프로세스다. 커널의 실행으로 운영체제가 하드웨어의 모든 기능을 제어하게 되었을 때 PID가 1인 init프로세스가 실행된다.
- 이 프로세스는 모든 UNIX 프로세스의 부모 프로세스로서 부팅 과정에서 사용자가 시스템을 사용할 수 있게 해주는 초기화 작업을 담당한다.
- BSD 계열은 싱글 유저모드와 멀티 유저모드 두 가지를 지원하는데 반하여, system V 계열은 더 많은 단계로 시스템의 운영 상태를 분류한다. 이를 런레벨이라 한다.(/etc/inittab 파일에 정의)
3) 시스템 종료
(가) 시스템 종료
① 운영 중인 unix 시스템은 정기점검, h/w 및 s/w 의 추가 또는 변경, 기타 관리 작업을 하기 위하여 시스템의 종료가 필요하다.
② unix 시스템 종료할 때 주의사항
- 접속 중인 사용자에게 시스템의 종료를 공지하여 작업을 마무리하도록 해야 한다.
- 운영 중인 서비스를 안전하게 종료해야 한다.
- 하드디스크를 갱신하여 파일 시스템의 무결성을 유지한다.
③ shutdown 명령은 시스템을 안전하게 종료할 때 사용하며 시스템의 런 레벨을 변경할 때도 사용된다.
시스템 종료 = init 5, shutdown -y -g0 -i5, poweroff
prom 모드 진입 = init 0, shutdown -y -g0 -i 0, halt
시스템 리부팅 = init 6, shutdown -y -g0 -i 6, reboot
④ boot PROM이 가지고 있는 정보
- 기본적인 하드웨어 점검
- flash ROM에 저장되어 존재하며, 소켓형식으로 제공
- Defaults 값만 저장되어 있고, 변경된 값은 NVRAM에 저장
- 인텔 PC의 CMOS와 유사
(나) 하드디스크 동기화(sync)
① UNIX 시스템은 하드디스크의 입/출력에 대한 효율성을 높이기 위하여 버퍼를 운영한다
② 만일 시스템이 비정상적으로 종료하면 버퍼에 있는 데이터가 하드디스크에 반영되지 않아서 파일시스템에서 무결성 문제가 생긴다. 따라서 하드디스크 동기화는 시스템을 종료하는 중에 해야 할 가장 중요한 작업이다.
③ 유닉스나 리눅스 종료 시 sync 명령을 내리는 이유는 이유가 바로 버퍼의 내용을 하드디스크로 옮기기 위함이다.
(2) 사용자 관리
1) 사용자 계정 추가 - useradd
① UNIX 시스템에 새로운 사용자 계정을 추가하기 위해서는 다음 과정을 거친다.
- 사용자 계정 정보를 저장하는 /etc/passwd와 암호화된 비밀번호를 저장하는 /etc/shadow에 사용자 정보를 추가한다.
- 그룹 파일 /etc/group에 그룹정보를 추가한다.
- 새 사용자를 위한 홈 디렉터리를 생성하고 접근권한을 부여한다.
- 사용자 로그인 시 필요한 몇 가지 시작 파일을 홈 디럭터리에 생성한다.
② 입력 문법
useradd [option] login_name
2) 사용자 계정 삭제 - userdel
① 사용자 계정을 삭제하는데 사용
② userdel [] login_name
3) 그룹 추가 - groupadd
① 새로운 그룹을 추가하는 명령
② group [-g gid] group_name
-g gid : 새로운 그룹에 할당할 그룹으 ㅣGID를 명시적으로 지정
ex) groupadd -g 100 study // gid 100인 study 그룹을 새로 추가한다.
4) 그룹 삭제 - groupdel
① 기존 그룹을 삭제하는 명령
② groupdel study // 그룹 study를 삭제
(3) 파일 시스템 관리
1) 파일 시스템 연결 - mount
① 보조기억장치에 들어 있는 데이터를 읽어 오고, 여기에 저장하려면 먼저 해당 장치를 UNIX 시스템에 연결하는 작업이 필요하다.
② mount 명령은 보조기억장치에 설치된 파일 시스템을 UNIX 시스템이 인식하도록 특정 디렉터리에 논리적으로 연결시켜 준다.
③ 입력 문법
mount [-option] [device | mount_point]
-a : /etc/fstab 파일에 정의된 모든 파일 시스템을 마운트한다.
2) 파일 시스템 연결 해제 - umount
① 이전에 마운트된 파일 시스템의 연결을 해제한다.
② 프로세스가 파일 시스템에 있는 파일을 사용 중이거나 사용자가 파일 시스템에 있는 디렉터리에 있다면 umount 명령은 [device ist busy]메시지와 함께 실패한다.
③ /etc/mtab 파일은 시스템에 마운트된 파일시스템의 정보를 관리한다. mount 명령을 실행하면 파일시스템이 마운트 정보를 /etc/mtab 파일에 기록하고, umount는 정보를 삭제한다.
④ 입력 문법
- a : 마운트된 모든 파일시스템을 언마운트 한다.
- f : 해당 파일시스템을 사용하는 프로세스를 강제로 종료하고 파일시스템을 언마운트한다.
3) 하드디스크 사용량 - du(disk usage)
① 디렉터리의 하드디스크 사용량을 확인하는데 사용
② 입력 문법
du [option] [dir_name]
-a(all) : 디렉터리뿐만 아니라 하위의 파일에 대한 정보도 보여준다.
-s(summary) : 현재 디렉터리가 차지하는 총용량만 출력한다
-k(Kilobytes) : 사용량을 킬로바이트 단위로 환산하여 출력한다.
4) 파일 시스템 용량 정보 - df(Disk Free)
① 파일 시스템의 전체 공간 및 사요가능 공간에 대한 정보를 보여준다.
② 입력 문법 및 예문
df [option] [file_system | file]
-k : 통계 데이터를 1024Byte 블록 단위로 출력한다
-i : 파일 시스템의 사용 가능한 또는 사용 중인 inode 정보를 출력한다.
ex) df /boot //boot 디렉터리에 마운트되어 있는 파일 시스템의 정보를 출력한다.
(4) 프로세스 스케줄 관리
1) 정기적 스케줄 관리 - cron
(가) 개요
① cron 데몬 프로세스는 시스템에서 정기적인 작업을 지정시간에 처리하기 위해 사용한다.
cron에 의해 동작되는 서비스를 주기적으로 확인하여 임의의 서비스가 동작되는 것을 사전 예방 해야 한다.
② cron 데몬 프로세스를 통한 처리가 효율적인 작업의 특징
- 일괄적으로 처리해야 하는 작업인 경우(야간 작업)
- 작업에 대한 요구가 불규칙하지 않은 경우
- 우선순위가 낮은 작업을 일정시기에 처리해야 하는 경우
- 작업 빈도가 낮아서 필요 시점에 처리하여 마무리하는 것이 자원관리상 효율적인 경우
③ cron 데몬 프로세스를 사용하려면 다음 세가지 구성요소가 필요하다.
- 정기적으로 처리할 작업 목록을 정의한 crontab 파일
- crontab파일을 제어 하는 crontab 명령
- crontab 파일을 읽어서 내용에 정의된 대로 작업을 처리하는 cron 데몬 프로세스
④ cron 데몬 프로세스는 시스템에서 기본적으로 지원하는 데몬 프로세스이므로 사용자는 crontab 명령으로 작업 목록을 정의하는 방법만 이해하면 된다.
(나) crontab 파일의 구조
① crontab 파일은 정기적으로 처리해야 하는 작업 목록을 정의한 파일이다. 이들 작업 목록은 cron 데몬 프로세스에 의해 처리된다.
② crontab 파일의 각 행은 Space나 tab키로 구분된 6개의 필드로 이뤄진다.
필드 의미 방법
1 분 0-59
2 시 0-23
3 일 1-31
4 월 1-12
5 요일 0-6
6 작업 작업
(다) crontab 파일의 제어
① crontab 파일은 사용자 계정별로 만들어진다.
② 시스템 관리자인 root는 사용자를 명시적으로 지정해 다른 사용자인 crontab 파일을 편집할 수 있으며, 일반 사용자는 자신의 crontab파일만 편집할 수 있다.
③ 입력 문법
crontab [-u user] [-e | -l | -r]
-e : 파일을 편집
-l : 파일을 출력
-r : 파일을 삭제한다
(라) crontab 명령 접근제어
① crontab 명령을 실행할 수 있는 사용자를 제한하여 허용하지 않는 사용자가 임의로 crontab 명령을 통한 작업 등록을 못하도록 설정한다.
② crontab 명령 접근제어를 위해 /etc/cron.allow, /etc/cron.deny 설정파일을 사용한다.
2) 일시적 스케줄 관리 - at
① 작업을 정기적으로 스케줄링하는 cron 데몬 프로세스와 달리, at 명령은 정해진 시간에 한 번만 실행한다
② at [-l | -t] time_date
-t : 작업시간을 지정한다
-l : 현재 대기 주인 작업목록을 출력
-r : 해당하는 작업을 목록에서 삭제한다(UNIX)
-d : 해당하는 작업을 목록에서 삭제한다.(리눅스)
4. Unix/Linux 서버 보안
(1) 시스템 보안
1) 사용자의 패스워드 관리
(가) 개요
① 사용자 관리란 UNIX/linux 시스템을 이용하는 사용자 계정과 인증을 관리하는 것을 말한다. passwd 파일은 시스템에 등록된 사용자 정보가 담겨있다.
② 패스워드 저장 정책에는 passwd 파일 내 계정 정보와 함께 저장하는 "일반 패스워드 정책"과 shadow 파일에 암호화된 패스워드를 저장하고 root 만이 접근할 수 있도록 제한하여 패스워드 보안을 강화하고 있다.
(나) passwd(/etc/passwd) 파일
p.64
① [user_account] [user_password] [user_ID] [group_ID] [comment] [home_dir] [login_shell]
②
(다) shadow(/etc/shadow) 파일
① [user_account] [encrypted_password] [last_change] [minlife] [maxlife] [warn] [inactive] [expires]
②
③ encrypted_password 필드 구성
④ 패스워드 저장 정책 변경
- pwconv 명령어 : 사용자 계정 패스워드 저장 정책을 shadow 패스워드 정책으로 변경하는 명령어
- pwunconv 명령어 : 사용자 계정 패스워드 저장 정책을 일반 패스워드 정책으로 변경하는 명령어
2) 프로세스 실행 권한[SUID, SGID]
① 유닉스/리눅스 시스템에서 프로세스의 자원에 대한 접근권한을 판단하기 위해 부여하는 ID로 RUID, RGID, EUID, EGID가 있다.
- RUID(Real) : 프로세스를 실행시킨 사용자의 UID
- RGID(real Group ID) : 프로세스를 실행시킨 사용자의 GID
- EUID(Effective User ID) : 프로세스가 실행중인 동안에만 부여되는 UID로 자원 접근권한을 판단하기 위한 UID로 사용한다.
- EGID(Effective User ID) : 프로세스가 실행중인 동안에만 해당 실행파일의 소유자, 소유그룹의 권한으로 자원에 접근할 수 있도록 하는 권한 설정이다.
② SUID, SGID는 프로세스가 실행중인 동안에 해당 실행파일의 소유자, 소유그룹의 권한으로 자원에 접근할 수 있도록 하는 권한 설정이다.
- SUID, SGID가 설정되지 않은 프로세스를 실행시키면 {RUID와 EUID}, {RGID와 EGID}가 동일하게 설정된다. 즉, 프로세스를 실행시킨 사용자의 UID로 RUID와 EUID가 설정되고, 사용자의 GID로 RGID, EGID가 설정이 된다. 따라서 실행시킨 사용자의 권한으로 자원에 접근하게 된다.
- SUID, SGID가 설정된 프로세스를 실행시키면 RGID, EGID는 실행시킨 사용자의 UID, GID로 설정되고 EUID와 EGID는 실행파일 소유자의 UID, GID로 설정된다. 따라서 실행시킨 사용자와는 무관하게 프로세스가 실행중인 동안에는 실행파일 소유자의 권한으로 자원에 접근하게 된다.
③ 특수권한 비트(SUID, SGID) 설정
3) 디렉터리 접근권한[sticky-bit]
① 일반적으로 공유 디렉터리(/tmp, /var/tmp..)는 모든 사용자가 이용할 수 있도록 user, group, other에 rwx 권한을 부여한다. 문제는 다른 사용자가 만든 파일을 누구나 삭제 또는 파일명 변경을 할 수 있다는 점이다.
따라서 자유롭게 파일을 생성하되 파일 삭제, 변경은 소유자만 가능하도록 하는 목적으로 사용되는 특수권한비트가 sticky-bit다.
② sticky-bit가 설정된 디렉터리는 시스템에 있는 모든 사용자들이 자유롭게 파일/ 디렉터리를 생성할 수 있지만 파일 삭제 및 파일명 변경은 소유자 또는 root만 가능하다.
③ 특수권한 비트 설정
- 기호는 t이지만 user에 지정해야한다. 리눅스는 o+t, Unix는 u+t로 지정
(2) 네트워크 보안
1) 보안 쉘[SSH]
① 보안 쉘이란? 암호 통신을 이용하여 네트워크상의 다른 컴퓨터에 접속하여 원격으로 명령을 실행하거나 파일을 조작하는 응용 프로그램 또는 프로토콜을 의미한다.
- 암호화된 원격 터미널 서비스 제공
- 암호화된 파일 송수신 서비스 제공
② 기존의 rsh, rlogin, Telnet, FTP 등 평문 송수신 서비스의 취약점을 대체하기 위해 설계되었으며 디폴트로 22/tcp 포트를 사용한다.
2) 슈퍼 서버[inetd 데몬]
(가) 개요
① 네트워크 서버/클라이언트 구조에서 다양한 서비스의(FTP, Telnet, SSH, HTTP 등) 서버 프로세스 동작방식은 공통점이 존재한다.
실제 서비스를 제공하는 서비스 프로세스를 제외하고는 클라이언트의 접속 요청이 있을 때까지 대기하다가 요청이 들어오면 해당 요청을 처리할 서비스 프로세스를 실행하는 형태이다.
② 따라서 효율적인 서버자원의 활용이라는 측면에서 공통적인 부분을 처리하는 슈퍼데몬을 만들어 개별 서비스를 등록하게 하여 클라이언트 요청은 슈퍼 데몬이 모두 처리하고 개별 서비스를 호출해주는 방식을 생각해볼 수 있는데 이러한 방식이 바로 슈퍼 데몬(inetd 데몬) 방식이다.
- Stand-Alone 방식 : 개별 서비스별로 서버 프로세스가 동작하는 방식으로 속도가 빠른 장점이 있지만 서버 리소스도 많이 점유하고 있는 단점이 있다.
- inetd 방식 : 슈퍼데몬을 이용하여 개별 서비스를 동작시키는 방식으로 상대적으로 속도가 느리지만 서버 리소스를 절약할 수 있다.
③ inetd 데몬은 N개의 개별 서버를 하나로 통합하여 클라이언트로부터 서비스 요청이 올때마다 해당 서비스에 관련된 실행 모듈(FTP, Telnet, SSH, HTTP 등) 을 실행해 준다.
④ inetd 데몬은 최초 실행 시 /etc/inetd.conf 파일의 정보를 참조하여 서비스할 프로그램들에 대한 정보를 얻는다. 시스템 관리자 inetd 데몬으로 서비스할 프로그램의 특징을 /etc/inetd.conf 파일에 정의해야 한다.
⑤ TCP Wrapper 서비스와 연동하여 서비스별 호스트 접근 제어를 수행할 수 있다.
⑥ 리눅스 시스템의 경우 xinetd 데몬을 주로 사용한다. 이는 inetd에서 보안과 리소스 관리 등을 향상시킨것이며 기능상 큰 차이는 없다.
(나) inetd.conf 파일의 구조
ftp / streap / tcp / nowait / root / /usr/sbin/in.ftpd / in.ftpd -l -a
1 / 2 / 3 / 4 / 5 / 6 / 7
① 파일 구조
1 서비스명 : inetd 데몬은 /etc/services 파일에 등록된 포트번호를 참조하여 서비스할 프로세스의 포트를 결정한다. /etc/inetd.conf와 /etc/services 파일은 서비스명을 인덱스로 하여 해당 서비스의 정보를 서로 연계한다.
2 소켓타입 : 해당 서비스에 대한 소켓유형을 설정한다. TCP 기반 서비스는 stream을 사용하고 udp 기반의 서비스는 datagram을 사용한다.
3 프로토콜 : /etc/protocols 파일에 주어진 프로토콜 중 사용가능한 프로토콜을 설정한다. 또한 /etc/services 파일에 설정한 프로토콜과 일치해야 한다.
4 플래그 : 서비스 요청을 받은 이후에 즉시 다음 서비스 요청을 처리할 것인지(nowait) 아니면 요청처리가 완료될 때까지 대기하였다가 다음 요청을 처리할지(wait) 설정한다.
5 사용할 사용자 계정 : 프로그램을 실행시킬 사용자를 설정한다.
6 실행 경로명 : 해당 서비스를 처리하는 실행 모듈의 경로를 절대경로로 설정한다.
7 실행 인수 : 프로그램의 인수를 설정한다. 첫 번째는 응용 프로그램 자신의 이름이 된다.
② 서비스 활성화
- inetd.conf 파일에 실행할 서비스를 활성화한 후 inetd 데몬을 재시작 한다.
#/etc/protocols 파일 - 인터넷 상에서 사용하는 프로토콜과 프로토콜 식별 번호를 정의해 놓은 파일로 IANA(Internet Assigned Number Authority)기구를 통해 관리된다.
#/etc/services 파일 - 인터넷 상에서 사용하는 다양한 서비스에 대한 포트/프로토콜 정보를 정의해 놓은 파일로 IANA 기구를 통해 관리된다.
well-known port(0~1023), registered port(1024~49151), dynamic port(49152-65535) 정보를 확인할 수 있다.
(다) 불필요한 /취약한 서비스 비활성화
① 불필요하고 보안상 취약한 다음 서비스들은 비활성화 한다.
- DoS 공격에 취약한 Simple TCP 서비스 : echo(7/tcp), discard(9/tcp), daytime(13/tcp), chargen(19/tcp) ..
- r계열 서비스 : rlogin, rsh, exec 등 r계열 서비스는 인증 없이 관리자의 원격접속을 가능하게 하는 명령어들로 이기종 운영체제간 백업 등의 용도로 사용되는 경우가 있으나 보안상 매우 취약하기 때문에 사용하지 말아야 한다.
- 불필요한 rpc(remote procedure call) 서비스 : rpc.cmsd, rusersd 등 분산 환경에서 서버 응용프로그램에 접근하여 작업 호출을 할 수 있는 서비스로 버퍼 오버플로우 등 다수의 취약점이 존재하여 침해사고발생 위험이 있으므로 서비스를 중지해야 한다.
- 기타 불필요한 finger, tftp, talk 등의 서비스
② 불필요한 취약한 서비스 확인 및 비활성화 처리
- inetd.conf 파일에서 취약한 서비스를 grep하여 활성화되어 있으면 이를 주석처리하여 비활성화 한다.
- inetd.conf 설정을 적용하기 위해 inetd 서비스를 재시작 한다.
3) 접근권한[TCP Wrapper]
(가) 개요
① TCP Wrapper는 외부에서 들어오는 클라이언트에 대해 접근통제 기능을 제공한다. 클라이언트의 IP 주소를 확인하여 시스템 관리자가 접근을 허용한 호스트들에 대해서만 서비스를 허용하기 때문에 외부의 해킹으로부터 시스템을 보호할 수 있다.
② 접근허용 및 차단에 대한 판단은 /etc/hosts.allow와 /etc/hosts.deny 파일에 정의된 호스트 정보를 기준으로 한다. 이를 통해 외부로부터 접근을 선택적으로 제한할 수 있다.
- 먼저 hosts.allow 파일을 참조하여 해당 호스트 정보가 있다면 접근을 허용한다. 없다면 hosts.deny 파일을 참조하여 해당 호스트 정보가 있으면 접근을 차단한다.
- hosts.deny 파일에도 해당 호스트 정보가 없다면 default로 모든 접근을 허용한다.
③ TCP Wrapper를 사용하기 전과 후의 Telnet 서비스에 대한 /etc/inetd.conf 파일 구조
구분 | 서비스 | 소켓 타입 | 프로토콜 | 플래그 | 사용자 | 실행 경로 | 실행 인수 |
사용전 | Telnet | stream | TCP | nowait | root | /usr/sbin/in.telnetd | in.telnetd |
사용 후 | Telnet | stream | TCP | nowait | root | /usr/sbin/tcpd | in.telnetd |
- TCP Wrapper를 사용할 경우 해당 서비스의 실행경로에 "/usr/sbin/in.telnetd"를 명시한다. inetd 데몬은 외부로부터 서비스 요청이 올 경우 inetd.conf 파일을 참조하여 실행경로에 설정된 /usr/sbin/tcpd를 실행한다.
- tcpd는 hosts.allow와 hosts.deny파일을 참조하여 점근제어를 수행한 후 실행 인수로 설정된 서비스를 실행한다.
(나) hosts.allow(접근 허용)와 hosts.deny(접근 금지)
① 구문 형식
service_list : cient_list[shell_command]
②
③ twist ,spawn
- shell_command 라인에서 사용가능한 특수 문자
%a 클라이언트의 IP 주소
%A 서버의 IP 주소
%c 클라이언트의 정보
%d 서비스명
%h 클라이언트의 호스트명 또는 iP 주소
%n 클라이언트의 사용자 이름
%u 클라이언트의 사용자 이름
%p 서비스의 데몬 프로세스다
%s 서버의 정보
%% 하나의 %문자
4) 슈퍼데몬[xinetd]
(가) 개요
① 기존의 inetd 슈퍼데몬의 비효율적인 리소스 관리와 보안성 문제를 극복하기 위해 나온 슈퍼데몬으로 서비스별 다양한 설정 옵션을 가지고 있다.
② 서비스별 접근제어를 위해 TCP Wrapper의 기능뿐만이 아니라 자체적으로 다양한 서비스별 접근제어가 가능하다.
③ 서비스 구성은 다음과 같다.
- /etc/xinetd.conf :글로벌 xinetd 설정 파일
- /etc/xinetd.d/ 서비스 설정 파일 : 개별 서비스에 대한 설정 파일
(나) 서비스별 설정 파일
service
disable
socket_type
wait
user
server
cps
instance
per_source
only_from
no_access
access_times
log_on_failure
log_on_success
(다) 서비스별 접근제어 실습
① xinetd 데몬의 telnet 서비스(/etc/xinetd.d/telnet) 설정파일에 주요 접근제어 내용
- no_access : 해당 ip 대역 접근을 차단
- access_times : 몇시부터 몇시까지 접근을 허용한다.
- cps :
- instance :
- per_source :
② 설정파일 변경 후 xinetd 데몬을 재기동하여 서비스 설정을 적용한다.
③ 접근 차단 로그 확인(/var/log/messages) - 차단 로그를 살펴보면 no_access에 의한 주소 차단과 access_times에 의한 접근 시간 차단이 발생한 것을 볼 수 있다.
(3) PAM(장착형 인증 모듈, Pluggable Authentication Modules)
1) 개요
① PAM은 리눅스 시스템 내에서 사용되는 각종 어플리케이션 인증을 위해 제공되는 다양한 인증용 라이브러리들을 말한다.
- 일반적으로 /lib/security 또는 /usr/lib/security 디렉터리에 해당 라이브러리가 저장되어 있다.
- 라이브러리들은 어플리케이션 인증 목적으로 관리자에 의해 선택적으로 사용할 수 있다. 이를 통해 s/w 개발 시 인증부분을 독립적으로 개발할 수 있고 필요에 따라 인증체계를 선택적으로 사용할 수 있는 장점이 있다.
② 리눅스는 로그인이나 telnet, ftp 등 각종 프로그램 사용 시 PAM을 통해 인증을 처리한다. 프로그램 개발 시 인증 모듈을 별도 개발하지 않고 플러그인 방식의 PAM을 사용함으로써 인증 방식 및 정책의 유연성과 중앙 통제가 가능하다는 장점이 있다.
③ PAM은 리눅스 시스템에서 사용자 인증의 핵심이며, 각 응용 프로그램에 대한 인증 형태, 사용자 권한, 접근 자원 등을 선택할 수 있는 라이브러리다.
④ 시스템 관리자는 다양한 인증 서비스를 선택할 수 있고 기존 응용 프로그램을 수정할 필요 없이 새로운 인증 서비스 모듈을 추가하여 사용할 수 있다.
2) PAM을 사용한 인증 절차
① 각 프로그램은 인증이 필요한 부분에 PAM 라이브러리를 호출한다.
② PAM 라이브러리가 호출되면 해당 프로그램의 PAM 설정파일을참조하여 등록된 여러 PAM 모듈들을 수행하고 그 결과를 응용 프로그램에 반환한다.
③ 응용 프로그램은 그 반환된 결과를 이용하여 인증 여부를 결정한다.
④ PAM 라이브러리 관련 경로
- /etc/pam.d : PAM 라이브러리를 이용하는 각 응용 프로그램의 설정 파일이 위치한다. 설정 파일명은 응용 프로그램명과 동일하다.
- /lib/security : PAM 라이브러리가 제공하는 다양한 인증 모듈들이 위치한다.
- /etc/security : PAM 모듈 실행에 필요한 추가 설정 파일이 위치한다.
3) PAM 설정파일(/etc/pam.d/remote 설정파일 일부)
[type] [control] [module-path] [module-arguments]
① type : PAM 모듈 종류
- account
- auth
- password
- session
② control : 각 모듈 실행 후 성공 또는 실패에 따른 PAM 라이브러리 행동 결정
- requisite
- required
- sufficient
- optional
③ module-path : PAM에서 사용할 실제 모듈파일이 위치한 경로를 의미한다. 모듈 이름(*.so 파일)만 명시할 경우 기본 PAM 모듈 디렉터리에서 해당 모듈을 찾는다.
④ module-arguments : 모듈에게 전달되는 인수
4) PAM 활용 예1 (시스템 취약점 분석/평가 항목)
(가) root 계정의 원격 접속 제한
(나) 실습
(다) 유닉스/리눅스 시스템별 root 계정 원격 접속 제한 설정
(라)
(마)
5) PAM 활용 예2 (시스템 취약점 분석/평가 항목)
(가) 계정 잠금 임계값 설정
(나)
(다)
6) PAM 활용 예3 (시스템 취약점 분석/평가 항목)
(가)
(나)
(다)
(라)
(4) 시스템 로그 설정과 관리
1) 개요
① 유닉스/리눅스 로그가 저장되는 경로는 시스템마다 조금씩 다르다. 일반적으로 유직스의 경우 /var/adm 디렉터리에 주로 저장되며 리눅스의 경우 /var/log 디렉터리에 주로 저장된다.
② 리눅스에서는 /var/log 디렉터리에서 시스템의 모든 로그를 기록 및 관리하고 있다. 시스템의 /etc/syslog.conf 파일에서 시스템 로그 파일들의 위치를 지정하고 있다.
③ 서버에는 여러 개의 로그 파일이 있으며 이들 로그를 남기는 데몬들 또한 다양하다. 시스템 로그데몬, 메일 데몬, 웹, 네임서버데몬, 슈퍼데몬 등 다양하다.
2) 유닉스/리눅스 주요 로그 파일
(가) utmp(x) 로그파일
- 현재 로그인한 사용자의 상태정보를 담고 있는 로그 파일
- binary 파일로 되어 있으며 그 내용을 확인하기 위해서는 [w, who, finger 등] 명령어를 이용
- linux : /var/run/utmp, unix : /var/adm/utmpx
(나) wtmp
- 사용자의 성공한 로그인/로그아웃 정보, 시스템의 Boot/Shutdown 정보에 대한 히스토리를 담고 있는 로그 파일
- binary 파일로 되어 있으며 그 내용을 확인하기 위해서는 [last] 명령 사용(last명령은 모든 계정에 대한 로그인/로그아웃 정보를 출력한다, reboot 사용자(pseudo user)를 통해 Boot/Shutdown 정보를 확인)
- linux : /var/log/wtmp, unix : /var/adm/wtmpx
(다) lastlog 로그 파일
- 가장 최근에 성공한 로그인 기록을 담고 있는 파일
- binary 파일로 되어 있으며 그 내영을 확인하기 위해서는 [lastlog, finger] 명령 사용
- linux : /var/log/lastlog, unix : /var/adm/lastlog
(라) btmp(linux), loginlog(unix)
- 실패한 로그인 시도에 대한 기록을 담고 있는 파일
- Linux : /var/log/btmp, binary 파일로 되어 있으며 [lastb명령]
- unix : /var/adm/loginlog, 텍스트 파일로 되어 있어 vi 등으로 로그 확인 가능 5회이상 실패 시 실패한 로그 남김
(마) sulog 로그 파일
- su(switch user) 명령을 사용한 결과를 저장한 파일로 sunOS를 포함한 unix에서만 볼 수 있다.
- unix : /var/adm/sulog, 텍스트 파일로 되어 있어 vi 편집기로 볼 수 있다.
- linux : /var/log/secure 로그 파일에 남음
(바) acct/pacct 로그 파일
- 시스템에 로그인한 모든 사용자가 로그아웃할 때까지 입력한 명령어와 터미널의 종류, 프로세스 시작 시간 등을 저장한 로그
- binary파일로 되어 있으며 [lastcomm 명령사용]
- linux : /var/account/pacct, 기본 생성이 아니라서 "accton/var/account/pacct"명령 실행 필요
- unix : /var/account/pacct, 기본 생성되는 로그 파일이 아니라서 "usr/lib/acct/accton /var/adm/pacct" 명령 실행 필요
(사) history 로그 파일
- 각 계정별로 실행한 명령어에 대한 기록을 저장한 파일로 각 계정별 홈 디렉터리에 존재한다.
- 로그 파일은 ".쉘종류_history" 형식으로 생성되며 텍스트 파일로 되어 VI 편집기로 내용 확인 가능 [history 명령 사용]
(아) secure 로그 파일
- 주로 사용자/그룹 생성/삭제, 로그인 등의 사용자 인증에 대한 정보를 기록하고 있는 로그 파일로서 서버보안에 아주 민감하고 중요한 파일
- 원격에서 접속한 내역과 su(Switch user) 명령을 수행한 내역 등이 저장된다.
- linux : /var/log/secure
(자) messages 로그 파일
- 리눅스 시스템의 가장 기본적인 시스템 로그 파일로 시스템 운영에 대한 전반적인 메시지를 저장하고 있다.
- 주로 시스템 데몬들의 실행상황과 내역, 사용자들의 접속 정보, TCP Wrapper 접근 제어 정보 등을 저장한다.
- linux : /var/log/messages
(차) dmesg 로그 파일
- 리눅스가 부팅될 때 출력되는 모든 메시지를 기록하고 있다. 부팅 시의 에러나 조치사항을 살펴 보려면 이 파일을 참조해야 한다.
- 텍스트 형식의 로그 파일을 보거나 dmesg 명령으로 확인
- Linux : /var/log/dmesg
(카) boot.log 로그 파일
- 리눅스가 부팅될 때 파일 시스템에 대한 체크, 서비스 데몬들의 실행 상태 등을 기록하고 있는 로그파일로 성공/실패 여부를 확인할 수 있다.
- Linux : /var/log/boot.log
(타) xferlog 로그 파일
- 리눅스 시스템의 FTP 로그 파일로서 proftpd 또는 vsftpd 데몬들의 서비스 내역을 기록하는 파일
- FTP로 로그인하는 사용자에 대한 로그 기록과 어떤 파일을 업로드/다운로드 하였는가에 대하여 상세하게 기록한다.
- Linux : /var/log/xferlog
(파) cron로그 파일
- 시스템의 정기적인 작업에 대한 로그 즉 시스템 cron 작업에 대하여 기록하고 있는 파일
- /etc/디렉터리에는 cron.hourly, cron.daily, cron.monthly 디렉터리들이 있다.
- Linux : /var/log/cron
(하) maillog 로그 파일
- sendmail 또는 qmail 등과 같은 메일 송수신 관련 내역들과 ipop 또는 imap 등과 같은 수신내ㅐ역들에 대해 기록한다.
- 메일관련 모든 것 기록
- linux : /var/log/maillog
(거) mail 로그 파일
- 사용자들에 대한 메일을 보관하고 있는 디렉터리로서 메일을 한 번 이상 사용한 사용자는 사용자 계정 ID와 동일한 파일이 하나씩 존재
- 사용자 계정 생성 시에 /var/spool/mail 디렉터리 내에 생성하는 계정명과 동일한 메일 파일이 생성된다.
- Linux : /var/spool/mail
3) syslog 설정 및 관리
(가) 개요
① 유닉스 시스템은 syslog 표준 인터페이스를 통해 커널 및 응용 프로그램에 의해 발생하는 로그를 체계적으로 생성하고 관리한다.
② 동작방식을 살펴보면, 커널 및 응용 프로그램이 syslog API를 통해 로그를 생성하면 syslogd 데몬 프로세스가 syslog.conf 설정 파일을 참조하여 지정한 로그 파일, 콘솔 또는 외부 서버 등에 로그를 기록한다.
- syslog API 사용 구문 : syslog(priority, "%s", "로그 문자열")
③ /etc/syslog.conf 파일은 시스템 로그 데몬이 실행될 때 참조되는 로그 설정 파일로서 어떤 로그를 어디에 남길지 로그 저장 규칙이 정의되어 있다.
④ 최근 리눅스에서는 기존 syslog를 개선한 rsyslog를 주로 사용한다.
⑤ syslog는 기밀성, 무결성, 가용성 등 정보보호 특성을 고려하지 않고 개발되었다.
(나) facility : 로그 생성 서비스
(다) priority : 로그 수준(Level)
emergency
alert
critical
error
warning
notice
information
debug
(라) action
① 로그를 어디에 남길 것인지를 결정한다. 로그파일, 콘솔, 원격 로그 서버, 특정 사용자 등에 로그를 남길 수 있다.
- 로그파일
- 콘솔
- 원격 로그 서버
- user
- *
② 원격 로그 서버 설정 실습
(마) syslog.conf(rsyslog.conf) 설정 예
① #kern.*
② *.info;
③ authpriv.*
④ mail.*
⑤ cron.*
⑥ *.emerg
⑦ uucp, news.crot
⑧ local7.*
⑨
4) 리눅스 로그 관리
(가) 로그 모니터링
① /var/log/secure와 같은 텍스트 형식의 로그를 실시간으로 계속 모니터링 하려면 "tail -f /var/log/messages"명령을 이용
② "tail" 명령은 대상 파일의 마지막 n라인을 출력하는 명령어로 -f옵션을 주면 실시간으로 추가되는 내용들을 출력해준다.
③ utmp, wtmp, lastlog 등 바이너리 형식의 로그파일들은 cat이나 vi 등의 텍스트 편집기를 통해서는 확인할 수 없다.
(나) 로그파일 순환 관리
① syslog나 데몬 프로세스가 출력하는 로그 파일을 그대로 방치하면 사이즈가 커지면서 관리하기 어려워지고 디스크 사용율이 100%가 되어 시스템 장애가 발생할 수 있다.
② lograte는 시스템 로그파일을 관리하기 위한 도구로 로그파일 순환, 압축 등의 기능을 가지고 있다.
데몬 /usr/sbin/logrotate logrotate : 데몬 위치 및 데몬 프로그램
데몬 설정 파일 /etc/logrotate.conf :
설정 디렉터리 /etc/logrotate.d :
상황 파일 /var/lib/logrotate.status :
cron /etc/cron.daily/logrotate :
③ logrotate 설정파일 주요 옵션
5. 시스템 해킹
1) 버퍼 오버플로우 공격(Buffer Overflow Attack)
(가) 개요
① 버퍼 오버플로우는 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생한다. 버퍼 오버플로우가 발생하게 되면 프로그램의 오작동을 유발시키거나, 악의적인 코드를 실행시킴으로써 공격자 프로그램을 통제할 수 있는 권한을 획득하게 된다.
② 버퍼 오버플로우에는 스택 버퍼 오버플로우와 힙 버퍼 오버플로우가 있다.
- 스택 버퍼 오버플로우 : 스택은 함수 처리를 위해 지역변수 및 매개변수가 위치하는 메모리 영역을 말한다. 스택에 할당된 버퍼들이 문자열 계산 등에 의해 정의된 버퍼의 한계치를 넘는 경우 버퍼 오버플로우가 발생하여 복귀 주소를 변경하고 공격자가 원하는 임의 코드를 실행한다.
- 힙 버퍼 오버플로우 : 힙은 사용자가 동적으로 할당하는 메모리 영역 (malloc 등의 메모리 할당 함수 이용)이다. 힙에 할당된 버퍼들에 문자열 등이 저장되어 질 때, 최초 정의된 힙의 메모리 사이즈를 초과하여 문자열 등이 저장되는 경우 버퍼 오버플로우가 발생하여 데이터와 함수주소 등을 변경하여 공격자가 원하는 임의 코드를 실행한다.
(나) 버퍼 오버플로우 이해를 위한 C언어 함수
주요 C언어 함수
- strcpy(char*dst, const char * src) : src 문자열을 dst 버퍼에 저장한다. src 문자열의 길이를 체크하지 않으므로 dst 버퍼를 초과하는 결과가 발생할 수 있다.
- strncpy(char*dst, const char * src, size_t len) : src 문자열의 len 만큼을 dst 버퍼에 저장한다. src 문자열의 길이를 제한하기 때문에 버퍼 오버플로우에 안전하다.
- size_t strlen : 문자열의 null 문자를 제외한 바이트 수를 반환한다.
- sizeof(피연산자) : 피연산자의 크기를 반환한다.
- C언어에서 문자열 처리
- C언어에서 문자열은 null문자로 문자열의 끝을 표현한다.
- 가령 "ABCD"라는 4개의 문자로 구성된 문자열을 정의한다면, 실제로는 "ABCD\0"의 5개로 저장된다.
(다) 스택 버퍼 오버플로우 공격 실습
(라) 스택 버퍼 오버플로우 대응방안(안전코드)
① 안전한 함수를 사용하여 버퍼 오버플로우 방지
② 입력값 사전 검증을 통한 버퍼 오버플로우 방지
(마) 스택 버퍼 오버플로우 대응 기술
① 스택 가드
: 메모리상에서 프로그램의 복귀주소와 변수 사이에 특정 값(카나리아 단어 : 메모리 변경 여부를 탐지하기 위한 특정 단어)을 저장해 두었다가 그 값이 변경되었을 경우를 오버플로우로 가정하여 프로그램 실행을 중단하는 기술을 말한다.
② 스택 쉴드
: 함수 시작 시 복귀 주소를 Global RET라는 특수 스택에 저장해 두었다가 함수 종료 시 저장된 값과 스택의 RET 값을 비교해 다를 경우 오버플로우로 가정하여 프로그램 실행을 중단시키는 기술을 말한다.
③ ASLR(Address Space Layout Randomization)
: 메모리 공격을 방어하기 위해 주소 공간 배치를 난수화하는 기법이다. 실행 시 마다 메모리 주소를 변경시켜 악성코드에 의한 특정 주소 호출을 방지한다.
2) 레이스 컨디션 공격(Race Condition Attack)
(가) 개요
① : 둘 이상의 프로세스나 스레드가 공유자원에 동시에 접근할 때 접근하는 순서에 따라 비정상적인 결과가 발생하는 조건/상황을 말한다.
② 실행되는 프로세스가 임시파일을 만드는 경우 악의적인 프로그램을 통해 그 프로세스의 실행 중에 끼어들어 임시파일을 목적파일로 연결(심볼릭 링크)하여 악의적인 행위를 할 수 있다.
③ 만약 프로세스가 setuid 설정이 되어 root권한이 실행되면 권한 상승 취약점으로 이어진다.
(나) 공격 원리 실습
kiwi99계정으로 race_cond 실행 -> 공격자가 심볼릭 링크 시도(tmp.dat -> /etc/shadow) -> tmp.dat 오픈 -> tmp.dat 씌기 -> 심볼릭 링크에 의한 쓰기 발생
(다) 대응 방안
① 가능하면 임시파일을 생성하지 않는다.
② 파일 생성 시 이미 동일한 파일이 존재하는 경우 파일 생성 또는 쓰기를 금지한다.
③ 사용하고자 하는 파일에 링크가 걸려있으면 실행을 중단한다.
④ umask를 최하 022정도로 유지하여 임시로 생성한 파일이 공격자에 의해 악의적으로 삭제되지 않도록 한다.
3) 포맷 스트링 공격(Format String Attack)
(가) 개요
① 포맷 스트링은 c언어의 printf()등의 함수에서 사용되는 문자열의 입/출력 형태를 정의하는 문자열로 서식 문자열이라 표현한다.
② 포맷 스트링을 인자로 하는 함수의 취약점을 이용한 공격으로 외부로부터 입력된 값을 검증하지 않고 입출력 함수의 포맷 스트링을 그대로 사용하는 경우 발생할 수 있는 취약점이다.
③ 공격자는 포맷 스트링을 이용하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있다. 그 결과, 공격자는 취약한 프로세스의 권한을 획득하여 임의의 코드를 실행할 수 있다.
(나) 공격 원리
① 주요함수
- printf(서식문자열, 인자1, ...) : 인자값을 포맷 스트링으로 표준 출력한다.
- fprintf(fp, 서식문자열, 인자1,...) : 인자 값을 포맷 스트링으로 지정한 파일(fp)에 출력한다.
- sprintf(buf, 서식문자열, 인자1..) : 인자값을 포맷 스트링으로 지정한 버퍼(buf)에 출력힌다.
② 포맷 스트링 식별자
%d - 10진수 정수 출력
%f - 실수 출력
%c - 문자 출력
%s - 문자열 출력
%x - 16진수 정수 출력
%n - 이전까지 출력한 총 바이트 수를 지정한 변수
③
④
⑤ 포맷 스트링 취약점
포맷 스트링을 인자로 하는 함수 사용 시 포맷 스트링을 지정하지 않고 사용자 입력을 통해서 포맷 스트링이 결정된다면 공격자는 이를 조작하여 메모리 내용을 참조하고 특정 영역의 값을 변경할 수 있다.
공격자는 스택 프레임 구조를 고려하면서 "%x"를 통해 메모리 내용 참조 및 원하는 위치(RET 영역)로 이동한 후 "%n"을 통해 Return Address를 악성코드가 위치한 주소로 변조하여 악성코드를 실행할 수 있다.
(다) 대응 방안
포맷 스트링을 함수의 입력 파라미터로 직접 사용하지 않는다.
취약한 예 printf(argv[1]);
안전한 예 printf("%s", argv[1]);
참고
2021 정보보안기사 실기 알기사책
'교육 및 자격증 > 정보보안기사 : 실기' 카테고리의 다른 글
part2. 네트워크(sec4,5,6) (0) | 2023.04.07 |
---|---|
sec2 UNIX, Linux 서버 취약점; sec3 윈도우 서버 취약점 (0) | 2023.04.07 |
정보보안기사 실기 기출 분석 및 출제 범위 (0) | 2023.03.31 |
Sec17; 정보보안 법규 (0) | 2023.03.06 |
목차 (0) | 2022.09.06 |