이번에는 일반적인 서버 환경에서의 권한(permission)에 대한 이야기를 해 볼까 합니다. 리눅스 계열의 서버 환경에서 파일 permission에 대한 부분은 아주 중요한 부분입니다. 개인용 PC용 OS인 Windows 와 MacOS 에서는 이 권한에 대한 부분을 크게 신경쓰지 않고 사용하게 되는데, 이처럼 화면이 있는 OS의 경우 복수의 사용자가 동시에 접근하여 프로그램을 실행하는 것이 불가능한 상태이고, 따라서 현재 구동되는 프로그램은 화면에 보이는 그 사용자가 됩니다. 이렇게 되면 실행하는 모든 프로그램(화면이 있는 것이든 background에서 실행되는 서비스 형태이든)들은 모두 내가 실행 권한이 있거나 없거나가 결정되어 있는 상태입니다.

결국 모든 실행된 프로그램과 그 프로그램이 생성한 파일 등은 모두 내 소유물이 되고, 내가 접근 가능한 것이 되기 때문에 권한은 큰 문제가 되지 않고 고려 대상도 아닙니다. 하지만 linux 등 서버 환경에서는 다수의 사용자가 로그인, 프로그램을 실행하는 것이 가능하고 따라서 여러 사용자가 동시에 특정 파일을 접근한다거나 하는 부분이 실재로 많이 일어나게 됩니다.

간단한 예로, log 파일을 이야기할 수 있습니다.

A라는 사용자가 실행한 프로그램에서 생성한 log 파일은 B라는 사용자가 구동한 프로그램에서 읽지 못하는 것이 일반적입니다. 뒤에서 설명하겠지만 두 사용자가 같은 그룹에 속해 있으면서 그룹의 읽기 권한이 없거나, 다른 그룹에 속해 있는데 others에 대한 읽기 권한을 주지 않은 경우에는 파일을 읽는 것이 불가능합니다.

이러한 점들에 착안해서 파일 및 디렉토리 권한에 대한 이야기를 조금 해보겠습니다.

권한(permission)

권한들에 대해 보려면 터미널에서 ls -al 을 입력하면 됩니다. ll 도 결국 저 명령어를 축약에서 지정해 놓은 것입니다.

편의상 스크린샷은 MacOS 의 것을 사용하겠습니다.

위 스크린샷의 첫 줄을 맨 앞부터 하나하나 설명하면 다음과 같습니다.

  • -rw-r--r-- : 이 부분이 권한을 나타내는 부분입니다.

  • 1 : hard link 의 개수 1

  • jonghunpark : 파일의 소유자 id 입니다.

  • staff : 파일의 소유자 group id 입니다.

이 내용에 대해서 상세히 보면 파일명 README.md 에 대한 권한은 -rw-r--r-- 입니다. 이 것이 가리키는 정보는 다음과 같습니다. 총 10자리 중에서 1, 3, 3, 3 칸으로 나누어 아래와 같이 설명합니다.2

  • (1) - : 디렉토리 여부를 표시합니다. 만약 디렉토리인 경우 이 부분이 d로 표시됩니다.

  • (3) rw- : 소유자(User) 에 대한 권한을 표시합니다. 소유자, 즉 생성한 사람은 읽기와 쓰기에 대한 권한을 가지고 있습니다.3

  • (3) r-- : 그룹(group) 의 권한을 표시합니다. 파일 생성자의 그룹에 대해서 읽기 권한을 가지고 있습니다. 4
  • (3) r-- : 다른사람(others) 의 권한을 표시합니다. 그룹과 마찬가지고 읽기 권한만 가지고 있습니다.

위 내용을 숫자로 표현하는 경우가 많이 있습니다. 위 권한을 숫자로 표현하면 644 입니다.

권한의 변경

만약 이렇게 주어진 권한을 변경하려면 linux 기반 시스템에서 chmod 라는 명령어를 사용합니다.

$ chmod {권한} {대상파일이나 디렉토리}

예를 들어, 위 파일에 대해서 권한을 모두에게 모든 권한을 허용하려면 아래와 같이 입력합니다.

$ chmod 777 README.md

chmod 명령어 뒤에 오는 권한은 위와 같이 숫자 형태여도 되고, 문자 형태여도 됩니다. 즉 chmod rwxrwxrwx README.md 라고 실행해도 동일한 결과를 가져옵니다.

대상이 되는 파일이나 디렉토리는 여러 개를 파라미터로 할 수 있습니다. 예를 들어 위 경우에서 README.md 파일과 Rakefile 이라는 두 파일을 수정하려면 chmod 777 README.md Rakefile 이라고 띄어쓰기로 구분하면 됩니다.

UMASK

MacOS 에서 파일을 하나 생성해 보겠습니다.

위에서는 touch 명령어와 mkdir 명령어를 통해 파일과 디렉토리를 생성하였습니다. 그런데 생성하고 난 뒤에 permission 이 기본적으로 설정되어 있는 것을 발견할 수 있습니다. 파일에는 -rw-r--r--, 디렉토리에는 drwxr-xr-x 로 되어 있습니다.

이렇게 linux 계열 시스템에는 파일 및 디렉토리 생성에 있어서 기본 권한을 잡아주는 것이 존재합니다. 그것이 바로 UMASK 입니다. 4

umask 값은 777에서 권한을 뺀 값입니다. 다시 말하면 777에서 umask 값을 뺀 것이 권한 값이 될 것입니다. 이러한 umask 값은 bash_profile 이나 .profile 같은 사용자 기본 설정 부분에서 잡아주도록 설정되어 있기도 합니다. umask 값의 적용은 일반적으로 디렉토리에 대해서는 그대로 적용되고, 파일에 대해서는 111을 뺀 값이 그 권한이 됩니다.

  • root 사용자에 대해서 umask 기본값은 022 입니다. 따라서 디렉토리에 대한 권한은 755가 되고, 파일에 대해서는 644가 됩니다.

  • 일반 사용자에 대해서 umask 기본값은 002 입니다. 따라서 디렉토리에 대한 권한은 775가 되고, 파일에 대해서는 664가 됩니다.

  • 디렉토리에 대한 기본 permission은 777이고, 파일에 대한 기본 권한은 666입니다.

더욱 정확하게 이야기하자면 기본 permission이 파일은 666, 디렉토리는 777이라고 보면 됩니다(그러니 위 설명에서처럼 111을 빼라고 하는 것입니다). 이렇게 되어있는 기본 permission에 umask 값을 빼면 그 것이 기본 permission이 됩니다.

MacOS에서는?

서버 환경에서는 /etc/bashrc 파일이나 /etc/profile 에 아래와 같이 설정되어 있을 것입니다.

umash 022

그러나 MacOS 에서는 이 값이 보이지 않습니다.

맥에서는 다음과 같이 설정할 수 있습니다.

사용자 앱의 umask

관리자로 로그인한 뒤 터미널에 다음 명령을 입력하여 nnn을 027 또는 002와 같은 umask 값으로 대체합니다. 이 명령은 열려 있는 모든 앱에 대해 사용자의 umask를 설정합니다. 여기에는 명령어 라인에서 접근하는 앱과 이러한 앱이 생성하는 새 파일도 포함됩니다. 이 명령을 입력한 후 Mac을 재시동해야 할 수 있습니다.

sudo launchctl config user umask nnn

터미널이 ‘구성을 쓸 수 없음: 해당 파일 또는 디렉토리 없음’이라고 응답하는 경우 시동 디스크에 /private/var/db/com.apple.xpc.launchd/config 폴더가 있는지 확인합니다. 구성 폴더가 없는 경우 다음 명령을 입력하여 구성 폴더를 생성한 후 다시 시도합니다.

sudo mkdir -m 755 /private/var/db/com.apple.xpc.launchd/config

시스템 프로세스의 umask

관리자로 로그인한 뒤 터미널에 다음 명령을 입력하여 nnn을 027 또는 002와 같은 umask 값으로 대체합니다. 이 명령은 시스템 컨텍스트에서 실행되는 모든 데몬에 대해 사용자의 umask를 설정합니다. 시스템 소프트웨어에서 사용하는 파일의 권한이 변경될 수 있기 때문에 이 작업은 전혀 권장되지 않습니다. 권한이 너무 제한적이면 소프트웨어가 작동하지 않을 수 있으며, 권한이 너무 개방되어 있으면 보안 문제가 발생할 수 있습니다. 이 명령을 입력한 후 Mac을 재시동해야 할 수 있습니다.

sudo launchctl config system umask nnn

터미널이 ‘구성을 쓸 수 없음: 해당 파일 또는 디렉토리 없음’이라고 응답하는 경우 시동 디스크에 /private/var/db/com.apple.xpc.launchd/config 폴더가 있는지 확인합니다. 구성 폴더가 없는 경우 다음 명령을 입력하여 구성 폴더를 생성한 후 다시 시도합니다.

sudo mkdir -m 755 /private/var/db/com.apple.xpc.launchd/config

출처 및 참고자료

  1. 하드 링크(hard link)란, Windows 에서의 바로가기 같은 개념이라고 할 수 있는데, 해당 파일에 대한 링크를 생성하여 꼭 그 위치가 아니어도 그 파일을 읽거나 실행하는 데 활용됩니다. 

  2. 여기서 이야기하는 3자리의 문자는 순서대로 읽기(read, r), 쓰기(write, w), 실행(execute, x)를 나타냅니다. 이를 2진수로 표현한 뒤 10진수로 변환하면 각각 순서대로 2^2, 2^1, 2^0 에 해당하여 모든 권한을 가지게 되면 2^2 + 2^1 + 2^0 = 7 이 됩니다. 

  3. 진수 표현으로는 2^2 + 2^1 = 6 이 되어 이 값은 6입니다. 

  4. 여기서는 일반적인 경우에 대해서만 이야기하겠습니다. 만약 본인이 사용하는 ubuntu, centos 등 OS에 따른 상세한 부분을 확인하고자 한다면 해당 부분을 꼭 찾아보시기 바랍니다.  2


Leave a comment