초보 해커를 위한 C언어와 동작 원리/Ch3. Operating system

리눅스 권한

anonkorea4869 2025. 4. 23. 00:50

! 내용은 검토 포스트 입니다. 부정확한 내용이 있을 있으니 양해바랍니다.

1. 권한

권한(permission)은 보안을 위해 어떤 행위자가 어떤 행위를 할 수 있는지 제한하는 것이다. daehun 유저가 작성한 텍스트 파일은 daehun 유저만 읽을 수 있게 허가하고, 나머지 유저는 못 읽게 하는 것이 그 예이다.

1.1. 권한의 종류

행위 : 읽기(read), 쓰기(write), 실행(execute)

행위자 : root, user, group, other/guest

! root 계정은 소유주/소유 그룹이 아니더라도 모든 파일에 대해서 접근이 가능하다.

2. ls -l

ls -l 명령어를 입력하면 아래와 같이 나옴

주황색 : 권한 → 3개씩 끊어서 묶음으로 나타낼 수 있음 rwx/rwx/rwx

    • r(read), w(write), x(execute), -(none)
    1. 첫번째 묶음 : user
    2. 두번째 묶음 : group
    3. 세번째 묶음 : others
    • r w x / r - x / - - - → user는 r,w,x 가능 / group은 r, x 가능
  • 빨간색 : 소유 user
  • 파란색 : 소유 group

2.2. group

user가 사용자 본인인것은 알겠는데 group은 뭘까? 현재 내 group은 groups 명령어를 통해 확인할 수 있다.groupadd 명령어 등을 통해 그룹에 참가할 수 있지만, 기본적으로 user명의 group에 자동으로 속해있다.

3. chmod

리눅스에서 권한을 바꾸는 대표적인 명령어.

chmod 명령어는 해당 파일에 대한 소유주와 root만 실행 가능하다 → group도 되는지

// chmod [옵션] [파일/디렉토리명]
chmod 777 /etc/passwd

3.1. 8진수로 권한 나타내기

user/group/other 권한을 따로 분리하여 r=4, w=2, x=1를 매칭시켜 해당하는 권한의 값을 더하고 그 값을 나열한다.

예시 : rwx/r-x/--- → 4+2+1/4+1/0 → 750

chmod 750 /etc/passwd

3.2. 문자로 권한 나타내기

3.3. 권한 실습

  • 디렉토리에 접근하기 위해 어떤 권한이 필요할까?
cd /home/test/linux

4. 특수 권한

4.1. ID의 종류

uid(Real UID) : 실제 사용자 본인의 아이디

euid(Effective UID) : 프로그램이 실행될 때 갖는 아이디

내 아이디는 id 명령어를 통해 확인 가능

4.2. 특수 권한의 종류

  • setuid : 소유자의 권한으로 프로그램 실행
  • setgid : 소유 그룹의 권한으로 프로그램 실행
  • sticky bit : 디렉토리에 적용되면 공유 디렉토리 역할을 하며, 디렉토리 소유자 또는 root가 아닌 유저들은 파일을 삭제하고나 이름을 변경 못하게 막음, 파일 또는 디렉토리 생성은 누구나 가능

4.3. 특수 권한 설정 방법

rwx/rwx/rwx를 각각 4/2/1로 나누어 더한 후 chmod 를 통해 설정

기본 755 권한과 더불어 setuid를 주려면 4를 앞에 붙여준다.

chmod 4755 [filename]

만약 setuid는 있지만 x권한이 없으면 대문자 S로 표시되게 된다.

출처 : https://reakwon.tistory.com/189

4.4. 특수 권한 실습

root만 읽을 수 있는 secret.txt 파일을 setuid를 통해 읽는 방법을 학습해보겠다.

파일 생성

echo "SECRET" > /home/test/secret.txt
chmod 600 /home/test/secret.txt

read 프로그램 생성

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(){
        int fd=open("root_read_only.txt",O_RDONLY);
        int n;
        char buf[128];
        printf("uid:%d\n",getuid());    //실제 사용자 ID
        printf("euid:%d\n",geteuid());  //이 프로그램을 실행할때만 갖는 ID
        n=read(fd,buf,sizeof(buf));
        if(n<0){
                printf("파일을읽을 수 없습니다. erorr code:%d\n",n);
                exit(1);
        }
        printf("file content:%s\n",buf);
}
gcc -o /home/test/setuid /home/test/setuid.c
chmod 4755 /home/test/setuid

5. 소유자 변경

chown(change owner) 명령어를 통해 소유 user와 소유 group을 변경할 수 있다.

chown 명령어는 소유 user와 root만 가능하다.

chown [user]:[group] [filename]

만약 디렉토리 내부의 모든 소유주를 변경해야하면 아래와 같이 -R(recursive) 옵션을 사용할 수 있다.

chown -R [user]:[group] [filename]

6. 사용자 변경

su(switch user) 명령어를 통해 사용자 변경이 가능하다. user가 root가 아니라면 비밀번호를 입력해야 변경 가능하다.

만약 username을 작성해주지 않으면 root를 적어주지 않아도 root로 사용자 변경을 시도한다.

su [username]

su 명령어 후 pwd 명령어를 입력하면 사용자 변경을 시도한 경로로 사용자가 변경되게 된다. A의 홈 디렉토리에서 su 명령어로 B로 변경후 ls 를 입력하면 권한 문제가 생기게된다. 이는 현재 B가 A의 홈디렉토리에 있기 때문이다. 따라서 - 옵션을 붙여주면 자동으로 변경될 사용자의 홈 디렉토리 경로로 이동되게 된다.

su - [username]

7. sudo

sudo(Substitue User Do)는 일반 사용자가 root 계정으로 명령을 실행 할 수 있는 것이다. 따라서 sudo touch 123 명령어를 입력하면 root권한으로 파일이 생성되게 된다.

/etc/sudoers 설정파일에 있는 user만 sudo 권한을 가질 수 있음