참고※참고 자료는 드림핵을 이용하였습니다.
※드림핵의 로드맵대로 공부할 예정입니다.
※스스로를 위해 정리한 참고 자료입니다.
리눅스에서 유저와 그룹은 리눅스의 권한 시스템을 설명하기 위해 빠뜨릴 수 없는 개념입니다.
리눅스의 각 유저는 이름과 고유한 사용자 ID(UID) 를 가지고 있습니다.
그룹은 말 그대로 여러 유저가 속할 수 있는 그룹으로, 이 역시 그룹 이름과 고유한 그룹 ID(GID) 를 가지고 있습니다.
파일이나 디렉토리와 같은 시스템 자원에 유저가 접근하면 유저의 UID와 해당 유저가 속한 그룹의 GID를 확인하여 정당한 권한을 가지고 있는지를 판단해 접근을 제어합니다.
/etc/passwd
는 리눅스의 유저 정보를 담고 있는 텍스트 파일입니다.
각 사용자의 이름, 사용자 ID, 속해있는 그룹 ID 등의 정보를 포함하고 있습니다.
- 다음과 같이
cat
명령어로/etc/passwd
파일의 내용을 확인할 수 있습니다.user@user-VirtualBox:~/new_dir$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin ...(생략) user:x:1000:1000:user,,,:/home/user:/bin/bash fwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin vboxadd:x:999:1::/var/run/vboxadd:/bin/false user@user-VirtualBox:~/new_dir$
/etc/group
은 리눅스의 그룹 정보를 저장하는 텍스트 파일입니다.
각 그룹의 이름, 그룹 ID, 그룹에 속한 유저 목록 등의 정보를 포함하고 있습니다.
- 다음은
cat
명령어로/etc/group
파일의 내용을 확인한 결과입니다.user@user-VirtualBox:~/new_dir$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,user tty:x:5: disk:x:6: ...(생략) user:x:1000: sambashare:x:135:user fwupd-refresh:x:136: vboxsf:x:999: vboxdrmipc:x:998: user@user-VirtualBox:~/new_dir$
- 리눅스는 사용자가 파일과 디렉토리에 접근하는 행위에 대해 권한으로 제어합니다.
- 각 파일과 디렉토리 소유자(owner)와 소유 그룹(group)을 가지고 있습니다.
- 소유자는 파일 또는 디렉토리의 권한을 수정할 수 있는 능력을 가지고 있습니다.
- 소유자는 이를 통해 소유자 또는 소유 그룹에 포함된 유저가 해당 파일 또는 디렉토리에 대해서 얼마만큼 접근 권한을 가질 것인지 설정할 수 있습니다.
- 다음과 같이 세 종류의 접근 권한이 있습니다.
- 읽기(Read): 파일 또는 디렉토리의 내용을 볼 수 있게 허용합니다.
- 쓰기(Write): 파일 또는 디렉토리의 내용을 수정하거나 삭제하는 것을 허용합니다.
- 실행(Execute): 파일이 프로그램인 경우 실행할 수 있게 허용합니다. 디렉토리의 경우, 디렉토리의 내용에 접근할 수 있도록 허용합니다.
파일이나 디렉토리의 권한을 보기 위해ls -l
를 사용합니다.
해당 명령어는 디렉토리의 내용을 권한 정보와 함께 출력합니다.- 다음은
ls -l
명령어 예시 결과입니다.user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir ---------- 1 user user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$
- 다음은
dir
디렉토리의 예시입니다. 첫 번째 열은 권한 플래그를 나타내고 세 번째 열은 소유자를 나타냅니다. 네 번째 열은 소유 그룹을 나타냅니다. 결과의 첫 번째 행을 가져와 자세히 살펴보겠습니다.drwxrwxr-x 2 user user 4096 12월 2 13:38 dir
dir
의 권한 플래그는drwxrwxr-x
이고, 소유자는user
이며 소유 그룹은user
입니다. 각각에 대해 자세히 알아보겠습니다.첫 번째 열
drwxrwxr-x
: 권한 플래그drwxrwxr-x 2 user user 4096 12월 2 13:38 dir
- 위 결과에서 첫 번째 열이 각 파일 또는 디렉토리의 권한 플래그를 나타냅니다.
- 권한 플래그는 다음과 같이 4개의 부분으로 나뉠 수 있습니다: d rwx rwx r-x
- d rwx rwx r-x
먼저 위에서 bold 처리한 첫 번째 문자는 파일의 타입을 나타냅니다.
d
는 디렉토리,-
는 일반 파일,l
은 바로가기와 같은 링크 파일을 나타냅니다.
- d rwx rwx r-x
그 다음 문자들은 권한 플래그입니다. 문자 3개씩 3개의 덩어리로 나뉩니다.
위에서 bold 처리한 3개의 문자는 파일 또는 디렉터리의 소유자의 권한을 나타냅니다.
- d rwx rwx r-x
위에서 bold 처리한 3개의 문자는 파일 또는 디렉토리의 소유 그룹에 포함된 유저들의 권한을 나타냅니다.
- d rwx rwx r-x
위에서 bold 처리한 3개의 문자는 파일 또는 디렉토리의 소유자 및 소유 그룹에 포함된 유저들을 제외한, 나머지 유저들의 권한을 나타냅니다.
권한을 나타내는 각 문자에 대한 설명은 다음과 같습니다.r
: 소유자(또는 소유 그룹에 포함된 유저들 또는 그외 유저)가 파일 또는 디렉토리에 읽기(Read) 권한을 가집니다.w
: 소유자(또는 소유 그룹에 포함된 유저들 또는 그외 유저)가 파일 또는 디렉토리에 쓰기(Write) 권한을 가집니다.x
: 소유자(또는 소유 그룹에 포함된 유저들 또는 그외 유저)가 파일 또는 디렉토리에 실행(Execute) 권한을 가집니다.
권한을 나타내는 3개 문자는 2진수나 10진수로도 표현이 가능합니다.
예를 들어rwx
는 2진수로111
이며, 10진수로는 7입니다.
r--
은 2진수로100
이며, 10진수로는 4입니다.세 번째 열
user
: 소유자drwxrwxr-x 2 user user 4096 12월 2 13:38 dir
위 결과에서 세 번째 열이 파일 또는 디렉토리의 소유자를 나타냅니다.
소유자는 파일 또는 디렉토리에 대한 제어권을 가지고 있습니다.
소유자는 파일 또는 디렉토리의 권한 플래그를 변경할 수 있고 파일의 소유자 또는 소유 그룹을 변경할 수도 있습니다.
위dir
디렉토리의 소유자가user
유저임을 알 수 있습니다.네 번째 열
user
: 소유 그룹리눅스에는 여러 사용자를 하나의 집합으로 관리할 수 있는 그룹 기능이 있습니다.
소유 그룹은 그룹 단위로 파일 또는 디렉토리에 권한을 부여할 때 사용합니다.
특정 파일 또는 디렉토리에 대한 접근 권한을 편리하게 그룹 단위로 부여하거나 제한할 수 있어 자주 활용되는 기능입니다.
결론
앞서 배운 것들을 종합하여 아래의 ls -l 결과를 해석해보겠씁니다.
-rwxrw-r-- 1 user user 13 12월 2 13:08 world
우선 소유자는
user
이며 소유 그룹은user
입니다.
권한 플래그는 다음과 같습니다.
rwx rw- r--
- 파일 타입을 나타내는 첫 번째 문자가
-
이므로world
는 일반 파일입니다.- 소유자 권한 플래그는
rwx
이므로user
유저는world
파일을 읽고 쓰고 실행할 수 있습니다.- 소유 그룹 권한 플래그는
rw-
이므로user
그룹에 속한 유저들은world
파일을 읽고 쓸 수는 있지만 실행할 수는 없습니다.user
유저가 아니면서user
그룹에 속하지 않은 유저들은r--
권한을 가지므로world
파일을 읽을 수만 있고 쓰거나 실행할 수는 없습니다.
chmod
는 파일 권한을 변경하는 명령어입니다.root
유저 혹은 파일의 소유자만 실행할 수 있습니다.
chmod 권한 파일명
형식으로 사용합니다.
권한을 표현할 때는 권한 플래그를 10진수로 표현하거나 기존의 권한에 문자를 더하거나 뺍니다.
- 다음은
ls -l
명령어 결과입니다.hello
파일에 아무 권한도 부여되지 않은 상태입니다.user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir ---------- 1 user user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$
world
파일과 동일하게, 소유자는 읽고 쓰고 실행할 수 있고, 소유 그룹은 읽고 쓸 수 있고, 일반 유저는 읽을 수만 있도록hello
파일 권한을 수정하겠습니다.
소유자 권한은 rwx이므로111
=7, 소유 그룹 권한은 rw-이므로110
=6, 일반 유저 권한은 r--이므로100
=4입니다.
chmod 764 hello
를 실행하면 권한이 아래와 같이 변경됩니다.user@user-VirtualBox:~/new_dir$ chmod 764 hello user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxrw-r-- 1 user user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$
이번에는
hello
파일 소유 그룹에 실행 권한을 부여하겠습니다.
다음과 같이chmod g+x hello
명령어를 실행하면 권한이 변경됩니다.
권한을 제거하고 싶으면chmod g-wx hello
와 같은 형식으로 입력합니다.user@user-VirtualBox:~/new_dir$ chmod g+x hello user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxrwxr-- 1 user user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$ chmod g-wx hello user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxr--r-- 1 user user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world
chown
은 파일 소유자 혹은 소유 그룹을 변경하는 명령어입니다.
root
유저만 실행할 수 있습니다.
chown 사용자명[.그룹명] 파일명
형식으로 사용합니다.
소유 그룹만 변경하고 싶은 경우chgrp
명령어를 사용합니다.
hello
파일의 소유자를user
에서root
로 변경하겠습니다. 명령어를root
권한으로 실행하려면 맨 앞에sudo
를 붙여줍니다.
sudo chown root hello
명령어를 실행하면 소유자가 변경됩니다. 이제user
유저는hello
파일을 수정할 수 없습니다.user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxr--r-- 1 user user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$ sudo chown root hello [sudo] password for user: user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxr--r-- 1 root user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$ echo "hello" > hello bash: hello: Permission denied user@user-VirtualBox:~/new_dir$
앞서 배운 r,w,x 권한 외에 특수한 권한 3가지를 소개하겠습니다.
setuid: 일반 사용자가 파일을 실행하면 파일 소유자 권한으로 실행됩니다.
예를 들어,/bin/passwd
파일은 소유자가root
이지만 setuid가 설정되어 있어 일반 사용자가root
권한으로 실행하고 비밀번호도 변경할 수 있습니다.
setuid는 소유자의 실행 권한에x
대신s
문자로 나타냅니다.
대문자S
로 표시되는 경우에는 setuid가 걸려 있으나, 실행 권한이 없는 경우입니다.
/bin/passwd
의 권한 플래그는 다음과 같습니다.user@user-VirtualBox:/bin$ ls -l passwd -rwsr-xr-x 1 root root 59976 11월 24 21:05 passwd
- 소유자의 실행 권한이 s로 설정된 것을 볼 수 있습니다.
setgid: 일반 사용자가 파일을 실행하면 파일 소유 그룹 권한으로 실행됩니다.
setgid는 소유 그룹의 실행 권한에x
대신s
문자로 나타냅니다.
마찬가지로 실행 권한이 없으나 setgid가 걸려 있는 경우 대문자S
로 표시됩니다.
sticky bit: 디렉토리에 sticky bit를 설정하면 파일 및 디렉토리 소유자와 root 사용자 외에 일반 사용자가 파일을 삭제할 수 없습니다.
주로 공용 디렉토리에 사용합니다. 일반 사용자의 실행 권한에x
대신t
문자로 나타냅니다.
이 역시 마찬가지로 실행 권한이 없는 경우에는 대문자T
로 표시됩니다.특수 권한을 지정할 때는 권한 플래그 맨 앞에 숫자를 붙여 나타냅니다.
setuid는 4, setgid는 2, sticky bit는 1입니다.
다음은 chmod 4755 world
명령어로world
파일에 실행 권한과 setuid를 설정하는 모습입니다. setuid만 설정하는 경우chmod u+s world
도 가능합니다.setgid는
chmod g+s world
, sticky bit는chmod o+t world
로 설정할 수 있습니다.user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxr--r-- 1 root user 13 12월 2 13:05 hello -rwxrw-r-- 1 user user 13 12월 2 13:08 world user@user-VirtualBox:~/new_dir$ chmod 4775 world user@user-VirtualBox:~/new_dir$ ls -l total 12 drwxrwxr-x 2 user user 4096 12월 2 13:38 dir -rwxr--r-- 1 root user 13 12월 2 13:05 hello -rwsrwxr-x 1 user user 13 12월 2 13:08 world
/
루트 디렉토리는 리눅스의 최상위 디렉토리를 말하며, 절대 경로는 /
입니다.
cd /; ls -l
또는 ls -l /
를 실행하면 루트 디렉토리에 존재하는 파일과 디렉토리들을 볼 수 있습니다.
user@user-VirtualBox:~$ ls -l /
total 3991632
lrwxrwxrwx 1 root root 7 11월 30 18:15 bin -> usr/bin
drwxr-xr-x 4 root root 4096 12월 1 14:10 boot
drwxrwxr-x 2 root root 4096 11월 30 18:25 cdrom
drwxr-xr-x 19 root root 4180 12월 1 14:25 dev
drwxr-xr-x 130 root root 12288 12월 1 14:09 etc
drwxr-xr-x 3 root root 4096 11월 30 18:27 home
lrwxrwxrwx 1 root root 7 11월 30 18:15 lib -> usr/lib
lrwxrwxrwx 1 root root 9 11월 30 18:15 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 11월 30 18:15 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 11월 30 18:15 libx32 -> usr/libx32
drwx------ 2 root root 16384 11월 30 18:14 lost+found
drwxr-xr-x 3 root root 4096 11월 30 19:49 media
drwxr-xr-x 2 root root 4096 8월 9 20:48 mnt
drwxr-xr-x 3 root root 4096 11월 30 19:55 opt
dr-xr-xr-x 257 root root 0 12월 1 14:11 proc
drwx------ 4 root root 4096 12월 1 14:17 root
drwxr-xr-x 33 root root 900 12월 1 14:12 run
lrwxrwxrwx 1 root root 8 11월 30 18:15 sbin -> usr/sbin
drwxr-xr-x 11 root root 4096 8월 9 20:55 snap
drwxr-xr-x 2 root root 4096 8월 9 20:48 srv
-rw------- 1 root root 4087349248 11월 30 18:15 swapfile
dr-xr-xr-x 13 root root 0 12월 1 14:11 sys
drwxrwxrwt 20 root root 4096 12월 1 14:17 tmp
drwxr-xr-x 14 root root 4096 8월 9 20:48 usr
drwxr-xr-x 14 root root 4096 8월 9 20:54 var
user@user-VirtualBox:~$
위 ls
명령어 실행 결과에서 볼 수 있듯이 루트 디렉토리 안에 많은 디렉토리가 존재합니다.
이중 몇 가지 중요한 디렉토리들을 알아보겠습니다.
/bin
일반 유저가 사용할 수 있는 기본적인 명령어나 프로그램을 담고 있는 디렉토리입니다.
/boot
시스템 부팅에 필요한 파일들을 담고 있는 디렉토리입니다.
/dev
리눅스에서는 컴퓨터에 부착된 물리적인 장치들을 디바이스 드라이버를 거쳐 파일 형태로 접근 가능합니다.
그러한 장치들을 나타내는 파일들을 담고 있는 디렉토리입니다.
/etc
운영체제나 운영체제 위에서 동작하는 서비스의 설정 파일들을 담고 있는 디렉토리입니다.
/home
각 일반 유저의 홈 디렉토리를 담고 있는 디렉토리입니다. 일반 유저들은 각기 자신만의 홈 디렉토리를 가지고 있습니다. 예를 들어
dream
유저의 홈 디렉토리는/home/dream
입니다.
/lib
시스템에 필요한 라이브러리 파일들을 담고 있는 디렉토리입니다.
/bin
이나/sbin
에 존재하는 프로그램이 필요로 하는 동적 라이브러리 파일이/lib
디렉토리에 존재합니다.
/opt
소프트웨어 패키지들을 담는 디렉토리입니다.
/proc
리눅스 커널 자원에 접근할 수 있는 파일과 프로세스를 나타내는 파일을 담고 있습니다.
/root
root
유저의 홈 디렉토리입니다.
/sbin
/bin
디렉토리와 마찬가지로 기본적인 유저 명령어나 프로그램을 가지고 있는 디렉토리입니다./sbin
은root
유저가 사용할 수 있는 명령어나 프로그램을 가지고 있습니다.
/tmp
유저나 프로그램이 임시로 파일을 생성해야할 때 사용할 수 있는 디렉토리입니다. 본 디렉토리에 오래 존재했던 파일들은 자동으로 삭제되므로 주의하여 사용해야 합니다.
/usr
사용자 바이너리, 문서, 라이브러리, 헤더 파일 등을 담고 있는 디렉토리입니다.
/var
프로그램이나 시스템이 실시간으로 가변적인 파일을 사용하고 저장해야 할 때 활용하는 디렉토리입니다.
예를 들어/var/log
에는 다양한 로그 파일이 저장됩니다.