싱글모드로 비밀번호 변경하기/cron/백업스케줄링/ crontab접근제어/작업스케줄링/방화벽/iptables (교육 40일차)

SW·2023년 1월 16일

실습> CentOS 7 싱글모드로 비밀번호 변경하기

비밀번호를 잊어버리면 싱글모드로 변경할 수 있다.
반대로 물리적인 서버에 비인가자가 접근하면 root권한을 탈취할 수 있다.
그러므로 서버를 운영할 때 이 부분에 보안을 반드시 설정해야 한다.

참고: https://cafe.naver.com/linuxmasternet/882

1. 부팅 화면 진입
CentOS7 부팅 시 키보드 키 ESC 키를 누르면 아래처럼 GRUB 화면이 나온다. 이때 키보드 e 키를 누르면 GRUB 편집 모드로 바뀐다.

2. GRUB 편집
GRUB 편집모드로 들어와서 커서를 kernel 부분에 위치하고 rhgb quite 를 삭제하고, 아래처럼 init=/bin/bash 로 수정한다.
수정 완료되면 단축키 Ctrl + x 를 눌러서 부팅한다.


부팅이 완료되면 root 권한의 쉘 (bash-4.2#) 이 떨어진다.
싱글모드라는 것은 복구모드로 비밀번호 없이 관리자 권한의 프롬프트가 실행되는 환경을 말한다.

3. /파일시스템 쓰기 권한으로 변경
부팅 후에는 /파일시스템이 ro(read only)로 되어 있다. 비밀번호를 변경하는다는 것은 /etc/shadow 파일에 root 비빌번호가 저장되어야 하므로 /파일시스템을 rw(read only)로 변경해야 한다.

mount -o remount,rw / 명령어로 /파일시스템을 rw모드로 변경하고 passwd 명령어로 root(관리자) 비밀번호를 변경한다.

비밀번호 변경이 완료되면 SELinux 관련 touch /.autorelabel 파일을 하나 만들어주고 exec /sbin/init 명령어로 재부팅하면 변경된 비번이 적용된다.


















##############
📌 크론 (cron) 📌
##############

cron 데몬은 무엇인가 ?
-스케줄 설정 데몬이다.
-데몬이란 백그라운드 프로세스로 동작하면서 서비스를 실행하는 프로세스이다.

cron 종류
-시스템 크론: root 만이 설정이 가능하다.
설정 파일 : /etc/crontab (-rw-r--r--. 1 root root)
-사용자 크론: root, 일반 사용자들이 설정이 가능하다.
설정 파일 : /var/spool/cron/<유저명> (e.g. -rw-------. 1 user1 user1)

crond 파일이 무엇인가 ?
-crond의 데몬 파일명으로 cron의 서비스 파일명이다.

'>>> 시스템 크론 구조 (/etc/crontab) <<<
환경 변수
#주석
실행할 스케줄
💥💥💥#실행할 스케줄은 아래처럼 설정한다.💥💥💥
💥💥💥분 시 일 월 요일 사용자 명령어

'>>> 사용자 크론 구조 (/var/spool/cron/사용자) <<<
환경 변수
#주석
실행할 스케줄
💥💥💥#실행할 스케줄은 아래처럼 설정한다.💥💥💥
💥💥💥분 시 일 월 요일 명령어

시스템 크론의 스케줄 등록 형식

매일 새벽 1시 정각에 root의 권한으로 rdate -s time.bora.net를 실행한다.
-매일 새벽 1시 정각에 타임서버에 접속해서 정확한 시간을 가져와서 시스템에 설정한다.
00 01 * * * root rdate -s time.bora.net

요일:
0(일) 1(월) 2(화) 3(수) 4(목) 5(금) 6(토) 7(일)

cron의 시간 설정 예
매분 마다(1분 마다)


매년 12월 25일 18:00
00 18 25 12 *

12월 25일 월요일 18:00
00 18 25 12 1
00 18 25 12 mon

매일 13:20분
20 13 * * *

매일 새벽 4:30분
30 4 * *
30 04
* *

시간의 범위

10분 마다(00,10,20,30,40,50)

*/10 * * * * 
00,10,20,30,40,50 * * * * 

2분 마다(00,02,04,06 ...)

*/2 * * * * 

3시간 마다(3, 6, 9, 12 ...)

* */3 * * * 
* 3,6,9,12... * * * 

범위지정 -를 사용
10분 ~ 15분까지 (10,11,12,13,14,15)

10-15 * * * * 
10,11,12,13,14,15 * * * * 

새벽 4시 ~ 5시 까지

* 04-05 * * * 
10 04-05 * * * 
10 04,05 * * * 
매일 새벽 4시 20분에 root의 권한으로 /root/bin/backup.sh 스크립트를 실행하는 설정
시스템 크론에 설정하는 경우: 20 04 * * * root /root/bin/backup.sh 
사용자 크론에 설정하는 경우: 20 04 * * * /root/bin/backup.sh 

매일 새벽 4시 30분에 user1의 권한으로 /home/user1/bin/test.sh 스크립트를 실행하는 설정
시스템 크론에 설정하는 경우: 30 04 * * * user1 /home/user1/bin/test.sh
사용자 크론에 설정하는 경우(root 사용자): 30 04 * * * /home/user1/bin/test.sh

일요일 오후 2시 정각에 root의 권한으로 /root/bin/time.sh 스크립트를 실행하는 설정
시스템 크론에 설정하는 경우: 00 14 * * 0 root /root/bin/time.sh
사용자 크론에 설정하는 경우(root 사용자): 00 14 * * 0 /root/bin/time.sh

6시간 마다 30분에 root의 권한으로 /home 디렉터리를 /root/backup/home.tar.gz 으로 압축하는 설정 
시스템 크론에 설정하는 경우: 30 */6 * * * root tar  czf /root/backup/home.tar.gz /home
사용자 크론에 설정하는 경우(root 사용자): 30 */6 * * * tar  czf /root/backup/home.tar.gz /home

실습> 시스템 cron 사용하기 1

슈퍼유저(root)가 시스템 크론을 사용할 수 있도록 설정한다.

시스템 cron의 설정파일: /etc/crontab
슈퍼 유저 root가 cron을 설정해야 하고 일반유저는 설정할 수 없다. (-rw-r--r--. root root)
그러므로 일반유저는 직접적으로 /etc/crontab 파일을 편집할 수 없으므로 일반유저는 시스템 크론을
사용할 수 없지만 관리자인 root가 대신 등록을 하면 사용할 수 있다.
다시 말해서 root가 /etc/crontab을 편집하고 실행은 일반유저가 실행할 수 있게 설정하면 가능하다.

drwxr-xr-x. 85 root root 8192 1월 16 10:21 /etc
-rw-r--r--. 1 root root 451 6월 10 2014 /etc/crontab

실행 스크립트명: /root/bin/datetime.sh
스크립트 내용: 1분 마다 date를 실행해서 날짜와 시간을 /tmp/datetime.txt 에 저장한다. (추가)

-- 순서 --
1. cron 실행
2. 스크립트 생성
3. 예약시간 등록
4. 저장된 파일 내용 확인
-- 순서 --

1. cron 실행
CentOS 7 설치 시 자동으로 실행되어 있으므로 따로 실행할 필요가 없다.

[root@localhost ~]# yum -y install rdate
[root@localhost ~]# rdate -s time.bora.net
[root@localhost ~]# date
2023. 01. 16. (월) 10:29:14 KST

리눅스 설치 시 이미 crond가 실행되었지만 여기서는 다시 실행한다.
[root@localhost ~]# > /var/log/cron
[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 월 2023-01-16 10:34:00 KST; 2s ago
Main PID: 2960 (crond)
CGroup: /system.slice/crond.service
└─2960 /usr/sbin/crond -n

1월 16 10:34:00 localhost.localdomain systemd[1]: Stopped Command Scheduler.
1월 16 10:34:00 localhost.localdomain systemd[1]: Started Command Scheduler.
1월 16 10:34:00 localhost.localdomain crond[2960]: (CRON) INFO (Syslog will be used instead of sendmail.)
1월 16 10:34:00 localhost.localdomain crond[2960]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 68% if used.)
1월 16 10:34:00 localhost.localdomain crond[2960]: (CRON) INFO (running with inotify support)
1월 16 10:34:00 localhost.localdomain crond[2960]: (CRON) INFO (@reboot jobs will be run at computer's startup.)

[root@localhost ~]# ps -ef | grep crond
root 2960 1 0 10:33 ? 00:00:00 /usr/sbin/crond -n
root 3122 3007 0 11:05 pts/1 00:00:00 grep --color=auto crond

[root@localhost ~]# cat /var/log/cron
Jan 16 10:34:00 localhost crond[1687]: (CRON) INFO (Shutting down)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (Syslog will be used instead of sendmail.)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 68% if used.)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (running with inotify support)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (@reboot jobs will be run at computer's startup.)

2. 스크립트 생성
스크립트 디렉터리: /root/bin
스크립트 파일명: datetime.sh
날짜와 시간 저장되는 파일명 : /tmp/datetime.txt

install: 파일을 복사하는 명령어

자신의 홈 디렉터리에 bin 디렉터리를 생성하고 그 안으로 들어간다.
[root@localhost ~]# cd
[root@localhost ~]# mkdir bin; cd bin

755 권한을 갖는 datetime.sh 파일을 생성한다.
[root@localhost ~]# install /dev/null datetime.sh
[root@localhost ~]# ll datetime.sh
-rwxr-xr-x. 1 root root 0 1월 16 10:38 datetime.sh

[root@localhost ~]# vi datetime.sh
-- datetime.sh --
#!/bin/sh

# 파일명: /root/bin/datetime.sh
# 프로그램 설명: 날짜와 시간을 출력해서 /tmp/datetime.txt 파일에 추가한다.
# 작성자: 리눅스마스터넷

date >> /tmp/datetime.txt
-- datetime.sh --

[root@localhost ~]# date
2023. 01. 16. (월) 10:41:09 KST

[root@localhost ~]# ./datetime.sh
[root@localhost ~]# cat /tmp/datetime.txt
2023. 01. 16. (월) 10:41:14 KST

환경변수 PATH에 /root/bin 경로가 마지막에 들어있기 때문에 ./ 를 생략해도 된다.
/tmp/datetime.txt 파일에 시간이 잘 추가되는지 실행한다.
[root@localhost ~]# datetime.sh
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@localhost ~]# cat /tmp/datetime.txt
2023. 01. 16. (월) 10:41:14 KST
2023. 01. 16. (월) 10:42:15 KST

3. 예약시간 등록
크론 종류: 시스템 크론
시스템 크론의 설정 파일: /etc/crontab
설정의 내용: /etc/crontab 에 datetime.sh 파일을 1분 마다 실행할 수 있도록 스케줄을 등록한다.

[root@localhost ~]# vi /etc/crontab
-- /etc/crontab --
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 1분 마다 root의 권한으로 /root/bin/datetime.sh 파일을 실행한다. 
* * * * * root /root/bin/datetime.sh

-- /etc/crontab --

4. 저장된 파일 내용 확인
설정을 저장하고 나온 후 로그를 확인하다.
첫 번째 터미널에서 로그를 확인한다.
[root@localhost ~]# tail -f /var/log/cron
Jan 16 10:34:00 localhost crond[1687]: (CRON) INFO (Shutting down)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (Syslog will be used instead of sendmail.)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 68% if used.)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (running with inotify support)
Jan 16 10:34:00 localhost crond[2960]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Jan 16 10:50:01 localhost crond[2960]: (system) RELOAD (/etc/crontab)

두 번째 터미널에서 /tmp/datetime.txt 파일을 확인한다.
[root@localhost ~]# tail -f /tmp/datetime.txt
2023. 01. 16. (월) 10:41:14 KST <-- 쉘에서 직접 실행
2023. 01. 16. (월) 10:42:15 KST <-- 쉘에서 직접 실행
2023. 01. 16. (월) 10:51:01 KST <-- cron에서 실행
2023. 01. 16. (월) 10:52:01 KST <-- cron에서 실행
2023. 01. 16. (월) 10:53:01 KST <-- cron에서 실행
2023. 01. 16. (월) 10:54:01 KST <-- cron에서 실행
:
:(생략)

첫 번째 터미널에서 로그를 확인하면 아래처럼 CMD라는 부분이 출력된다.
CMD는 시스템 크론에 등록된 스크립트가 실행되었다는 의미이다.
Jan 16 10:51:01 localhost crond[2960]: (system) RELOAD (/etc/crontab)
Jan 16 10:51:01 localhost CROND[3034]: (root) CMD (/root/bin/datetime.sh)
Jan 16 10:52:01 localhost CROND[3040]: (root) CMD (/root/bin/datetime.sh)
Jan 16 10:53:01 localhost CROND[3045]: (root) CMD (/root/bin/datetime.sh)
Jan 16 10:54:01 localhost CROND[3050]: (root) CMD (/root/bin/datetime.sh)
Jan 16 10:55:01 localhost CROND[3056]: (root) CMD (/root/bin/datetime.sh)
Jan 16 10:56:01 localhost CROND[3061]: (root) CMD (/root/bin/datetime.sh)

5. 복구
테스트가 완료되면 /etc/crontab에 설정된 임시 시간을 삭제하거나 주석처리 한다.
여기서는 향후에 다시 확인할 수 있도록 주석처리 한다.
[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 1분 마다 root의 권한으로 /root/bin/datetime.sh 파일을 실행한다. 
#* * * * * root /root/bin/datetime.sh

로그에 기록되는 내용은 RELOAD라고 기록된다.
CMD: 명령어를 실행할 때 기록된다.
RELOAD: 설정 파일 수정할 때 기록된다.
Jan 16 11:02:01 localhost CROND[3106]: (root) CMD (/root/bin/datetime.sh)
Jan 16 11:03:01 localhost CROND[3112]: (root) CMD (/root/bin/datetime.sh)
Jan 16 11:04:01 localhost CROND[3117]: (root) CMD (/root/bin/datetime.sh)
Jan 16 11:05:01 localhost crond[2960]: (system) RELOAD (/etc/crontab)
^C

실습> 시스템 cron 사용하기 2

일반 유저가 시스템 크론을 사용할 수 있도록 설정한다.

시스템 cron: /etc/crontab 에 설정
슈퍼 유저 root가 cron을 설정해야 하고 일반유저는 설정할 수 없다.
drwxr-xr-x. 85 root root 8192 1월 16 10:21 /etc
-rw-r--r--. 1 root root 451 6월 10 2014 /etc/crontab

그러므로 일반유저는 직접적으로 /etc/crontab 파일을 편집할 수 없으므로 일반유저는 시스템 크론을
사용할 수 없지만 관리자인 root가 대신 등록을 하면 사용할 수 있다.
다시 말해서 root가 /etc/crontab을 편집하고 실행은 일반유저가 실행할 수 있게 설정하면 가능하다.

1. 스크립트 생성
[root@localhost ~]# useradd user1
[root@localhost ~]# su - user1
$ mkdir bin
$ cd bin/

$ install /dev/null datetime.sh
$ ll datetime.sh
-rwxr-xr-x. 1 user1 user1 0 1월 16 11:13 datetime.sh

$ vi datetime.sh
#!/bin/sh

# 파일명: /home/user1/bin/datetime.sh
# 프로그램 설명: 날짜와 시간을 출력해서 /tmp/datetime2.txt 파일에 추가한다.
# 작성자: 리눅스마스터넷

date >> /tmp/datetime2.txt

환경변수 PATH를 확인하면 /home/user1/bin 디렉터리가 설정되어 있으므로 이 디렉터리에 있는
명령어는 ./ 를 생략하고 실행할 수 있다.
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin

datetime.sh를 실행해서 /tmp/datetime2.txt 파일에 날짜와 시간이 저장되는지 확인한다.
$ datetime.sh > /tmp/datetime2.txt
$ ll /tmp/datetime2.txt
-rw-rw-r--. 1 user1 user1 33 1월 16 11:16 /tmp/datetime2.txt
$ cat /tmp/datetime2.txt
2023. 01. 16. (월) 11:16:16 KST
$ date
2023. 01. 16. (월) 11:16:34 KST
$ exit

2. 시스템 크론 등록
root 권한으로 /etc/crontab 파일을 수정한다.
[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 1분 마다 root의 권한으로 /root/bin/datetime.sh 파일을 실행한다. 
# * * * * * root /root/bin/datetime.sh
# 1분 마다 user1의 권한으로 /home/user1/bin/datetime.sh 파일을 실행한다. 
* * * * * user1 /home/user1/bin/datetime.sh

3. 로그 확인
[root@localhost ~]# date
2023. 01. 16. (월) 11:21:41 KST

두 번째 터미널에서는 /tmp/datetime2.txt 를 확인한다.
[root@localhost ~]# tail -f /tmp/datetime2.txt
2023. 01. 16. (월) 11:16:16 KST <-- 쉘에서 직접 실행
2023. 01. 16. (월) 11:22:01 KST <-- cron에서 실행
2023. 01. 16. (월) 11:23:01 KST <-- cron에서 실행
2023. 01. 16. (월) 11:24:01 KST <-- cron에서 실행

로그를 확인하면 cron에서 실행된 로그가 기록되어 있다.
[root@localhost ~]# tail -f /var/log/cron
:
:(생략)
Jan 16 11:22:01 localhost crond[2960]: (system) RELOAD (/etc/crontab)
Jan 16 11:22:01 localhost CROND[3165]: (user1) CMD (/home/user1/bin/datetime.sh)
Jan 16 11:23:01 localhost CROND[3172]: (user1) CMD (/home/user1/bin/datetime.sh)
Jan 16 11:24:01 localhost CROND[3177]: (user1) CMD (/home/user1/bin/datetime.sh)
^C

4. 복구
테스트가 완료되면 /etc/crontab에 설정된 실행 라인을 삭제하거나 주석처리 한다.
여기서는 향후에 다시 확인할 수 있도록 주석처리 한다.
[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 1분 마다 root의 권한으로 /root/bin/datetime.sh 파일을 실행한다. 
# * * * * * root /root/bin/datetime.sh
# 1분 마다 user1의 권한으로 /home/user1/bin/datetime.sh 파일을 실행한다. 
#* * * * * user1 /home/user1/bin/datetime.sh 

#############
📌 사용자 크론 📌
#############

사용자 크론: 시스템의 모든 사용자(root, 일반 사용자)가 등록하는 크론을 말한다.

시스템 크론 설정파일: /etc/crontab
사용자 크론 설정파일: /var/spool/cron/사용자명

/usr/bin/crontab 파일 권한:

~  <-- 일반유저가 실행할 수 있는 권한이 있어야 한다.

-rwsr-xr-x. 1 root root 57656 8월 9 2019 /usr/bin/crontab
~ <-- setuid가 설정되어 있다.

위에서 2개의 권한이 설정이 되어 있어야 일반유저가 아래 디렉터리에 자신의 크론파일을 생성할 수 있다.
/var/spool/cron 디렉터리 권한:
drwx------. 2 root root 6 8월 9 2019 /var/spool/cron/

/usr/bin/crontab
-e: 사용크론 설정파일 생성/수정
-l: 설정된 사용자 크론 리스트 확인
-r: 설정된 사용자 크론 삭제

일반 유저 user1로 로그인한다.
사용크론 설정파일 생성할 때는 /tmp/ 디렉터리에 임시(랜덤문자열) 파일이 생성되고 저장 후 종료하면
임시 파일을 /var/spool/cron/사용자명으로 root 권한으로 이름을 변경해서 이동시킨다.
이것이 가능한게 Set-UID 설정되어 있기 때문에 가능하다.
[root@localhost ~]# rdate -s time.bora.net
[root@localhost ~]# su - user1

crontab -e를 실행하면 /tmp/crontab.ZDBt5M 임시 파일이 생성된다.
임시 파일의 이름은 crontab -e를 할 때마다 달라진다.
$ crontab -e
:w

다른 터미널에서 파일을 확인하면 user1 권한으로 생성된 것을 확인할 수 있다.
테스트할 때는 실행할 때 마다 파일명이 달라지므로 자신에게 만들어진 임시 파일명으로 한다.
[root@localhost ~]# ll /tmp/crontab.ZDBt5M
-rw-------. 1 user1 user1 0 1월 16 11:47 /tmp/crontab.ZDBt5M

이제 cron의 설정 파일을 아래처럼 생성하고 vi를 종료하면 임시 파일인 /tmp/crontab.ZDBt5M 파일을
/var/spool/cron/user1 파일로 이름을 변경해서 이동시키게 된다.
$ crontab -e

* * * * * date >> /tmp/datetime3.txt

저장하고 종료하는 순간 /tmp/crontab.ZDBt5M /var/spool/cron/user1로 이름을 변경해서 이동시켰기
때문에 임시파일을 확인하면 파일이 존재하지 않는 것이다.
[root@localhost ~]# ll /tmp/crontab.ZDBt5M
ls: cannot access /tmp/crontab.ZDBt5M: 그런 파일이나 디렉터리가 없습니다

/var/spool/cron/user1 파일을 확인하면 파일이 user1 권한으로 생성된 것을 확인할 수 있다.
/var/spool/cron/ 디렉터리에 일반 유저가 파일을 저장할 수 있는 이유는 crontab 명령어가
Set-UID 권한을 가지고 있기 때문이다.
[root@localhost ~]# ll /var/spool/cron/user1
-rw-------. 1 user1 user1 37 1월 16 11:50 /var/spool/cron/user1

/var/spool/cron/user1 파일의 내용을 확인하면 방금 생성한 내용이라는 것을 알 수 있다.
[root@localhost ~]# cat /var/spool/cron/user1

* * * * * date >> /tmp/datetime3.txt

일반유저가 직접 파일에 접근하면 /var/spool/cron 디렉터리에 접근할 수 없기 때문에 허가가 거부된다.
$ cat /var/spool/cron/user1
cat: /var/spool/cron/user1: 허가 거부

SetUID 권한이 설정된 crontab(/usr/bin/crontab) 파일을 이용해서 볼 수 있다.
$ crontab -l

          • date >> /tmp/datetime3.txt

$ tail -f /tmp/datetime3.txt
:
:(생략)
2023. 01. 16. (월) 12:08:01 KST
2023. 01. 16. (월) 12:09:01 KST
2023. 01. 16. (월) 12:10:01 KST
2023. 01. 16. (월) 12:11:01 KST
2023. 01. 16. (월) 12:12:01 KST
2023. 01. 16. (월) 12:13:01 KST
2023. 01. 16. (월) 12:14:01 KST
2023. 01. 16. (월) 12:15:01 KST

(user1) LIST (user1): crontab -l 을 이용해서 확인했기 때문에 로그에 LIST 명령어가 기록된다.
[root@localhost ~]# tail -f /var/log/cron
:
:(생략)
Jan 16 12:08:01 localhost CROND[3367]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:09:01 localhost CROND[3372]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:10:01 localhost CROND[3377]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:11:01 localhost CROND[3382]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:12:01 localhost CROND[3389]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:13:01 localhost CROND[3394]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:14:01 localhost CROND[3399]: (user1) CMD (date >> /tmp/datetime3.txt)
Jan 16 12:14:26 localhost crontab[3424]: (user1) LIST (user1)
Jan 16 12:14:34 localhost crontab[3427]: (user1) LIST (user1)
Jan 16 12:15:01 localhost CROND[3431]: (user1) CMD (date >> /tmp/datetime3.txt)
^C

설정된 사용자 크론을 삭제한다.
$ crontab -r

/var/log/cron 에는 아래처럼 기록된다.
Jan 16 12:18:55 localhost crontab[3453]: (user1) DELETE (user1)

설정된 사용자 크론의 리스트를 확인한다.
$ crontab -l
no crontab for user1

/var/log/cron 에는 아래처럼 기록된다.
Jan 16 12:19:05 localhost crontab[3455]: (user1) LIST (user1)

실습> 사용자 크론 설정 (root)

1. 로그 모니터링
cron 로그 파일을 초기화하고 모니터링 한다.
[root@localhost ~]# > /var/log/cron
[root@localhost ~]# tail -f /var/log/cron

2. 사용자 크론 설정
[root@localhost ~]# crontab -e

# 1분 마다 date 를 실행해서 /tmp/datetime4.txt 파일로 저장한다.
* * * * * date >> /tmp/datetime4.txt

로그에는 아래처럼 기록된다.
Jan 16 12:25:33 localhost crontab[3459]: (root) BEGIN EDIT (root)
Jan 16 12:27:55 localhost crontab[3459]: (root) REPLACE (root)
Jan 16 12:27:55 localhost crontab[3459]: (root) END EDIT (root)

3. 크론 파일 확인
[root@localhost ~]# ll /var/spool/cron/root
-rw-------. 1 root root 116 1월 16 12:27 /var/spool/cron/root

[root@localhost ~]# cat /var/spool/cron/root

# 1분 마다 date 를 실행해서 /tmp/datetime4.txt 파일로 저장한다.
* * * * * date >> /tmp/datetime4.txt

[root@localhost ~]# crontab -l

# 1분 마다 date 를 실행해서 /tmp/datetime4.txt 파일로 저장한다.
* * * * * date >> /tmp/datetime4.txt

로그에는 아래처럼 기록된다.
Jan 16 12:29:12 localhost crontab[3474]: (root) LIST (root)

4. 파일 모니터링
크론이 1분 마다 실행되는지 /tmp/datetime4.txt 파일의 내용을 모니터링해서 확인한다.
[root@localhost ~]# tail -f /tmp/datetime4.txt
2023. 01. 16. (월) 12:28:01 KST <-- cron에서 실행
2023. 01. 16. (월) 12:29:01 KST <-- cron에서 실행
2023. 01. 16. (월) 12:30:01 KST <-- cron에서 실행
2023. 01. 16. (월) 12:31:01 KST <-- cron에서 실행

로그에는 아래처럼 기록된다.
Jan 16 12:28:01 localhost CROND[3464]: (root) CMD (date >> /tmp/datetime4.txt)
Jan 16 12:29:01 localhost CROND[3471]: (root) CMD (date >> /tmp/datetime4.txt)
Jan 16 12:30:01 localhost CROND[3477]: (root) CMD (date >> /tmp/datetime4.txt)
Jan 16 12:31:01 localhost CROND[3484]: (root) CMD (date >> /tmp/datetime4.txt)
^C
[root@localhost ~]# crontab -r

실습> 아래 조건에 맞는 크론 설정하기

1. 시스템 크론 설정
크론 종류: 시스템 크론
root 권한으로 ls -ld /etc 명령어를 실행해서 /tmp/etclist.txt 파일로 기록한다.
/tmp/etclist.txt 파일은 명령어의 결과를 계속 추가하는 것으로 설정한다.
시간 설정: 1분 마다
설정된 시스템 크론을 확인한다.
/tmp/etclist.txt 파일에 결과가 잘 저장되었는지 확인한다.
5분 후에 설정된 시스템 크론을 삭제한다.

2. 사용자 크론 설정
크론 종류: 사용자 크론
user2 권한으로 ls -ld /tmp 명령어를 실행해서 /tmp/tmplist.txt 파일로 기록한다.
/tmp/tmplist.txt 파일은 명령어의 결과를 계속 추가하는 것으로 설정한다.
시간 설정: 1분 마다
설정된 사용자 크론을 확인한다.
/tmp/tmplist.txt 파일에 결과가 잘 저장되었는지 확인한다.
5분 후에 설정된 사용자 크론을 삭제한다.

1. 시스템 크론 설정
크론 종류: 시스템 크론
root 권한으로 ls -ld /etc 명령어를 실행해서 /tmp/etclist.txt 파일로 기록한다.
/tmp/etclist.txt 파일은 명령어의 결과를 계속 추가하는 것으로 설정한다.
시간 설정: 1분 마다
설정된 시스템 크론을 확인한다.
/tmp/etclist.txt 파일에 결과가 잘 저장되었는지 확인한다.
5분 후에 설정된 시스템 크론을 삭제한다.

[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

* * * * * root ls -ld /etc >> /tmp/etclist.txt

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

* * * * * root ls -ld /etc >> /tmp/etclist.txt

[root@localhost ~]# tail -f /tmp/etclist.txt
drwxr-xr-x. 85 root root 8192 1월 16 14:02 /etc
drwxr-xr-x. 85 root root 8192 1월 16 14:02 /etc
:
:

[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

[root@localhost ~]# * * * * * root ls -ld /etc >> /tmp/etclist.txt

2. 사용자 크론 설정
크론 종류: 사용자 크론
user2 권한으로 ls -ld /tmp 명령어를 실행해서 /tmp/tmplist.txt 파일로 기록한다.
/tmp/tmplist.txt 파일은 명령어의 결과를 계속 추가하는 것으로 설정한다.
시간 설정: 1분 마다
설정된 사용자 크론을 확인한다.
/tmp/tmplist.txt 파일에 결과가 잘 저장되었는지 확인한다.
5분 후에 설정된 사용자 크론을 삭제한다.

사용자 user2를 생성하고 비밀번호를 설정한다.
[root@localhost ~]# useradd user2
[root@localhost ~]# passwd user2

생성된 사용자 user2로 서버에 로그인한다.
ssh user2@서버주소

사용자 크론을 설정한다.
$ crontab -e

* * * * * ls -ld /tmp >> /tmp/tmplist.txt

설정된 사용자 크론을 확인한다.
$ crontab -l

* * * * * ls -ld /tmp >> /tmp/tmplist.txt

파일을 모니터링한다.
$ tail -f /tmp/tmplist.txt
drwxrwxrwt. 11 root root 4096 1월 16 14:08 /tmp
drwxrwxrwt. 11 root root 4096 1월 16 14:08 /tmp
:
:(생략)
^C

root 권한에서 user2 크론 파일이 잘 생성되었는지 확인한다.
[root@localhost ~]# ll /var/spool/cron/
합계 4
-rw-------. 1 user2 user2 43 1월 16 14:07 user2

사용자 크론의 리스트를 확인한다.
$ crontab -l

* * * * * ls -ld /tmp >> /tmp/tmplist.txt

설정된 사용자 크론을 삭제한다.
$ crontab -r

사용자 크론을 삭제했으므로 아무 내용도 출력되지 않는다.
$ crontab -l
no crontab for user2

실습> 시스템의 중요 파일을 백업하는 스케줄링 설정하기

서버 보안 담당자인 여러분이 서버에 중요 디렉터리의 삭제를 대비해서 백업을 받기 위한 작업 수행한다.

rdate 패키지를 설치해서 서버가 매시 정각에 time.bora.net에서 정확한 시간을 받아올 수 있도록 설정한다.
새벽 4시 30분에 백업스크립트를 실행해서 시스템에 중요 디렉터리를 백업 한다.
백업 스크립트는 backup.sh 이름으로 저장한다.
스크립트의 내용은 아래와 같다.
backup.sh 스크립트가 실행하기 위해서는 퍼미션을 실행 권한으로 변경하고 rsync 패키지를 설치한다.
백업 디렉터리는 백업 스크립트 안에 backupDirList 변수를 참고한다.
backupDirList 에 저장된 디렉터리를 /backup 디렉터리에 백업한다.
backup.sh 스크립트의 절대 경로는 /root/bin/backup.sh 이므로 /root/bin 디렉터리에 스크립트를 위치시킨다.

시간 설정 명령어: rdate -s time.bora.net && clock -w
백업 스크립트: /root/bin/backup.sh

-- 작업 순서 --
1. rsync 패키지 설치
2. 백업 스크립트 작성
3. 백업 스크립트 실행
4. 백업 디렉터리 확인
5. 크론 등록
6. 크론 테스트
-- 작업 순서 --

1. rsync 패키지 설치
rsync 패키지는 rsync라는 명령어 저장하는 패키지로 주로 백업할 때 사용한다.
[root@localhost ~]# yum -y install rsync

2. 백업 스크립트 작성
:set noai
:set paste
i

[root@localhost ~]# cd
[root@localhost ~]# vi bin/backup.sh
-- /root/bin/backup.sh --
#!/bin/sh

# 파일명: bakcup.sh
# 프로그램 설명: 시스템의 중요 디렉터리를 백업하는 스크립트
# 작성자: 서버 보안 담당자 홍길동
# 버전: 2023011601

today=(date+(date +%Y%m%d) # 날짜 backup=/backup # 백업 디렉터리 backupDir=backup/$today # 백업 디렉터리 밑에 날짜

# 백업할 중요 디렉터리들
# /etc : 설정 디렉터리
# /home : 사용자 디렉터리들
# /var/log : 로그 디렉터리
# /var/lib/mysql : DB 디렉터리 (현재 없으므로 생략)

backupDirList="/etc /home /var/log" # /var/lib/mysql"

echo "Starting Backup Script"

[root@localhost ~]# /backup 디렉터리가 없으면 700의 권한으로 생성한다.
[ ! -d $backup ] && mkdir -m 700 /backup

[root@localhost ~]# /backup 디렉터리 밑에 오늘 날짜의 디렉터리가 없으면 700의 권한으로 생성한다.
#backupDir:/backup/20230116if[!d"backupDir: /backup/20230116 if [ ! -d "backupDir" ]; then
mkdir -p -m700 $backupDir
fi

[root@localhost ~]# 반복문 for문을 이용해서 중요 디렉터리들을 백업한다.
for dir in $backupDirList
do

# rsync -a /etc /backup/20230116
# rsync -a /home /backup/20230116
# rsync -a /var/log /backup/20230116
rsync -a $dir $backupDir  
echo "$dir Backup Done."

done

echo "Stopping Backup Script"
-- /root/bin/backup.sh --

실행파일로 변경한다.
[root@localhost ~]# chmod 755 /root/bin/backup.sh

3. 백업 스크립트 실행
[root@localhost ~]# pwd
/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

backup.sh는 환경변수 PATH에 /root/bin이 마지막에 저장되어 있으므로 실행파일을 그냥 실행시켜도 실행이 된다.
[root@localhost ~]# backup.sh
Starting Backup Script
/etc Backup Done.
/home Backup Done.
/var/log Backup Done.
Stopping Backup Script

4. 백업 디렉터리 확인
tree 패키지를 설치해서 /backup 디렉터리를 확인하면 날짜 디렉터리가 만들어지고 그 안에
중요한 백업 디렉터리가 백업된 것을 확인할 수 있다.
tree -L 2: 깊이(Level)를 2단계 밑으로만 보여주는 옵션
[root@localhost ~]# yum -y install tree
[root@localhost ~]# tree -L 2 /backup/

4 directories, 0 files

전체 파일의 리스트를 확인하기 위해서는 아래 명령어를 사용한다.
[root@localhost ~]# tree /backup/20230116
:
:(생략)

5. 크론 등록
크론에 등록할 때 시스템 크론이냐, 사용자 크론이냐를 결정해야 한다.
여기서는 사용자 크론으로 등록을 할 것이다.
[root@localhost ~]# crontab -e

# 설정 형식: 분 시 일 월 요일 실행파일
# 새벽 4시 30분에 백업스크립트를 실행한다.
30 04 * * * /root/bin/backup.sh

[root@localhost ~]# crontab -l

# 설정 형식 : 분 시 일 월 요일 실행파일
# 새벽 4시 30분에 백업스크립트를 실행한다.
30 04 * * * /root/bin/backup.sh

[root@localhost ~]# ll /var/spool/cron/root
-rw-------. 1 root root 144 1월 16 14:40 /var/spool/cron/root

[root@localhost ~]# cat -n /var/spool/cron/root
1 # 설정 형식 : 분 시 일 월 요일 실행파일
2 # 새벽 4시 30분에 백업스크립트를 실행한다.
3 30 04 * * * /root/bin/backup.sh

6. 크론 테스트
날짜를 미래로 돌려놓고 백업이 잘되는지 테스트를 한다.

첫 번째 터미널에서 크론 로그를 모니터링 한다.
[root@localhost ~]# > /var/log/cron
[root@localhost ~]# tail -f /var/log/cron

두 번째 터미널에서 실행한다.
[root@localhost ~]# date
2023. 01. 16. (월) 14:42:46 KST

두 번째 터미널에서 실행한다.
내일 04시28분으로 시간을 수동으로 설정한다.
[root@localhost ~]# date 01170428
2023. 01. 17. (화) 04:28:00 KST

두 번째 터미널에서 실행한다.
[root@localhost ~]# while :
do
date
sleep 1
clear
done

첫 번째 터미널에 크론 로그에 기록이 되면 명령어가 잘 실행된 것이다.
[root@localhost ~]# tail -f /var/log/cron
Jan 17 04:30:01 localhost CROND[3921]: (root) CMD (/root/bin/backup.sh)
Jan 17 04:30:01 localhost CROND[3919]: (root) CMDOUT (Starting Backup Script)
Jan 17 04:30:02 localhost CROND[3919]: (root) CMDOUT (/etc Backup Done.)
Jan 17 04:30:02 localhost CROND[3919]: (root) CMDOUT (/home Backup Done.)
Jan 17 04:30:02 localhost CROND[3919]: (root) CMDOUT (/var/log Backup Done.)
Jan 17 04:30:02 localhost CROND[3919]: (root) CMDOUT (Stopping Backup Script)

두 번째 터미널에서 /backup 디렉터리를 확인해보면 20230117 디렉터리가 잘 나오면 백업이 잘 된 것이다.
[root@localhost ~]# tree -L 2 /backup

1월 18일 새벽 4시 28분으로 시간을 변경해보고 백업이 잘 되는지 확인한다.
[root@localhost ~]# date 01180428
2023. 01. 18. (수) 04:28:00 KST

새벽 4시 30분에 백업 스크립트인 /root/bin/backup.sh 파일이 잘 실행되는 것을 로그로 확인할 수 있다.
[root@localhost ~]# tail -f /var/log/cron
:
:(생략)
Jan 18 04:30:01 localhost CROND[4406]: (root) CMD (/root/bin/backup.sh)
Jan 18 04:30:01 localhost CROND[4404]: (root) CMDOUT (Starting Backup Script)
Jan 18 04:30:02 localhost CROND[4404]: (root) CMDOUT (/etc Backup Done.)
Jan 18 04:30:02 localhost CROND[4404]: (root) CMDOUT (/home Backup Done.)
Jan 18 04:30:02 localhost CROND[4404]: (root) CMDOUT (/var/log Backup Done.)
Jan 18 04:30:02 localhost CROND[4404]: (root) CMDOUT (Stopping Backup Script)

/backup 디렉터리를 확인해보면 20230118 디렉터리가 잘 생성된 것을 볼 수 있다.
[root@localhost ~]# tree -L 2 /backup

7. 크론 테스트 2
위에서 설정한 사용자 크론을 시스템 크론으로 변경하고 사용자 크론은 삭제한다.

사용자 크론을 확인한다.
[root@localhost ~]# crontab -l

# 설정 형식: 분 시 일 월 요일 실행파일
# 새벽 4시 30분에 백업스크립트를 실행한다.
30 04 * * * /root/bin/backup.sh

사용자 크론에 설정된 내용을 시스템 크론으로 설정한다.
[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 설정 형식: 분 시 일 월 요일 실행파일
# 새벽 4시 30분에 백업스크립트를 실행한다.
30 04 * * * root /root/bin/backup.sh

사용자 크론을 삭제한다.
[root@localhost ~]# crontab -r

시간을 1.19 04:28분으로 변경한다.
[root@localhost ~]# date 01190428
2023. 01. 19. (목) 04:28:00 KST

새벽 4시 30분에 백업 스크립트인 /root/bin/backup.sh 파일이 잘 실행되는 것을 로그로 확인할 수 있다.
[root@localhost ~]# tail -f /var/log/cron
:
:(생략)
Jan 19 04:30:01 localhost CROND[4775]: (root) CMD (/root/bin/backup.sh)
Jan 19 04:30:01 localhost CROND[4773]: (root) CMDOUT (Starting Backup Script)
Jan 19 04:30:01 localhost CROND[4773]: (root) CMDOUT (/etc Backup Done.)
Jan 19 04:30:01 localhost CROND[4773]: (root) CMDOUT (/home Backup Done.)
Jan 19 04:30:01 localhost CROND[4773]: (root) CMDOUT (/var/log Backup Done.)
Jan 19 04:30:01 localhost CROND[4773]: (root) CMDOUT (Stopping Backup Script)

/backup 디렉터리를 확인해보면 20230119 디렉터리가 잘 생성된 것을 볼 수 있다.
[root@localhost ~]# tree -L 2 /backup/

!!! 참고 !!!
/etc/crontab에 잘못 설정하면 아래처럼 나온다.
시스템 크론에서 아래처럼 설정하면 로그에 bad command라고 나온다.
e.g.) 00 04 * * * /root/bin/backup.sh
Jan 18 04:52:01 localhost crond[2960]: (CRON) bad command (/etc/crontab)

e.g.) 00 04 * * root /root/bin/backup.sh
Jan 19 04:39:55 localhost crond[4843]: (CRON) bad day-of-week (/etc/crontab)

실습> crontab에 대한 접근 제어

사용자 크론 설정 막는 두가지 방법

첫 번째 방법
/usr/bin/crontab 파일의 권한에서 SetUID(setuid, Set-UID, set-uid)의 권한을 제거하면 된다.

1. /usr/bin/crontab 파일의 권한 변경
[root@localhost ~]# chmod u-s /usr/bin/crontab
[root@localhost ~]# ll /usr/bin/crontab
-rwxr-xr-x. 1 root root 57656 8월 9 2019 /usr/bin/crontab

/usr/bin/crontab 파일에 Set-UID 권한이 설정이 안되어 있어도 관리자는 사용할 수 있다.
[root@localhost ~]# crontab -e
:q!

[root@localhost ~]# crontab -l
no crontab for root

/usr/bin/crontab 파일에 Set-UID 권한이 설정이 안되어 있으면 일반유저는 사용할 수 없다.
$ crontab -e
You (user1) are not allowed to use this program (crontab)
See crontab(1) for more information
$ crontab -l
You (user1) are not allowed to use this program (crontab)
See crontab(1) for more information

테스트가 끝나면 원래의 권한(4755)으로 재설정한다.
[root@localhost ~]# chmod 4755 /usr/bin/crontab
[root@localhost ~]# ll /usr/bin/crontab
-rwsr-xr-x. 1 root root 57656 8월 9 2019 /usr/bin/crontab

두 번째 방법
/etc/cron.deny
-이 파일에 사용자 목록이 저장되면 crontab을 사용할 수 없다.
-이 파일은 기본으로 제공되어 있고 사용자 목록은 아무도 들어있지 않다.
-아무도 없다라는 것은 모든 사용자는 사용자 크론을 사용할 수 있다라는 의미이다.

/etc/cron.allow
-이 파일에 사용자 목록이 저장되면 crontab을 사용할 수 있다.
-이 파일은 기본으로 제공되어 있지 않다.
-관리자가 /etec/cron.allow 파일을 0byte짜리로 생성하면 사용자는 사용자 크론을 사용할 수 없다.
-[root@localhost ~]# install -m 600 /dev/null /etc/cron.allow

[root@localhost ~]# ll /etc/cron.{allow,deny}
-rw-------. 1 root root 0 1월 19 04:53 /etc/cron.allow
-rw-------. 1 root root 0 1월 19 04:50 /etc/cron.deny

$ crontab -l
You (user1) are not allowed to use this program (crontab)
See crontab(1) for more information

설정을 확인했다면 /etc/cron.allow 파일을 삭제한다.
[root@localhost ~]# rm -f /etc/cron.allow

/etc/cron.deny 파일에 거부할 사용자를 등록하면 사용자 크론을 사용할 수 없다.
[root@localhost ~]# echo user1 > /etc/cron.deny
$ crontab -l
You (user1) are not allowed to use this program (crontab)
See crontab(1) for more information

설정을 확인했다면 /etc/cron.deny 파일을 초기화한다.
[root@localhost ~]# > /etc/cron.deny

실습> 작업 스케줄링 실습

크론 종류: 시스템 크론

1. 매월 매일 01시 정각에 rdate 명령을 실행하여 time.bora.net과 시간을 동기화한다.
[root@localhost ~]# vi /etc/crontab
:
:(생략)

00 01 * * * root rdate -s time.bora.net

2. 매월 매일 6시간마다 30분이 될 때 /root/backup 디렉터리 하위에 home.tar.gz 이름으로
/home 디렉터리 하위 내용을 압축하여 저장한다.

[root@localhost ~]# vi /etc/crontab
:
:(생략)

30 */6 * * * root  tar -czf /root/backup/home.tar.gz /home

크론 종류: 사용자 크론

  1. 매월 매일 01시 정각에 rdate 명령을 실행하여 time.bora.net과 시간을 동기화한다.
    [root@localhost ~]# crontab -e
00 01 * * * rdate -s time.bora.net

2. 매월 매일 6시간마다 30분이 될 때 /root/backup 디렉터리 하위에 home.tar.gz 이름으로
/home 디렉터리 하위 내용을 압축하여 저장한다.

[root@localhost ~]# crontab -e

30 */6 * * * tar -czf /root/backup/home.tar.gz /home

############
📌 방화벽 📌
############

CentOS 6: iptables (기본 방화벽), firewalld (존재하지도 않았다.)
CentOS 7: firewalld (기본 방화벽), iptables (추가 방화벽)

넷필터 공식 사이트: https://netfilter.org/

서버에서는 반드시 방화벽을 설정하고 운영해야 안전하게 서버를 운영할 수 없다.

실습> ipables-services 패키지 설치하기

systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl start iptables
systemctl enable iptables
iptables -nL
iptables -F

firewalld 서비스를 중지한다.
[root@localhost ~]# systemctl stop firewalld

firewalld 서비스를 다시 실행하지 못하게 비활성화 한다.
[root@localhost ~]# systemctl disable firewalld

iptables-services 패키지를 설치한다.
[root@localhost ~]# yum -y install iptables-services

iptables-service 를 활성화 시키고 시작한다.
[root@localhost ~]# systemctl enable iptables
[root@localhost ~]# systemctl start iptables

iptables 상태를 확인한다.
[root@localhost ~]# systemctl status iptables

firewalld 상태를 확인한다.
[root@localhost ~]# systemctl status firewalld

iptables -nL 명령어를 이용해서 방화벽 룰을 확인한다.
[root@localhost ~]# iptables -nL

iptables -F 명령어를 이용해서 방화벽 룰을 해제한다.
[root@localhost ~]# iptables -F

service 명령어를 이용해서 사용하는 방법
[root@localhost ~]# service iptables stop
[root@localhost ~]# service iptables start
[root@localhost ~]# service iptables restart
[root@localhost ~]# service iptables status

실습> iptables 방화벽 테이블/체인 확인하기

테이블: 소문자로 되어 있다.
체인: 대문자로 되어 있다.
-built-in chain: 테이블에 이미 설정되어 있는 체인
-사용자 정의 체인: 사용자가 생성하는 체인

테이블(table): 방화벽에서 특정 기능을 제공하는 것
-사용자가 생성/삭제/수정할 수 없고 이미 만들어져 있다. 사용자가 삭제는 못한다.
체인(chain): 패킷이 이동하는 경로이며 패킷을 제어하는 위치
-빌트인 체인은 삭제/수정할 수 없고 있는 그대로 사용해야 한다.
-사용자 정의 체인은 생성/삭제/수정할 수 있다.
룰(rule): 각 테이블에 속해있는 체인에 설정하는 방화벽 정책
-사용자가 생성/삭제/수정할 수 있고 기본 룰은 이미 만들어져 있지만 생성/삭제/수정이 가능하다.

테이블의 종류
-filter: 패킷의 필터링하는 기능을 제공한다.
-nat: 패킷의 주소를 변환하는 기능을 제공한다.
-mangle: 패킷의 헤더값을 변환하는 기능을 제공한다.
-raw: 연결 추적 기능을 제공한다.
-security: SELinux의 강제적 접근 통제(MAC)를 지원하는 기능을 제공한다.

각 테이블에는 체인이 존재한다.

체인의 종류
-INPUT
-FORWARD
-OUTPUT
-PREROUTING
-POSTROUTING

-t 테이블: 테이블 종류를 선택하는 옵션
-L: 설정된 방화벽 룰의 리스트를 확인하는 옵션
-n: 숫자로 출력하는 옵션

각 테이블의 체인의 종류를 확인한다.
[user1@localhost ~]# iptables -nL
[user1@localhost ~]# iptables -t filter -nL
[user1@localhost ~]# iptables -t nat -nL
[user1@localhost ~]# iptables -t mangle -nL
[user1@localhost ~]# iptables -t raw -nL
[user1@localhost ~]# iptables -t security -nL


실습> 패킷의 흐름

filter INPUT : 패킷이 들어올 때 지나가는 체인 (패킷이 들어오는 문)
filter OUTPUT: 패킷이 나갈 때 지나가는 체인 (패킷이 나가는 문)

실습> 방화벽 기본 정책 설정하기 (-P 옵션)

ACCEPT: 패킷 허용
DROP: 패킷 거부

기본 정책이라함은 패킷이 들어올 때 해당 체인의 설정된 룰을 검사하고 매칭되는 룰이 없다면
기본값으로 적용되는 정책을 말한다. 좀 더 강력한 정책을 사용할려면 policy를 DROP으로 설정한다.

policy ACCEPT: 허용할 정책을 열어주고 반드시 마지막에 모두 막아야 한다.
policy DROP : 모두 막고 필요한 정책을 열어준다. 마지막에 모두 막아줄 필요가 없다.

-P 체인명 ACCEPT: 체인의 기본 정책을 허용하는 설정
-P 체인명 DROP : 체인의 기본 정책을 거부하는 설정

[user1@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

FORWARD 체인의 기본 정책을 ACCEPT -> DROP으로 변경한다.
-참고로 테이블명을 생략하면 기본값은 filter 테이블이다.
[user1@localhost ~]# iptables -P FORWARD DROP
[user1@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

FORWARD 체인의 기본 정책을 DROP -> ACCEPT로 변경한다.
-참고로 테이블명을 생략하면 기본값은 filter 테이블이다.
[user1@localhost ~]# iptables -P FORWARD ACCEPT
[user1@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

!!! 중요 !!!
반드시 대/소문자 구분을 해야 한다.
아래는 모두 에러이다.
[user1@localhost ~]# iptables -P FORWARD ACCept
iptables: Bad policy name. Run `dmesg' for more information.
[user1@localhost ~]# iptables -P fORWARD ACCEPT
iptables: Bad built-in chain name.

INPUT 체인의 기본 정책을 ACCEPT -> DROP으로 변경한다.
-아무 룰도 없는 상태에서 기본 정책을 DROP으로 변경하면 클라이언트와 연결된 세션은 끊어진다.
[user1@localhost ~]# iptables -P INPUT DROP

Socket error Event: 32 Error: 10053.
Connection closing...Socket close.

Connection closed by foreign host.

Disconnected from remote host(200.200.200.4:22) at 17:39:24.

filter 테이블의 INPUT 체인의 기본 정책을 DROP으로 변경했기 때문에 Host OS에서 ssh로 접속할 수 없다.
C:\Users\user>ssh root@200.200.200.4
ssh: connect to host 200.200.200.4 port 22: Connection timed out

콘솔로 접속해서 INPUT 체인의 기본 정책을 ACCEPT로 변경한다.
[user1@localhost ~]# iptables -P INPUT ACCEPT
[user1@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

filter 테이블의 INPUT 체인의 기본 정책을 ACCEPT로 변경했기 때문에 Host OS에서 ssh로 접속할 수 있다.
C:\Users\user>ssh root@200.200.200.4
root@200.200.200.4's password:
Last login: Thu Jan 19 04:41:53 2023 from 200.200.200.1
[root@localhost ~]#

profile
정보보안 전문가

0개의 댓글