안녕하세요. 썬구루입니다. 이번 게시물에서는 파일 권한(File Permission)에 대해 알아봅니다.
■ 파일 권한
어떠한 사용자가 파일 또는 디렉터리에 대해 접근을 했을 때 적용받는 권한이 있습니다. 어떠한 유저는 파일을 수정할 수 있고 다른 유저는 파일 내용 읽기만 가능하고 나머지 유저들은 어떠한 접근도 허용되지 않는 그러한 권한 말이죠.
그러면 리눅스 운영체제에서는 어떻게 파일에 대한 접근 권한이 결정될까요? 파일 권한에 대한 정보는 ls -l 명령에서 한번 확인한 적이 있습니다. 다시 확인한다면 아래 그림과 같습니다.
1). 권한 적용 대상
파일의 inode에 파일 권한에 관련된 mode 정보가 저장되어 있습니다. ls -l 명령의 첫 번째 필드에 파일 권한 정보가 나타나는데 위 그림과 같이 3개 문자씩 그룹화하여 Owner, Group, Other에 대한 권한을 나타낸다. 그래서 권한의 적용 대상은 다음과 같습니다.
권한 적용 대상
|
설 명
|
Owner
| 파일이나 디렉터리를 생성한 사용자, 즉 소유자를 뜻한다. |
Group
| 파일이나 디렉터리 생성 시 생정자의 주 그룹에 대한 GID가 설정된다. SetGID 가 적용된 디렉터리는 일반 디렉터리와 다르게 적용된다. 이것은 특수 권한(Special Persmission)에서 설명한다. |
Other
| 소유자와 그룹을 제외한 나머지 사용자를 뜻한다. |
우측 그림은 사용자가 파일이나 디렉터리 접근 시 권한 처리 절차를 나타내고 있다. root 계정으로 접속하든 일반 사용자 계정으로 접속하든 계정에 대한 UID 값은 반드시 존재한다. 그리고 /etc/passwd 파일에 계정에 관련된 주 그룹(Primary Group) UID 정보 또한 반드시 존재한다.
파일이나 디렉터리에 관련된 inode에는 사용자와 그룹에 관련된 이름을 저장하는 것이 아닌 숫자로 된 ID 값이 저장되어 있다. 우리가 ls -l 명령을 사용하여 파일에 대한 소유자와 그룹에 대한 이름을 볼 수 있는 것 ID 값에 대한 계정 이름이 자동으로 전환되어 보여서이다. 만약 ls -ln 명령을 사용하면 파일에 관련된 UID, GID 정보를 그대로 볼 수 있을 것이다. 사용자가 파일에 접근했을 때 사용자의 UID 값과 GID 값을 가지고 우측 그림처럼 파일 소유자인지 그룹 또는 other 인지를 처리하여 해당 권한이 적용되는 것이다. |
파일 권한
|
파일
|
디렉터리
|
r (read 읽기)
|
파일의 데이터를 읽을 수 있는 권한이다. 파일의 데이터 블록(Data Block)에 데이터가 저장되어 있는데 데이터 블록 내용을 읽을 수 있는 권한이라 보면 된다. | 디렉터리에 저장되어 있는 파일 리스트를 볼 수 있는 권한이다. 디렉터리도 파일이다. 디렉터리에 관련된 데이터 블록에는 파일 이름과 그에 매치되는 Inode 정보가 저장된다. 이것을 볼 수 있는 권한이다. 파일의 데이터를 읽을 수 있는 권한이다. 파일의 데이터 블록(Data Block)에 데이터가 저장되어 있는데 데이터 블록 내용을 읽을 수 있는 권한이라 보면 된다. |
w (write 쓰기)
|
파일의 데이터를 수정하거나 파일을 삭제할 수 있는 권한이다. 데이터 블록에 저장된 데이터를 수정할 수 있는 권한이라 보면 된다. | 디렉터리 이름을 수정하거나 디렉터리를 삭제할 수 있는 권한이다. 이 권한이 있다면 디렉터리에 저장된 파일에 대해 w 권한이 없어도 파일 삭제가 가능하다. 왜냐하면 데이터 블록을 수정할 수 있는 권한이기 때문이다. 그리고 데이터 블록에는 파일 이름과 이에 매치되는 inode 정보가 저장되어 있기 때문에 그 정보를 삭제하는 것이 가능하다. |
x (excute 실행)
|
파일을 실행할 수 있는 권한이다. 실행 가능한 바이너리 파일일 경우 실행 권한만 있으면 실행되지만 실행 가능한 쉘 스크립트 파일일 경우 읽기(r)와 실행(x) 권한이 있어야 실행된다. 왜냐하면 쉘 스크립트는 한 줄 읽고 한 줄 실행되는 인터프리터 언어이기 때문이다. | 디렉터리를 실행할 수 없다. 그러면 이는 어떤 권한인가? 디렉터리로 들어갈 수 있는 권한 그리고 ls -l을 했을 때 디렉터리에 저장된 파일들에 대한 상세 정보를 볼 수 있는 권한을 나타낸다. |
- (no permission)
|
해당 권한 없음을 나타낸다. 만약 x 자리에 - 기호가 있다면 실행 권한 없음을 나타낸다. | 해당 권한 없음을 나타낸다. 만약 x 자리에 - 기호가 있다면 실행 권한 없음을 나타낸다. |
4). 파일 권한 표기법
파일 권한을 표기하는 방법은 문자, 2진수, 8진수 표기법이 있다. 아래와 같은 표를 보고 표기법을 알아보자.
|
파일 권한을 설정하기 위해 chmod 명령을 사용한다.
1) 명령 형식
chmod mode <filename>
2) mode
파일에 할당될 권한을 나타낸다. 문자 또는 8진 표기법을 통해 파일 권한을 설정할 수 있다.
3). 예제
아래는 문자와 8진수를 사용하여 권한을 설정하는 간단한 예이다.
[root@centos01 ~]# mkdir /tmp/test1
[root@centos01 ~]# ls -ld /tmp/test1 drwxr-xr-x. 2 root root 4096 2018-03-21 02:14 /tmp/test1 [root@centos01 ~]# [root@centos01 ~]# chmod 750 /tmp/test1 [root@centos01 ~]# ls -ld /tmp/test1 drwxr-x---. 2 root root 4096 2018-03-21 02:14 /tmp/test1 [root@centos01 ~]# [root@centos01 ~]# chmod o+rx /tmp/test1 [root@centos01 ~]# ls -ld /tmp/test1 drwxr-xr-x. 2 root root 4096 2018-03-21 02:14 /tmp/test1 [root@centos01 ~]# |
■ umask
우리는 정형화된 또는 비정형화된 데이터를 저장하기 파일을 생성한다. 그리고 파일을 효율적으로 관리하기 위해 디렉터리를 사용한다. 하지만 디렉터리는 실제 파일 리스트를 가지고 있는 파일이다. 파일이 생성될 때 권한이 설정되는데 어떻게 해서 그렇게 권한이 설정될까? 그것은 파일 생성 시 umask 값의 영향을 받기 때문이다.
umask는 사용자가 파일이나 디렉터리 생성 시 권한을 제어하기 위해 사용되는 명령이다. 또한 값을 확인하기 위해 명령이 사용될 수 있다. 가끔 책이나 강의에 umask는 마이너스 연산 규칙이 적용된다고 하는데 이는 잘못 설명한 것이다. umask는 XOR 연산을 통해 적용된다. umask 값을 명령을 통해 설정할 수 있지만 보통 사용자 쉘의 초기화 파일 (bash 쉘 같은 경우. bash_profile)에 관련된 정보를 저장하여 사용한다.
대상
|
최초 생성 시 권한 표기
|
파일
|
문자표현 : rw-rw-rw- 2진수 표현 : 110 110 110 8진수 표현 : 666 |
디렉터리
|
문자표현 : rwxrwxrwx 2진수 표현 : 111 111 111 8진수 표현 : 777 |
2). 명령 형식
umask [umask 값]
3). 동작원리
umask 값은 파일 최초 생성 시의 권한과 XOR 연산을 통해 적용됩니다. 전자회로를 배우신 분들은 XOR 연산이라고 하면 쉽게 계산을 할 수 있을 것입니다. 하지만 일반인들에게는 XOR 연산이라면 익숙하지 못할 것입니다. 아래는 XOR 연산의 진리표입니다.
Input A
|
Input B
|
Output
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
0
|
복잡하게 생각할 것 없이 아래의 전자 회로도를 가지고 umask 값을 계산하면 모든 umask 값에 대해 정확하게 계산이 됩니다.
4). 예제
아래는 su 명령을 사용하여 user1 사용자 계정으로 전환, user1의 홈 디렉터리에 존재하는 bash 쉘의 초기화 파일인 . bash_profile에
umask 022
라는 내용을 추가한 후 exit로 종료 후 다시 user1 계정으로 전환 umask 값을 확인하는 예이다.
[root@centos01 ~]# su - user1
[user1@centos01 ~]$ umask 0002 [user1@centos01 ~]$ [user1@centos01 ~]$ grep mask .bash_profile [user1@centos01 ~]$ echo 'umask 022' >> .bash_profile [user1@centos01 ~]$ grep mask .bash_profile umask 022 [user1@centos01 ~]$ exit logout [root@centos01 ~]# su - user1 [user1@centos01 ~]$ umask 0022 [user1@centos01 ~]$ mkdir test1 [user1@centos01 ~]$ touch file1 [user1@centos01 ~]$ [user1@centos01 ~]$ ls -ld test1 file1 -rw-r--r--. 1 user1 user1 0 2018-03-21 02:29 file1 drwxr-xr-x. 2 user1 user1 4096 2018-03-21 02:29 test1 [user1@centos01 ~]$ |
No comments:
Post a Comment