본문 바로가기
해킹 기초지식

리눅스 권한- 유저(user)와 그룹(group)

by whiteTommy 2023. 11. 19.

리눅스의 권한 시스템을 설명하기 위해서는 유저그룹에 대한 개념을 알아야 한다.

 

유저 : 이름과 고유한 사용자 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)에 속한 유저가 해당 파일 또는 디렉토리에 대해서 얼마만큼 접근 권한을 가질 것인지를 설정할 수 있다. 3가지 접근 권한이 있다.

 

  1. 읽기(Read) : 파일 또는 디렉토리의 내용을 볼 수 있게 허용한다.
  2. 쓰기(write) : 파일 또는 디렉토리의 내용을 수정하거나 삭제하는 것을 허용한다.
  3. 실행(Execute) : 파일이 프로그램인 경우 실행할 수 있게 허용한다. 디렉터리의 경우, 디렉터리의 내용에 접근할 수 있도록 허용한다.

우선, 파일이나 디렉토리의 권한을 보기 위해 ls -l 명령어를 사용한다.

user@user-virtual-machine:~$ ls -l
total 44
drwxr-xr-x 2 user user 4096 11월 17 12:11 Desktop
drwxr-xr-x 2 user user 4096 11월 17 12:11 Documents
drwxr-xr-x 2 user user 4096 11월 17 12:11 Downloads
drwxr-xr-x 2 user user 4096 11월 17 12:11 Music
drwxrwxr-x 2 user user 4096 11월 18 15:55 new_dir
-rw-rw-r-- 1 user user    6 11월 18 01:31 old_file
drwxr-xr-x 3 user user 4096 11월 18 01:31 Pictures
drwxr-xr-x 2 user user 4096 11월 17 12:11 Public
drwx------ 4 user user 4096 11월 17 16:11 snap
drwxr-xr-x 2 user user 4096 11월 17 12:11 Templates
drwxr-xr-x 2 user user 4096 11월 17 12:11 Videos

 

첫 번째 열은 권한 플래그, 세 번째 열은 소유자, 네 번째 열은 소유 그룹을 나타낸다.

 

아래는 new_dir 의 예시이다. 

drwxrwxr-x 2 user user 4096 11월 18 15:55 new_dir

 

여기서, 권한 플래그는 drwxrwxr-x이며, 소유자는 user, 소유 그룹은 user 이다.

 

각각에 대해서 자세히 알아보자.

 

1. 권한 플래그

: ls -l에서 첫 번째 열에 있고, 위의 예시에서는 drwxrwxr-x이다.

d rwx rwx r-x

 

  • 첫 번째 부분(d)은 파일의 타입을 나타낸다. d는 디렉터리, -는 일반 파일, l은 바로가기와 같은 링크 파일을 나타낸다.
  • 두 번째 부분(rwx)은 소유자의 권한을 나타낸다.
  • 세 번째 부분(rwx)는 소유 그룹에 포함된 유저들의 권한을 나타낸다.
  • 마지막 부분(r-x)은 포함되지 않은 나머지 유저들의 권한을 나타낸다. 

여기서 r 은 앞서 언급한 읽기 권한, w는 쓰기 권한, x는 실행 권한을 의미한다. 즉, 위의 권한 플래그는 소유자와 소유 그룹에 포함된 유저들은 3가지 권한이 모두 가능하고, 나머지 유저들은 쓰기 권한을 제외한 나머지 권한이 가능하다.

 

한편, 권한을 나타내는 3개 문자는 2진수나 10진수로도 표현이 가능하다. 예를 들어 rwx는 2진수로 111이며, 10진수는 7이다. r--은 2진수로 100이며 10진수는 4이다.

 

2. 소유자

: ls -l에서 세 번째 열에 있고, 위의 예시에서는 user이다. 소유자는 파일 또는 디렉터리에 대한 제어권을 가지고 있다.

소유자는 파일 또는 디렉터리의 권한 플래그를 변경할 수 있고, 파일의 소유자 또는 소유 그룹을 변경할 수도 있다.

 

3. 소유 그룹

: ls -l에서 네 번째 열에 있고, 위의 예시에서는 user이다. 그룹 단위로 파일 또는 디렉터리에 권한을 부여할 때 사용한다. 

 

 

앞서 배운 것들을 종합하여 아래의 ls -l 결과를 해석해 보자.

-rw-rw-r-- 1 user user    6 11월 18 01:31 old_file

 

위의 old_file에 대한 권한 플래그는 - rw- rw- r--이다.

 

파일 타입을 나타내는 첫 번째 문자가 - 이므로 old_file 은 일반 파일이다.

소유자 권한 플래그는 rw- 이므로 user 유저는 old_file을 읽고, 쓸 수 있다.

소유 그룹 권한 플래그도 rw- 이므로 user 그룹에 속한 유저들은 old_file을 읽고, 쓸 수 있다.

user 유저가 아니면서, user 그룹에 속하지도 않은 나머지 유저들은 r-- 권한을 가지므로 old_file을 읽을 수만 있다.

 

 

이제는, 파일이나 디렉터리의 권한을 변경하는 명령어를 보자.

 

chmod 

: 파일 권한을 변경한다. root 유저, 파일의 소유자만 실행할 수 있다. chmod 권한 파일명 형식으로 사용한다.

 

아래에서 old_file의 소유자의 권한은 rw- 이므로 110(2진수) = 6(10진수), 소유 그룹의 권한은 rw- 이므로 마찬가지로, 110(2진수) = 6(10진수)이고, 일반 유저는 r-- 이므로 100(2진수) = 4(10진수)이다.

user@user-virtual-machine:~$ ls -l
total 44
drwxr-xr-x 2 user user 4096 11월 17 12:11 Desktop
...생략
-rw-rw-r-- 1 user user    6 11월 18 01:31 old_file	// old_file의 권한은 664 이다.

user@user-virtual-machine:~$ chmod 764 old_file		// 권한을 764로 변경한다.
user@user-virtual-machine:~$ ls -l
total 44
drwxr-xr-x 2 user user 4096 11월 17 12:11 Desktop
...생략
-rwxrw-r-- 1 user user    6 11월 18 01:31 old_file

 

chmod 764 old_file 명령어를 통해 old_file의 권한을 764로 변경한다. 764는 권한 플래그가 7(10진수)=111(2진수) 이므로 rwx이고, 6(10진수) = 110(2진수) 이므로 rw-이며, 4(10진수) = 100(2진수) 이므로r--이다.

즉, 764의 권한 플래그는 - rwx rw- r-- 로 변경된다.

 

이번에는 old_file 파일 소유 그룹실행 권한을 부여할 것이다. chmod g+x old_file 명령어를 실행하면 권한이 변경된다.

user@user-virtual-machine:~$ ls -l
-rwxrw-r-- 1 user user    6 11월 18 01:31 old_file

user@user-virtual-machine:~$ chmod g+x old_file

user@user-virtual-machine:~$ ls -l
-rwxrwxr-- 1 user user    6 11월 18 01:31 old_file

 

권한은 제거하고 싶으면 chmod g-wx old_file와 같은 형식으로 입력한다.

 

chown

파일 소유자, 소유 그룹을 변경한다. root 유저만 실행할 수 있다. chown 사용자명[. 그룹명] 파일명 형식으로 사용한다.

소유 그룹만 변경하고 싶은 경우 chgrp 명령어를 사용한다.

 

old_file의 소유자를 user에서 root로 변경할 것이다. root 권한으로 실행하려면 맨 앞에 sudo를 붙여준다.

sudo chown root old_file 명령어를 실행하면 소유자user에서 root로 변경된다.

user@user-virtual-machine:~$ sudo chown root old_file
[sudo] password for user: 
user@user-virtual-machine:~$ ls -l

drwxr-xr-x 2 user user 4096 11월 17 12:11 Desktop
drwxr-xr-x 2 user user 4096 11월 17 12:11 Documents
drwxr-xr-x 2 user user 4096 11월 17 12:11 Downloads
drwxr-xr-x 2 user user 4096 11월 17 12:11 Music
drwxrwxr-x 2 user user 4096 11월 18 15:55 new_dir
-rwxrwxr-- 1 root       user    6 11월 18 01:31 old_file
drwxr-xr-x 3 user user 4096 11월 18 01:31 Pictures
drwxr-xr-x 2 user user 4096 11월 17 12:11 Public
drwx------ 4 user user 4096 11월 17 16:11 snap
drwxr-xr-x 2 user user 4096 11월 17 12:11 Templates
drwxr-xr-x 2 user user 4096 11월 17 12:11 Videos

 

 

특수 권한

  • setuid : 일반 사용자가 파일을 실행하면 파일 소유자 권한으로 실행된다. 소유자의 실행 권한에 x대신 문자 s로 나타낸다. 실행 권한이 없는 경우 S로 표시된다.
user@user-virtual-machine:~$ /bin/passwd
Changing password for user.
Current password: 
New password: 
BAD PASSWORD: The password is just rotated old one
New password: 
Retype new password: 
passwd: password updated successfully
user@user-virtual-machine:~$ ls -l passwd
-rwsr-xr-x 1 root root 59976 11월 19 03:18 passwd	// 권한 플래그가 rws 로 변경됨
  • setgid : 일반 사용자가 파일을 실행하면 파일 소유 그룹 권한으로 실행된다.
  • sticky bit: 파일 및 디렉터리 소유자와 root 사용자 외에 일반 사용자가 파일을 삭제할 수 없도록 한다. 일반 사용자의 실행 권한에 x 대신 t 문자로 나타낸다. 실행 권한이 없는 경우 T로 표시된다.

특수 권한을 지정할 때, 권한 플래그 맨 앞에 숫자를 붙여 나타낸다. setuid는 4, setgid는 2, sticky bit 1이다.

 

chmod 4755 new_dir 명령어를 실행하면, 4는 setuid를 의미하며 755는 각각 rws rwx r-x를 의미하므로 다음과 같다.

user@user-virtual-machine:~$ chmod 4755 new_dir
user@user-virtual-machine:~$ ls -l

drwsr-xr-x 2 user user 4096 11월 18 15:55 new_dir	// 파일 소유자 권한으로 실행

 

setuid 만 설정하는 경우 chmod u+s new_dir 도 가능하다.

setgid는 chmod g+s new_dir, sticky bitchmod o+t new_dir로 설정할 수 있다.

 

 

 루트 디렉터리

:리눅스의 최상위 디렉터리이다, 절대 경로는/이다.

cd / ; ls - l 또는 ls -l / 를 실행하면 루트 디렉터리에 존재하는 파일과 디렉터리들을 볼 수 있다.

user@user-virtual-machine:~$ cd /; ls -l
total 2191440
lrwxrwxrwx   1 root root          7 11월 17 12:05 bin -> usr/bin
drwxr-xr-x   4 root root       4096 11월 17 12:14 boot
drwxrwxr-x   2 root root       4096 11월 17 12:07 cdrom
drwxr-xr-x  19 root root       4280 11월 18 14:48 dev
drwxr-xr-x 130 root root      12288 11월 19 03:16 etc
drwxr-xr-x   3 root root       4096 11월 17 12:08 home
lrwxrwxrwx   1 root root          7 11월 17 12:05 lib -> usr/lib
lrwxrwxrwx   1 root root          9 11월 17 12:05 lib32 -> usr/lib32
lrwxrwxrwx   1 root root          9 11월 17 12:05 lib64 -> usr/lib64
lrwxrwxrwx   1 root root         10 11월 17 12:05 libx32 -> usr/libx32
drwx------   2 root root      16384 11월 17 12:05 lost+found
drwxr-xr-x   4 root root       4096 11월 17 12:11 media
drwxr-xr-x   2 root root       4096  8월  8 07:52 mnt
drwxr-xr-x   2 root root       4096  8월  8 07:52 opt
dr-xr-xr-x 351 root root          0 11월 17 14:24 proc
drwx------   4 root root       4096 11월 17 12:11 root
drwxr-xr-x  37 root root        960 11월 19 03:03 run
lrwxrwxrwx   1 root root          8 11월 17 12:05 sbin -> usr/sbin
drwxr-xr-x  13 root root       4096  8월  8 07:59 snap
drwxr-xr-x   2 root root       4096  8월  8 07:52 srv
-rw-------   1 root root 2243952640 11월 17 12:05 swapfile
dr-xr-xr-x  13 root root          0 11월 17 14:24 sys
drwxrwxrwt  22 root root       4096 11월 19 03:38 tmp
drwxr-xr-x  14 root root       4096  8월  8 07:52 usr
drwxr-xr-x  14 root root       4096  8월  8 07:58 var

 

  • / bin : 일반 유저가 사용할 수 있는 기본적인 명령어가 프로그램을 담고 있는 디렉터리이다.
  • / boot : 시스템 부팅에 필요한 파일들을 담고 있는 디렉터리이다.
  • / dev : 컴퓨터에 부착된 물리적인 장치를 나타내는 파일을 담고 있는 디렉터리이다.
  • / etc  : 운영체제나 그 위에서 동작하는 서비스의 설정 파일을 담고 있는 디렉터리이다.
  • / home : 각 일반 유저의 홈 디렉터리를 담고 있는 디렉터리이다.
  • / lib : 시스템에 필요한 라이브러리 파일을 담고 있는 디렉터리이다.
  • / opt : 소프트웨어 패키지들을 담는 디렉터리이다.
  • / proc : 리눅스 커널 자원에 접근할 수 있는 파일과 프로세스를 나타내는 파일을 담고 있다.
  • / root : root 유저의 홈 디렉터리이다.
  • / sbin : 기본적인 유저 명령어나 프로그램을 갖는 디렉터리. root 유저가 사용할 수 있는 명령어나 프로그램을 가진다.
  • / tmp : 유저나 프로그램이 임시로 파일을 생성해야 할 때 사용할 수 있는 디렉터리이다.
  • / user : 사용자 바이너리, 문서, 라이브러리, 헤더 파일 등을 담고 있는 디렉터리이다.
  • / var : 프로그램이나 시스템이 실시간으로 가변적인 파일을 사용하고 저장할 때 활용하는 디렉터리이다.