IT 그리고 정보보안/Knowledge base

리눅스 파일 권한

plummmm 2021. 4. 14. 13:25
반응형

리눅스 파일 권한에 대한 이야기를 하겠다.

 

리눅스 운영체제가 여러명의 유저가 사용 가능하도록 계정이 존재하는 것은 알거임.

여러명의 사용자가 동시에 OS를 사용하는데.. 권한이 각자 다르겠지.

관리자 권한이 있고, 자원 접근이 한정적인 일반 사용자 계정이 있을 것이고, 

또 권한에 따른 그룹도 존재할 것이다.

 

$ls -al 명령을 디렉토리 내에 있는 파일들의 리스트가 나온다.

우리가 볼 것은 파일 목록 앞에 적힌 " drwx------ " 패턴으로 이루어진 문자들.

바로 오늘 얘기한 권한에 관련된 내용이 표시된 부분이다.

 

drwxrwxr-x 2 student student ​이놈들이 뭘 뜻하는 걸까.

 

먼저 맨 앞 d는 디렉토리인지 파일인지 구분하는 것이다. d가 되어있으면 디렉토리, -는 파일

다음 rwx rwx r-x 가 3개 연달아 나온다.

r은 읽기권한(read)w는 쓰기 권한(write)x는 실행 권한이다(execute)

 

그리고 저놈들이 연달아 3개 나오는데,

첫 번째는 사용자 권한

두 번째는 그룹 권한

세 번째는 other 즉, 방문자 권한 이다.

 

그리고 그 뒤에 나오는 계정명으로 추정되는 student student

앞에 껀 파일을 소유한 사용자, 뒤에 껀 파일을 소유한 그룹이다.

 

그럼 어떤 파일의 권한을 보는 방법을 알았다.

그럼 권한을 주는 방법도 알아야 할 것임.

 

chmod 라는 명령어를 사용하면 파일이나 디렉토리에 권한 부여를 할 수 있다.

rwx를 비트에 대응하여 보면.. (2진수 숫자로 생각하자.)

 

[r, w, x] ​→ [1, 1, 1]  [2^2, 2^1, 2^0] → [4, 2, 1]

이렇게 써주면 얼추 이해를 하지 싶은데..

긍까.. 비트 자리수에 대응하여 값을 가진다.

이 숫자들은 바로 앞에 포스트 에서 stat 구조체의 st_mode 맴버에 선언된 비트이다.

r : 4w : 2x : 1

 

그럼 이제 권한을 십진수 숫자로 나타낼 수 있다.

7 ​→ rwx   → r-x   → -wx

 

숫자로 나타낼 수 있으니 이 숫자를 이용하여 권한 부여를 할 수 있겠지?

예를 들어, chmod 755 test 라고 입력을 한다면

" -rwxr-xr-x " 이런 식으로 권한 부여가 될 것이다.

더 쉽게 chmod로 권한 설정하는 방법도 있다.

사용자=u, 그룹=g, 방문자=o 로 두고

chmod u+r (​or u+w, u+x, g-r, g-x ...)

이런 식으로 권한을 주거나 없애는 ... (+) 혹은  (-) 를 이용하여 쉽게 설정할 수도 있다. 

 

그리고 파일과 디렉토리가 가지는 권한이 서로 의미가 다른데,

 

파일은 말그대로 읽기, 쓰기, 실행에 대한 내용이니까 패스하고,

디렉토리는 좀 햇갈릴 수 있다.

dir 읽기 : ls 명령을 때릴 수 있나?

dir 쓰기 : 파일을 만들거나 삭제할 수 있나?

dir 실행 : cd 명령을 때릴 수 있나?

이런거다.

 

이건 파일에 대한 권한을 이쁘게 그림으로 그려놓은 것이다.

설명할 거 없다. 다음은 디렉토리 그림을 보자.

 

이해가 안간다면 외우자.

실행은 cd, 읽기는 ls, 쓰기는 생성/삭제

 

그럼 이번에는 open()이나 creat() 함수를 이용해서 파일을 생성할 때 권한을 보자.

보통은 프로세스의 euid를 따라서 파일이 생성된다.

 

이렇게 생성되는 새 파일의 gid 얘기도 안 할수가 없네. 2가지 경우가 있다.

1. 프로세스의 egid를 받아 새 파일의 gid로 지정

2. 새 파일이 생성된 디렉토리의 권한을 받아 gid로 지정

 

 

음.. 그 다음으로 조금 특수한 권한인 Setuid, Setgid에 대해 알아보자.

우리가 통상 사용자 계정으로 이용하다 보면 상위 권한이 필요한 작업이 생긴다. 가령, 비밀번호를 변경한다던지 하는 경우이다.

 

Setuid(gid)는 이럴 때 쓰인다.

setuid가 걸린 파일을 실행 중일 때는 그 파일 소유자 계정으로 권한이 상승된다.

setgid가 걸린 파일을 실행 중일 때는 그 파일 그룹 권한을 이용하여 실행한다.

 

 ls를 치면 -rwsr-sr-x 라고 되어 있는데.

원래 rwxrwxrwx 인데.. 지금 보면 x자리에 s가 와있다.

저건 setuid와 setgid가 걸린 상태이다.

 

vuln 파일을 실행 시에는 root권한을 이용하여 실행한다는 말이다.

이해가 잘 안간다면 예를 하나 들어줌.

 

A라는 놈이 있다. 이 넘은 보안키가 없어서 빌딩에 들어갈 수가 없다.

B는 빌딩에 들어갈 수 있는 보안키를 들고 있다.

A는 B에게 보안키를 빌려서 빌딩에 들어갈 수 있다.

 

위 예제에 적용하면 이해하기 쉬울 것임.

 

다시 본론으로 돌아가

리눅스 사용자 권한에는 euid, ruid가 있다.

 

euid ( effective user id )는 쉽게 setuid걸린 파일을 실행시에 받게되는 파일 소유자 권한을 뜻한다.

ruid ( real user id )는 원래 사용자의 권한 즉, 실제 권한을 의미한다.

 

setuid나 setgid가 설정된 파일을 실행하기 전의 권한은 ruid일 것이다.

그리고 파일을 실행할 때는 euid의 권한으로 승격 후에 실행된다.

그림을 보자.

 

그럼 chmod로 suid, sgid를 설정할 때 어떻게 하나.

setuid : chmod 4755 test

setgid : chmod 2755 test2 

 

감이 오나.. suid는 4000, sgid는 2000이다.

설정하는 법은 위에 처럼.

 

 

(+추가)

redhat 7.0이상 에서는 setuid걸린 파일에서 system()를 사용하면 euid로 권한 상승이 일어나지 않는다.

setreuid() 함수를 써서 인자를 setreuid(0,0) 으로 줘야 된다. (루트권한 0 혹은 ~~)

안그러면 exec()를 이용.

 

권한에 대해 실컷 알아봤으니, 그에 따른 시스템콜 함수들을 알아봐야지. 먼저 access 함수에 대해 알아보자.

access 함수는 "그 파일에 특정 권한이 있는지?" 를 확인하는 함수 이다.

판단은 Real ID를 보고 확인한다.

 

 

mode에 있는 것들은 이제 이 함수를 쓰면서 확인해 볼 권한이다.

이 파일의 read 권한이 있는지 궁금하다면 R_OK

execute 권한의 유무를 확인하고자 하면 X_OK 뭐 이런식이다.

예제 코드를 보자.

 

 

파일 경로를 인자로 받아서 R_OK 즉, read 권한이 있는지 확인하고

있으면 read access Ok 라는 문자열을 찍어내는 코드이다.

 

 

다음으로 umask() 라는 함수에 대해 알아보자

 

umask는 오류보고를 하지 않는 몇 없는 함수들 중 하나이다.

이놈은 프로세스의 파일 모드 생성 마스크를 설정하고 마스크의 이전 값을 되돌려 준다.

무슨 말이냐면..

umask 함수로 umask 권한을 설정 해두면, 파일 오픈, 생성할 때 주어지는 권한에서 umask에 있는 권한을 뺀 값이

그 파일의 권한이 되는 것이다.

 

umask(022) 를 설정해두고 파일 권한을 666 으로 생성한다면

그 파일은 644 권한을 갖는다는 것이다. 권한에 대한 마스크 비트는 아래 표에 나와

 

위에 표내용을 umask 사용할 때 참고 하면 된다.

umask(0) 인채로 생성된 foo 파일은 권한의 변화가 없을테고,

umask(066)이 설정된 bar 파일은 666에서 600으로 될 것이다.

 

다음은 chmod 와 fchmod 함수를 알아보자.

이건 뭐 우리가 늘상 쓰던 chmod 명령어의 기원이된 함수? 이다.

권한 변경하는 것임. fchmod는 오픈 된 파일에 대한 권한 변경이고 이게 다다

sys/stat.h 에 정의된 mode 값들을 보자.

 

넣을까 말까 하다가.. setuid 랑 setgid에 대한 매크로는 이전에 없어서 넣었다.

예제 코드를 보자. 위에 그림에 있는 녀석들이 어떻게 쓰이는지..

 

위에 생소한 부분이 나온다. (statbuf.st_mode & ~S_IWGRP) | S_ISGID 이다.

statbuf.st_mode 는 stat함수로 받아온 파일의 권한이다.

다음 ~S_IWGRP 은 그룹의 write 권한을 빼버린다는 말이다.

그리고 | S_ISGID 부분은 Setgid 를 on 시키다는 말.

또 살짝 생소한게 나온다. s와 S (소문자 대문자 s)

 

소문자 s는 해당 사용자가 실행권한(Execute)이 있을 때 set 비트가 설정되어 있을 때

대문자 S는 해당 사용자가 실행권한(Execute)이 없을 때 set 비트가 설정되어 있을 때를 말한다.

 

chmod와 fchmod가 권한을 변경하는 함수였다면

이번에 알아볼 chown 계열 함수들은 사용자 ID와 그룹 ID를 변경하는 함수이다.

 

stat, fstat lstat 과 마찬가지로 chown 계열 함수들도 

chown 은 심볼릭 링크가 걸려있다면 원본파일의 ID변경

fchown 은 오픈된 파일에 대한 ID 변경

lchown 은 심볼릭 링크가 걸려있다면 링크 파일 자체의 ID변경

이다.

반응형