{ 'setgid', 'setuid', 'sudo' }의 개념좀 설명좀 부탁합니다

{ ‘setgid’, ‘setuid’, ‘sudo’ }의 개념좀 설명좀 부탁합니다.


{ ‘setgid’, ‘setuid’, ‘sudo’ }의 개념이 이해가 안가요. [일단 기본적인 권한에 대한건 이해가 됩니다.]


일단 권한에 대해 먼저 이해하셔야 합니다.

파일에 대한 접근권한은
ls 파일명의 명령에 의해
r(4:읽기),w(2:쓰기),x(1:실행/목록보기),t(1:스티키비트), s(1:setuid,setgid)로 표시됩니다.
그리고 각 권한은 소유자/소유그룹/다른사용자 의 세가지에 대해 순서대로 표시됩니다.

ls /usr/bin/passwd를 실행하면
-rwsr-xr-x 1 root root 47064 7월 27 02:32 /usr/bin/passwd*
rws가 소유자에 대한 권한
r-x가 소유그룹에 대한 권한
r-x가 다른 사용자들에 대한 권한입니다.
이때 s가 setuid비트가 표시된 것입니다.

owner(소유자)는 파일의 소유자로 파일에 대한 모든 권한을 행사할 수 있습니다.
someone이라는 사람이
/usr/bin/touch /etc/passwd 이라는 명령을 실행할 경우,
/usr/bin/touch 라는 실행파일의 소유자는 root이지만, 실행시 root권한이 아닌,
someone의 권한으로 실행됩니다. 하지만, /etc/passwd라는 파일은
관리자외에 수정이 안되게 권한이 설정되어 있습니다.

여기서 문제가 발생합니다.
일반 사용자는 암호를 변경하기 위해 passwd라는 명령을 실행하게 되는데,
이 명령은 /etc/passwd파일에 접근하고, 수정을 해야만 됩니다.
일반 사용자가 passwd를 실행하면 그 사용자 권한으로 실행되기에,
/etc/passwd파일에 쓰기 권한이 없어, 암호변경에 실패하게 되겠죠?
그래서 필요한 것이 setuid나 sudo등의 일시적 권한 획득입니다.

setuid 비트라는 것은, 실행자가 해당 파일을 실행할 경우, 소유자의 권한을 획득함을 의미하고,
소유자가 이를 허락하기 위해 setuid비트를 설정합니다.
setuid비트를 설정하기 위해서는
chmod +s 파일명 혹은 chmod 4755 파일명 이런 식으로 설정하실 수 있습니다.
여기서 4는 setuid 비트이고, 2는 setgid, 1은 sticky비트입니다.
7은 4+2+1로 읽기,쓰기,실행의 권한을
5는 4+1로 읽기,실행 권한을 의미하고,
첫번째 4는 비트설정, 두번째 7은 사용자 권한, 5는 그룹권한, 5는 다른사용자에 대한 권한입니다.

위의 설명과 같은 이유로 /usr/bin/passwd파일에 setuid비트가 설정되어 있는 것입니다.

setgid는 group에 대해 적용하는 것이구요.
소유자가 허가한 것이기에, 이 프로그램을 실행할 경우, 소유자의 권한을 획득하지만,
그에 대해 암호인증등이 필요하지 않습니다.
그래서 보안상 문제가 발생할 수 있기에, setuid비트는 아주 신중히 다뤄져야 합니다.

sudo 및 su는 소유자와 관계없이, 원하는 사용자의 권한을 얻기 위해,
암호 인증을 요구합니다.
인증을 통과하는 경우, 일정 시간동안 해당 사용자의 권한을 유지합니다.
그 일정 시간이라는 것은, 세션의 유지시간이고, 세션이라는 것은 su로 로그인했을때 실행되는 쉘이 실행되는 동안을 의미합니다.

su는 해당 사용자로 로그인한 것과 같이 처리됩니다.
sudo는 로그인하는 것이 아니라, 프로그램을 실행할 때 일시적으로 권한을 획득할 때 사용합니다.
그렇지만, 대상 명령이 종료된 후에도 일정시간 안에, 명령을 실행할 경우,
암호를 되묻지 않습니다.
/etc/sudoers파일에 sudo권한에 대한 설정이 존재합니다.

추가로, sticky비트에 대해서 설명을 드리자면,
sticky비트는 restricted deletion flag와 같이 사용됩니다.
sticky비트는 파일에 적용되는 경우이고, restricted deletion flag는 디렉토리에 적용되는 경우입니다.
sticky비트가 설정되면, 파일을 스왑공간에 보존하여 빠르게 실행됩니다.

restricted deletion flag에 대해서 설명을 드리겠습니다.
sudo mkdir t
sudo chmod 1777 t
이렇게 명령하게 되면,
t라는 디렉토리의 소유자는 root가 됩니다.
그리고 t디렉토리는 모든 사용자가 읽기/쓰기/실행을 할 수 있게 됩니다.
cd t
touch kkk
someone이라는 사용자가 이렇게 명령했을 경우, 이 명령은 성공적으로 실행되며
t/kkk라는 파일이 생성되고, 소유자는 someone이 됩니다.
그런데, otheruser라는 사람이 kkk를 지우고자 한다면,

원래는 otheruser라는 사람도 t디렉토리에 대해 삭제 권한을 가지고 있기 때문에,
kkk를 삭제할 경우, 확인하는 절차와 함께 삭제할 수 있게 됩니다만,
restricted deletion flag에 의해, 삭제할 수 없게 됩니다.
파일에 대한 권한을 만족해야 삭제할 수 있게 제한되는 것입니다.

그래서, 어떤 디렉토리에 모든 사용자가 권한을 가지는 경우, 파일을 생성한 파일 소유자만
해당 파일을 삭제하게 할 경우, 아주 유용합니다.

"파일을 스왑공간에 보존하여 빠르게 실행"에 관한 질문.


"파일을 스왑공간에 보존하여 빠르게 실행"라고 했는대요. 이때 실행이 다 끝나면 스왑공간에서 제거될까요?
"파일을 스왑공간에 보존하여 빠르게 실행"의 경우를 예를들어서 설명좀 부탁합니다.


근데 sticky 비트는 잘 사용되지 않습니다.
preload라는 프로그램이 있고, 스왑공간에 저장하는 것 자체도 속도를 잡아먹기 때문이죠.
저는 스왑보다는 캐시가 효율적이라고 보고 있습니다.

스왑공간에 저장한다는 것은, 메모리의 상태를 저장한다는 것으로,
프로그램이 종료된 후, 스왑공간에 저장해 둠으로써,
프로그램을 읽어들일때, 메모리 배치등을 빠르게 할 수 있다는 것이죠.
또한 파일조각이 분산되었을 경우를 가정하면, 스왑에서 순서적으로 배치되어 있으면,
디스크에서 읽는 속도가 더 빠르게 되죠.

개인적으로는 sticky비트는 별로 추천하고 싶지 않습니다.
오래된 개념이거든요.

알겠읍니다.