1. 유닉스 개요
- 특징
① 대화식 OS: Shell을 통해 상호작용
② 멀티태스킹: 여러개 명령어 동시 처리
③ 멀티 유저: 동시에 여러 사용자가 하나의 컴퓨터 사용 가능
④ 호환성 및 이식성
⑤ 계층적 파일 시스템
⑥ 통신기능: 프로세스간 통신은 파이프 기능 제공
⑦ 개발환경 및 유틸리티 제공
* 커널은 대부은 C코드와 어셈블리로 작성됨.
* System call이 사용자 프로그램이 커널에 접근하는 인터페이스 제공
- 유닉스 OS 종류: SunOS, Solaris, HP-UX, AIX, Linux
- 유닉스 커널: 커널이 하나의 거대한 프로그램으로 이루어진 모놀리식(Monolithic) 커널과 개별 모듈로 이루어진 마이크로 커널이 있음.
모놀리식의 경우 커널이 모든 기능을 수행하기에 안정적 이지만 문제 발생시 부분 수정이 어려우며, 보통 일반 시스템보다 슈퍼컴퓨터에 적용됨.
마이크로의 경우 여러개의 모듈이 모여 하나의 커널을 이루는 개념으로 각 모듈의 권한이 동일하여 잘못된 모듈을 붙일 경우 커널 전체에 영향을 미칠수 있음.
- 유닉스의 파일 시스템은 트리 구조
/ : root
/var : 시스템 로그 저장되는 디렉터리.
/usr/lib : 기본 프로그램의 모듈들 저장된 곳.
/usr/sbin : 시스템 관리 명령어 저장되는 곳.
/usr/bin : 기본적으로 실행가능한 파일 저장 됨. 예: echo, mv, copy 등
/etc : 시스템 환경 설정 및 주요 설정 파일 저장 됨. 예: passwd, hosts 등
/dev : 물리적 장치 관리.
/usr/include : C언어 라이브러리 헤더 파일 저장됨.
- 파일시스템 구조
① 각 파티션 마다 부트블록, 슈퍼블록, i-node 리스트, 데이터 블록 영역으로 나뉨.
② 디스크 블록 할당 기법: 인덱스 필드로 13개을 사용. 10개는 직접블록 인덱스, 3개는 간접블록 인덱스를 사용함.
직접블록 인덱스는 실제 파일의 내용을 저장하고 있는 디스크 블록의 주소를 저장. 간접블록 인덱스는 단일간접, 이중간접, 삼중간접 블록 인덱스로 구분됨.
③ 부트블록: 부팅시 필요한 코드가 있는 블록
④ 슈퍼블록: 전체 파일 시스템에 대한 정보를 가지고 있는 블록, 데이터 블록 개수, 실린더그룹 개수, HW 설명, 마운트위치 정보,
i-node 정보, 파일 소유자, MAC time(파일 마지막 수정시간, 파일 마지막 접근시간, 파일 속성 마지막 변경 시간) 등
* MAC time으로 침해 사고 발생 시 무결성을 확인함.
⑤ i-node: 각 파일 정보 기억하는 장소, 120바이트 고정된 크기의 구조체, 일반 파일이나 디렉터리 파일의 i-node는 디스크 블록 위치를 포함,
특수파일(프린터, 디스크 같은 프로세스간 통신 기법) i-node는 주변장치 식별 정보 포함.
i-node는 파일에 대한 정보(예: 소유권, 허가권, 그룹, 수정된 시간)와 이 파일에 할당된 디스크 블록의 주소를 저장하는 필드로 구성됨.
- 유닉스 프로세스
① pid 0은 Swapper, 1은 init, 2는 pagedeamon. (Swapper와 pagedeamon은 커널모드에서 영구적으로 실행되며 커널 프로세스라고 함.)
② 그외 나머지 프로세스는 init을 fork하여 생성됨.
③ 부모프로세스가 먼저 죽으면 자식은 고아가 되지만 UNIX 규칙에 따라 init이 부모가 됨.
- 시스템 관리
① Run Level: 시스템 운영 상태. init X (X에 모드 번호 씀) 로 상태를 변경함.
0: PROM 모드
s,S: 싱글 유저 모드, 로컬 파일시스템이 마운트 안된 상태
1: 싱글 유저 모드, 로컬 파일시스템이 마운트 된 상태
2: 멀티 유저 모드, NFS 클라이언트 모드
3: 멀티 유저모드, NFS 서버 모드, UNIX 기본 Run Level
4: 사용 안함
5: 시스템 power off
6: 리부팅
② 부팅과정 : bios(POST 단계) → 부트(커널을 메모리에 적제하고 시스템 제어권을 커널에 넘김) →
커널(HW 점검 및 내부 자료구조 초기화, 시스템 운영을 위한 커널 모듈을 메모리에 적재) → init(첫 프로세스)
2. 명령어 몇개
- useradd: 사용자 추가
예: useradd abcd , 계정명이 abcd인 사용자 추가
- userdel abcd, abcd 사용자 삭제
- mount: 파일 시스템을 UNIX가 인식하도록 논리적으로 연결 시킴.
예: mount /dev/cdrom /mnt/cdrom , /dev/cdrom 파일을 /mnt/cdrom 디렉터리에 마운트
- du: 디스크 용량
- df: 파일 시스템 용량 정보
3. 정기적 프로세스 스케줄 관리 - cron
- cron 데몬 프로세스는 UNIX에서 정기적인 작업을 지정시간에 처리하기 위해 사용.
- 일괄적으로 처리해야하는 작업같은 경우 cron으로 처리
- 구성요소: crontab(처리할 작업 목록을 정의한 파일), crontab 명령어(crontab 파일 편집하는 명령어), cron 데몬 프로세스
- cron 파일은 사용자 계정별로 만들어짐.
- crontab 파일에는 분, 시, 일, 월, 요일, 실행할 작업의 경로 및 옵션 순으로 처리할 작업을 기술함.
4. 일시적 스케줄 관리 - at
- cron과는 달리 정해진 시간에 한번만 실행하게 하는 것이 at
- 작업목록에 처리할 작업이 등록되면 실행후 목록에서 삭제됨.
5. UNIX 서버 보안
- 패스워드 관리(리눅스도 동일함)
① /etc/passwd 파일 예: root:x:0:0:root:/root:/bin/bash
사용자계정명 : 암호화된 패스워드 : 사용자 ID(uid) : 그룹ID(gid) : 사용자이름 : 로그인 성공 후 사용자가 위치할 홈 디렉터리 : 명령어를 처리하는 셸 종류
* ‘x’의 의미는 shadow 비밀번호를 사용한다는 의미.
② 주의 1: root 계정의 원격 접속은 보안상 위험하므로 보통 root 계정으로 su(switch user)를 허용하는 계정 그룹을 생성한 후
해당 계정으로 접속하여 root 계정으로 전환하는 방법으로 root 권한을 얻어야 함.
③ 주의 2: root의 경우 UID는 0이다. 계정이 달라도 UID가 0이면 root와 같은 권한을 가지므로 임의의 계정에 UID가 0이 되어 있다면 root권한 탈취를 의심해야 함.
④ 주의 3: GID도 root 그룹의 경우 0이다. 다른 그룹에 0이 부여 되어있는지 점검해야 함.
⑤ 주의 4: 불필요한 계정은 삭제하거나 시스템 및 어플리케이션 계정(사용안하지만 어플이 만든 것)은 함부로 접속할 수 없도록
/bin/bash 대신 /bin/false 또는 /sbin/nologin 으로 설정한다.
- Shadow 파일
① /etc/shadow 파일에 암호화된 패스워드가 저장되고 관리자(root)만 읽을 수 있음.
이 파일에는 각 계정의 암호화된 패스워드와 패스워드 aging이 있는데 이것은 시간에 따른 패스워드 관리정책을 의미함.
② 필드 구성: 계정명 : 암호화된 비번 : 마지막 비번 변경일 : 패스워드 최소 사용기간(비번
설정 후 최소 사용기간) : 패스워드 최대 사용기간(만료일) : 만료 이전 경고일수 : 만료 후 계정 비활성화 기간 : 계정 만료일
* 설정 할게 없으면 그냥 빈칸으로 둔다. ::: 같이.
- umask(파일 접근권한)
① 생성된 파일 또는 디렉터리 마다 chmod 명령어로 퍼미션을 바꾸는 작업이 번거롭기 때문에 쉘환경변수를 적절히 변경하여
파일이나 디렉터리를 생성할때마다 자동으로 퍼미션이 조정되게 하기 위한 명령어.
* 설정 할게 없으면 그냥 빈칸으로 둔다. ::: 같이.
- umask(파일 접근권한)
① 생성된 파일 또는 디렉터리 마다 chmod 명령어로 퍼미션을 바꾸는 작업이 번거롭기 때문에 쉘환경변수를 적절히 변경하여
파일이나 디렉터리를 생성할때마다 자동으로 퍼미션이 조정되게 하기 위한 명령어.
② 시스템 관리자가 설정. 개별 계정은 /home의 각 계정별 .profile에서 함.
bash셸 사용시 .bashrc, C셸은 .cshrc 파일에 설정
③ 현재 프로세스가 생성할 파일과 디렉토리의 퍼미션을 정함.
퍼미션과 마찬가지로 8진수를 사용하며, 파일의 경우 666, 디렉토리의 경우 777에서 umask를 뺀 값이 생성되는 파일과 디렉토리의 퍼미션이 됨.
예를 들어 파일을 생성할 때 기본으로 적용되는 퍼미션을 664(rw-rw-r--)으로 하고 싶다면 umask 명령어의 인자로 002를 사용하면 됨.
④ umask 값 변경의 예: umask 077 입력
⑤ umask를 통해 최초생성시 파일이나 디렉터리의 권한을 최소로 만들고 필요시에 확장하는 방식으로 운영해야 함.
- SetUID, SetGID의 권한상승
① 보통 시스템의 사용자가 명령어를 실행시켰을 때 찾아서 실행시키는 과정은
현재 작업디렉토리에서 찾음. → $PATH에서 찾음 → 찾은후에 실행권한 체크 → 권한이 있다면 실행시킨 사용자의 UID로 실행 →
권한이없다면 이 파일이 Setuid bit가 있는가를 확인 → Setuid bit가 있다면 명령어 소유주의 UID(Effective UID)로 실행
* 계정이 누구인가를 식별하는 UID, GID를 각각 RUID(Real UID), RGID(Real GID)라고 함. 이외에 어떤 권한을 가지고 있는지를 나타내는 ID가 존재함.
EUID(Effective UID), EGID(Effective GID)가 그것이다.
② 즉, 사용자(또는 그룹)의 권한이 있어야 실행할 수 있는 경우, 그 권한을 다른 사용자(또는 그룹)에게 부여 할 때 사용하는 것이 SetUID, SetGID 명령어 임.
예를 들면 각 사용자의 패스워드를 변경할 수 있는 권한은 관리자계정(root)밖에 없지만 일반 사용자도 가능하도록 설정될 수 있음.
이것은 사용자가 패스워드를 변경할 때만 root계정의 권한을 가지게 되는 것임.
/usr/bin/passwd 파일에 root의 setuid 설정이 되어 있으면 일반 사용자도 root처럼 passwd 명령어를 쓸 수 있게 됨.
* SetXXX가 설정되면 다른 사용자라도 해당 파일의 소유자의 권한으로 실행한다는 것.
③ SetUID 설정: 보통 파일 퍼미션을 chmod 777 같이 지정하는데 SetUID 설정은 세자리의 숫자 앞에 SetUID 퍼미션을 하나더 사용하면 됨.
예: chmod 4777 temp 하게되면 temp 파일에 SetUID가 설정됨.
SetUID가 설정된 파일의 실행권한은 s로 되어 있음.
④ 퍼미션의 3자리숫자앞에 2또는 1을 함께입력하면 SetGID와 Sticky-bit을 설정할 수 있음. 4000 : SetUID설정, 2000 : SetGID설정, 1000 : Sticky-bit설정
Sticky-bit설정은 대부분 /tmp 디렉토리에 설정되어 있는데, 가장 흔한 용도는 공용디렉토리로 사용하기 위한 것.
퍼미션과 마찬가지로 8진수를 사용하며, 파일의 경우 666, 디렉토리의 경우 777에서 umask를 뺀 값이 생성되는 파일과 디렉토리의 퍼미션이 됨.
예를 들어 파일을 생성할 때 기본으로 적용되는 퍼미션을 664(rw-rw-r--)으로 하고 싶다면 umask 명령어의 인자로 002를 사용하면 됨.
④ umask 값 변경의 예: umask 077 입력
⑤ umask를 통해 최초생성시 파일이나 디렉터리의 권한을 최소로 만들고 필요시에 확장하는 방식으로 운영해야 함.
- SetUID, SetGID의 권한상승
① 보통 시스템의 사용자가 명령어를 실행시켰을 때 찾아서 실행시키는 과정은
현재 작업디렉토리에서 찾음. → $PATH에서 찾음 → 찾은후에 실행권한 체크 → 권한이 있다면 실행시킨 사용자의 UID로 실행 →
권한이없다면 이 파일이 Setuid bit가 있는가를 확인 → Setuid bit가 있다면 명령어 소유주의 UID(Effective UID)로 실행
* 계정이 누구인가를 식별하는 UID, GID를 각각 RUID(Real UID), RGID(Real GID)라고 함. 이외에 어떤 권한을 가지고 있는지를 나타내는 ID가 존재함.
EUID(Effective UID), EGID(Effective GID)가 그것이다.
② 즉, 사용자(또는 그룹)의 권한이 있어야 실행할 수 있는 경우, 그 권한을 다른 사용자(또는 그룹)에게 부여 할 때 사용하는 것이 SetUID, SetGID 명령어 임.
예를 들면 각 사용자의 패스워드를 변경할 수 있는 권한은 관리자계정(root)밖에 없지만 일반 사용자도 가능하도록 설정될 수 있음.
이것은 사용자가 패스워드를 변경할 때만 root계정의 권한을 가지게 되는 것임.
/usr/bin/passwd 파일에 root의 setuid 설정이 되어 있으면 일반 사용자도 root처럼 passwd 명령어를 쓸 수 있게 됨.
* SetXXX가 설정되면 다른 사용자라도 해당 파일의 소유자의 권한으로 실행한다는 것.
③ SetUID 설정: 보통 파일 퍼미션을 chmod 777 같이 지정하는데 SetUID 설정은 세자리의 숫자 앞에 SetUID 퍼미션을 하나더 사용하면 됨.
예: chmod 4777 temp 하게되면 temp 파일에 SetUID가 설정됨.
SetUID가 설정된 파일의 실행권한은 s로 되어 있음.
④ 퍼미션의 3자리숫자앞에 2또는 1을 함께입력하면 SetGID와 Sticky-bit을 설정할 수 있음. 4000 : SetUID설정, 2000 : SetGID설정, 1000 : Sticky-bit설정
Sticky-bit설정은 대부분 /tmp 디렉토리에 설정되어 있는데, 가장 흔한 용도는 공용디렉토리로 사용하기 위한 것.
즉, Sticky-bit로 설정된 디렉토리는 모든 사용자가 write가능하며 write된 파일은 그 사용자의 소유됨.
⑤ 코드안의 setuid, setgid로 관리자 계정 갖기. SetUID의 위험성 예
#include <stdio.h> 프로그램이 실행될 때 setuid, setgid로 인해
main(){ system("/bin/bash"); 는 root권한으로 실행됨.
setuid(0); // 사용자의 uid를 0(root)으로 설정
setgid(0);
system("/bin/bash");
}
위의 소스를 root 계정으로 컴파일하고, 실행파일에 chmod 4755 로 권한 설정(실행파일에 SetUID를 설정하는 것)한 후
일반 사용자 계정이 위의 코드의 실행파일을 실행하면 root 계정으로 bash 쉘이 실행됨.
일반 계정으로 실행했을 때, 관리자 PW를 묻지 않는 이유는 일반 사용자계정의 RUID는 500이지만 EUID는 0이기 때문임.
⑤ root만 접근가능한 파일을 일반 사용자도 접할 필요가 있다면 효율적으로 운영하겠지만 그렇지 않을 경우 보안허점이 된다.
⑥ Sticky bit를 이용해 디렉터리에 접그누건한을 부여할수 있으므로 sticky bit를 공유모드라고 함.
* 접근을 아무렇게나 허용하는 것은 위험하므로 특수권한에 대해서는 주기적으로 검색을 통해 관리함.
예: find / -perm 4000 -print , 설명: 4000권한을 갖는 파일 검색
find / -perm 2000 -print , 설명: 2000권한을 갖는 파일 검색
find / -perm 1000 -print , 설명: 1000권한을 갖는 파일 검색
* 참고
- http://www.digimoon.net/blog/209
- http://abtitndev.tistory.com/523
- http://idkwim.tistory.com/78
- http://egloos.zum.com/pathfind3r/v/1569991
- inetd 데몬(슈퍼서버)
① UNIX 시스템에는 많은 서버프로그램이 실행됨. inetd 데몬은 N개의 개별 서버를 통합하여 클라이언트의 요청을 받으면 해당 서비스와 관련 모듈을 실행 시켜줌.
② 불필요한 서비스 제한하기 위해서 inetd.conf 파일을 보면 됨.
- 접근통제 (TCP Wrapper)
① TCP wrapper는 외부에서 들어오는 클라이언트에 대한 접근 통제 기능 제공.
② IP 주소를 기반으로 통제하므로 외부 해킹으로부터 시스템 보호 가능
③ TCP Wrapper가 설치되면, inetd 데몬은 TCP Wrapper 데몬인 tcpd 데몬에 연결을 넘겨줌.
즉, Client의 요청 → Inetd 데몬 → tcpd(hosts.allpw, hosts.deny로 통제) → 모듈 연결 후 실행
④ /etc/hosts.allow 파일과 /etc/hosts.deny 파일에 IP를 등록하여 접근 허용 및 차단을 결정.
파일 참조 순서는 allow 파일을 참조하여 IP가 있으면 해당 호스트의 접근을 허용하고, 없으면 deny 참조하여 차단을 결정함.
둘다 없으면 default로 모든 접근을 허용한다.
⑤ hosts.deny: 보통 ALL:ALL 로 설정. 의미: 모든 서비스에 대해 모든 호스트의 접근 차단. 이것은 allow 파일의 것 외에 모든 호스트는 차단하도록 하는 것.
⑥ hosts.allow:
예1: ALL:192.168.1.1 = 모든 서비스를 192.168.1.1이 이용가능
예2: in.ftpd:192.168.1.2 192.168.2.2 = ftp 서비스를 ~1.2와 ~2.2가 이용가능.
예3: ALL:192.168.1.0/255.255.255.0 = 192.168.1.0 ~ 192.168.1.255 사이의 모든 호스트 서비스 이용 가능
예4: ALL:LOCAL = 모든 서비스는 같은 네트워크에 있는 것만 사용 가능
예5: ALL EXCEPT in.telnetd:ALL = in.telnetd를 제외하고 모든 서비스를 모든 호스트가 사용 가능
예6: in.telnetd: .xxxx.com EXCEPT www.xxxx.com = www.xxxx.com을 제외한 xxxx.com 도메인의 모든 호스트에 대해 telnet 서비스 가능
6. 유닉스/리눅스 로그 파일
- utmp(x) 로그파일 (리눅스/유닉스(SunOS))
현재 로그인한 사용자의 상태 정보를 담고 있음.
w, who, finger 명령어로 확인. 명령어 뒤에 계정명 치면 해당 사용자 정보만 나옴.
리눅스: /var/run/utmp, 유닉스: /var/adm/utmpx
- wtmp(x) 로그파일 (리눅스/유닉스(SunOS))
성공한 로그인/로그아웃, boot/shutdown 정보를 기록.
last 명령어 사용(로그인/로그아웃 정보만 출력), 뒤에 계정명 오면 해당 계정 정보만 나옴.
last reboot 또는 last reboot <사용자계정> 해야 boot/shutdown 정보 확인 가능.
리눅스: /var/log/wtmp, 유닉스: /var/adm/wtmpx
- lastlog 로그파일 (리눅스/유닉스(SunOS))
마지막으로 성공한 로그인 기록을 저장함.
lastlog, finger 명령어 사용
리눅스: /var/log/lastlog, 유닉스: /var/adm/lastlog
lastlog -u <계정명> 은 특정 사용자 정보. lastlog -t <일수>는 해당 일수 내에 접속한 기록
finger <계정명>은 특정 사용자 정보.
- btmp 로그파일 (리눅스), loginlog(유닉스(SunOS))
실패한 로그인 시도에 대한 기록 저장
리눅스: /var/log/btmp, lastb 명령어로 로그 봄. lastb <계정명> 도 가능.
유닉스: /var/adm/loginlog, vi를 통해 확인 가능. 5회 이상 실패한 것만 저장. 특정 사용자의 정보만 볼 경우 cat /var/adm/loginlog | grep <계정명> 으로 봄.
- sulog 로그파일 (유닉스(SunOS) 만 볼수 있음)
su 명령을 사용한 결과를 저장, 유닉스에서 /var/adm/sulog를 vi로 보면 됨.
‘+’로 뜨는 것은 su 명령이 성공한 것, ‘-’는 실패한 것.
리눅스는 /var/log/secure 로그파일에 있음.
- acct/pacct 로그파일 (리눅스/유닉스(SunOS))
시스템에 로그인한 모든 사용자가 로그아웃 할 때까지 입력한 명령어와 터미널 종류, 프로세스 시작시간 등을 저장한 로그파일.
리눅스: /var/account/pacct, lastcomm <계정명> , 자동으로 생성되는 로그파일이 아니므로 /var/account/pacct 명령으로 실행해줘야 함.
유닉스: /var/adm/pacct, 자동 생성이 아니므로 /usr/lib/acct/accton /var/adm/pacct 명령으로 실행.
예: 실행한명령어 플래그(없으면 빈칸) 사용자명 터미널 타입 프로세스시작시간
플래그는 S(root에 의한 실행), F(exec 없이 fork에 의해 실행), X(시그널에 의해 종료됨, SIGTERM)
- history 로그파일 (리눅스/유닉스(SunOS))
계정별 홈 디렉토리에 생성되며, 실행한 명령어에 대한 기록 저장.
텍스트 파일로 되어 있어 history 명령어 또는 vi로 본다.
“.쉘종류_history”가 파일 이름이다.
7. Syslog
- 유닉스에서는 syslog 인터페이스를 통해 로그를 생성하고 관리함.
OS에 의해 자동으로 시작되며, /etc/syslog.conf를 읽어서 발생한 로그를 어디에 저장할지 결정함.
즉, syslog.conf에는 어떤 로그를 어디에 남길지 로그 저장 규칙이 정의되어 있음. 최근에는 syslog를 개성한 rsyslog를 사용함.
- /etc/syslog.conf 파일의 각 행들의 형식
facility.priority; facility.priority action(logfile-location)
설명: facility 서비스에 대해 priority 경우에 해당하는 이벤트 발생시 action 로그파일에 로그를 남긴다.
* priority: emergency(높음)-alert-critical0error0warning-notice-information-debug(낮음)
* action: 로그파일경로 지정 또는 원격 로그 서버 IP 주소 지정.
- syslog의 취약점: 기밀성, 무결성, 가용성 등을 고려하지 않고 만들어짐. 따라서 UDP로 로그 전송시 해킹 가능.
권고사항1: TCP를 이용할 것.
권고사항2: payload 보호하기 위해 BEEF(the Blocks Extensible Exchange Protocol)를 사용 할 것.
BEEF는 연결시향적, 비동기적 응용 프로그램 프로토콜로 내부적으로 인증, 재전송, 프라이버시 등을 지원해 신뢰성 보장함.
- syslog.conf(rsyslog.conf) 설정 예.
① #kern.* /dev/console : 커널에 관련된 로그를 /dev/console에 출력하라.
② *.info;mail.none;authprive.non;cron.none /var/log/messages : *.info는 모든 서비스에 대한 info 수준 이상의 로그를 message로그 파일에 기록하되,
mail, authpriv, cron 서비스 로그는 기록하지 말라(none)는 것.
③ authpriv.* /var/log/secure : authpriv에 속하는 서비스(tcp_wrapper, telnet, ftp, finger 등)의 모든 로그(*)를 secure 파일에 기록하라.
④ mail.* /var/log/maillog : 메일서비스(qmail, ipop 등)의 모든 로그를 maillog 파일에 기록하라
⑤ cron*. /var/log/cron : crond 데몬과 atd 데몬 등에서 발생하는 로그를 기록하라.
⑥ *.emerg * : 모든 서비스(*)의 emerg 로그를 모든 사용자(*)에게 보내라
⑦ uucp,news.crit /var/log/spooler : uucp, news 서비스 관련 서버의 crit 수준 이상의 로그를 기록하라.
⑧ local7.* /var/log/boot.log : 시스템 부팅시의 모든 로그를 기록하라
- 로그 순환: 로그가 많이 쌓이면 디스크에 꽉참. 따라서 로그파일을 압축 하거나 다른 곳으로 보내야 한다.
이것을 관리하는 것이 logrotate 이다. 주기적으로 실행되어야 하므로 cron에 의해 일단위로 실행된다.
8. 유닉스/리눅스 서버 취약점 대응
- root 외 uid가 0인 것 금지.
① cat /etc/passwd 로 계정정보 파악.
② usermod 명령어로 uid가 0인 일반 계정 uid 변경. usermod –u 2016 aaa, aaa 계정 uid를 2016으로 변경.
③ hp-ux OS는 chuser id=2016 aaa
- 패스워드 최소길이 설정 및 최소 사용기간 설정
① SunOS: /etc/default/passwd 파일에서 PASSLENGTH=8 MINWEEKS=1 (단위: 주)
② 리눅스: /etc/login.defs 파일에서 PASS_MIN_LEN 8 PASS_MIN_DAYS 1 (단위: 일)
③ AIX: /etc/security/user 파일에서 minlen=8 minage=1 (단위: 주)
④ HP-UX: /etc/default/security 파일에서 MIN_PASSWORD_LENGTH=8 PASSWORD_MINDAYS=1 (단위: 일)
- 패스워드 파일 보호
① /etc/shadow 파일에 암호화된 패스워드가 저장되므로 권한있는 사용자만 읽게한다.
② SunOS, 리눅스: /etc/passwd에 비번필드가 x인지 확인
③ IX: 기본적으로 /etc/security/passwd에 암호화하여 저장
④ HP-UX: /tcb 디렉터리 존재 확인, /etc/passwd에서 x 확인, 이 OS는 신뢰모드에서 패스워드를 암호화하여 /tcb/files/auth 에 계정에 따라 파일로 저장함.
- Session Timeout 설정
① 리눅스, AIX, HP-UX
sh, ksh, bash shell 사용시: /etc/profile(.profile)에서 TMOUT=600(초) export TMOUT
csh shell 사용시: /etc/csh.login에서 set autologout=10 설정
② SunOS: /etc/default/login TMOUT=600(초) export TMOUT 설정
- 주요 파일 소유자 및 권한 설정
① /etc/passwd: 사용자 정보, root 소유, 644이하 권한으로 설정.
② /etc/shadow: 사용자의 암호화된 pw정보. root외에는 접근 금지, 400이하 권한 설정.
③ /etc/hosts: IP와 호스트 이름 매핑. 노출시 악의적 시스템 접근가능하게 함. root소유로 600이하. 금융위는 644로 권장.
④ /etc/(x)inetd.conf: inetd 데몬에 대한 설정 파일. root 소유 600이하 권한.
⑤ /etc/syslog.conf: syslogd 데몬에 대한 설정 파일. 로그 기록하는데 사용됨. root 소유. 644권한.
⑥ /etc/services: 서비스 관리(서비스별 포트, 프로토콜 정보) root 소유. 644권한.
⑤ 코드안의 setuid, setgid로 관리자 계정 갖기. SetUID의 위험성 예
#include <stdio.h> 프로그램이 실행될 때 setuid, setgid로 인해
main(){ system("/bin/bash"); 는 root권한으로 실행됨.
setuid(0); // 사용자의 uid를 0(root)으로 설정
setgid(0);
system("/bin/bash");
}
위의 소스를 root 계정으로 컴파일하고, 실행파일에 chmod 4755 로 권한 설정(실행파일에 SetUID를 설정하는 것)한 후
일반 사용자 계정이 위의 코드의 실행파일을 실행하면 root 계정으로 bash 쉘이 실행됨.
일반 계정으로 실행했을 때, 관리자 PW를 묻지 않는 이유는 일반 사용자계정의 RUID는 500이지만 EUID는 0이기 때문임.
⑤ root만 접근가능한 파일을 일반 사용자도 접할 필요가 있다면 효율적으로 운영하겠지만 그렇지 않을 경우 보안허점이 된다.
⑥ Sticky bit를 이용해 디렉터리에 접그누건한을 부여할수 있으므로 sticky bit를 공유모드라고 함.
* 접근을 아무렇게나 허용하는 것은 위험하므로 특수권한에 대해서는 주기적으로 검색을 통해 관리함.
예: find / -perm 4000 -print , 설명: 4000권한을 갖는 파일 검색
find / -perm 2000 -print , 설명: 2000권한을 갖는 파일 검색
find / -perm 1000 -print , 설명: 1000권한을 갖는 파일 검색
출처: 참고 링크 |
- http://www.digimoon.net/blog/209
- http://abtitndev.tistory.com/523
- http://idkwim.tistory.com/78
- http://egloos.zum.com/pathfind3r/v/1569991
- inetd 데몬(슈퍼서버)
① UNIX 시스템에는 많은 서버프로그램이 실행됨. inetd 데몬은 N개의 개별 서버를 통합하여 클라이언트의 요청을 받으면 해당 서비스와 관련 모듈을 실행 시켜줌.
② 불필요한 서비스 제한하기 위해서 inetd.conf 파일을 보면 됨.
- 접근통제 (TCP Wrapper)
① TCP wrapper는 외부에서 들어오는 클라이언트에 대한 접근 통제 기능 제공.
② IP 주소를 기반으로 통제하므로 외부 해킹으로부터 시스템 보호 가능
③ TCP Wrapper가 설치되면, inetd 데몬은 TCP Wrapper 데몬인 tcpd 데몬에 연결을 넘겨줌.
즉, Client의 요청 → Inetd 데몬 → tcpd(hosts.allpw, hosts.deny로 통제) → 모듈 연결 후 실행
④ /etc/hosts.allow 파일과 /etc/hosts.deny 파일에 IP를 등록하여 접근 허용 및 차단을 결정.
파일 참조 순서는 allow 파일을 참조하여 IP가 있으면 해당 호스트의 접근을 허용하고, 없으면 deny 참조하여 차단을 결정함.
둘다 없으면 default로 모든 접근을 허용한다.
⑤ hosts.deny: 보통 ALL:ALL 로 설정. 의미: 모든 서비스에 대해 모든 호스트의 접근 차단. 이것은 allow 파일의 것 외에 모든 호스트는 차단하도록 하는 것.
⑥ hosts.allow:
예1: ALL:192.168.1.1 = 모든 서비스를 192.168.1.1이 이용가능
예2: in.ftpd:192.168.1.2 192.168.2.2 = ftp 서비스를 ~1.2와 ~2.2가 이용가능.
예3: ALL:192.168.1.0/255.255.255.0 = 192.168.1.0 ~ 192.168.1.255 사이의 모든 호스트 서비스 이용 가능
예4: ALL:LOCAL = 모든 서비스는 같은 네트워크에 있는 것만 사용 가능
예5: ALL EXCEPT in.telnetd:ALL = in.telnetd를 제외하고 모든 서비스를 모든 호스트가 사용 가능
예6: in.telnetd: .xxxx.com EXCEPT www.xxxx.com = www.xxxx.com을 제외한 xxxx.com 도메인의 모든 호스트에 대해 telnet 서비스 가능
6. 유닉스/리눅스 로그 파일
- utmp(x) 로그파일 (리눅스/유닉스(SunOS))
현재 로그인한 사용자의 상태 정보를 담고 있음.
w, who, finger 명령어로 확인. 명령어 뒤에 계정명 치면 해당 사용자 정보만 나옴.
리눅스: /var/run/utmp, 유닉스: /var/adm/utmpx
- wtmp(x) 로그파일 (리눅스/유닉스(SunOS))
성공한 로그인/로그아웃, boot/shutdown 정보를 기록.
last 명령어 사용(로그인/로그아웃 정보만 출력), 뒤에 계정명 오면 해당 계정 정보만 나옴.
last reboot 또는 last reboot <사용자계정> 해야 boot/shutdown 정보 확인 가능.
리눅스: /var/log/wtmp, 유닉스: /var/adm/wtmpx
- lastlog 로그파일 (리눅스/유닉스(SunOS))
마지막으로 성공한 로그인 기록을 저장함.
lastlog, finger 명령어 사용
리눅스: /var/log/lastlog, 유닉스: /var/adm/lastlog
lastlog -u <계정명> 은 특정 사용자 정보. lastlog -t <일수>는 해당 일수 내에 접속한 기록
finger <계정명>은 특정 사용자 정보.
- btmp 로그파일 (리눅스), loginlog(유닉스(SunOS))
실패한 로그인 시도에 대한 기록 저장
리눅스: /var/log/btmp, lastb 명령어로 로그 봄. lastb <계정명> 도 가능.
유닉스: /var/adm/loginlog, vi를 통해 확인 가능. 5회 이상 실패한 것만 저장. 특정 사용자의 정보만 볼 경우 cat /var/adm/loginlog | grep <계정명> 으로 봄.
- sulog 로그파일 (유닉스(SunOS) 만 볼수 있음)
su 명령을 사용한 결과를 저장, 유닉스에서 /var/adm/sulog를 vi로 보면 됨.
‘+’로 뜨는 것은 su 명령이 성공한 것, ‘-’는 실패한 것.
리눅스는 /var/log/secure 로그파일에 있음.
- acct/pacct 로그파일 (리눅스/유닉스(SunOS))
시스템에 로그인한 모든 사용자가 로그아웃 할 때까지 입력한 명령어와 터미널 종류, 프로세스 시작시간 등을 저장한 로그파일.
리눅스: /var/account/pacct, lastcomm <계정명> , 자동으로 생성되는 로그파일이 아니므로 /var/account/pacct 명령으로 실행해줘야 함.
유닉스: /var/adm/pacct, 자동 생성이 아니므로 /usr/lib/acct/accton /var/adm/pacct 명령으로 실행.
예: 실행한명령어 플래그(없으면 빈칸) 사용자명 터미널 타입 프로세스시작시간
플래그는 S(root에 의한 실행), F(exec 없이 fork에 의해 실행), X(시그널에 의해 종료됨, SIGTERM)
- history 로그파일 (리눅스/유닉스(SunOS))
계정별 홈 디렉토리에 생성되며, 실행한 명령어에 대한 기록 저장.
텍스트 파일로 되어 있어 history 명령어 또는 vi로 본다.
“.쉘종류_history”가 파일 이름이다.
7. Syslog
- 유닉스에서는 syslog 인터페이스를 통해 로그를 생성하고 관리함.
OS에 의해 자동으로 시작되며, /etc/syslog.conf를 읽어서 발생한 로그를 어디에 저장할지 결정함.
즉, syslog.conf에는 어떤 로그를 어디에 남길지 로그 저장 규칙이 정의되어 있음. 최근에는 syslog를 개성한 rsyslog를 사용함.
- /etc/syslog.conf 파일의 각 행들의 형식
facility.priority; facility.priority action(logfile-location)
설명: facility 서비스에 대해 priority 경우에 해당하는 이벤트 발생시 action 로그파일에 로그를 남긴다.
* priority: emergency(높음)-alert-critical0error0warning-notice-information-debug(낮음)
* action: 로그파일경로 지정 또는 원격 로그 서버 IP 주소 지정.
- syslog의 취약점: 기밀성, 무결성, 가용성 등을 고려하지 않고 만들어짐. 따라서 UDP로 로그 전송시 해킹 가능.
권고사항1: TCP를 이용할 것.
권고사항2: payload 보호하기 위해 BEEF(the Blocks Extensible Exchange Protocol)를 사용 할 것.
BEEF는 연결시향적, 비동기적 응용 프로그램 프로토콜로 내부적으로 인증, 재전송, 프라이버시 등을 지원해 신뢰성 보장함.
- syslog.conf(rsyslog.conf) 설정 예.
① #kern.* /dev/console : 커널에 관련된 로그를 /dev/console에 출력하라.
② *.info;mail.none;authprive.non;cron.none /var/log/messages : *.info는 모든 서비스에 대한 info 수준 이상의 로그를 message로그 파일에 기록하되,
mail, authpriv, cron 서비스 로그는 기록하지 말라(none)는 것.
③ authpriv.* /var/log/secure : authpriv에 속하는 서비스(tcp_wrapper, telnet, ftp, finger 등)의 모든 로그(*)를 secure 파일에 기록하라.
④ mail.* /var/log/maillog : 메일서비스(qmail, ipop 등)의 모든 로그를 maillog 파일에 기록하라
⑤ cron*. /var/log/cron : crond 데몬과 atd 데몬 등에서 발생하는 로그를 기록하라.
⑥ *.emerg * : 모든 서비스(*)의 emerg 로그를 모든 사용자(*)에게 보내라
⑦ uucp,news.crit /var/log/spooler : uucp, news 서비스 관련 서버의 crit 수준 이상의 로그를 기록하라.
⑧ local7.* /var/log/boot.log : 시스템 부팅시의 모든 로그를 기록하라
- 로그 순환: 로그가 많이 쌓이면 디스크에 꽉참. 따라서 로그파일을 압축 하거나 다른 곳으로 보내야 한다.
이것을 관리하는 것이 logrotate 이다. 주기적으로 실행되어야 하므로 cron에 의해 일단위로 실행된다.
8. 유닉스/리눅스 서버 취약점 대응
- root 외 uid가 0인 것 금지.
① cat /etc/passwd 로 계정정보 파악.
② usermod 명령어로 uid가 0인 일반 계정 uid 변경. usermod –u 2016 aaa, aaa 계정 uid를 2016으로 변경.
③ hp-ux OS는 chuser id=2016 aaa
- 패스워드 최소길이 설정 및 최소 사용기간 설정
① SunOS: /etc/default/passwd 파일에서 PASSLENGTH=8 MINWEEKS=1 (단위: 주)
② 리눅스: /etc/login.defs 파일에서 PASS_MIN_LEN 8 PASS_MIN_DAYS 1 (단위: 일)
③ AIX: /etc/security/user 파일에서 minlen=8 minage=1 (단위: 주)
④ HP-UX: /etc/default/security 파일에서 MIN_PASSWORD_LENGTH=8 PASSWORD_MINDAYS=1 (단위: 일)
- 패스워드 파일 보호
① /etc/shadow 파일에 암호화된 패스워드가 저장되므로 권한있는 사용자만 읽게한다.
② SunOS, 리눅스: /etc/passwd에 비번필드가 x인지 확인
③ IX: 기본적으로 /etc/security/passwd에 암호화하여 저장
④ HP-UX: /tcb 디렉터리 존재 확인, /etc/passwd에서 x 확인, 이 OS는 신뢰모드에서 패스워드를 암호화하여 /tcb/files/auth 에 계정에 따라 파일로 저장함.
- Session Timeout 설정
① 리눅스, AIX, HP-UX
sh, ksh, bash shell 사용시: /etc/profile(.profile)에서 TMOUT=600(초) export TMOUT
csh shell 사용시: /etc/csh.login에서 set autologout=10 설정
② SunOS: /etc/default/login TMOUT=600(초) export TMOUT 설정
- 주요 파일 소유자 및 권한 설정
① /etc/passwd: 사용자 정보, root 소유, 644이하 권한으로 설정.
② /etc/shadow: 사용자의 암호화된 pw정보. root외에는 접근 금지, 400이하 권한 설정.
③ /etc/hosts: IP와 호스트 이름 매핑. 노출시 악의적 시스템 접근가능하게 함. root소유로 600이하. 금융위는 644로 권장.
④ /etc/(x)inetd.conf: inetd 데몬에 대한 설정 파일. root 소유 600이하 권한.
⑤ /etc/syslog.conf: syslogd 데몬에 대한 설정 파일. 로그 기록하는데 사용됨. root 소유. 644권한.
⑥ /etc/services: 서비스 관리(서비스별 포트, 프로토콜 정보) root 소유. 644권한.
댓글 없음:
댓글 쓰기