본문 바로가기
리눅스/Part 1 - Learning The Shell

리눅스 기초 | 9-1. 권한

by 객잔주인 2024. 5. 29.

해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다


유닉스 계열 운영체제는 MS-DOS와 다르게 멀티태스킹멀티유저 기능을 지원합니다.

 

이것이 정확히 무엇을 의미할까요? 이는 두 명 이상의 사람이 동시에 컴퓨터를 사용할 수 있음을 의미합니다. 일반적인 컴퓨터는 한 개의 키보드와 모니터를 가지고 있지만 그럼에도 동시에 여러 명이 이용할 수 있습니다. 예를 들어, 컴퓨터가 네트워크나 인터넷에 연결되어 있다면 원격 사용자가 $\texttt{ssh}$(secure shell)를 통해 로그인하여 컴퓨터를 사용할 수 있습니다. 원격 사용자는 커맨드 라인뿐만 아니라 그래픽 애플리케이션도 실행하여 원격 디스플레이에 출력할 수 있습니다. X 윈도우 시스템(X Window System)은 이러한 기능을 기본적으로 지원하는 그래픽 시스템입니다.

 

리눅스의 멀티유저 기능은 최근에 일어난 혁신이 아니라 운영 체제의 설계에 깊이 뿌리내린 특징입니다. 유닉스의 개발 환경을 생각하면 이해할 수 있습니다. 오래 전 개인화 되기 전의 컴퓨터는 매우 크고 비싸며 중앙에 집중되어 있었습니다. 예를 들어, 일반적인 대학 컴퓨터 시스템은 한 빌딩에 있는 큰 중앙 컴퓨터와 캠퍼스 곳곳에 설치된 터미널로 구성되었습니다. 컴퓨터는 다수의 사용자가 동시에 중앙 컴퓨터를 사용해야 했기 때문에 멀티유저 지원이 필수적이었습니다.

 

이를 실용적으로 이용하려면 각 사용자를 서로 보호할 수 있는 방법을 고안해야 했습니다. 즉, 한 사용자가 컴퓨터를 다운시키는 일이나 다른 사용자의 파일에 접근하여 수정하거나 삭제하는 등의 행위를 방지해야 했습니다.

 

이 챕터에서는 시스템 보안의 필수 요소들과 아래의 명령어들을 배워보겠습니다:

  • $\texttt{id}$ - 사용자 ID를 표시합니다
  • $\texttt{chmod}$ - 파일의 권한을 변경합니다
  • $\texttt{umask}$ - 파일의 기본 권한을 설정합니다
  • $\texttt{su}$ - 다른 사용자로서 쉘을 실행합니다
  • $\texttt{sudo}$ - 다른 유저로서 명령어를 실행합니다
  • $\texttt{chown}$ - 파일 소유자를 변경합니다
  • $\texttt{chgrp}$ - 파일 그룹 소유자를 변경합니다
  • $\texttt{passwd}$ - 사용자의 비밀번호를 변경합니다

소유자, 그룹 멤버, 기타 사용자

챕터 3에서 시스템을 탐색했을 때, 예를 들어, $\texttt{/etc/shadow}$와 같은 파일을 보려고 했을 때 문제가 있었던 경험을 할 수 있었을 것입니다:

이 에러 메시지가 나타난 이유는 일반 사용자가 이 파일을 열어 볼 권한이 없기 때문입니다.

 

유닉스 보안 모델(파일 시스템과 사용자 접근 권한을 관리하기 위한 체계)에서 사용자는 파일과 디렉토리를 소유할 수 있습니다. 사용자가 파일이나 디렉토리를 소유하면 사용자는 접근 권한을 제어할 수 있습니다. 사용자는 소유자가 접근 권한을 부여한 그룹(group)의 그룹원이 될 수 있습니다. 그룹에 접근 권한을 부여하는 것에 더해서 유닉스 용어로 월드(world)라고 불리는 모든 사용자에게 권한을 부여할 수 있습니다. 자신의 ID를 보기 위해 $\texttt{id}$ 명령어를 사용합니다.

출력된 결과를 살펴보겠습니다. 사용자 계정이 생성되면 사용자는 숫자 형태의 user ID(uid)를 부여받고 uid는 사용자명에 매핑됩니다. 또, 사용자는 기본 그룹 ID인 primary group ID(gid)를 부여받고 추가적으로 다른 그룹에도 소속될 수 있습니다. 위 예시는 페도라 시스템의 예시입니다. 우분투와 같은 다른 시스템에서는 조금 다르게 보일 수 있습니다:

보이는 것처럼 페도라와 우분투에서 uid와 gid 넘버가 다릅니다. 이는 페도라에서는 일반 사용자의 넘버링을 500부터 시작하고 우분투는 1000부터 시작하기 때문입니다. 또, 우분투 사용자는 더 많은 그룹에 소속되어 있는 것을 볼 수 있습니다. 이는 우분투가 시스템 장치와 서비스의 권한을 관리하는 방법에 따른 차이입니다.

 

이런 정보는 어디서 받아오는 것일까요? 다른 많은 것들과 마찬가지로 몇개의 텍스트 파일에서 옵니다. 사용자 계정은 $\texttt{/etc/passwd}$ 파일에 정의되어 있고 그룹은 $\texttt{/etc/group}$ 파일에 정의되어 있습니다. 사용자 계정과 그룹이 생성되면 이 파일들은 사용자의 비밀번호 정보를 가지는 $\texttt{/etc/shadow}$와 함께 수정됩니다. $\texttt{/etc/passwd}$ 파일은 각 사용자 계정에 대해 사용자명, uid, gid, 사용자의 실제 이름, 홈 디렉토리, 그리고 로그인 쉘을 정의합니다. $\texttt{/etc/passwd}$나 $\texttt{/etc/group}$의 내용을 보면 일반 사용자 계정 외에도 슈퍼유저(uid 0) 계정과 다른 여러 시스템 사용자가 있는 것을 확인할 수 있습니다.

 

다음 챕터에서 프로세스에 대해 배울 때 다른 "사용자"들이 사실 꽤 바쁘게 동작하고 있는 것을 보게될 것입니다.

 

많은 유닉스 계열 시스템이 일반 사용자를 "users"라는 그룹에 배치하는데, 현대의 리눅스는 사용자를 고유한 그룹에 배정합니다. 이 때 이 그룹의 이름은 사용자명과 일치하도록 생성됩니다. 이렇게 하면 권한 설정을 더 세밀하고 유연하게 할 수 있는 장점이 있습니다.

 

읽기, 쓰기, 실행

파일과 디렉토리에 대한 접근 권한은 읽기 권한, 쓰기 권한, 실행 권한으로 정의 됩니다. 이를 $\texttt{ls}$ 명령의 출력 결과에서 확인할 수 있습니다:

처음 10개의 문자는 파일 속성(file attribute)를 나타냅니다. 맨 처음 문자는 파일 유형(file type)입니다. Table 9-1에서 우리가 자주 보게 될 파일 유형을 확인할 수 있습니다.

 

Table 9-1: 파일 유형

속성 유형
$\texttt{-}$ 일반 파일
$\texttt{d}$ 디렉토리
$\texttt{l}$ 심볼릭 링크. 심볼릭 링크에서는 나머지 파일 속성이 모두 "rwxrwxrwx"로 표시됩니다. 실제 파일의 속성은 심볼릭 링크가 가리키는 파일의 속성을 봐야합니다.
$\texttt{c}$ 문자 특수 파일(character special file). 이 파일은 데이터를 바이트 스트림으로 처리하는 장치를 나타내는 파일입니다. 이런 장치들은 데이터를 한 번에 한 문자씩 순차적으로 읽거나 씁니다. 예로 터미널이나 $\texttt{/dev/null}$이 이에 해당합니다.
$\texttt{b}$ 블록 특수 파일(block special file). 블록 특수 파일은 데이터를 블록 단위로 처리하는 장치를 나타내는 파일입니다. 이런 장치들은 데이터를 큰 덩어리, 즉 블록 단위로 읽거나 씁니다. 예로 하드 드라이브나 DVD 드라이브가 이에 해당합니다.

파일 속성의 나머지 9개 문자는 파일 모드(file mode)라고 불리며, 파일 소유자, 파일 그룹 소유자, 그리고 이외 사용자의 읽기, 쓰기, 실행 권한을 나타냅니다.

Table 9-2는 파일이나 디렉토리가 가진 모드 속성 $\texttt{r}$, $\texttt{w}$, $\texttt{x}$에 대해 설명합니다:

 

Table 9-2: 권한 속성

속성 파일 디렉토리
$\texttt{r}$ 파일을 열어 읽어볼 수 있습니다. - 실행 권한(O): 파일의 속성까지 볼 수 있습니다. $\texttt{ls -l}$
- 실행 권한(X): 파일 목록만 볼 수 있습니다. $\texttt{ls}$
$\texttt{w}$ 파일 내용의 편집할 수 있습니다. 그러나 파일명을 변경하거나 파일을 삭제할 수 없습니다. 파일명 변경과 파일 삭제 권한은 디렉토리 속성에 의해 결정됩니다. 디렉토리 내에 파일을 만들거나 삭제하거나 이름을 변경할 수 있습니다.
$\texttt{x}$ 파일을 프로그램으로 인식하고 실행될 수 있도록 합니다. 스크립트 언어로 작성된 프로그램 파일들은 실행되기 위해 읽기 권한도 필요합니다. 명령어 인자로써 디렉토리명을 사용할 수 있습니다. 예) $\texttt{cd}$ directory

 

Table 9-3은 파일 속성 세팅의 예시를 보여줍니다:

 

Table 9-3: 권한 속성 예시

파일 속성 의미
$\texttt{-rwx------}$ 파일 소유자가 읽고, 쓰고, 실행할 수 있는 일반 파일. 다른 사용자는 아무런 권한이 없음
$\texttt{-rw-------}$ 파일 소유자가 읽고 쓸 수 있는 일반 파일. 다른 사용자는 아무런 권한이 없음
$\texttt{-rw-r--r--}$ 파일 소유자가 읽고 쓸 수 있는 일반 파일. 파일 소유자 그룹에 속한 경우 읽을 수 있음. 모든 사람들이 읽을 수 있음(world-readable)
$\texttt{-rwxr-xr-x}$ 파일 소유자가 읽고, 쓰고, 실행할 수 있는 일반 파일. 기타 사용자는 읽기 및 실행 권한이 있음
$\texttt{-rw-rw----}$ 파일 소유자와 파일 그룹 소유자는 읽기와 쓰기 권한이 있습니다
$\texttt{lrwxrwxrwx}$ 심볼릭 링크. 모든 심볼릭 링크는 "가짜 권한"을 가집니다. 실제 권한에 대한 내용은 심볼릭 링크가 가리키는 파일이 가지고 있습니다.
$\texttt{drwxrwx---}$ 디렉토리. 소유자와 그룹 소유자는 디렉토리에 파일을 생성하거나 기존 파일의 이름을 변경하거나 삭제할 수 있습니다.
$\texttt{drwxr-x---}$ 디렉토리. 소유자는 디렉토리에 파일 생성, 이름 변경, 삭제 권한을 가집니다. 그룹 소유자는 디렉토리에 입장할 수는 있지만 파일을 생성하거나 삭제하거나 이름을 변경할 수 없습니다.

 

$\texttt{chmod}$ - 파일 모드 변경

파일이나 디렉토리의 모드(권한)를 수정하기 위해서 $\texttt{chmod}$ 명령어가 사용됩니다. 파일의 소유자나 슈퍼유저만이 파일이나 디렉토리의 모드를 수정할 수 있습니다. $\texttt{chmod}$는 두 가지 다른 방식으로 모드 변경을 수행합니다: 8진법 표현 or 심볼릭 표현. 먼저 8진법 표현에 대해 배워보겠습니다.

8진법이 뭐야?

8진법과 그의 사촌 16진법은 컴퓨터에서 수를 표현하기 위한 시스템입니다. 우리 인간은 10개의 손가락을 가지고 태어나 10진법 시스템을 사용합니다. 그러나 컴퓨터는 1개의 손가락만 가지고 있어 2진법을 사용합니다. 2진법은 0과 1만을 사용하여 수를 표현합니다. 따라서 아래와 같이 표현됩니다:

0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011...

8진법에서는 0에서 7까지의 숫자를 사용하여 수를 표현합니다:

0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21...

16진법은 0에서 9까지의 숫자에 더해 "A"부터 "F"까지의 알파벳을 사용합니다:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13...

2진법을 사용하는 이유는 알겠는데 (컴퓨터는 손가락이 한 개 뿐이니까) 8진법과 16진법은 왜 쓰는걸까요? 인간의 편리함을 위해 사용한다고 답할 수 있을 것 같습니다. 컴퓨터에서는 종종 작은 단위의 데이터가 비트 패턴(bit pattern)으로 표현됩니다. RGB 색상을 예로 들어보겠습니다. 대부분의 컴퓨터 디스플레이에서는 각 픽셀이 세 가지 색 요소로 구성됩니다: 8비트의 빨간색, 8비트의 초록색, 8비트의 파란색. 미디엄 블루는 24개의 숫자로 표현됩니다:

010000110110111111001101

이런 숫자를 하루종을 읽고 쓸 수 있을까요? 저는 안된다고 봅니다. 이제 다른 수 시스템이 여기에 도움을 줄 수 습니다. 16진법의 각 수는 이진법의 4개의 숫자를 대신합니다. 8진법에서는 1개의 수가 이진법의 3개의 숫자를 대신하죠. 따라서 미디엄 블루를 나타내는 24개의 숫자는 6개의 16진법 숫자로 대체될 수 있습니다:

436FCD

16진법의 숫자에서 빨강의 요소는 43, 초록은 6F, 파랑은 CD임을 알 수 있습니다.

지금은 16진법 표기가 8진법보다 일반적으로 사용되지만 8진법으로 3비트를 표현하는 방식은 꽤 유용하다는 것을 곧 보게 될 것입니다...

8진법 표기법을 사용하면 권한에 관한 설정을 8진법 수로 표기할 수 있습니다. 3개의 권한은 3개의 이진법 수로 표현될 수 있고 3개의 이진법 수는 1개의 8진법 수로 표현될 수 있습니다. Table 9-4에서 그 패턴을 확인해보세요.

 

Table 9-4: 이진법과 8진법을 사용한 파일 모드

8진법 이진법 파일 모드
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwx

 

즉, 8진법 수 3개를 사용하면 소유자, 그룹 소유자, 월드의 파일 모드를 설정할 수 있습니다.

$\texttt{chmod}$에 "600"이라는 인자를 넘겨줌으로써 소유자에게 읽기와 쓰기 권한을 부여했고 그룹 소유자나 월드로부터 모든 권한을 제거했습니다. 우리가 주로 사용하게 될 권한은 7 (rwx), 6 (rw-), 5 (r-x), 4 (r--), 0 (---)입니다.

 

$\texttt{chmod}$는 상징 표기를 이용해서도 실행할 수 있습니다. 상징 표기는 세 부분으로 구성됩니다:

  • 권한 변경 대상(소유자, 그룹 소유자, 월드)
  • 권한 변경 방식
  • 변경할 권한
상징 의미
$\texttt{u}$ "user"의 초성. 소유자를 의미
$\texttt{g}$ "group"의 초성. 그룹 소유자를 의미
$\texttt{o}$ "other"의 초성. 월드를 의미
$\texttt{a}$ "all"의 초성. 모든 사용자를 의미

아무 것도 쓰여있지 않다면 기본적으로 모든 사용자가 대상이 됩니다.

 

권한 변경 방식은 권한 추가를 의미하는 "+", 권한 제거를 의미하는 "-", 뒤에오는 권한을 부여한다는 것을 의미하는 "="을 사용하여 지정합니다. 변경할 권한은 앞에서 본 표기대로 "r", "w", "x"를 사용합니다. 이 세 종류의 상징을 사용하여 각 사용자에게 권한을 부여할 수 있습니다.

표기 의미
$\texttt{u+x}$ 소유자에게 실행 권한을 추가
$\texttt{u-x}$ 소유자의 실행 권한을 제거
$\texttt{+x}$ 모든 사용자에게 실행 권한을 추가
$\texttt{o-rw}$ 월드의 읽기 및 쓰기 권한 제거
$\texttt{go=rw}$ 그룹 소유자 및 월드의 권한을 읽기 및 쓰기로 설정
$\texttt{u+x, go=rx}$ 소유자에게 실행 권한을 추가하고 그룹 소유자 및 월드의 권한을 읽기 및 쓰기로 설정

 

권한 설정에 8진법을 사용할지 상징 표기를 사용할지는 자유입니다. 상징 표기를 사용하면 한 사용자의 권한만 변결할 수 있다는 장점이 있습니다. 자세한 사항은 $\texttt{chmod}$의 매뉴얼 페이지를 확인하세요.

 

$\texttt{umask}$ - 기본 권한 설정

$\texttt{umask}$ 명령어는 파일이 생성 될 때 기본으로 부여될 권한을 설정합니다. 이 명령어는 8진법 표기를 사용하여 파일 생성 시 어떠한 권한을 "가릴(mask)" 것인지를 설정합니다. 아래 예시를 보겠습니다.

 

기본적으로 권한 설정은 $\texttt{--- rw- rw- rw-}$로 되어있습니다. 위에서 $\texttt{umask}$의 결과를 보면 0002로 되어있습니다. 이는 월드의 권한에서 8진법으로 2에 해당하는 권한을 삭제하겠다는 뜻입니다. 8진법으로 2이면 2진법으로는 $\texttt{010}$이고 이는 $\texttt{-w-}$입니다. 따라서 기본 권한에서 월드의 쓰기 권한을 삭제한다는 의미입니다. 아래 이미지를 참고하세요.

 

혹은 다음과 같이 $\texttt{umask}$를 0000으로 설정하면, 즉, 모든 권한을 살리겠다고 설정하면 기본 설정대로 $\texttt{--- rw- rw- rw-}$ 권한으로 파일이 생성됩니다.

$\texttt{umask}$를 0022로 설정하면 어떻게 될까요?

이번에도 1이 있는 자리의 권한이 삭제된 것을 볼 수 있습니다.

 

$\texttt{umask}$를 변경하여 파일을 생성한 후에는 다시 원래대로 $\texttt{0002}$로 바꾸어주세요. 마스크를 바꿀 일이 많이 있지는 않지만 고도의 보안이 필요한 상황에서는 바꿀 필요가 있을 것입니다.

특별 권한

권한은 소유자, 그룹 소유자, 그리고 월드에 대해서 설정할 수 있다는 것을 배웠습니다. 그런데 왜 $\texttt{umask}$를 이용하여 마스킹을 할 때에는 4개의 수를 입력받는 걸까요? 사실 읽기, 쓰기, 실행 권한에 더해 몇몇 권한이 더 있습니다. 덜 사용되지만요.

첫번째는 setuid bit (8진법 4000)입니다. 이를 실행 파일에 적용하면 실제 사용자(프로그램을 실행하는 사용자)의 유효 사용자ID(effective user ID, euid)를 슈퍼유저로 세팅합니다. 만약 일반 사용자가 "setuid root"로 설정된 파일을 실행하면 슈퍼유저의 권한으로 파일을 실행하게 됩니다.

두번째는 setgid bit (8진법 2000)입니다. setuid bit와 비슷하게 실제 사용자의 유효 사용자 ID를 파일 소유자로 세팅합니다. setgid 비트가 디렉토리에 설정되면, 해당 디렉토리 내에서 새로 생성되는 파일 및 서브 디렉토리의 그룹 소유권이 파일을 생성한 사용자의 기본 그룹이 아닌, 상위 디렉토리의 그룹 소유권을 상속받게 됩니다. 이는 공동 작업시에 유용한 설정입니다.

세번째는 sticky bit (8진법 1000)입니다. sticky bit가 설정된 디렉토리에서는 파일 소유자, 디렉토리 소유자, 슈퍼유저 외에는 파일을 삭제하거나 파일명을 변경할 수 있습니다. $\texttt{tmp}$와 같은 공용 작업 공간에서 권한을 조정하기 위해 사용됩니다.

다음은 상징 표기를 사용해 특별 권한을 부여하는 방법입니다.

프로그램에 setuid를 부여:
$\texttt{chmod u+s}$ program

디렉토리에 setgid를 부여:
$\texttt{chmod g+s}$ dir

디렉토리에 sticky bit를 부여:
$\texttt{chmod +t}$ dir

$\texttt{ls}$의 출력을 보면 특별 권한을 쉽게 확인할 수 있습니다.

setuid는 $\texttt{ls}$ 결과가 다음과 같습니다:
$\texttt{-rw}\mathbf{s}\texttt{r-xr-x}$

setgid는 $\texttt{ls}$ 결과가 다음과 같습니다:
$\texttt{drwxrw}\mathbf{s}\texttt{r-x}$

sticky bit는 $\texttt{ls}$ 결과가 다음과 같습니다:
$\texttt{drwxrwxrw}\mathbf{t}$