Tuesday, March 20, 2018

CentOS 6.6 리눅스 기초] 9. 파일 권한


안녕하세요. 썬구루입니다. 이번 게시물에서는 파일 권한(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진수 표기법이 있다. 아래와 같은 표를 보고 표기법을 알아보자.

문자
2진수
8진수
권한의미
 ---
 000
 0
권한없음
 --x
 001
 1
실행
 -w-
 010
 2
쓰기
 -wx
 011
 3
쓰기, 실행
 r--
 100
 4
읽기
 r-x
 101
 5
읽기, 실행
 rw-
 110
 6
읽기, 쓰기
 rwx
 111
 7
읽기, 쓰기, 실행


■ 파일 권한 변경 chmod 명령

파일 권한을 설정하기 위해 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