Linux는 대표적인 Multi-User OS이다. 이런 환경에서 중요한 것은 특정 파일이 어떤 User(혹은 Group)에 의해 관리되고 있는가이다.
이런 "파일을 소유 및 관리하고 있는 User(Owner) 혹은 Group"을 파일 소유권이라고 한다.
파일 소유권은 User와 Group으로 구성되어 있다.
User는 여러 그룹에 동시에 속할 수 있으며 파일 1개는 1개 유저와 1개 Group만 Ownership으로써 가질 수 있다.
Root 계정(관리자 계정)은 Super User로써 서버에 존재하는 모든 파일에 대하여 소유권을 가지고 있다.
파일 소유권이 파일의 주인을 명시하는 거라면 허가권이란 특정 파일에 대하여 누가 어느 정도의 권한으로 접근할 수 있는지를 나타내는 것이다.
파일의 주인인 User와 Group만 지정했던 소유권과는 달리 허가권은 서버 내에 존재하는 모든 User 및 Group들에게 설정되어야 하는 값이므로 "User(Owner), Group, Other(World)" 총 3개로 구성되어 있다.
각 보안 그룹에 줄 수 있는 권한은 Read(r), Write(w), Execution(x) 실행 권한이 있다.
Read와 Write는 직관적으로 느낌이 올 것이며 Execution은 "실행" 권한으로 파일이 실행 파일일 경우 특정 User가 그 파일을 실행할 수 있는지 여부에 대한 Permission이다.
Root 계정(관리자 계정)은 모든 파일에 대하여 모든 권한(rwx)를 가지고 있다.
ls -l
명령어를 통해 파일 및 디렉터리의 File Permission & Ownership을 알 수 있다.
즉 아래와 같은 구조를 가지는 것이다.
[File Type][File Permissions] [Link Count] [Owner] [Group] [Size] [Mtime] [File Name]
그렇다면 File Type과 Permission이 어떤 의미를 가지고 있는지 좀 더 자세히 알아보자.
d
: Directory-
: 일반 파일l
: Symbolic Link Files
: Unix domain Socketp
: Named pipec
: Character device fileb
: Block device file출처 : https://danielmiessler.com/study/unixlinux_permissions/
이전에 말했듯 File Permission은 "User(Owner), Group, Other"로 구성되어 있고 각자 Read(r), Write(w), Execute(x) 권한을 가질 수 있다. Linux에선 이 둘을 합쳐 File Permission을 위 사진과 같이 표현한다.
(참고로 Owner과 Group은 파일의 Ownership(소유권)을 기준으로 판단한다. 즉 위 Terminal 사진에서 djjlim 계정이 아닌 다른 계정들은 모두 Other인 것이다)
일단 모든 File Permission은 각 필드마다 영문자로 3글자 혹은 숫자 0 ~ 7까지의 값을 가질 수 있다.
영문자는 "r, w, x, -"이고 각 영문자는 "r : 4", "w : 2", "x : 1", "- : 0"의 수와 매칭된다.
rwx가 4,2,1과 매칭되는 이유는 간단한데, 바로 2진법을 생각하면 된다.
이진법으로 "abc"라는 값이 존재할 경우 a는 4, b는 2, c는 1의 값을 가진다.
"rwx" 또한 마찬가지인데, 각 필드에 대한 Permission을 기록할 때 "rwx" 순으로 기록하기 때문에 각각 4, 2, 1 숫자와 매칭되는 것이다.
"-"는 해당 권한을 가지고 있지 않다라는 의미를 가지며 0으로 매칭되는 것이다.
예시 몇개를 통해 Permission 기록 방법을 확실히 알아보자.
추가로 파일을 처음 만들었을 떄 Default Permission은 755(rwxr-xr-x)이다.
(r, w, x이외에도 "s"라는 추가값이 존재하기는 하지만 이는 Group과 User에 대해 더욱 자세히 알아야 하므로 나중에 다시 설명하겠다)
chown [Options] [USER][:GROUP] 파일
위 명령어를 입력할 경우 파일에 대한 Owner는 입력한 User로, 만약 :GROUP을 입력했다면 Group 또한 입력한 group으로 변경될 것이다.
추가로 User를 입력하지 않고 :GROUP만 입력할 경우 Owner Group만 변경시킬 수도 있다.
chmod [Option] MODE FILE
chmod는 특이하게 Option 뿐만이 아닌 "MODE"라는 Parameter가 추가적으로 존재한다.
파일에 적용할 Permission을 어떻게 설정할 것인지에 대한 문자열 생성 부분이다.
r
: 읽기 권한w
: 쓰기 권한x
: 실행 권한+
: Permission 추가-
: Permission 제거=
: 현재 모드로만 권한 지정u
: Userg
: Groupo
: Othera
: allMode Parameter는 위에 나온 문자나 기호들을 조합하여 권한을 부여하는 것이다.
일단 필자가 가장 많이 활용하는 것은 +755처럼 그냥 원하는 Permission을 8진수 형식으로 바로 주입해주는 것이다.
사용 방식에 따라 "g+x"(파일이 속한 Group에 실행 권한 추가), "a=r"(모든 사용자에게 읽을 수 있는 권한만 줌), ug-wx(Owner과 Group에게 Write 및 Execution 권한 뺏음) 처럼 사용할 수도 있을 것이다.
Linux에서 umask란 특정 디렉토리에 파일 및 디렉토리를 생성할 경우 권한을 자동으로 설정하기 위한 명령어이다.
umask 명령어를 통해 mask 값을 설정하여 설정한 디렉토리의 하위 파일들에 대한 Default 권한을 설정할 수 있다.
사용법은 아래와 같다.
# Umask 값을 문자로 설정
umask u=rwx,g=rw,o=r
# Umask 값을 Octet(8진수)로 설정
umask 022
# Umask 확인(8진수)
umask
# Umask 문자로 확인
umask -S
여기에서 헷갈리지만 무조건 알아야 하는 개념이 있는데 바로 8진법으로 Umask 값을 설정하는 방식이다.
일반 파일의 Permission은 최대 666, 디렉터리 파일의 Permission은 최대 777로 되어 있다.
이 떄 "최대 Permission - umask"의 값이 파일의 Default Permission이 되는 것이다.
예를 들어 Umask값이 002로 되어 있을 경우 일반 파일을 생성하면 666-002 = 664, 즉 rw-rw-r-x의 Permission을 가질 것이며 디렉토리의 경우 777 - 002 = 775, 즉 rwxrwxr-x의 권한을 가질 것이다.
그렇다면 간단하게 사용해보며 자세히 알아보자.
처음에는 umask가 002였다. 따라서 일반파일은 664(rw-rw-r--), 디렉토리는 775(rwxrwxr-x)의 권한을 가지고 생성되었음을 확인할 수 있다.
이후 umask를 022로 바뀐 뒤 새로 생성한 일반파일은 644(rw-r--r--), 디렉토리는 755(rwxr-xr-x)의 권한을 가지고 생성되었음을 알 수 있다.