본문 바로가기
IT Security/LINUX Basic

11. Linux - Umask, Set UID, Set GUI, sticky bit

by Rosmary 2019. 12. 1.
728x90
반응형

1. umask

 

리눅스에서 root 계정으로 새로운 파일이나 폴더를 생성하게 되면, 아래의 그림처럼 파일은 644를, 폴더는 755 권한을 가지는 것을 볼 수 있다.

 

 

그렇다면, 파일과 폴더 생성 시, 디폴트 값으로 부여되는 권한은 어떻게 정해지는 것일까?

 

Ctrl+l 키로 화면을 모두 깔끔하게 지운 뒤, umask 명령어를 입력하면, 4자리의 숫자가 나타나게 된다. 

 

 

흥미로운 점은, root 계정으로 이 명령어를 실행했을 때와, 일반 계정으로 이 명령어를 실행했을 때 나타나는 출력 결과가 다르다는 점이다. root는 0022로, 일반 계정은 0002로 나타난다.

 

그렇다면 이 umask라는 녀석은 무엇을 의미하는 것일까? 다시 처음의 사진으로 돌아가서, root 계정으로 만든 파일과 폴더의 권한값을, umask 값과 함께 비교하여 살펴보자

 

========================

파일 :   644(rw-r--r--)

폴더 :   755(rwxr-xr-x)

umask: 022(----w--w-)

========================

 

이 값들을 유심히 보다보면, 한 가지 특징이 보이는데, 파일 권한과 umask 권한 값이 더해지면 666, 폴더 권한과 umask 권한이 더해지면 777 값이 나타나는 것을 알 수 있다. 즉, umask 값은 파일과 폴더를 새로 형성할 시, 어떤 권한을 제외하고 파일/폴더를 생성할지를 지정해주는 역할을 한다고 보면 된다. 

 

일반계정의 umask 값은 0002다. 따라서 새로운 파일과 폴더 생성 시, 파일은 664(rw-rw-r--)로, 폴더는 775(rwxrwxr-x) 권한을 가지게 된다.

 

 

이 umask 값을 이용하면, 일반 사용자가 자신의 홈 디렉토리에 폴더나 파일 생성 시, 특정 권한만 가질 수 있도록 만들 수 있다. 만약, 자신을 제외한 모든 사용자가 이 파일에 대해 어떠한 권한을 가지게 하고 싶지 않다면, 자신의 umask 값을 077로 변경하면 된다. 변경 방법은 umask 명령어를 사용하여 진행하며, 포맷은 아래와 같다.

 

================

umask [숫자권한]

================

 

 

따라서, 각 사용자는 자신의 취향에 따라 umask 값을 사용하는 것이 가능하며, 다른 계정의 umask 값을 변경하는 것은 불가능하다(당연한 것이, 다른 계정의 umask 값을 변경할 수 있다면 손쉽게 다른 사람의 파일과 폴더 정보를 볼 수 있으니 말이다...).

 

예외적으로 umask 값이 따로 설정되는 폴더가 하나 있는데, 이는 root 계정에서 새 사용자를 생성할 시, 함께 만들어지는 각 사용자의 홈 디렉토리이다. 현재 필자의 리눅스에서는 새 사용자를 생성하면 각 사용자의 홈 디렉토리 권한이 700으로 주어지는데, 이 권한은 root의 umask 값과 연관되어 있지 않다. 대신에, 이전 포스팅에서 언급했던 /etc/login.defs 파일 내에, 각 홈 디렉토리의 umask를 설정하는 부분에서 수정이 가능하다. 

 

umask 설정을 아무것도 건드리지 않은 경우, root는 umask 022, 일반사용자는 umask 002 값이 부여된다. 관리자는 기본적으로 부여되는 umask 값을 변경할 수 있는데, 이는 /etc/profile 파일 내에서 해당 umask 값을 수정하면 된다.

 

 

해당 파일의 59번째 줄에, umask 부여와 관련된 스크립트 코드가 존재하는데, UID 값이 199번보다 큰 경우(일반 사용자인 경우), umask 값을 002로 부여하며, 그렇지 않은 경우(관리자 계정인 경우) umask 022로 부여한다는 내용이 존재한다. 만약, 해당 umask 값을 변경하고 저장한다면, 새 사용자 생성 시, 나타나는 umask 값은 이전과 다르게 나타날 것이다.

 

 

***  umask 명령어에 옵션으로 -S를 사용하는 경우, 알파벳 형태의 umask가 출력된다.

 

 

그런데... umask로 출력된 결과물을 다시 한 번 자세히 살펴보자. 뭔가 모르게 위화감이 든다. 분명 소유자, 소유그룹, 기타 계정에만 권한을 부여하기 때문에 umask 명령어의 결과값 역시 3자리로 결과가 나타나야하는데, 신기하게도 4자리 값이 출력된다. 그렇다면, 맨 앞에 위치한 저 녀석은 무엇을 의미하는 것일까? 이 녀석이 무슨 역할을 하는지 이해하기 위해서는, 우선 SetUID, SetGID, sticky bit라는 녀석에 대해 알아야한다. 

 

 

 

 

2. SetUID

 

SetUID가 등장하는 파일은 passwd 명령어인데, 이 파일의 권한값을 보면 다른 권한과 달리 조금 특이한 점이 눈에 보인다.

 

 

바로 소유 계정의 마지막 알파벳이 x가 아닌 s를 띄고 있다는 점이다. passwd의 경우 소유 계정은 root지만, root를 제외한 나머지 계정 역시 비밀번호를 변경(수정권한 w가 필요하다)하기 위해 사용해야 하는 명령어다. 파일을 실행하는 것은 모든 계정이 가능하지만, 비밀번호를 수정하는 것은 root 계정에만 부여되어 있기 때문에, root를 제외한 사용자들은 passwd 명령어를 사용하여 자신들의 비밀번호를 변경할 때, root의 w권한을 잠시 빌려 사용하는 개념이라고 생각하면 된다. 

 

SetUID의 동작을 확인하기 위해, /usr/bin/passwd 파일을 홈 디렉토리로 복사해 가지고 온 뒤, 권한을 변경하며 user1으로 실행시켜보려고 한다. 

 

 

복사된 passwd 파일에는 SetUID가 지정되어 있지 않다. SetUID가 지정되어 있지 않은 파일을 사용해, user1 계정에서 passwd를 변경해보려 한다.

 

 

passwd 파일이 실행은 되지만, 수정 권한이 부여되지 않았기 때문에, 수정 결과 "인증 토큰 수정 오류"라는 출력물이 발생한다. 이제 passwd에 SetUID를 지정한 뒤, 동일한 과정을 반복해보려 한다. 

 

 

SetUID가 부여된 passwd 파일은, w 권한이 없는 기타 계정이더라도 root의 w 권한을 빌려 비밀번호를 수정하는 것이 가능함을 확인했다. 

 

여기서 궁금한 점이 하나 더 생기는데, 수정 권한을 빌리는 것임에도 불구하고, "SetUID를 의미하는 's'문자는 왜 실행 권한의 위치에 존재하느냐"라는 것이다. 논리적으로 생각해본다면 's'가 실행 권한에 붙는 것이 타당한데, 파일을 수정하기 위해서 파일 실행이 우선 진행되어야 하기 때문이다. 즉, 필자는 조금 전에 수정 권한을 빌린다고 설명을 달아놓았으나, 엄밀히 말하자면, 실행 권한 + 수정권한을 소유 계정으로부터 일시적으로 부여받는 것이라고 생각하면 된다.(그러나 other 권한에도 x가 부여되어 있어야 root의 실행/수정 권한을 받는 것이 가능하다...)

 

그래서, 소유 계정에 w 권한이 없더라도, SetUID가 설정되어 있는 경우, root를 제외한 나머지 계정이 비밀번호를 바꾸는 것도 가능하다. 아래의 화면처럼.

 

 

특이하게도 SetUID는 파일에만 적용될 뿐, 폴더에는 적용되지 않는다. 폴더에 SetUID 권한을 줄 수는 있어도, 기타 계정이 소유 계정의 권한을 이용하여 폴더 내에 새로운 파일이나 폴더를 생성하는 것을 막는다. 필자도 이 이유를 추론만 할 뿐인데, 권한을 빌려 새로운 파일이나 폴더를 만들게 되면, 소유 계정 외의 다른 계정이 소유계정이 모르는 사이 해당 폴더 내의 파일이나 하위 폴더를 생성, 삭제, 변형시키는 것이 가능하기 때문이다.

 

 

3.  SetGID

 

SetGID는 SetUID와 유사한 기능을 가진다. 다만 폴더와 파일의 소유 계정이 아니라 소유 그룹 권한을 빌려온다는 차이점이 있다. SetGID는 숫자로 권한 부여 시, 맨 앞자리에 2를 입력하면 된다. 

 

 

4.  Sticky bit

 

Sticky bit는 앞의 SetUID/Set GID와는 조금 상반된 특징을 가진다. 소유 계정의 폴더에 SetUID/GID가 붙어있는 경우, 해당 폴더는 타 사용자나 그룹이 내부 파일을 생성/변경/삭제하는 것이 불가능하지만, Sticky bit는 다른 계정의 폴더 내에도 내 계정으로 된 파일을 집어넣는 것이 가능하도록 만들어준다. 

 

Sticky bit는 other 권한의 마지막 자리에 알파벳 't'가 부여되며, 숫자 권한으로 나타낼 경우, 맨 앞자리에 1이 입력된다. 

 

 

그러나 SetUID / Set GID와는 다르게, 실행 권한과 수정 권한을 모두 부여하는 개념이 아니기 때문에, 타 사용자가 다른 사용자 계정 소유의 폴더 내에 파일을 만들기 위해서는 other 권한에 w와 x가 동시에 부여되어 있어야 한다. 

 

w 권한이 존재하지 않는 경우

 

w 권한이 존재하는 경우

sticky bit를 이용하면, 여러 사용자가, 자신의 계정이 아닌 폴더에도 자기 소유의 폴더나 파일을 올려 보관할 수 있게 된다. 이 때, 다른 사용자의 폴더에 대한 생성/변경/삭제 권한은 주어지지 않으며, sticky bit가 붙은 폴더의 소유자만이 타 사용자의 관리 파일을 지울 수 있는 권리를 가진다.

 

타 계정은 sticky bit가 적용된 폴더 내의 다른 계정 파일을 수정할 수 없다.

 

sticky bit 폴더의 소유주는 내부 파일을 수정하는 것이 가능하다.


SetUID와 SetGID, 그리고 Sticky bit를 사용할 때 주의해야 할 점이 있는데, 반드시 x 권한이 부여되어 있어야 제대로 작동한다. 만약, x 권한이 부여되지 않은 상태에서 이들 권한을 부여하는 경우, SetUID/SetGID/Sticky bit를 나타내는 알파벳 권한이 모두 대문자로 출력된다. 

 

 

당연히 SetUID/SetGID/Sticky bit의 경우 실행 권한이 있어야만 정확히 작동되는만큼, 이들 bit 적용 후 알파벳 권한이 대문자로 출력된다면 제대로 기능하지 못한다.

 

 

FIN.

 

반응형

댓글