Ⅱ-2 사용자·그룹과 권한은 Ⅱ-1 셸과 명령행 기본의 표 2에서 ‘종류와 권한’ 으로만 설명한 ls -l 의 첫 열을 이어서 다룬다. 명령의 출력은 genealogypost.com 을 운영하는 라즈베리파이 5에서 2026-10-09 에 일반 사용자 계정으로 실행한 결과이다. 파일을 만들고 권한을 바꾸는 명령은 홈 디렉토리 아래의 연습 디렉토리(~/practice)에서만 실행하였고, 다 쓴 뒤 그 디렉토리를 지웠다. 출력에 든 사용자 이름은 user 로, 호스트 이름은 raspberrypi 로, 홈 디렉토리 경로는 /home/user 로 바꾸어 실었다.
2.1 사용자 및 그룹
리눅스는 파일과 프로세스마다 주인을 기록하고, 그 주인이 누구냐에 따라 할 수 있는 일을 가른다. 주인의 단위는 사용자와 그룹이다. 사용자 한 명은 그룹 여러 개에 속할 수 있으며, 그룹에 준 권한은 그 그룹의 구성원 모두가 받는다 [10].
2.1.1 현재 사용자와 소속 그룹 확인
그림 1은 지금 로그인한 사용자와 그 사용자가 속한 그룹을 확인한 결과이다. whoami 는 사용자 이름만, id 는 번호와 이름을 함께, groups 는 그룹 이름만 보인다.
user@raspberrypi:~ $ whoami
user
user@raspberrypi:~ $ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),102(input),105(render),110(netdev),115(lpadmin),993(gpio),994(i2c),995(spi)
user@raspberrypi:~ $ groups
user adm dialout cdrom sudo audio video plugdev games users input render netdev lpadmin gpio i2c spi- uid 는 사용자 번호이다. 커널은 이름이 아니라 이 번호로 사용자를 구분한다.
- gid 는 기본 그룹의 번호이다. 이 사용자가 새로 만드는 파일의 그룹이 된다.
- groups 는 이 사용자가 속한 그룹 전체이며, 이 계정은 17개 그룹에 속해 있다.
- 27(sudo) 는 관리자 명령을 쓸 수 있는 그룹이다. 2.5절에서 다룬다.
- gpio, i2c, spi 는 라즈베리파이의 핀과 버스 장치 파일을 쓸 수 있는 그룹이다.
그림 1의 그룹은 이 서버에 서비스를 설치하면서 더한 것이 아니다. Raspberry Pi OS 는 이미지에 들어 있는 uid 1000 계정의 이름을 첫 설정 때 바꾸는 방식으로 첫 사용자를 만든다. 이 방식은 /usr/lib/userconf-pi/userconf 의 usermod -l 과 groupmod -n 줄에서 확인하였다. 그래서 이미지에 정해진 그룹 목록이 그대로 이어진다.
2.1.2 /etc/passwd 의 구성
사용자 계정의 정보는 /etc/passwd 에 한 줄에 한 사용자씩 적혀 있다. 그림 2는 그중 관리자(root)와 일반 사용자의 줄만 grep 으로 고른 결과이다.
user@raspberrypi:~ $ grep -E '^(root|user):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
user:x:1000:1000:,,,:/home/user:/bin/bash표 1은 그림 2의 일반 사용자 줄을 쌍점(:)으로 나눈 일곱 열을 나타낸다 [9].
| 열 | 값 | 의미 |
|---|---|---|
| 1. 사용자 이름 | user | 로그인할 때 입력하는 이름 |
| 2. 비밀번호 | x | 비밀번호가 /etc/shadow 에 따로 있다는 표시. /etc/shadow 는 root 만 읽을 수 있다 |
| 3. UID | 1000 | 사용자 번호. root 는 0 이다 |
| 4. GID | 1000 | 기본 그룹의 번호 |
| 5. 설명 | ,,, | 이름·연락처 같은 설명. 비어 있어 쉼표만 남았다 |
| 6. 홈 디렉토리 | /home/user | 로그인한 직후의 현재 디렉토리 |
| 7. 로그인 셸 | /bin/bash | 로그인하면 실행되는 셸(Ⅱ-1 그림 2) |
2.2 권한의 표기
2.2.1 기호 표기
그림 3은 ls -l 첫 열 10글자의 구성을 나타낸다. 첫 글자는 파일의 종류이고, 나머지 9글자는 3글자씩 소유자, 그룹, 그 밖의 사용자에게 준 권한이다. 각 3글자는 차례로 읽기(r), 쓰기(w), 실행(x)이며, 허용하지 않은 권한은 - 로 표시한다.
파일에 접근하는 사용자가 소유자이면 첫 묶음만, 소유자가 아니고 파일의 그룹에 속하면 둘째 묶음만, 둘 다 아니면 셋째 묶음만 적용된다 [1]. 묶음을 합쳐서 적용하지 않으므로, 소유자 묶음의 권한이 그룹 묶음보다 적으면 소유자는 그룹 구성원보다 적은 권한을 받는다.
r, w, x 의 뜻은 파일과 디렉토리에서 다르다. 표 2는 두 경우를 나란히 나타낸다 [1].
| 권한 | 파일 | 디렉토리 |
|---|---|---|
| r 읽기 | 내용을 읽는다(cat, less) | 안에 든 이름의 목록을 본다(ls) |
| w 쓰기 | 내용을 고친다 | 안에서 파일을 만들고, 지우고, 이름을 바꾼다. x 도 있어야 한다 |
| x 실행 | 프로그램으로 실행한다 | 그 디렉토리로 들어가고(cd), 안의 파일에 접근한다 |
표 2의 디렉토리 w 는 파일을 지우는 권한이 파일이 아니라 그 파일이 든 디렉토리에 있다는 뜻이다. 2.6.2절의 스티키 비트는 이 규칙에 예외를 둔다.
2.2.2 숫자 표기
숫자 표기는 r 을 4, w 를 2, x 를 1 로 세어 묶음마다 더한 값을 세 자릿수로 적는다. 그림 3의 -rw-r--r-- 는 소유자 4+2+0=6, 그룹 4+0+0=4, 그 밖 4+0+0=4 이므로 644 이다. 표 3은 숫자 표기 네 가지와 그 쓰임을 나타낸다.
| 숫자 | 기호 | 계산 | 쓰이는 곳 |
|---|---|---|---|
| 644 | rw-r--r-- |
6=4+2, 4=4, 4=4 | 일반 파일. 소유자만 고치고 모두 읽는다(그림 4의 f.txt) |
| 755 | rwxr-xr-x |
7=4+2+1, 5=4+1, 5=4+1 | 디렉토리와 실행 파일. 모두 들어가고 실행한다(그림 4의 d) |
| 600 | rw------- |
6=4+2, 0, 0 | 비밀번호나 열쇠가 든 파일. 소유자만 읽고 고친다 |
| 700 | rwx------ |
7=4+2+1, 0, 0 | 소유자만 들어가는 디렉토리(그림 8의 /root 와 /home/user) |
그림 4는 연습 디렉토리에 빈 파일 f.txt 와 디렉토리 d 를 만든 직후의 권한이다. stat -c "%a %A %n" 은 숫자 표기와 기호 표기를 한 줄에 함께 보인다.
user@raspberrypi:~ $ mkdir -p ~/practice && cd ~/practice && touch f.txt && mkdir d && ls -l
total 4
drwxr-xr-x 2 user user 4096 Oct 9 22:23 d
-rw-r--r-- 1 user user 0 Oct 9 22:23 f.txt
user@raspberrypi:~/practice $ stat -c "%a %A %n" f.txt d
644 -rw-r--r-- f.txt
755 drwxr-xr-x d새 파일은 644, 새 디렉토리는 755 로 만들어졌다. 이 두 값이 정해지는 까닭은 2.6.1절의 umask 에서 계산한다.
2.3 권한 변경
권한은 chmod 로 바꾼다. 파일의 권한을 바꿀 수 있는 사람은 그 파일의 소유자와 root 이다 [1]. chmod 는 숫자 표기와 기호 표기를 모두 받는다. 표 4는 기호 표기를 이루는 세 부분을 나타낸다.
| 부분 | 글자 | 뜻 |
|---|---|---|
| 대상 | u, g, o, a | 소유자, 그룹, 그 밖의 사용자, 셋 모두 |
| 연산 | +, -, = | 더한다, 뺀다, 적은 것으로 바꾼다 |
| 권한 | r, w, x | 읽기, 쓰기, 실행 |
그림 5는 f.txt 의 권한을 네 번 바꾸며 매번 ls -l 로 확인한 결과이다. 숫자 표기는 세 묶음을 한꺼번에 정하고, 기호 표기는 적은 부분만 바꾼다.
user@raspberrypi:~/practice $ chmod 600 f.txt; ls -l f.txt
-rw------- 1 user user 0 Oct 9 22:23 f.txt
user@raspberrypi:~/practice $ chmod u+x,g+r f.txt; ls -l f.txt
-rwxr----- 1 user user 0 Oct 9 22:23 f.txt
user@raspberrypi:~/practice $ chmod 755 f.txt; ls -l f.txt
-rwxr-xr-x 1 user user 0 Oct 9 22:23 f.txt
user@raspberrypi:~/practice $ chmod 644 f.txt; ls -l f.txt
-rw-r--r-- 1 user user 0 Oct 9 22:23 f.txtchmod 600은 그룹과 그 밖의 권한을 모두 지웠다(rw-------).chmod u+x,g+r은 소유자에게 x 를, 그룹에게 r 을 더했다. 그 밖의 사용자 묶음은 그대로---이다(rwxr-----, 숫자로 740).chmod 755와chmod 644는 앞의 상태와 관계없이 세 묶음을 표 3의 값으로 바꾸었다.
디렉토리 안의 모든 파일을 한꺼번에 바꾸는 -R 옵션도 있다. 그러나 chmod -R 755 처럼 숫자를 쓰면 파일과 디렉토리가 같은 값을 받는다. 일반 파일에도 x 가 붙으므로, 파일과 디렉토리를 나누어야 할 때는 Ⅱ-1 1.6절의 find 로 종류를 골라 바꾼다.
2.4 소유자 변경
소유자는 chown 으로, 그룹은 chgrp 로 바꾼다. 그림 6은 일반 사용자가 자기 파일 f.txt 의 소유자를 root 로 바꾸려 한 결과이다.
user@raspberrypi:~/practice $ chown root f.txt
chown: changing ownership of 'f.txt': Operation not permitted
user@raspberrypi:~/practice $ ls -l f.txt
-rw-r--r-- 1 user user 0 Oct 9 22:23 f.txt자기 파일인데도 소유자를 바꾸지 못하였다. 리눅스에서 파일의 소유자를 바꿀 수 있는 것은 관리자 권한을 가진 프로세스뿐이기 때문이다 [2]. 그래서 chown 은 2.5절의 sudo 를 붙여 실행한다.
그룹을 바꾸는 규칙은 다르다. 소유자는 자기가 속한 그룹으로만 파일의 그룹을 바꿀 수 있다 [2]. 그림 7은 연습 디렉토리에 f.txt 를 다시 만들어 그룹을 두 번 바꾸려 한 결과이다.
user@raspberrypi:~/practice $ chgrp users f.txt; ls -l f.txt
-rw-r--r-- 1 user users 0 Oct 9 22:25 f.txt
user@raspberrypi:~/practice $ chgrp root f.txt; ls -l f.txt
chgrp: changing group of 'f.txt': Operation not permitted
-rw-r--r-- 1 user users 0 Oct 9 22:25 f.txt- users 그룹으로는 바뀌었다. 그림 1의 groups 에 users 가 있다.
- root 그룹으로는 거부되었다. 그림 1의 groups 에 root 가 없다.
2.5 관리자 권한
2.5.1 root 와 일반 사용자의 경계
root 는 UID 0 인 관리자 계정이다(표 1). root 의 프로세스는 2.2절의 권한과 관계없이 파일을 읽고 쓰며, 그림 6의 chown 도 실행할 수 있다 [2]. 그림 8은 일반 사용자가 root 의 홈 디렉토리를 열려 한 결과와, 그 디렉토리의 권한이다.
user@raspberrypi:~ $ ls /root
ls: cannot open directory '/root': Permission denied
user@raspberrypi:~ $ ls -ld /root ~
drwx------ 28 user user 4096 Oct 9 22:25 /home/user
drwx------ 25 root root 4096 Oct 9 22:23 /root/root 의 권한은 700(rwx------)이고 소유자는 root 이다. user 는 소유자도 아니고 root 그룹도 아니므로 셋째 묶음 --- 이 적용되어 거부되었다. 일반 사용자의 홈 /home/user 도 700 이므로 다른 일반 사용자는 들어올 수 없다.
2.5.2 sudo 및 su
일반 사용자가 관리자 명령을 실행하는 방법은 sudo 와 su 두 가지이다. 표 5는 두 명령과 root 로 직접 로그인하는 경우를 비교한 것이다 [3], [5].
| 방법 | 묻는 비밀번호 | 권한이 이어지는 범위 | 기록 |
|---|---|---|---|
| root 로 로그인 | root 의 비밀번호 | 로그아웃할 때까지 모든 명령 | 모든 명령이 root 의 것으로 남아 실제 사람을 구분하지 못한다 |
su - |
root 의 비밀번호 | exit 할 때까지 모든 명령 | su 를 실행한 사용자는 남고, 그 뒤의 명령은 root 의 것으로 남는다 |
| sudo 명령 | 자기 비밀번호 | 그 명령 하나 | 누가 어떤 명령을 실행했는지 남는다 |
sudo 는 root 의 비밀번호를 여러 사람이 나누어 갖지 않아도 되고, 명령마다 기록이 남는다. 그래서 Raspberry Pi OS 의 첫 사용자는 sudo 로 관리 명령을 실행한다. 누가 sudo 를 쓸 수 있는지는 /etc/sudoers 에 적혀 있다. 그림 9는 sudo 그룹의 구성원과 sudoers 의 해당 규칙이다.
user@raspberrypi:~ $ getent group sudo
sudo:x:27:user
user@raspberrypi:~ $ ls -l /etc/sudoers
-r--r----- 1 root root 1714 Jun 27 2023 /etc/sudoers
root@raspberrypi:~# grep -E '^%sudo' /etc/sudoers
%sudo ALL=(ALL:ALL) ALL- sudo 그룹의 구성원은 user 하나이다.
%sudo의 % 는 사용자가 아니라 그룹을 가리킨다.ALL=(ALL:ALL) ALL은 차례로 모든 호스트에서, 모든 사용자와 그룹의 자격으로, 모든 명령을 실행할 수 있다는 뜻이다 [4].- /etc/sudoers 의 권한은 440(
r--r-----)이다. root 도 바로 고치지 않고 문법 검사를 하는visudo로 고친다 [4].
2.6 기본 권한 및 특수 권한
2.6.1 umask
umask 는 새 파일과 디렉토리를 만들 때 지울 권한을 정한 값이다. 그림 10은 이 계정의 umask 를 숫자와 기호로 확인한 결과이다.
user@raspberrypi:~ $ umask
0022
user@raspberrypi:~ $ umask -S
u=rwx,g=rx,o=rx프로그램이 요청한 권한에서 umask 에 켜진 비트를 끈 값이 실제 권한이 된다 [6]. touch 는 파일을 666 으로, mkdir 은 디렉토리를 777 로 요청한다. umask 022 는 그룹과 그 밖의 w(2)를 끄므로 계산은 다음과 같다.
- 파일. 666(
rw-rw-rw-) 에서 그룹·그 밖의 w 를 끄면 644(rw-r--r--) - 디렉토리. 777(
rwxrwxrwx) 에서 그룹·그 밖의 w 를 끄면 755(rwxr-xr-x)
두 값은 그림 4의 stat 출력 644 와 755 와 같다. umask 를 077 로 바꾸면 같은 계산으로 새 파일은 600, 새 디렉토리는 700 이 된다. umask -S 는 지울 비트가 아니라 남는 권한을 기호로 보이므로, u=rwx,g=rx,o=rx 는 디렉토리의 755 와 같다.
2.6.2 특수 권한
권한 9글자의 x 위치에는 x 대신 s 나 t 가 표시되기도 한다. 이것이 특수 권한이며, 숫자 표기에서는 세 자릿수 앞에 숫자 하나를 더 적는다. 그림 11은 특수 권한이 붙은 디렉토리 하나와 프로그램 둘을 확인한 결과이다.
user@raspberrypi:~ $ ls -ld /tmp /usr/bin/passwd /usr/bin/sudo
drwxrwxrwt 333 root root 36864 Oct 9 22:27 /tmp
-rwsr-xr-x 1 root root 72048 Dec 14 2025 /usr/bin/passwd
-rwsr-xr-x 1 root root 269312 Apr 11 21:01 /usr/bin/sudo
user@raspberrypi:~ $ stat -c "%a %A %n" /tmp /usr/bin/passwd /usr/bin/sudo
1777 drwxrwxrwt /tmp
4755 -rwsr-xr-x /usr/bin/passwd
4755 -rwsr-xr-x /usr/bin/sudo표 6은 특수 권한 세 가지의 표시와 숫자, 동작을 나타낸다 [7].
| 이름 | 숫자 | 표시 위치 | 동작 | 이 서버의 예 |
|---|---|---|---|---|
| setuid | 4000 | 소유자의 x 위치에 s | 실행한 사람이 아니라 파일 소유자의 권한으로 실행된다 | /usr/bin/passwd, /usr/bin/sudo (4755) |
| setgid | 2000 | 그룹의 x 위치에 s | 파일은 파일 그룹의 권한으로 실행된다. 디렉토리에 붙이면 안에 만든 파일이 그 디렉토리의 그룹을 받는다 | 그림 11에는 없음 |
| 스티키 비트 | 1000 | 그 밖의 x 위치에 t | 디렉토리 안의 파일은 그 파일의 소유자와 디렉토리 소유자, root 만 지우거나 이름을 바꿀 수 있다 | /tmp (1777) |
- /tmp 는 777 이므로 누구나 파일을 만든다. 표 2에 따르면 누구나 남의 파일도 지울 수 있어야 하지만, 스티키 비트가 이를 막는다. Ⅱ-1 표 1에서 ‘남의 파일을 지우지 못하게 하는 표시’ 라고 적은 t 가 이것이다.
- passwd 는 일반 사용자가 실행해도 root 권한으로 실행된다. 그래서 일반 사용자가 root 만 고칠 수 있는 /etc/shadow 의 자기 비밀번호 줄을 바꿀 수 있다.
- sudo 도 setuid root 이다. 2.5.2절의 sudo 는 이 비트로 root 권한을 얻으며, sudoers 규칙은 그 권한을 누구에게 쓰게 할지 정한다.
2.7 ACL
2.2절의 권한은 소유자 한 명과 그룹 하나에만 따로 줄 수 있다. 다른 사용자 한 명에게만 읽기를 주려면 그 사용자를 그룹에 넣거나 그 밖의 사용자 모두에게 열어야 한다. ACL(Access Control List, 접근 제어 목록)은 사용자나 그룹을 하나씩 지정해 권한을 더한다 [8].
그림 12는 f.txt 에 웹 서버 사용자 www-data 의 읽기 권한을 더하기 전과 후를 getfacl 로 확인하고, 마지막에 setfacl -b 로 ACL 을 지운 결과이다. www-data 는 Debian 계열에서 웹 서버가 실행되는 계정이다.
user@raspberrypi:~/practice $ getfacl f.txt
# file: f.txt
# owner: user
# group: user
user::rw-
group::r--
other::r--
user@raspberrypi:~/practice $ setfacl -m u:www-data:r f.txt
user@raspberrypi:~/practice $ getfacl f.txt
# file: f.txt
# owner: user
# group: user
user::rw-
user:www-data:r--
group::r--
mask::r--
other::r--
user@raspberrypi:~/practice $ ls -l f.txt
-rw-r--r--+ 1 user user 0 Oct 9 22:23 f.txt
user@raspberrypi:~/practice $ setfacl -b f.txt; ls -l f.txt
-rw-r--r-- 1 user user 0 Oct 9 22:23 f.txt표 7은 그림 12의 두 번째 getfacl 출력의 줄을 나타낸다 [8].
| 줄 | 뜻 |
|---|---|
user::rw- |
소유자의 권한. ls -l 의 첫 묶음과 같다 |
user:www-data:r-- |
setfacl 로 더한 줄. www-data 한 사용자의 권한 |
group::r-- |
파일 그룹의 권한 |
mask::r-- |
이름을 지정한 사용자·그룹 줄과 파일 그룹 줄이 넘을 수 없는 최대 권한. setfacl 이 저절로 만든다 |
other::r-- |
그 밖의 사용자의 권한. ls -l 의 셋째 묶음과 같다 |
- setfacl 의
-m u:www-data:r은 차례로 고친다(modify), 사용자(u), 이름, 권한이다. - ACL 이 붙자 ls -l 의 권한 끝에 + 가 표시되었다. ls -l 만으로는 www-data 의 줄이 보이지 않으므로, + 가 있으면 getfacl 로 확인한다.
- ACL 이 있는 파일에서 ls -l 의 둘째 묶음은 group 줄이 아니라 mask 줄을 보인다 [8]. 그림 12에서는 두 값이 모두
r--이어서 같게 보인다. setfacl -b로 더한 줄을 모두 지우자 + 표시가 사라졌다.
이 실습에서 www-data 가 f.txt 를 실제로 읽으려면 f.txt 까지 가는 디렉토리마다 www-data 에게 x 가 있어야 한다(표 2). 그림 8에서 /home/user 가 700 이므로, 이 상태에서는 ACL 을 더해도 www-data 가 f.txt 에 닿지 못한다.
다음 글은 Ⅱ-3. 프로세스와 systemd 서비스 이다.
REFERENCES
- [1]Free Software Foundation, GNU Coreutils Manual, File permissions. [Online]. Available: https://www.gnu.org/software/coreutils/manual/html_node/File-permissions.html [Accessed: 2026-10-09]
- [2]Linux man-pages project, chown(2). [Online]. Available: https://man7.org/linux/man-pages/man2/chown.2.html [Accessed: 2026-10-09]
- [3]T. C. Miller, Sudo Manual, sudo(8). [Online]. Available: https://www.sudo.ws/docs/man/sudo.man/ [Accessed: 2026-10-09]
- [4]T. C. Miller, Sudo Manual, sudoers(5). [Online]. Available: https://www.sudo.ws/docs/man/sudoers.man/ [Accessed: 2026-10-09]
- [5]Linux man-pages project, su(1). [Online]. Available: https://man7.org/linux/man-pages/man1/su.1.html [Accessed: 2026-10-09]
- [6]Linux man-pages project, umask(2). [Online]. Available: https://man7.org/linux/man-pages/man2/umask.2.html [Accessed: 2026-10-09]
- [7]Linux man-pages project, inode(7). [Online]. Available: https://man7.org/linux/man-pages/man7/inode.7.html [Accessed: 2026-10-09]
- [8]Linux man-pages project, acl(5). [Online]. Available: https://man7.org/linux/man-pages/man5/acl.5.html [Accessed: 2026-10-09]
- [9]Linux man-pages project, passwd(5). [Online]. Available: https://man7.org/linux/man-pages/man5/passwd.5.html [Accessed: 2026-10-09]
- [10]R. Hertzog, R. Mas, The Debian Administrator's Handbook, User and Group Databases. [Online]. Available: https://debian-handbook.info/browse/stable/sect.user-group-databases.html [Accessed: 2026-10-09]