이번에는 리눅스의 특수 권한에 대해 실습 위주로 포스팅하겠습니다.
우선 원활한 실습 환경 조성을 위해 selinux를 비활성화하겠습니다.
selinux는 리눅스 초기 보안 모듈입니다.
/etc/selinux/config를 vi로 열어서 7번째 행 selinux=enabled를 selinux=disabled로 변경한 후 저장하겠습니다.
/etc/selinux/config가 원본 파일이지만, 아래 예시를 보면 /etc/sysconfig/selinux 파일이 원본 파일에 링크되어있는 것을 확인할 수 있습니다. 둘 중 어느 파일을 수정해도 원본 파일인 /etc/selinux/config가 수정됩니다.
[root@localhost /]# ll /etc/selinux/config ; ll /etc/sysconfig/selinux -rw-r--r--. 1 root root 561 3월 12 14:29 /etc/selinux/config lrwxrwxrwx. 1 root root 17 2월 19 01:02 /etc/sysconfig/selinux -> ../selinux/config |
먼저 vi를 복습할 겸 vi로 열어보겠습니다. (자세한 내용은 [Linux] 리눅스 vi 편집기 사용법 포스팅에서)
[root@localhost /]# vi /etc/selinux/config |
:set nu[Enter] ((실행 모드(Last line mode)에서 vi 편집기 줄번호 생성))
:7[Enter] ((실행 모드(Last line mode)에서 7번째 행으로 커서 위치 옮기기))
i를 눌러서 삽입 모드(Edit mode)로 진입한 후 SELINUX=enforcing을 SELINUX=disabled로 변환
esc를 눌러서 명령 모드(Command mode)로 진입
:wq ((실행 모드(Last line mode)에서 저장 후 나가기))
이제 리눅스를 재부팅해야 합니다.
init 명령어로 재부팅하겠습니다. (init 명령어는 runlevel을 바꿀 때 사용합니다.)
[root@localhost /]# init 6 |
bin 디렉터리는 실행 명령어들이 있는 디렉터리입니다.
윈도우의 C:\Windows\System32 폴더라고 생각하면 됩니다.
notepad(메모장)을 실행하면 C:\Windows\System32 폴더 안의 notepad.exe가 실행되는 것처럼
리눅스의 명령어도 마찬가지입니다.
예를 들어 pwd라는 명령어는 어디 있을지 찾아보겠습니다.
아래 사진은 명령어를 찾는 과정입니다.
우선 현재 디렉터리를 먼저 확인해보겠습니다.
[root@localhost /]# ll | grep pwd [root@localhost /]# |
현재 디렉터리에 pwd 명령어가 없으니 $PATH에서 명령어를 찾아야 합니다.
echo $PATH 명령으로 확인해 보면 [ /usr/local/sbin ], [ /usr/local/bin ], [ /usr/sbin ], [ /usr/bin ], [ /root/bin ]
총 5개의 디렉터리를 확인할 수 있습니다.
[root@localhost /]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost /]# |
아래처럼 디렉터리를 하나하나 찾다 보니 /usr/bin 디렉터리에서 pwd 명령어를 찾을 수 있습니다.
[root@localhost /]# ll /usr/local/sbin | grep pwd [root@localhost /]# ll /usr/local/bin | grep pwd [root@localhost /]# ll /usr/sbin | grep pwd -rwsr-xr-x. 1 root root 36272 4월 1 2020 unix_chkpwd [root@localhost /]# ll /usr/bin | grep pwd -rwxr-xr-x. 1 root root 33232 8월 20 2019 pwd -rwxr-xr-x. 1 root root 11536 10월 1 2020 pwdx [root@localhost /]# |
passwd 명령어도 /usr/bin 디렉터리 안에 존재합니다.
[root@localhost /]# ll /usr/bin | grep passwd -rwsr-xr-x. 1 root root 78408 8월 9 2019 gpasswd -rwxr-xr-x. 1 root root 273648 7월 29 2020 grub2-mkpasswd-pbkdf2 -rwxr-xr-x. 1 root root 11216 10월 1 2020 kpasswd -rwxr-xr-x. 1 root root 15336 10월 1 2020 lppasswd -rwsr-xr-x. 1 root root 27856 4월 1 2020 passwd -rwxr-xr-x. 1 root root 28296 10월 14 2020 vncpasswd [root@localhost /]# |
passwd 명령어의 권한을 보면 -rwsr-xr-x로 되어있습니다. [Linux] 리눅스 특수 권한 포스팅에서 다룬 적 있던 내용입니다. UID(소유주 권한)에 특수 권한이 붙어 있습니다. 이로 인해 root가 아닌 일반 사용자도 실행 가능함을 알 수 있습니다.
아래 예시처럼 UID에 특수 권한이 존재하기 때문에 passwd 명령어로 (현재 로그인한 계정) 자신의 비밀번호는 변경이 가능함을 알 수 있습니다.
[user1@localhost /]$ passwd user1 사용자의 비밀 번호 변경 중 user1에 대한 암호 변경 중 (현재) UNIX 암호: [user1@localhost /]$ passwd korea1 passwd: root로만 사용자 이름을 지정할 수 있습니다. [user1@localhost /]$ |
SetGID는 wall 명령어를 통해 실습으로 알아보겠습니다.
[ wall ] 명령어
- Write to ALL
- 모든 터미널 유저에게 메시지를 보내는 명령어
- 형식 : wall [보낼 메시지]
ll /usr/bin | grep wall 명령으로 wall을 보면 GID에는 특수 권한(실행 권한 부여)과, tty라는 그룹에 묶여 있는 것을 볼 수 있습니다. tty라는 그룹에 속해있다면 wall 명령을 실행할 수 있습니다.
[root@localhost /]# ll /usr/bin | grep wall -rwxr-xr-x. 1 root root 116200 10월 1 2020 firewall-cmd -rwxr-xr-x. 1 root root 332292 10월 1 2020 firewall-config -rwxr-xr-x. 1 root root 103607 10월 1 2020 firewall-offline-cmd -r-xr-sr-x. 1 root tty 15344 6월 10 2014 wall [root@localhost /]# |
아래 예시처럼 root 계정이 아닌 test 계정에서도 wall 명령어가 실행이 가능한 것을 볼 수 있습니다.
소유주는 root이지만, test 계정은 tty라는 그룹에 묶여있기 때문에 특수 권한에 의해 wall 명령이 모두 실행됩니다.
(putty 타이틀바 우클릭 => New Session으로 세션 추가가 가능합니다.)
하나 더 실습해보겠습니다.
root 계정으로 /everybody 디렉터리를 생성 후 chmod 명령으로 /everybody 디렉터리의 권한을 drwxrwsrwx로 설정해주겠습니다.
[root@localhost /]# mkdir /everybody ; chmod 2777 /everybody [root@localhost /]# ll | grep everybody drwxrwsrwx 2 root root 4096 3월 12 22:38 everybody [root@localhost /]# |
su 명령어(Switch User)로 test계정(일반 사용자)으로 로그인 후 특수 권한이 설정된/everybody 디렉터리 안에 다른 디렉터리와 파일을 생성하겠습니다.
[root@localhost everybody]# su test [test@localhost everybody]$ touch /everybody/testfile.test1 [test@localhost everybody]$ mkdir /everybody/testdir.test1 |
이후 ll(ls -l) 명령어로 확인해보면 아래처럼 test 계정에서 생성한 파일과 디렉터리가 SetGID의 영향을 받아, 그룹이 root로 바뀐 것을 확인할 수 있습니다. 심지어 디렉터리는 SetGID가 또 설정되었습니다.
[test@localhost everybody]$ ll 합계 4 drwxrwsr-x 2 test root 4096 3월 12 22:43 testdir.test1 -rw-rw-r-- 1 test root 0 3월 12 22:42 testfile.test1 [test@localhost everybody]$ |
testdir.test1 디렉터리 안에 tdir2 디렉터리와 tfile2 파일을 생성한 후 확인해보면 SetGID가 디렉터리 바로 아래가 아닌, 하위의 모든 파일(디렉터리)에 적용되는 것을 확인할 수 있습니다.
[test@localhost everybody]$ mkdir /everybody/testdir.test1/tdir2 [test@localhost everybody]$ touch /everybody/testdir.test1/tfile2 [test@localhost everybody]$ ll /everybody/testdir.test1 합계 4 drwxrwsr-x 2 test root 4096 3월 12 22:50 tdir2 -rw-rw-r-- 1 test root 0 3월 12 22:50 tfile2 [test@localhost everybody]$ |
[ SetGID의 위험성 ]
"root"가 공용 디렉터리를 생성한 후, 공용 디렉터리에 SetGID를 설정할 경우, 어떤 유저든 공용 디렉터리 안에 파일을 생성하면 그 파일의 그룹은 "root"가 됩니다.
[ SetUID와 SetGID의 차이점 ]
유닉스 계열 운영체제(리눅스)에서는 파일의 소유자를 바꾸는 것은 관리자 "root"만 가능하게 설정이 되어있기 때문에 SetUID에서는 SetGID와 같이 디렉터리 하위에 모두 적용되는 상황은 생기지 않습니다.
즉, "root"가 한 디렉터리에 SetUID를 설정한 후 다른 유저가 그 디렉터리 내부에 파일을 생성했을 때, 디렉터리의 "SetUID"의 기능을 실행하는 것은 "root"가 아니라 "일반 유저"이기 때문에 소유자가 변경되지 않습니다.
'[Linux] 리눅스(CentOS7)' 카테고리의 다른 글
[Linux] 리눅스 디스크 파티션_3 (0) | 2022.03.14 |
---|---|
[Linux] 리눅스 디스크 파티션_2 (0) | 2022.03.13 |
[Linux] 리눅스 디스크 파티션 (0) | 2022.03.11 |
[Linux] 리눅스 하드 링크와 심볼릭 링크(소프트 링크) (0) | 2022.03.10 |
[Linux] 리눅스 특수 권한 (0) | 2022.03.09 |