DongDD's IT

[정보보안기사 실기] 시스템 보안 - UNIX/LINUX 본문

자격증/정보보안기사

[정보보안기사 실기] 시스템 보안 - UNIX/LINUX

DongDD 2018. 4. 24. 15:02

[정보보안기사 실기] 시스템 보안 - UNIX/LINUX



UNIX/Linux 시스템 관리



시스템 시작/종료


1. 부팅

1) Run Level

- 시스템 운영 상태를 표시

- init 프로세스는 /etc/inittab 파일에 정의된 run level에 따라 /etc/rc.d/rc[run.level].d에 나열된 스크립트를 실행해 운영 상태 구성

-> Run Level 0 : PROM mode(Programmable Read-Only Memory)

-> Run Level S,s : 시스템 싱글 유저 모드(로컬 File System 마운트 X)

-> Run Level 1 : 시스템 싱글 유저 모드(로컬 File System 마운트 O)

-> Run Level 2 : 멀티 유저 모드(NFS 클라이언트 모드)

-> Run Level 3: 멀티 유저 모드(NFS 서버 모드, UNIX default)

-> Run Level 4 : 사용 X

-> Run Level 5 : 시스템 power off 모드

-> Run Level 6 : 시스템 리부팅

- Run Level 확인 : who -r, runlevel 명령어 사용


2) INIT 상태(=Run Level)

- Run Level 변경 : init X 명령어 사용


2. 시스템 시작

- BIOS -> Boot Program -> Kernel -> Init

1) BIOS

- 전원이 켜지면 BIOS는 기본적인 하드웨어 이상 유무 점검

- 시스템의 하드웨어 정보 수집

2) Boot Program

- 하드디스크에서 커널을 읽어 메모리에 적재, 시스템 제어권을 커널에 넘김

3) Kernel

- 커널이 메모리에 적재되고 운영체제가 구동됨

- 일부 하드웨어 점검, 내부 자료구조 초기화, 부가적 커널 모듈 메모리에 적재

4) init

- 커널에 의해 생성되는 첫번째 프로세스

- 커널 실행으로 운영체제가 하드웨어의 모든 기능을 제어하게 되면 PID가 1인 init 프로세스가 생성됨

- 모든 프로세스의 부모 프로세스


3. 시스템 종료

- shutdown 명령어 사용

1) 종료 시 주의 사항

- 접속된 사용자에게 종료를 공지해 작업을 마무리하도록 함

- 운영중인 서비스를 안전하게 종료

- 하드디스크를 갱신해 파일 시스템 무결성 유지

2) 하드디스크 동기화

- UNIX 계열에서는 디스크 입출력에 대한 효율을 높이기 위해 버퍼를 사용, 비정상적인 종료 시 버퍼의 내용이 디스크에 반영되지 않아 무결성 문제가 생길 수 있음

- sync 명령어를 이용해 버퍼의 내용을 하드디스크로 옮길 수 있음



사용자 관리


1. 계정 추가

- useradd 명령어 사용(root만 사용가능)

- /etc/passwd에 사용자 정보가 추가됨

- passwd 명령어를 이용해 password 설정

- /etc/group에 그룹 정보 추가

- 홈 디렉토리, 쉘 설정


2. 계정 삭제

- userdel 명령어 사용(root만 사용가능)

- option : -r

-> 계정 + 홈 디렉토리 삭제


3. 그룹 추가

- groupadd 명령어 사용

- option : -g,gid

-> 명시한 gid로 그룹 생성


4. 그룹 삭제

- groupdel 명령어 사용



파일 시스템 관리


1. mount

- 보조기억장치에 설치된 파일시스템을 UNIX 시스템이 인식하도록 특정 디렉토리에 논리적으로 연결하는 것

- mount src dest(src를 dest에 연결)

- option : -a

-> /etc/fstab 파일을 기반으로 mount

- /etc/mtab에 마운트 정보 기록


2. umount

- mount된 File system의 연결을 해제함

- 사용중이거나 사용자가 파일 시스템내에 있는 디렉토리에 있는 경우 메시지 출력과 함께 실패

- /etc/mtab에 있는 마운트 정보 삭제

- umount X(X에 연결된 파일 시스템 연결 해제)

- option : -a, -f

-> -a : 모든 파일 시스템을 umount함

-> -f : 해당 파일시스템을 사용하는 프로세스를 강제 종료하고 파일 시스템을 umount


3. du

- 하드 디스크 사용량을 확인하기 위해 사용하는 명령어

- option : -a, -s, -k

-> -a : 하위 파일에 대한 정보도 보여줌

-> -s : 현재 디렉토리가 차지하는 총 용량만 출력

-> -k : kilobyte 단위로 출력


4. df

- 파일 시스템의 전체 공간, 사용 가능 공간을 확인하기 위해 사용하는 명령어

- df [file | filesystem]

- option : -k, -i

-> -k : 통계 데이터를 1024 bytes 블록 단위로 출력

-> -i : 사용 가능한, 사용중인 i-node 정보를 출력



프로세스 스케쥴 관리


1. 정기적 스케쥴 관리(cron)

- cron 데몬 프로세스는 정기적인 작업을 지정시간에 처리하기 위해 사용

1) 필요한 구성요소

- crontab 파일 : 작업 목록

- crontab 명령 : crontab 파일 제어

- crontab 데몬 프로세스 : crontab 파일을 읽어 처리

2) crontab 파일 형식

- 6개의 필드로 구성(space, tab으로 구분)

- 분 시 일 월 요일 작업

- 요일 : 0(일요일) ~ 6(월요일)

ex1) 0 8-10 * * 1 a.out : 월요일 8,9,10시에 a.out 실행

ex2) */10 * * * * a.out : 매 10분마다 a.out 실행

3) crontab 파일 제어

- 사용자 계정별로 만들어짐

- root는 다른 사용자의 crontab 파일 수정 가능, 일반 사용자는 자기 것만 수정 가능

- crontab -u username [option]

- option

-> -e : 편집(없으면 생성)

-> -l : 출력

-> -r : 제거

4) crontab 파일 접근 제어

- /etc/crontab.allow와 /etc/cron.deny 파일을 통해 접근 제어

- /etc/crontab.allow만 있는 경우 : 이 목록에 있는 사용자만 사용 가능

- /etc/crontab.deny만 있는 경우 : 이 목록에 없는 사용자들은 사용 가능

- 둘다 있는 경우 : allow가 우선

- 둘다 없는 경우 : root만 사용 가능(일부 시스템은 모든 사용자 사용 가능)


2. 일시적 스케쥴 관리(at)

- 정해진 시간에 한번만 실행

- 한번 처리된 작업은 목록에서 삭제

- at

- option

-> -t time : 작업시간 설정(이 명령 실행 후 실행할 파일 설정)

-> -l : 현재 대기중인 작업 목록 출력

-> -r job : 해당 작업 삭제(UNIX)

-> -d job : 해당 작업 삭제(Linux)



UNIX/Linux 서버 보안



시스템 보안


1. 사용자 패스워드 관리

1) /etc/passwd 파일

- 불필요한 계정의 shell은 /sbin/nologin, /bin/false로 설정해 접속할 수 없도록 해야 함

2) /etc/shadow 파일

- passwd 파일에 평문 저장 시 유출이 생길 수 있음

- root만이 read 가능

- 암호화된 패스워드 정보와 패스워드 에이징 정보(시간의 흐름에 따른 관리 정책)가 있음

account:password:last_change:minlife:maxlife:warn:inactive:expires

- password : $id$solt$enc_password

-> $id : 1(MD5), 2(BlowFish), 5(SHA-256), 6(SHA-512)

-> * : 패스워드 잠김(별도의 인증 방식으로는 로그인 가능)

-> !! : 패스워드 잠김(모든 로그인 불가)

-> 빈 값 : 패스워드 설정 X(패스워드 없이 로그인)

- last_change : 1970년 1월 1일을 기준으로 변경한 날(일 수)

- minlife : 변경한 날 이후로 패스워드를 변경할 수 없는 일수

- maxlife : 변경한 날 이후로 패스워드 만료 일수

- warn : 만료 이전 경고 일수

- inactive : 만료된 이후 계정이 비활성화 되기 전까지의 일수

- expires : 계정 만료일 설정(1970년 1월 1일 기준)


- passwd -l account : 패스워드 잠금

- passwd -u account : 패스워드 잠금 해제


2. 프로세스 실행 권한(SUID, SGID)

- 프로세스 실행하는 동안 부여되는 UID, GID

- RUID : 프로세스를 실행한 사용자의 UID

- RGID : 프로세스를 실행한 사용자의 GID

- EUID : 프로세스를 실행하는 동안 부여되는 UID

- EGID : 프로세스를 실행하는 동안 부여되는 GID

- 주기적으로 root 소유주 파일의 suid, sgid가 설정된 파일을 찾아 취약점이 있는지 확인

ex) passwd 명령 : 실제적으로 shadow 파일에 접근할 수는 없지만 passwd 실행 시 set uid가 설정되어 패스워드 변경이 가능함


3. 디렉토리 접근권한(sticky-bit)

- 리눅스에서의 일반 공유 디렉토리인 /tmp는 모든 사용자가 이용할 수 있게 sticky-bit를 설정함

- rwx로 설정할 경우 다른 사람의 파일을 삭제, 변경할 수 있지만 sticky-bit를 설정해 파일 삭제, 변경은 소유자만 가능하도록 함


네트워크 보안


1. 보안 쉘(SSH)

- 암호 통신을 이용해 네트워크상의 다른 컴퓨터에 접속해 원격으로 명령 실행, 파일을 조작할 수 있게 해주는 프로토콜

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

- TCP 22번 port


2. 슈퍼서버(inetd 데몬)

- 클라이언트 요청을 슈퍼 데몬이 모두 받아 처리하고 개별 서비스를 호출해주는 데몬 프로세스

- Stand-Alone 방식 : 서비스 별로 데몬 프로세스가 동작되는 방식(속도가 빠르지만, 리소스 소모가 큼)

- inetd(xinetd) 방식 : 슈퍼 데몬을 이용해 개별 서비스를 실행시키는 방식(속도는 느리지만, 리소스 소모가 작음)

- inetd 데몬 최초 실행 시, /etc/inetd.conf 파일을 참조해 서비스 프로그램들에 대한 정보를 얻음

- Tcp wrapper와 연동해 서비스 별 호스트 접근 제어 기능을 사용할 수 있음


1) inetd.conf 파일

서비스 소켓 프로토콜 플래그 계정 실행경로 실행인자

- 서비스 : /etc/services 에 등록된 포트 번호를 참조해 서비스 별로 포트 부여

- 소켓 : TCP(stream), UDP(datagram)

- 프로토콜 : /etc/protocols에 설정된 프로토콜 중 선택(/etc/services의 프로토콜과 일치해야 함)

- 플래그 : nowait(요청 이후 즉시 처리), wait(요청 완료를 기다린 후 처리)

2) 불필요한 서비스 비활성화

- DoS에 취약한 Simple TCP 서비스

-> echo(TCP 7)

-> discard(TCP 9)

-> daytime(TCP 13)

-> chargen(TCP 19)

- R계열 서비스 : 인증 없이 관리의 원격 접속

-> rlogin, rsh, rexec

- 불필요한 rpc 서비스

-> rpc, cmsd, rusersd

- 기타

-> finger, tftp, talk

3) 접근 통제(TCP Wrapper)

- 외부에서 들어오는 클라이언트에 대한 접근 통제 기능

- /etc/hosts.allow와 /etc/hosts.deny파일 이용

- /etc/hosts.allow를 먼저 확인해 접근을 허용하고 이 목록에 없다면 /etc/hosts.deny를 확인해 이 목록에 있을 경우 접근 차단, 둘다 정보가 없는 경우에는 default로 허용

- inetd.conf의 실행경로에 TCP Wrapper인 /usr/sbin/tcpd를 명시하면 외부 서비스 요청 시 tcpd를 호출해 hosts.allow, hosts.deny 확인해 접근 통제

- shell_command : hosts.deny에 등록되어 있어 차단된 호스트에게 통보나 경고 메시지를 보내는 용도로 사용(twist,spawn)

- 서비스 : ip or domain 형식으로 되어 있음

ex1) ALL : 192.168.1.1 -> 192.168.1.1에서 접속하는 모든 서비스 허용

ex2) ALL EXCEPT in.telnetd : ALL -> 모든 사용자가 telnet을 제외한 모든 서비스 사용 가능



PAM(Pluggable Authentication Modules)


- 리눅스에서 일반적으로 사용하는 플러그 방식의 중앙 통제 인증 모듈

- 인증 형태, 접근 권한, 접근 자원 등을 선택할 수 있게 하는 라이브러리


1. PAM 인증 절차

- 각 프로그램이 인증이 필요한 부분에서 PAM 라이브러리를 호출하도록 함

- 해당 프로그램의 PAM 설정파일을 참조해 등록된 여러 PAM 모듈을 수행하고 그 결과를 반환

- 인증 여부 결정

- /etc/pam.d : PAM 라이브러리를 이용하는 프로그램들의 설정파일들이 들어있는 디렉토리

- /lib/security : PAM 라이브러리가 제공하는 인증 모듈들이 들어있는 디렉토리

- /etc/security : PAM 모듈 싱해에 필요한 추가 설정 파일들이 들어있는 디렉토리


2. PAM 설정 파일

- 형식 : type control module_path argument

1) type

- account : 사용자의 시스템 권한 확인 모듈

- auth : 인증 기능

- password : 패스워드 설정, 확인 모듈

- session : 인증 성공 시, 세션을 만들어주는 모듈

2) control

- requiste : 인증 실패 시, 인증 거부

- required : 인증을 실패해도 다음 모듈 실행, 최종 결과는 인증 실패

- sufficient : 이전 모듈이 실패해도 현재 모듈 성공 시 인증 성공

- optional : 모듈 성공, 실패 응답 상관 X

3) module_path

- 모듈 파일의 실제 경로

4) argument

- 모듈에 전달되는 인자


3. PAM(시스템 취약점 분석 항목)

1) root 계정 원격 접속 제한

- /etc/security : pam_securetty.so 모듈이 사용하는 파일(root 접근 제한 설정 파일)

- /etc/pam.d의 remote(login)파일에 pam_securetty.so 모듈 추가 후 /etc/securetty파일에 pts/~ 터미널을 모두 제거(auth required /lib/securetty.so)

- SunOS는 /etc/default/login 파일의 CONSOLE 라인 주석처리

2) 계정 잠금 임계값 설정

- Brute Force, Dictionary Attack을 막기 위해 계정 잠금 임계값을 설정

- pam_tally2.so or pam_tally.so 모듈 사용

- /etc/pam.d/system-auth 파일에 auth required pamtally2.so deny=5 unlock_time=120과 같은 항목을 추가

-> deny : 실패 횟수(5회 실패 시 제한), unlock_time : 잠그는 시간(120초 동안 로그인 불가)

- pam_tally2 -u username 명령어로 실패 횟수 확인 가능

- option

-> -r : 실패 횟수 초기화

- SunOS에서는 /etc/default/login의 RETIRES 값 설정



시스템 로그


- UNIX : /var/adm, Linux : /var/log에 저장됨

- /etc/syslog.conf 파일에서 로그 파일 위치 지정


1. 주요 로그 파일

1) utmp(x)

- 현재 로그인한 사용자 정보를 담고 있는 로그 파일

- binary로 되어있어 w, who, finger 명령어로 확인


2) wtmp(x)

- 성공한 로그인/로그아웃 정보, boot/shutdown 정보를 담고 있는 로그 파일

- binary로 되어있어 last 명령어로 확인


3) lastlog

- 가장 최근에 성공한 로그인 기록을 담고 있는 로그 파일

- binary로 되어있어 lastlog, finger 명령어로 확인 가능


4) btmp(x) - Linux, loginlog - UNIX

- 실패한 로그인 정보를 담고 있는 로그 파일

- btmp는 binary로 되어있어 lastb 명령어로 확인 가능


5) sulog

- su 명령을 사용한 결과를 담고 있는 로그 파일

- UNIX : /var/adm/sulog

- Linux : /var/log/secure


6) acct/pacct

- 시스템에 로그인한 모든 사용자가 로그아웃할 때까지 입력한 명령어와 터미널 종류 등을 담고 있는 로그 파일

- 기본 로그 파일이 아니기 때문에 accton /var/account/pacct 명령을 이용해 로그 파일을 생성하도록 해야함

- binary로 되어있어 lastcomm 명령어로 확인 가능


7) history

- 각 계정별로 실행한 명령어를 담고 있는 로그 파일

- .shell_history의 이름을 가지고 계정 별 홈 디렉토리에 저장

- text로 되어있어 직접 확인 가능하지만, history 명령어를 사용해도 확인 가능


8) secure - Linux

- 사용자/그룹 생성/삭제, 사용자 인증에 대한 정보를 담고 있는 로그 파일(su 명령어 사용에 대한 정보가 들어가기 때문에 서버 보안에 매우 중요함)

- /var/log/secure


9) messages - Linux

- 기본적인 시스템 로그 파일로 시스템 운영에 대한 메시지를 담고 있음

- 데몬 프로세스들의 내역, 접속 정보, TCP wrapper 정보 등을 담고 있음

- /var/log/messages


10) dmesg - Linux

- 리눅스 부팅 시 출력되는 메시지들을 담고 있는 로그 파일

- /var/log/dmesg(text)로 저장되어 그냥 볼 수 있지만, dmesg 명령어로도 확인 가능


11) boot.log - Linux

- 부팅 시, 파일 시스템 검사, 데몬들의 실행 상태 등을 담고 있는 로그 파일

- /var/log/boot.log


12) xferlog - Linux

- FTP 로그 파일로 proftpd, vsftpd 데몬들의 서비스 내역을 담고 있는 로그 파일

- /var/log/xferlog

- 형식 : 전송날짜/시간 소요시간 원격주소 파일크기 파일명 종류 액션플래그 전송방향 사용자접근형식 로그인 사용자 서비스 인증방법 인증ID 전송상태

- 종류 : a(ascii), b(binary)

- 액션 플래그 : _(no action), C(압축 파일), U(비압축 파일), T(tar 파일)

- 전송 방향 : i(->서버), o(->로컬), d(서버에서 삭제)

- 접근 방식 : r(인증된 사용자), a(익명 사용자)

- 전송 상태 : c(완료), i(실패)


13) cron - Linux

- cron 작업에 대한 정보를 기록한 로그 파일

- /etc에 cron.hourly, cron.daily 등 시간별, 일별, 주별, 월별 작업 스크립트들이 저장되어 있음

- /var/log/cron


14) maillog - Linux

- sendmail, qmail 등 메일 송수신 내역들과 ipop, imap과 같은 수신 내역들에 대한 정보를 담고 있는 로그 파일

- /var/log/maillog


15) mail - Linux

- 사용자들에 대한 메일을 갖고 있는 디렉토리(한번 메일을 사용한 사용자 id와 동일한 파일이 존재)

- /var/spool/mail


2. syslog 

- 커널 및 응용 프로그램에 의해 발생하는 로그를 체계적으로 생성, 관리하는 표준 인터페이스

- syslog API를 통해 로그를 생성하면 syslogd가 syslog.conf 설정 파일을 참조해 지정한 로그 파일에 생성

- syslog 대신 최근에는 rsyslog사용

- 처음에는 정보보호 특성을 고려하지 않고 개발(UDP)

-> TCP 사용 권고

-> 기밀성 보장을 위한 BEEP(연결 지향, 비동기성 연결을 위한 응용 프로토콜 프레임워크) 이용 권고

- 형식 : facility.prority ~~  action(logfile_path)

1) facility : 서비스 종류(로그 생성 서비스)

- * : 모든 서비스

- auth/authpriv : 인증 관련 메시지

- cron : cron과 atd에 의해 생성되는 메시지

- daemon : telnet 등 데몬에 의한 메시지

- kern : kernel에 의한 메시지

- lpr : 프린터 데몬 lpr에 의한 메시지

- mail : sendmail, pop 등 메일 시스템에 의한 메시지

- news : USENET 등과 같은 뉴스시스템에 의해 발생되는 메시지

2) priority : 로그 Level

- 높음 Emergency(emerg) > alert(alert) > Critical(crit) > Error(err) > Warning(warning) > Notice(notice) > Information(info) > debug(debug) 낮음

- * : 모든 수준의 로그를 저장, none : 로그를 저장하지 않음

3) action : 로그 저장, 출력 위치 지정

- 로그 파일 : 경로

- 콘솔 : /dev/console

- 원격 : @hostname

- 지정 사용자 화면 : user

- 로그인한 모든 사용자 : *


3. 로그 관리

1) 로그 모니터링

- text로 된 로그 파일에 tail -f 명령어와 옵션을 사용해 추가되는 내용들을 실시간으로 볼 수 있음

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

- 로그 파일을 그대로 두면 사이즈가 방대해져 디스크가 모자라게 됨 -> rotate로 해결

- logrotate : 시스템 로그 파일 관리 도구(rotate, compress 기능)

- /etc/logrotate.d 디렉토리에 데몬/프로세스 별 설정 파일이 있음

-> missingok  로그 파일이 없어도 오류 발생 X

-> notifempty : 로그 파일이 비어있으면 rotate X

-> sharedscripts : 로그 파일이 여러개여도 스크립트를 공유해 한번만 실행

-> postrotate/endscript : rotate 후 스크립트 파일 실행

- /etc/logrotate.conf : logrotate 설정 파일

-> daily, weekly, monthly : 일, 주, 월 단위로 rotate

-> rotate N : N개를 rotate 함

-> create : rotate 시 새롭게 생성되는 로그 파일의 권한, 소유주 등 설정

-> dateext : 로그 파일의 확장자를 날짜로 함

-> compress/uncompress : 압축/비압축

-> size N : N size가 되면 rotate

-> include : 개별 데몬 설정 파일을 include



시스템 해킹


1. Buffer Overflow

ref) http://dongdd.tistory.com/37


- 대응 방안 : 문자열 길이 검사,  strncpy 등 원하는 길이만 복사, 입력받게 함



2. Format String Attack

ref) http://dongdd.tistory.com/88



3. Race Condition Attack


- 실행되는 프로세스가 임시파일을 만드는 경우 악의적 프로그램을 통해 그 프로세스의 실행 중에 끼어들어 생성되는 임시파일에 symbolic link를 이용해 권한 상승을 노리는 공격

- 중요한 파일에 프로그램이 생성하는 임시 파일의 이름으로 symbol link를 생성하고 이 파일에 쓰기를 하여 중요한 파일을 변조


1) 대응 방안

- 가능하면 임시파일 생성 X

- 동일한 파일이 있는 경우 생성, 쓰기 금지

- 사용하려는 파일에 link가 걸려있으면 실행 중단

- umask 이용


Comments