[Linux] 리눅스(CentOS7)

[Linux] 리눅스 특수 권한_2

ITsubin 2022. 3. 12. 22:59

이번에는 리눅스의 특수 권한에 대해 실습 위주로 포스팅하겠습니다.

 

우선 원활한 실습 환경 조성을 위해 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 /]$
[ SetUID를 사용하는 이유 ]
- SetUID 비트가 설정된 파일은 실행 순간만 그 파일의 소유자 권한으로 실행됩니다.
- 즉, 실행 순간만 권한을 빌려오는 것이기 때문에 매번 root가 작업하지 않아도 되고, 일반 사용자에게 root 권한을 주지 않아도 되므로 보다 안전한 방법입니다.

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"가 아니라 "일반 유저"이기 때문에 소유자가 변경되지 않습니다.