유닉스 시스템은 1960년대 후반에 AT&T사의 Bell 연구소에서 개발한 Multics라는 이름을 가진 운영체제에서 그 뿌리를 찾을 수 있다. 그 후 본격적으로 유닉스 시스템의 개발에 착수한 사람은 Ken Thompson으로 DEC사의 PDP-7용 OS를 Assembly로 개발하여 초기 유닉스 시스템 발전의 기초를 만들었으며, 1973년 Dennis Ritchie가 이식성이 뛰어난 C언어로 유닉스 시스템을 재작성함으로써 본격적인 유닉스 시대의 장을 만들게 되었다.
나. 유닉스 시스템 핵심 구조
유닉스 시스템은 크게 커널, 쉘, 파일시스템 3가지 핵심 구조로 구성되며 다음 [표 4-1]은 유닉스 시스템의 핵심 구조에 대한 간단한 설명이다.
(1) 커널(Kernel)
사용자 프로그램들은 경우에 따라 시스템의 하드웨어나 소프트웨어의 자원을 액세스하게 되는데 커널은 이러한 사용자 프로그램을 관리하는 부분을 말한다. 커널은 크게 프로세스, 메모리, 입출력(I/O) 그리고 파일 관리의 네 부분으로 나누 어 생각할 수 있으며 이러한 서브시스템은 각기 독립적으로 사용자 프로그램에 의해서 의도되는 서비스를 올바르게 제공하기 위해서 상호 협동적으로 작동하게 된다. 또한 커널은 쉘과 상호 연관되어 있어서 쉘에서 지시한 작업을 수행하고 결과물을 돌려보낸다.
(2) 쉘(Shell)
쉘은 유닉스 시스템과 사용자 사이의 인터페이스를 제공하는 것을 말한다. 즉, 사용자가 문자열들을 입력하면 그것을 해석하여 그에 따르는 명령어를 찾아서 커널에 알맞은 작업을 요청하게 된다. 쉘은 종류에 따라 전통적으로 Bourne 쉘, C 쉘, Korn 쉘 등으로 구분된다.
o Bourne 쉘(/bin/sh, $): AT&T의 유닉스 환경을 위해 개발되었으며, 대부분의 유닉스에서 제공하는 기본 쉘이다. 빠른 수행과 최소한의 자원만을 요구하는 것이 특징이다.
o C 쉘(/bin/csh, %): 사용법이 C 언어와 유사하며, Korn 쉘, Bourne 쉘과 기본적으로 유사한 특성을 가지고 있으나 대형 시스템을 목표로 설계되었기 때문에 명령어의 용어와 문법적 구조는 다르다.
o Korn 쉘(/bin/ksh, $) : 벨 연구소의 David Korn에 의해 제작되었으며, Bourne 쉘을 포함하며, aliasing, history, command line editing 같은 특성이 추가되었 다.
(3) 파일 시스템(File System)
유닉스의 최상위 레벨의 디렉터리인 root는 “/”로 시작하여 하위에 다음과 같은 디 렉터리 계층구조를 이룬다.
o /dev: 디바이스 파일을 주로 포함하는 디렉터리 o /etc: 시스템 관리를 위한 파일을 포함하는 디렉터리(passwd, hosts, rc 등의 파일 포함) o /sbin: Standalone binary 파일을 포함하는 디렉터리(시스템의 시작에 필요한 init, mount, sh 등) o /tmp: 임시 디렉터리 o /bin: 시스템 바이너리 파일을 포함하는 디렉터리 o /lib: 시스템 라이브러리 파일을 포함하는 디렉터리(유틸리티, 패키지 등 포함) o /var: 계정 정보와 계정 관리 및 시스템 통계 등에 관한 디렉터리 o /usr: 각종 실행 프로그램이나 온라인 매뉴얼 등을 포함하는 디렉터리
다. 유닉스 시스템 부팅 절차와 실행 단계
(1) 유닉스 시스템 부팅 절차
o 시스템 초기화 o Bootstrap disk에 있는 첫 블록을 옮겨 그 코드(code)를 실행 o Bootstrap loader는 유닉스 파일을 찾아서 메모리에 옮겨, 처리하여 수행 o 유닉스 파일은 몇몇 하드웨어 인터페이스를 초기화 o 초기화 작업이 끝난 후에 프로세스 0을 수행 o 프로세스 0을 만들어 초기화한 후 시스템은 프로세스 0을 복제함으로써 프로세스 1을 생성 o 앞 단계까지 성공적으로 수행한 경우, 정상적인 스케줄링 수행 o init 프로세스인 프로세스 1이 수행이 되면 exec system call을 하게 되는데 이 시스템 콜은 프로세스 1의 code 명령에 파일 /etc/init를 읽어 들임 o getty 프로세스는 다음과 같이 처리됨 - communication line connection, exec login o login 프로세스 - 사용자 ID/패스워드 검증, 쉘 실행
(2) 유닉스 시스템 실행 단계
System V 계열의 유닉스 시스템은 실행 단계(Run Level)별로
다음 [표 4-2]와 같은 단계를 포함하며, init 명령어를 통하여 사용자가 통제할 수 있다.
2. 유닉스 시스템 관리
가. 유닉스 시스템 로그 관리
다음 [표 4-3]은 유닉스 시스템에서의 중요 로그 파일을 설명한 것이다.
(1) syslog 로깅 주체(facility)
syslog 로깅 주체(facility)는 로그 정보를 요청한 프로그램 종류로 구분되며, syslog 로깅 주체별 로그 대상 사건은 다음 [표 4-4]와 같다.
(2)syslog 레벨
syslog 레벨(level)은 심각성(severity) 레벨을 의미하는데 다음 [표 4-5]와 같은 단계로 구분 지을 수 있다. 심각성 레벨은 심각도에 따라 emerg > alert > crit > err > warn > notice > info > debug 순이다.
(3) syslog 설정 구문(/etc/syslog.conf)
주의할 점은 mark를 제외한 나머지 레벨은 *.alert , *.debug 등과 같이 facility를 와일드카드(wild card, *)를 사용하여 나타낼 수 있지만, mark의 경우에는 와일드카드를 사용할 수 없다는 것이다.
다음 [표 4-6]은 /etc/syslog.conf 설정 구문에 대한 설명이다.
나. 유닉스 시스템 백업 및 복구 보안
침입자에 의해 시스템의 데이터가 변조되거나 파괴되었을 때, 가장 안전하고 정확한 복구 방법은 백업 및 복구대책이다. (1) 백업 대책
o 백업 대상 분류 : 전체, 중요 파일, 로그 파일 등 기준에 의하여 백업 대상을 지정하는 것 o 백업 주기 : 현재 수행하고 있는 백업의 주기는 일/주/월 단위 및 수시 백업으로 분류 o 백업 종류 : 다음 [표 4-7]과 같다
.
(2) 복구 대책(침해사고 또는 장애 등에 대한 복구 대책)
o 복구 우선순위: 본질적 업무 기능(30분 이내), 중요 업무 기능(24시간 이내), 부가 업무 기능(48시간 이내) 등으로 분류 o 목표 복구 수준: 특정 백업 시점, 전일 백업 시점의 데이터로 복구 - 특정 백업시점(I), 전일백업 시점(D) o 목표 복구 시간: 30분 이내, 3시간 이내, 24시간 이내, 48시간 이내로 분류
(3) 백업과 복구 유닉스 명령어
#ufsdump options : 백업 0-9 : 0: full dump, 1~9: incremental backup u : /etc/dumpdates에 write, incremental backup 가능하도록 처리 f : device 장치 명시, 디폴트는 tape v : view # ufsrestore : 복구
(1) 불필요한 서비스의 제거 시스템 운영에서 불필요한 서비스 제거를 위하여 다음 절차를 수행한다. o “#netstat -an”을 통하여 현재 사용, 준비하고 있는 서비스 포트를 확인한다. Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 210.205.14.100:80 0.0.0.0:* LISTEN tcp 0 0 210.205.14.100:8080 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
명령어의 실행 결과에서 LISTEN으로 응답하는 포트는 외부사용자가 접속할 수 있는 경로를 제공하는 서비스 포트로서, 현재 사용 중임을 의미한다. 따라서 반드시 사용 유무를 확인하여 제거해야 한다. o “#netstat -an”의 처리 결과 LISTEN 상태인 서비스 포트의 내용 을 /etc/services 파일의 내용과 비교하여 서비스 포트의 내용을 참조한다. 그리고 /etc/inetd.conf 파일에서 해당 서비스 항목의 첫 라인에 주석 처리한다. (#을 해당 라인에 삽입)
[stkim@insert stkim]$ more /etc/inetd.conf # Version: @(#)/etc/inetd.conf 3.10 05/27/93 # # Echo, discard, daytime, and chargen are used primarily for testing. #echo stream tcp nowait root internal #echo dgram udp wait root internal #discard stream tcp nowait root internal #discard dgram udp wait root internal #daytime stream tcp nowait root internal #daytime dgram udp wait root internal #chargen stream tcp nowait root internal #chargen dgram udp wait root internal #time stream tcp nowait root internal # These are standard services.
o “ps –ef | grep inetd”의 명령어를 사용하여 현재 사용 중인 서비스 포트들을 총괄적으로 관리하는 인터넷 슈퍼 데몬의 프로세스 ID를 확인한다. [stkim@insert stkim]$ ps –ef | grep inetd root 318 1 0 14:01 ? 00:00:00 inetd
o “kill –HUP 318(inetd’s Process ID)” 인터넷 슈퍼 데몬을 재수행하여 /etc/inetd.conf 파일에서 사용을 금지하도록 설정한 서비스 포트의 상태를 재인식하도록 명령한다. o “netstat –an” 명령어를 사용하여 해당 서비스 포트에 대한 결과값이 나타나지 않았다면 조치가 완료된 것이다.
다음 [표 4-8]은 유닉스 시스템에서 일반적으로 정의된 서비스를 정리한 것이다.
(2) 유닉스 시스템 프로세스 관리 'ps' 명령은 유닉스 시스템에서 현재 구동 중인 프로세스를 확인하는 명령으로 'kill' 명령을 통해 강제적으로 구동 중인 프로세스를 정지할 수 있다.
o 관련 명령어
- ps –ef : 프로세스 확인 명령 - kill PID, killall PID : 프로세스 정지 명령 - kill -15 PID : default signal 제거 - kill -9 PID : 프로세스 강제 제거 - pgrep –lf sendmail : 프로세스 실행 확인 명령 - pkill sendmail : 프로세스 정지 명령 라. 유닉스 배치 작업(at, cron) (1) at 설정 #at 1045 10시 15분에 특정한 job(shell_script_file)을 수행하도록 처리한다. #/var/spool/cron/crontabs 파일을 수정하여 주기적으로 job을 수행하도록 한다. ※ 명령어는 full path을 지정해야 한다.
(2) cron 설정
crontab 파일 구문(syntax)은“minute hour day_of_month month weekday command" 이다.
o crontab 파일 구문- minute(분) : 0 ~ 59 - hour(시) : 0 ~ 23 - day_of_month (일) : 1 ~ 31 - month(월) : 1 ~ 12 - weekday(요일) : 일요일부터 토요일까지를 나타내는 0 ~ 6 - command(명령) : 실행 명령 예를 들어, “0 0 * * 0 /bin/myjob.sh” 은 매월 일요일 0시 0분에 /bin/myjob.sh 명령어를 실행하라는 뜻이다.
마. 유닉스 시스템 패키지/패치 관리 (1) 유닉스 시스템 패키지 관리 유닉스 시스템에서의 소프트웨어를 패키지라고 말하며, 이것을 설치하는 것을 “패키지를 설치한다.”라고 한다. 다음은 패키지 관련 명령어이다.
o pkginfo -d /cdrom/~ : 시스템에 설치된 패키지 정보를 확인한다. -d 옵션을 사용하여 서브 디렉터리의 패키지 정보를 볼 수 있다. o pkgadd -d /cdrom/~ : /cdrom/~ 디렉터리에 존재하는 소프트웨어를 설치한다. o pkgadd -d /cdrom/~ -s /pkg : -s 옵션은 저장할 곳을 지정하는 옵션이다. o pkgrm pkg_name : 패키지를 삭제한다. o pkgchk pkg_nameo pkginfo 등
(2) 유닉스 시스템 패치 관리
다음과 같은 절차로 패치를 설치한다. o ftp sunsolve.sun.com에서 다운받는다. - /pub/patches : patch 파일, readme 파일을 다운받는다. o /usr/bin/unzip ./xxxx.zip : 압축을 푼다. o zcat/gzcat : 압축을 푼다.- zcat xxx.tar.Z | tar -xvf - >> 결과: xxx - gzcat o patchadd 명령어를 이용하여 패치 설치(필요한 경우 삭제) - patchadd xxxx : 패치 설치 o 설치된 패치 삭제(불필요한 경우 삭제) - patchrm xxxx : 설치된 패치 삭제
3. 유닉스 시스템 보안
가. 유닉스 시스템 계정 보안 (1) 기본 개요
패스워드는 사용자가 기억하기 용이하게 작성하되, 타인이 유추하기 어렵게 작성해야한다.
(2) 작성 규칙
패스워드는 반드시 숫자와 문자가 조합된 6자리 이상으로 규정하며, 일련번호, 주민등록번호, 계정과 유사 등 유추 가능한 패스워드의 사용을 금지한다.
(3) 패스워드 부여 절차
o 신규계정 생성 시 보안 관리자가 초기 패스워드를 일괄 부여하며 사용자가 최초 로그인 시 변경하도록 규정한다. o 패스워드 분실, 변경, 재발급은 정의된 절차와 규정에 따라 보안 관리한다.
(4) 패스워드 관리 o 정보보호 정책의 패스워드 관리지침 준수 o 계정 및 패스워드 유출로 인한 보안 침해사고의 궁극적인 책임은 개인에게 있음을 인식 o 쉽게 유추할 수 없는 패스워드 설정 o 주기적인 패스워드 변경 규정의 준수
다음 [표 4-9]는 유닉스 시스템 계정 설정과 관련된 파일이다.
나. 쉘 보안
(1) 쉘 종류 및 특징
쉘은 사용자와 운영체체 커널 사이에 위치하는 명령어 해석기를 말한다.
o C 쉘(Berkeley 유닉스 C 쉘): .cshrc 파일에 사용자가 필요로 하는 환경 변수를 저장하여 사용자가 로그인할 때 지정한 명령들을 자동으로 수행케 함으로써, 사용자의 작업 환경을 편리하게 지정할 수 있다.
o Bourne 쉘: .profile 파일에 환경 변수를 저장함으로써, 사용자의 작업 환경을 편리하게 한다. .profile 파일은 C 쉘의 .cshrc 파일과 같은 역할을 한다.
o Korn 쉘: .kshrc 또는 .profile 파일에 환경 변수를 저장하여 사용자의 작업 환경을 편리하게 한다. C 쉘과 TC 쉘의 기능을 모두 제공하며, 쉘 스크립트 언어는 Bourne 쉘과 비슷하다.
(2) 쉘의 환경 파일
파일명이 ‘.’으로 시작하기 때문에 숨김 파일/도트 파일(ls 명령에 나타나지 않음), 초기화 파일/선행 파일(사용자 로그인 시 먼저 실행), 환경파일(사용자의 환경설정이 정의되어 있음)로 불린다.
다음은 환경파일에 대한 설명이다.
o .login: 특정 쉘에 관계없는 초기 사용자환경을 지정하여 로그인할 때 지정한 명령들을 자동으로 수행 o .logout: 시스템 접속을 종료하기 전에 마지막으로 수행될 내용 지정 파일 o .forward: 자신에게 온 전자우편을 다른 곳으로 그대로 전송하기 위한 파일 o .gopher: Gopher에서 사용하는 디렉터리 o .history: 쉘을 사용할 때 수행한 명령어의 일부를 저장하는 파일 o .ncrecent: ncftp 사용할 때 최근에 접속한 곳의 주소 및 위치 저장 파일 o .newsrc: USENET News Group 이용 시 그룹 환경 저장 파일 o .plan: finger용으로 자신의 정보나 계획을 적어 외부에 공개하는 파일 o .rhosts: rlogin을 이용하여 시스템에 접속할 때 암호를 묻지 않고 자동으로 접속할 수 있는 서버 및 사용자를 지정하는 파일
아래 [표 4-10]은 각 쉘에 따른 환경 파일을 정리한 것이다.
아래 [표 4-11]은 환경 파일에서의 변수 설정에 대한 설명이다.
다. 유닉스 파일 시스템 보안
(1) 파일 시스템 개요
o 유닉스 파일 시스템은 유닉스 커널 프로그램과 프로그램 실행에 필요한 시스템 파일 및 사용자 데이터 파일로 구성됨 o 개인 저장장소를 제공하고 정보를 여러 사용자가 사용, 공유할 수 있는 수단을 제공 o 여러 가지 정보를 저장하는 기본적인 구조 o 디스크 공간에 독립된 공간 구축 가능 o 독립된 파일 시스템은 다른 파일 시스템으로부터 독립적으로 존재
다음 [표 4-12]는 파일 시스템 종류에 대한 설명이다.
다음 [표 4-13]은 파일 시스템 구조에 대한 설명이다.
(2) umask를 이용한 파일권한 설정 새롭게 생성되는 파일이나 디렉터리는 디폴트 권한으로 생성된다. 이러한 디폴트 권한은 umask 값에 의해서 결정되는데, 이 권한은 부모 프로세스나 로그인 쉘에 의해 상속받는다.
따라서 umask 값이 안전하지 않은 권한으로 설정된 경우, 허가되지 않은 사용자에게 까지 파일이나 프로세스에 접근이 허락되어 보안 상 큰 위협 요소가 될 수 있다. 시스템의 기본값으로 umask는 시스템 환경파일인 /etc/profile 파일에 022로 설정되 어 있다. 보안을 강화하기 위하여 시스템 환경파일(/etc/profile)과 각 사용자별 홈 디렉터리 내 환경파일($HOME/.profile)에 umask값을 027 또는 077 로 변경하는 것을 권장한다.
umask 값의 변경에 따라 새롭게 생성되는 파일의 권한은 소유자(owner), 그룹 (group), 다른 사용자(others)별로 아래 [표 4-14]와 같이 적용된다.
(3) 특수 권한(setuid, setgid)파일의 관리 SUID(Set UID), SGID(Set GID)은 실행 파일이 슈퍼유저(root)나 다른 상위 사용자의 권한으로 수행될 수 있도록 규정한 특별한 파일권한 설정 비트이다. 또한 상위 권한으로 실행되는 특징 때문에 시스템 해킹의 주요 수단으로 악용되며, 프로그램 파일에 버그가 존재할 경우 불법 권한 획득에 이용될 수 있는 심각한 보안 위협이 될 수 있다. 즉 일반 사용자가 SUID, SGID 설정을 통해 특정 슈퍼 유저의 권한을 위임받아 특정 명령을 실행시킬 수 있다.
o setuid: 실행 파일에 사용됨(예, /etc/passwd)o setgid: 같은 project에 실행 권한 을 주기 위해서 setgid 사용(예, sys) o sticky bit: 디렉터리에 인가된 사용자만 쓰기(write) 가능하도록 하기 위해서 디렉터리 자체에 설정 (예, /var/tmp - 모든 사용자가 사용 가능하지만, 삭제는 파일의 소유자만 가능함(root는 예외))
다음 [표 4-15]는 특수권한 파일의 설정 및 검색과 관련된 명령이다.
※ find / -perm 7000 -print : suid, sgid, sticky 비트가 모두 설정된 파일을 검사
※ find / -perm 6000 -print : suid, sgid가 설정된 파일을 검사
(라) 보안 관리에 사용되는 주요 명령어 다음 [표 4-16]은 보안 관리와 관련된 주요 명령어에 대해 정리한 것이다.
(마) 보안 관리를 위한 중요 유닉스 파일과 명령어
보안 관리를 위한 중요 대상 파일은 네트워크 설정 관련, 신뢰관계 설정 관련, 배치작업 관련, 감사추적(로깅) 관련 항목으로 구분하여 중요 파일을 기술한다.
다음 [표 4-17]은 네트워크 설정과 관련된 파일이다.
다음 [표 4-18]은 신뢰관계 설정과 관련된 파일이다.
다음 [표 4-19]는 배치작업 설정과 관련된 파일이다.
다음 [표 4-20]은 로그 파일에 대해 정리한 것이다.
(바) 보안 강화 도구
보안 강화 도구 중 대부분은 사용 목적에 따라 보안 관리자를 위한 보안강화 도구로 사용되거나 공격자에 의한 침입 도구로 사용될 수 있다. 보안 도구에 대한 자세한 사항은 8장의 ‘침해사고 대응‘에서 소개한 도구의 설명을 참조하고 여기에서는 정보보호관리에 사용되는 보안 강화 도구의 사용 목적에 따른 분류 기준을 이해하도록 한다.
다음 [표 4-21]은 보안 강화 도구를 사용목적에 따라 분류하여 정리한 것이다.
(1) TCP Wrapper
TCP Wrapper는 인터넷 슈퍼데몬인 inetd 데몬에 의해 구동되는 네트워크 서비스 (예를 들어 ftp, telnet, rlogin, rsh, exec, tftp, talk, systat, finger 등)들에 대한 접근 통제와 사용된 서비스별 로그를 기록할 수 있는 보안강화 도구이다. TCP Wrapper는 시스템에 존재하는 소프트웨어나 설정 파일을 바꿀 필요가 없으며 클라이언트와 서버 응용 프로그램 사이의 실질적인 통신에 부하를 주지 않는다.
TCP Wrapper는 /etc/inetd.conf에 정의되고 inetd 데몬에 의해 통제되는 네트워크 서비스를 통제하기 위하여inetd 데몬과 네트워크 서비스데몬(in.telnetd, in.ftpd, in.rlogind 등) 사이에 tcpd 데몬을 구동하여 네트워크 서비스의 사용에 대한 접근 제어와 로그 기록 기능을 한다.
o 접근 제어 - TCP Wrapper의 접근제어는 /etc/hosts.allow 파일과 /etc/hosts.deny 파일에 의하여 이루어진다. 접근 제어에 사용되는 두 파일 중에서 tcpd가 먼저 검색 하는 것은 hosts.allow 파일이다.
그러므로 hosts.allow 파일에 접근을 허가하는 호스트를 적어두고, hosts.deny 파일 에는 ALL을 적어두면 허가된 호스트만이 시스템에 원격으로 접근할 수 있다.
o 로그 기록- TCP Wrapper(tcpd)는 syslog 데몬을 사용하며 telnet, ftp, rexec, rsh, rlogin, tftp, talk 등에 대한 접근 로그를 기록하며 기본적으로 /var/log/syslog 파일에 저장된다. 다른 파일로 변경하려면 /etc/syslog.conf 파일에 서 설정을 수정하면 된다. (2) CGI Wrapper TCP_Wrapper가 유닉스 서버의 네트워크 서비스(예, Telnet, rlogin, ftp 등)에 대한 접근 통제를 위한 보안도구라면 CGI Wrapper는 웹서비스의 CGI를 보호하는 웹서버 보안강화 도구이다.
CGI Wrapper는 웹서버의 자식 프로세스들이 모두 nobody 권한으로 실행되었을 때 발생하는 문제점을 보완하기 위하여 만들어진 것이다. CGI Wrapper는 CGI 프로그램 이 위치한 디렉터리의 소유자 권한으로 CGI 프로그램을 실행시킨다.
따라서 모든 CGI가 nobody로 실행되는 것이 아니며, 모든 CGI는 CGI 프로그램 자신 의 소유로 실행이 되는 것이다. 그리고 CGI Wrapper는 실행시킬 CGI 프로그램이 위치한 디렉터리 소유자와 CGI 프로그램의 소유자를 비교하여 같을 때에만 실행시키며, 다를 때에는 실행시키지 않도록 동작함으로써 CGI에서 발생되는 취약성을 보완한다.
(사) OS 별 주요 유닉스 명령어
다음 [표 4-22]에서 [표 4-27]은 OS 별로 주요 유닉스 명령어를 비교한 것이다.