참고
※참고 자료는 드림핵을 이용하였습니다.
※드림핵의 로드맵대로 공부할 예정입니다.
※스스로를 위해 정리한 참고 자료입니다.

권한

유저(user)와 그룹(group)

리눅스에서 유저그룹리눅스의 권한 시스템을 설명하기 위해 빠뜨릴 수 없는 개념입니다.
리눅스의 각 유저는 이름과 고유한 사용자 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

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

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로 표시됩니다.

특수 권한을 지정할 때는 권한 플래그 맨 앞에 숫자를 붙여 나타냅니다.
setuid4, setgid2, sticky bit1입니다.

  • 다음은 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 디렉토리와 마찬가지로 기본적인 유저 명령어나 프로그램을 가지고 있는 디렉토리입니다. /sbinroot 유저가 사용할 수 있는 명령어나 프로그램을 가지고 있습니다.

/tmp

유저나 프로그램이 임시로 파일을 생성해야할 때 사용할 수 있는 디렉토리입니다. 본 디렉토리에 오래 존재했던 파일들은 자동으로 삭제되므로 주의하여 사용해야 합니다.

/usr

사용자 바이너리, 문서, 라이브러리, 헤더 파일 등을 담고 있는 디렉토리입니다.

/var

프로그램이나 시스템이 실시간으로 가변적인 파일을 사용하고 저장해야 할 때 활용하는 디렉토리입니다.
예를 들어 /var/log에는 다양한 로그 파일이 저장됩니다.




출처 및 참고자료

https://learn.dreamhack.io/441#16

profile
안녕하세요

0개의 댓글