Linux는 여러 사람이 사용할 수 있는 다중 사용자 시스템이다.
여러 사용자가 한 시스템을 사용하다보니 특정 파일, 프로그램, 디렉토리 등을 허가된 사용자만 사용할 수 있게 제한을 두어야 할 때가 있다.
즉, 특정 파일에 대한 권한 관리가 필요한 것이다.

ls -l 명령어를 통해 파일, 디렉토리의 권한을 확인할 수 있다.
파일 목록 제일 앞의 rwxrwxrwx는 해당 파일의 권한을 나타낸 것으로 3글자 단위로 소유자, 소유 그룹, 그 외 기타 사용자의 해당 파일에 대한 권한을 나타낸다.
r, w, x 각 알파벳이 가리키는 권한은 대략적으로 다음과 같다.
각 실행권한의 구체적인 내용은 해당 요소가 파일인지, 디렉토리인지에 따라 달라진다.
파일에서 읽기 권한(r)은 해당 파일을 읽을 수 있는지를 나타낸다.
예를 들면, cat 명령어를 통해 해당 파일을 읽을 수 있다는 것이다.

vi 명령어를 통해 해당 파일을 열어보면 readonly 상태로 vi 에디터 창이 열린다.
파일에서 쓰기 권한(w)은 해당 파일을 수정할 수 있는지를 나타낸다.
예를 들면, vi 명령어를 통해 해당 파일을 수정할 수 있다는 것이다.
파일에 쓰기 권한이 있으면 읽기 권한만 있을 때와 달리 vi 명령어를 통해 해당 파일을 열었을 때 readonly 메시지가 없어져있다.
파일에서 실행 권한(x)은 해당 파일을 실행할 수 있는지를 나타낸다.
디렉토리의 권한을 알아보기 전에 디렉토리의 권한은 디렉토리 entry, inode와 관련이 있기 때문에 directory entry와 inode에 대해 알아보아야 한다.
directory entry와 inode에 대한 자세한 내용은 File System의 ext를 살펴보자.
https://velog.io/@ymail837/%EC%9D%BC%EB%B0%98-File-System
(File System post)
개인적으로 파일의 권한은 직관적이었던 것에 반해 디렉토리의 권한은 각 권한이 직관적이지 않아서 햇갈린다.
디렉토리에서 읽기 권한은 해당 디렉토리 안에 어떤 파일이 들어있는지 확인할 수 있는지를 나타낸다.
예를 들면, 읽기 권한이 있다면 ls 명령어를 통해 해당 디렉토리 안에 어떤 파일이 있는지 확인할 수 있다는 것이다.
구체적인 작동 원리를 설명하자면, 읽기 권한은 directory entry을 들여다봐서 파일 list를 확인할 수 있는 권한이다.
디렉토리에서 쓰기 권한은 해당 디렉토리의 파일 list를 변경할 수 있는지를 나타낸다.
해당 디렉토리의 파일 list를 변경할 수 있다는 것이 정확히 무엇을 의미하는지 알아보자

위의 스크린샷은 test 디렉토리와 그 안에 이런저런 파일, 디렉토리를 만들고 ls -l 명령어를 통해 해당 디렉토리 안의 파일들을 나타낸 것이다. 디렉토리의 쓰기 권한이 있다는 것은 ls 명령어가 출력하는 파일 list를 변경할 수 있다는 것이다.
구체적인 작동 원리를 설명하자면, 쓰기 권한은 디렉토리 entry를 수정할 수 있는 권한이다.
단, 실행 권한이 없으면 수정 권한이 무쓸모가 된다. 실행 권한이 없다면 inode에 접근할 수 없기 때문에 파일 생성, 제거 등을 할 수 없고 근본적으로 디렉토리의 파일 list를 변경할 수 없다.
단순히 파일 목록을 변경하지 않는 선에서 해당 디렉토리 안의 내용을 이곳저곳으로 옮기는 것은 가능하다.

test/mvtest1 디렉토리에 mvtest 파일이 있다.

test 디렉토리에 쓰기 권한이 없음에도 불구하고 mvtest을 test/mvtest2로 이동시킬 수 있다.
왜냐하면 mvtest 파일을 test/mvtest1에서 test/mvtest2로 이동시키는 것은 test 디렉토리 입장에서 볼 때 ls를 사용하면 나오는 파일 목록이 변경시키지 않기 때문이다.
디렉토리에서 실행 권한은 해당 디렉토리에 접근할 수 있는지를 나타낸다.
예를 들면, 실행 권한이 있다면 cd 명령어를 통해 해당 디렉토리에 접근할 수 있다는 것이다.
만약 디렉토리에 실행 권한이 없다면 해당 디렉토리 안의 파일을 실행, 삭제, 이동 시키는 것도 막힌다. 해당 파일을 실행, 삭제, 이동시키기 위해서는 먼저 디렉토리에 접근해야 하기 때문이다.
구체적인 작동 원리를 설명하자면, 실행 권한은 파일 이름을 directory entry에 대응시켜 해당 파일 이름에 해당하는 inode를 알아내고 접근할 수 있는 권한이다.
파이썬에서 디렉토리 자료구조에서 key 값에 대응하는 value 값만을 얻어낼 수 있는 것 처럼 directory entry의 모든 key(파일 이름 목록)을 알아낼 수는 없다.
파일이나 디렉토리의 삭제, 이동 권한은 그 파일의 소유자와 상관이 없다.
파일이나 디렉토리의 삭제, 이동 권한은 그 파일의 부모 디렉토리의 권한과 상관이 있다.
리눅스에는 rwx 3개의 권한 말고도 3개의 특수 권한이 더 있다.
setuid/setgid는 어떤 파일을 실행할 때 해당 파일의 소유자, 소유그룹의 권한으로 실행하게 해준다.
s로 표현되며 해당 파일의 실행 권한(x)이 있을 경우 소문자 s로, 실행 권한(x)이 없을 경우 대문자 S로 표현된다.
setuid/setgid는 어떤 계정이든 사용할 수 있지만 해당 프로그램을 사용하기 위해서는 상위 권한이 필요한 경우에 사용한다. setuid/setgid를 사용하는 대표적인 예가 passwd 명령어이다. passwd 명령어의 경우 어떤 계정이든지 자기 계정의 비밀번호를 설정할 수 있어야 함과 동시에 비밀번호를 설정하는 과정에서 root 권한이 필요한 /etc/shadow 파일을 수정해야 한다. 이런 경우 setuid/setgid를 사용한다.
sticky bit는 해당 디렉토리에 파일, 디렉토리 생성은 누구나 가능하지만 삭제, 변경은 소유주만 가능하게 하는 역할을 한다.
t로 표현되며 setuid/setgid와 마찬가지로 해당 디렉토리의 실행 권한(x)이 있는 경우 소문자 t로, 실행 권한(x)이 없을 경우 대문자 T로 표현된다.
언듯 봐서는 others의 wx권한과 크게 달라보이지 않는다. 하지만 결정적인 차이점은 삭제, 변경은 소유주만 가능하다는 점이다. others의 wx권한은 해당 디렉토리에서 소유자와 상관없이 생성, 삭제, 변경이 가능하다.
sticky bit를 사용하는 대표적인 예시로는 /tmp 디렉토리가 있다.
root(super user)의 권한은 시스템을 제약 없이 조작할 수 있는 권한이다.
아무 계정이나 sudo 명령어를 이용해 root 권한으로 명령어를 실행할 수 있도록 하면 보안에 심각한 문제를 야기할 수 있다.
따라서, Linux는 etc/sudoers 파일을 통해 sudo 명령어로 root 계정에 접근할 수 있는 계정을 관리하고 있다.
sudo 명령어를 이용하면 root 유저의 권한으로 명령어를 실행할 수 있다.
나는 일시적으로 root 권한을 사용할 수 있는 것이 sudo의 모든 기능인 줄 알았다.
하지만 이 기능은 sudo 기능의 일부분에 불과하다.
sudo의 정확한 기능은 다른 계정의 권한으로 명령어를 실행할 수 있도록 하는 것이다.
앞서 설명했듯이, sudo는 다른 계정의 권한으로 명령어를 실행할 수 있도록 해준다.
어떤 계정이 sudo를 통해 어떤 권한을 사용할 수 있는지는 etc/sudoers 파일에 적혀져있다.

위의 스크린샷은 /etc/sudoers 파일의 일부분을 가져온 것으로 구조는 아래와 같이 되어있다.
user/group hosts=(allowed users:allowed groups) allowd command
user/group : sudo 명령어를 사용하는 user 혹은 group, %로 시작하면 group을 나타내는 것이다.
allowed users : user가 sudo를 통해 사용할 수 있는 user의 권한
allowed groups : user가 sudo를 통해 사용할 수 있는 group의 권한
allowed command : user가 다른 계정의 권한을 사용해서 실행할 수 있는 명령어
구체적으로 일반 계정이 root 권한을 사용하는 과정을 알아보자
Linux를 처음 실행할 때 ymail8372라는 이름의 계정을 생성했다고 해보자.

ymail8372는 27(sudo) 그룹에 속해 있다.

sudo 그룹에 속한 그룹은 root를 포함한 모든 계정의 권한을 사용할 수 있다. 따라서, ymail8372는 root의 권한을 사용할 수 있는 것이다.
참고로, ALL=(ALL:ALL)와 같이 root를 포함한 모든 user의 권한을 사용할 수 있다고 해도 다른 사용자가 소유하고 있는 파일에 접근할 때 기본적으로 해당 파일의 소유자 권한이 아닌 root의 권한을 사용한다.
sudo -u Goyo ls /home/Goyo
특정 user의 권한을 사용하기 위해서는 sudo -u 옵션을 사용하여야 한다.
앞서 설명했듯 root의 권한과 root 권한을 사용할 수 있도록 해주는 sudo 명령어는 매우 중요하다.
따라서 /etc/sudoers는 보안을 매우 신경써야 하는 파일이다. 그렇기 때문에 /etc/sudoers 파일의 권한을 보면 root조차 직접 /etc/sudoers 파일을 직접 수정할 수 없게 되어있다.

대신 visudo라는 명령어를 사용하면 /etc/sudoers 파일을 수정할 수 있다.
앞서 살펴본 내용을 통해 sudo가 단순히 root의 권한을 사용할 수 있도록 하는 것이 아니라 다른 계정의 권한을 사용할 수 있도록 하는 명령어라는 것을 알 수 있었다.
그렇기 때문에 나는 sudo가 super user do의 약자가 아니라 substitute user do의 약자라고 생각한다.