/* 테스트 1 버전 - 성능 최적화 적용 */ 마무: 리눅스 권한

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 시스템 해킹 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate using chrome ↓↓↓===***===>

레이블이 리눅스 권한인 게시물을 표시합니다. 모든 게시물 표시
레이블이 리눅스 권한인 게시물을 표시합니다. 모든 게시물 표시

2019년 10월 8일 화요일

setuid setgid 매우 자세하게!

안녕하세요 마무입니다~ 오늘은 리눅스 권한의 연장선상에 있는 개념 "리눅스 특수권한"과
"setuid", "stickybit", "setuid"에 대해 알아보겠습니다!

이 포스트를 다 읽으시면

setuid setgid stickybit 개념을 확실히 알고 사용하실 수 있으실 겁니다


최대한 쉽게 설명하려고 노력할 테니 화이팅해서 오늘도 공부해보자구요!

***이 포스트를 이해하기 위해 알고있어야 할 개념들***
1. inode 개념
2. 유저, 그룹, other의 개념
3. rwx, 권한 개념
***********************************************************

----목차----

1. 리눅스 특수권한 개념

2. setuid란

3. setuid 사용 예시

4. setgid란, 명령어 "wall"

5. setgid 사용 예시

6. 중간정리

7. StickyBit란 

8. StickyBit 사용 예시

9. 특수권한 기호로 파일에 설정하기, 특수권한 설정 때 있는 버그

10. 총 정리

입니다.
-------------

여기서 못 찾은 정보는
운영체제 페이지 : https://mamu2830.blogspot.com/p/blog-page_14.html
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
에서 찾아보세요!




1. 리눅스 특수권한 개념




리눅스엔 특수권한이라고 불리는 "SetUID, SetGID, StickyBit"가 있는데요 이 3가지   (SetUID{s}, SetGID{s}, StickyBit{t}) 모두 "실행권한(x,excute)"에 관련된 개념입니다.
그래서 3가지 모두 파일의 실행에 관련된 기능으로 사용되고, 기호도 "실행"자리에 생깁니다. 

무슨 소리냐, 권한이 "u(소유자), g(그룹), o(other)"순으로 있는 것 처럼
"SetUID"를 파일에 설정하면 "소유자(u)의 실행권한"에 x대신 "s"가 들어가고
"SetGID"를 파일에 설정하면 "그룹(g)의 실행권한"에 x대신 "s"가 들어가고
"StickyBit"를 파일에 설정하면 "other(o)의 실행권한"에 x 대신 "t"가 들어갑니다.






위 사진은 기존 "777(rwxrwxrwx)"이던 파일에 특수권한(SetUID + SetGID + StickyBit =7000)를 모두 준 모습(7777)으로,
이렇게 실행자리에 "x" 대신 s(SetUID), s(SetGID), t(StikcyBit)가 들어간 모습을 볼 수 있습니다.

'네? SetUID + SetGID + StickyBit = 7000이라니 무슨소린가요???'

무슨소리냐면 그림을 보여드리며 설명해드릴게요~




위 그림처럼

기존에 권한이 "r, w, x"순으로 "4, 2, 1"이여서 총 8진수 1자리를 가진 것 처럼 "특수권한"
"s(SetUID), s(SetGID), t(StickyBit)"도 각각 "4, 2, 1"을 가지며 기존 rwx와 같은 방식으로, 수가 맨 오른쪽에서부터 왼쪽으로 2배씩 증가하는 규칙입니다.

위의 "특수권한"이 왜 맨 외쪽에 있느냐? 그림이 무슨 의미이냐? 하실텐데요.
사실 권한은 [][][] 이렇게 3자리만 있는게 아니라
"특수권한, UID, GID, Other"순으로 "[][][][]" 4자리가 있던 겁니다.

지금까지 저희가 "chmod 777 [파일]"처럼 바꾼 것도 맨 앞의 "특수권한을 생략한 것"이였다는 거죠. 사실은 "chmod 0777 [파일]"라 표현하는게 정확한 표현입니다.

특수권한을 주는 방법은 기존의 권한 법과 똑같이 기호로 주는 법과 번호로 주는 법 둘다 있습니다. 기호로 주는 건 매우 간단하므로 나중에 알려드리겠습니다.

우선 번호로 특수권한을 주는 방법은
chmod [권한 번호] [파일] 이렇게 하는겁니다.

예를 들어, 기존에 권한이 "755"이던 파일에 "SetUID"를 주고싶다? "chmod 4755" [파일]
이고

기존에 "755"이던 파일에 SetGID를 주고싶다? "chmod 2755 [파일]" 이렇게 하시면 됩니다.

StickyBit만 주고싶으면 "chmod 1755 [파일]" 이겠죠?

그럼 SetUID, SetGID, StickyBit 모두 주고싶으면 어떻게 할까요? 네 모두 더한 "7000"을 붙여주면 됩니다 "chmod 7755 [파일]" 이렇게 말이죠.


여기서 "SetUID, SetGID, StickyBit"의 기호(s, s, t)순서와 누가 4000이고 2000, 1000이냐가 헷갈리실텐데요.

"SetUID, SetGID, StickyBit"순서를 쉽게 외우는 방법은, 기존 권한이           u(user), g(group), o(other)순일 걸 생각하시면 잘 외워질거에요 무슨 소리냐면







SetUID는 "UID"니까 "u(user)"의 "x"자리에 들어갈 것이고, "u"는 첫 번째니까 4000!
SetGID는 "GID"니까 "g(group)"의 "x"자리에 들어갈 것이고, "g"는 두 번째니까 2000!
Stickybit는 나머지인 o(other)의 "x"자리에 들어가겠군! 그리고 마지막이니까 1000!
 이렇게 말이죠!


여기까지 정리해보면,

특수권한 "SetUID, SetGID, StickyBit"를 부여하면 각각 u,g,o 실행권한 자리에 "x"대신 s, ,s ,t가 들어가는 것이고

저 헷갈리는 특수권한 숫자(SetUID{4000}, SetGID{2000}, StickyBit{1000})는 기존의 권한처럼, "chmod" 명령어로 파일에 특수권한을 줄 때 쓰는 거랍니다..


여기서 마지막 개념!  "s(SetUID), s(SetGID), t(StikcyBit)" 모두 기존 파일에 실행권한 "x"가 있었다면 소문자 "s, s, t"가 들어가고 , 실행권한 "x"가 기존에 없었다면 
대문자 "S, S, T"가 들어갑니다

예시를 한번 보여드릴게요




"touch"로 "aloha"라는 파일을 만듬 -->" ll -d"로 "aloha"파일의 권한이 "x"가 없는
-rw-r--r--(644)인 것을 확인




"chmod 7644(기존 aloha파일의 권한은 644였다) aloha"로 파일에게 특수권한을 모두 줌
--> "ll -d" 로 파일에 실행권한이 없었기에 대문자 "S, S, T"가 들어간 것을 확인


이렇게 원래 실행권한 "x"가 없는 곳에 특수권한을 주면 소문자가 아닌 S, S ,T가 들어간다는 것을 확인해 보았습니다.

그럼 이번엔 원래 파일에 실행(x)권한이 있으면 특수권한을 줄 때 소문자인 걸 확인해 볼게요.






"chmod 7755(기존 7644에 'x'인 '1'을 ugo에 각각 더한 7755) aloha" 로 실행권한을 준 뒤
---> "ll -d"로 확인하니 파일에 실행권한 'x'가 있어서 소문자 "s, s, t" 이죠?


여기까지 3가지 특수 권한(SetUID{4000}, SetGID{2000}, StickyBit{1000}) 모두 실행에 관련된 기능이며,
실행권한 자리 "x" 대신에 s, s, t가 들가구, 파일에 실행권한 'x'가 없었으면 대문자 S, S, T가 들어간다는 것을 배운겁니다!



2. setuid란



SetUID(s)란, 말 그대로 파일을 실행할 때 Set(적용해라) UID(파일의 소유자로)입니다.

다시말해, SetUID가 적용된 파일을 실행하면, 실행 파일이 끝날 때 까지
파일의 소유자의 UID가 되는 겁니다. 

그럼 왜 "소유자 자체"가 아니라 "소유자 UID"로 바뀌는 것일까요? "UID"란 계정을 가리키는 "유일한 숫자"여서 "UID를 쓴다"는 것은, "UID가 가리키는 계정을 사용하는 것"과 마찬가지이기 때문입니다.

이것이 얼마나 대단하고 위험 한 것이냐면 SetUID가 설정돼 있는 "root"의 파일을 실행하면
실행이 끝날 때 까지 실행하는 사람의 UID가 root의 UID "0"이 되어  root의 권한을 갖는 겁니다.

그래서 실제로 잘못 설정하면 큰일나기에 주의해서 사용해야 합니다.(실제로 사용할 일은 별로 없음), 놀라운 것은 이 메커니즘을 이용해 해킹하는 방법도 있었다고 하네요 ㄷㄷ

자 그럼 확실하게 배우기 위해 한번 "SetUID" 얼마나 사용되고 있는지 체감해볼까요?

"root"로 로그인한 상태에서
리눅스 터미널에 "find / -perm -4000" 을 쳐 봅시다.
"find(뭔가를 찾겠다) /(최상위 루트디렉토리 "/"에서) -perm(permission,권한이)
-4000(4000{SetUID}가 있는 것을)"

그러면





이렇게 생각보다 많은 파일이 나오며 실제로 SetUID가 잘 쓰이고 있는 것을
확인 할 수 있습니다~ 맨 위에 제가 아까 예시를 들기 위해 만든 "aloha"도 있네요 ㅋㅋㅋ




3. setuid 사용 예시




먼저 "SetUID"가 사용되는 예시를 보여드릴텐데요 이 "SetUID"라는 기능은 "유저와 그룹" 포스트에서 배운 "/etc/passwd" 라는 "유저에 대한 정보가 들어있는 파일"을 사용할 때 쓰입니다.

이 "/etc/passwd"는 유저들의 정보가 저장되는 데이터베이스 파일이기 때문에, 저희가 "passwd" 라는 명령어를 이용해 유저의 패스워드를 바꾸면 그 변경된 정보는 "/etc/passwd"에 적힙니다.
(물론 "/etc/passwd"에 적힌 패스워드는 바로 "/etc/shadow"로 이동됨)





그리고 사진을 보시면 "-rw-r--r-- 1 root root" 이렇게 "/etc/passwd"파일을 변경할 수 있는 "w"권한은 소유주인 "root"에게만 있습니다. 다른 사람은 변경할 수 가 없죠.

그런데도 저희들은 "root"이외의 유저로도 로그인한 상태로 아무렇지 않게 "passwd"라는 명령어로 패스워드를 바꿔왔었습니다. 뭔가 이상하죠?

그러면 지금까지 어떻게 일반유저들이 패스워드를 바꿀 수 있었고, 변경된 내용을 어떻게 "/etc/passwd"에 적용할 수 있었을까요?

이것이 바로 "SetUID"란 특수권한으로 인해 가능한 일이였습니다!

바로 "/usr/bin/passwd"라는 명령어 파일에 "SetUID"권한이 부여가 돼 있기 때문에 일반 유저가
"passwd"란 명령어를 실행했을 때 일반유저의 UID가 "/etc/passwd"파일의 소유주인 "root"로 적용돼서, root인 양 /etc/passwd 파일의 내용을 변경할 수 있었던 것입니다.

...

'에? 명령어 파일? 뭔소리야?' 하실 분들이 있을거란 걸 압니다.
"리눅스 파일과 디렉토리" 포스트에서 "리눅스는 모든 것을 파일로 취급한다"고 했었는데
못 보신 분들이 있을 수 있기 때문이죠. 다시말해서

우리가 터미널 명령어라고 부르며 사용해오던 이 리눅스 "명령어"(ls, mkdir, passwd 등등 모든 명령어)들은 모두 사실 "실행파일" 이란 겁니다. 그리고 그 실행파일의 "o(other)"에 "r(read)와 x(excute)" 권한이 있어서 모든 유저가 사용할 수 있었던 거죠.

저희가 편하게 터미널에서 "ls"라고 치면 이것은 사실 "usr/bin/ls" 란 실행파일을 실행시킨 것이라는 겁니다.

같은 맥락으로 저희가 패스워드를 바꿀 때 사용하는 "passwd" 명령어도 사실은 "/usr/bin/passwd" 란 실행파일을 실행시킨 겁니다.

이런 명령어 실행파일들은 대부분 bin(binary)이나 sbin(system binary) 디렉토리에 들어있습니다.

계속해서 SetUID가 적용된 "/usr/bin/passwd"란 실행파일에 "ll -d"를 해보시면




이렇게 나옵니다. 뭔가 보이시나요? 아뇨 그 빨간색 이름 말고요,  권한 부분을 좀 더 주의깊게 보십쇼.





보이시나요? "소유주의 권한자리 u(user)"의 실행권한 "x"가 있을 곳에 저 소문자
"s"라는 것이?  이걸 보고 우리는 이제 실행권한 "x"가 있는 파일에 "SetUID"도 설정됐다는 것을 알 수 있습니다

이처럼 "SetUID"는 다른 사람의 파일을 실행할 때 소유자 권한이 필요한 경우 사용합니다.




4. setgid란, 명령어 "wall"



SetGID(s)란, 파일을 실행할 때 Set(적용해라) GID(파일의 그룹으로)입니다.

SetUID에 대해 먼저 배웠기 때문에 "SetGID"는 무슨 기능인지 대충 예상이 되실 겁니다.
"SetGID"가 설정된 파일을 실행하면, 실행이 끝날 때까지 자신의 GID가 파일 그룹의 GID로  바뀌는 거죠.

하지만 "SetUID"과 비교해보면 "SetGID"가 필요한 명령어파일은 그리 많진 않아요


한번 봐볼까요? UID처럼
root로 로그인하여

"find / -perm -2000" 해보는거죠. (SetGID가 2000이니까)





해보시면 그래도 생각보단 꽤 나옵니다.
하지만 저 명령어중에서 저희가 실제로 사용하는 명령어는 그리 많진 않아요

저희는 저기 중에서 /root/aloha다음에 있는  "/usr/bin/wall" ,즉 "wall"이라는 명령어를 사용해 "SetGID"를 테스트 해볼게요~

일단 "wall"이란 명령어가 뭔지를 알아야겠죠?

"wall" 명령어는 "write to all"의 줄임말로 우리가 아는 "벽"이 아닙니다.
"write to all"이란 뜻대로 모든 유저(모든 터미널)에게 메세지를 보내는 명령어죠
네트워크를 조금 아시는 분들이라면 그냥 브로드캐스트라고 생각하시면 됩니다.

사용법은 매우 간단합니다.

wall(write to all) [옵션] [보낼 메세지] 또는 wall [옵션] --> 내용적고 "ctrl + D"
입니다.

옵션으론

 -"n" : 누가 보냈는지 적지 않음(root만 사용가능)
이 있습니다. "-n"이 원래 무슨 영어인지 아무리 찾아봐도 안나와서 못 썼습니다 ㅠ

그런데 "-n" 옵션이 누가 보냈는지를 가리는건데 "root"만 사용이 가능하니 결국
누가 보냈는지 안 보이면 "root"가 보낸 걸 알 수 있다는 함정..

"-n"옵션만 빼면 이 "wall"이란 명령어는 root뿐만 아니라 모든 유저가 사용이 가능합니다

테스트를 위해 리눅스에서 터미널을 3개를 열어서 각각 "root"를 포함한
3명의 유저로 로그인 해보겠습니다.

저 같은 경우 "root", "mamu", "korea"로 로그인 했습니다.

새로운 터미널을 여는 건 터미널에서 우클릭을 하신다음 "새 창" 또는 "새 탭"을 누르시면
됩니다. 개인적으론 "새 탭이 좀더 편합니다"

새 탭을 2개 더 여신다음 각각 다른 유저로 "su - [유저이름]" 로그인 하시면 됩니다~

그러면



이렇게 3개의 터미널에 각가 다른 유저가 로그인 된 모습이 될 겁니다~

그럼 이제 "root"에서 "wall"를 사용해볼게요




이렇게  root에서 "wall hello everybody?" 하니 --->
root로 부터 브로드캐스트 메세지가 보내졌다고 뜹니다.
그리고 다른 일반 유저들을 눌러 확인해보면




이렇게 일반유저 "mamu"에서 봐도 root에게 메세지가 왔다는 것을 볼 수 있습니다.

이번엔 일반 유저가 "wall"를 사용해볼게요




이렇게 "mamu"에서 "wall Hi admin!"이라고 보냈습니다 --->
"root"로 가서 확인해 보면




"mamu"로 부터 브로드캐스트 메세지가 왔다고 뜨면서 잘 사용되는 걸 볼 수 있죠?
-->
다른 일반유저 "korea"로 가서 확인해 보아도


이렇게 "root", "mamu"에서부터 메세지를 잘 받은 모습입니다.




그리고 "root"로 돌아와서 옵션 "-n"을 써서 "wall -n Who am I?"라 보내고 -->
다른 유저 "mamu"로 와서 보면



이렇게 누가 보냈는지는 안뜨고 간략하게 메세지가 옵니다.
그리고 이번에 일반유저 "mamu"로도 "-n"옵션을 사용해보려 하지만




이렇게 권한이 없다며 사용이 안됩니다.

여기까지  "wall(write to all)" 명령어에 대해 알아보겠습니다.

그럼 왜 "SetGID"를 설명하는데 뜬금없이 "wall"이란 명령어를 설명했는지는
바로 밑에서 알려드릴게요~




5. setgid 사용 예시



자 그럼 왜 SetGID가 사용되는 예시에 "wall"을 설명을 했느냐,
위에서 배운대로 "wall"이란 명령어는 "모든 유저(터미널)"에 메세지를 보내는
명령어로 누구나 사용이 가능했죠?
이 누구나 사용이 가능하다는 것에서 이미 "Feel"이 오셨을 겁니다.

그렇습니다 이 누구나 "wall" 명령어를 사용가능했던 이유는 바로 "wall"의 원래 실행파일
/usr/bin/wall 에 SetGID가 설정돼 있기 때문이였습니다~




자 "ll -d /usr/bin/wall" 이렇게 파일의 권한을 확인해 봅시다.

뭐가 보이시나요? 노란색 이름 말구요~ 권한부분과 그룹부분을 보세요.




일단 g(group) 부분의 실행권한에 소문자 "s"가 보이는 걸로 봐선
그룹에 실행권한이 있는 파일에 "SetGID"까지 설정된 걸 알 수 있죠.

그리고 또 하나 주목해야할 점, 오른쪽에 소유그룹 이름을 보시면 "tty"라고 보이실겁니다.

어라? 난 저런 그룹을 만든 적이 없는데? 하실텐데
저건 원래 리눅스 시스템에서 사용되는 그룹입니다.

원래 1000미만의 GID를 가진 그룹은 시스템에서 쓰이는 그룹이라고 생각하시면 됩니다.

한번 확인해 볼까요?
"more /etc/group" 이렇게 말이죠(more은 걍 제가 사용하는 것으로 ,"cat, vi 등" 파일 내용을 읽는 명령어는 아무거나 사용 가능)





우왉.. 길다 다 필요 없고 제가 밑줄을 친 "tty"란 그룹만 보면 됩니다.
보시면 "GID가 5인 tty란 그룹이 있죠"?

자 그럼 이  "tty"가 무엇을 의미하며,  "tty"란 그룹이 어디에 사용되는 것이냐?

"tty" 는 "TeleTYpewriter"의 줄임말이며 이것은 통신에 사용되던 전기식 타자기인데
유닉스계열(리눅스) 운영체제에선 이걸 "터미널"을 가리키는 용어로 사용합니다.

말이 좀 어려운데 그냥 "tty = 터미널" 입니다.

"디렉터리와 파일" 포스트에서 "리눅스는 모든 것을 파일로 다룬다는 것"을 썼었는데, 기억하시나요? 기억 안나시면 다시 보고오세요 ㅎ
마찬가지로 이 "tty", 즉 "터미널"도 파일로 존재합니다

바로 장치들을 모아둔 /dev/ 디렉터리에 /dev/tty로 말이죠!
"ll -d /dev/tty"를 쳐봅시다.





자 이렇게 /dev/tty란 파일을 확인해 보시면
파일은 "c" 즉 "character special" 파일인 것을 알 수 있고
소유자는 "root", 그룹은 "tty"인 것을 알 수 있습니다.

자 그룹이 "tty"로 돼 있다는 것은 그룹 "tty"에 속한 사람만 사용할 수 있다는 뜻이겠죠?
이렇게 "tty"란 그룹은 "/dev/tty(터미널)"을 사용하기 위한 그룹이였다는 것을 알았습니다.

아이고 그래서 우리가 배운 "wall" 명령어랑 무슨 관계가 있냐고요? 원래도
"/dev/tty"의 o(other)에 "rw"가 있어서, 모든 유저가 각자의 터미널을 읽고 쓸 순 있지만

"wall"은 "모든 터미널에 메세지를 보내는 명령어"이기 때문에 그 이상의 많은 권한이 필요합니다. 그리고 터미널은 사용하려면 "tty"그룹이여야 하죠

그래서 "/usr/bin/wall"에 SetGID를 걸어 "wall" 명령어 즉, "/usr/bin/wall" 파일을 실행할 때 GID가 "tty"의 GID(5)가 되어서 "/dev/tty"를 사용할 수 있게 한겁니다.

여기까지만 끝나면 SetGID의 기능이 끝나면 좋을텐데...

아쉽게도 "SetGID"엔 한 가지 다른 기능이 또 있습니다.

그것은 바로 디렉터리에 "SetGID"를 설정했을 경우 그 디렉터리 안에 파일을 만들면
그 누가 만들더라도 디렉터리의 GID로 적용되어 생성됩니다.

다시말해서 "root"가 공용디렉터리를 만들고 거기에 SetGID를 설정할 경우
어떤 유저든 공용디렉터리 안에 파일을 만들면 그 파일의 그룹은 "root"가 된다는 겁니다.

사실 이런 상황이 생기게 된 이유는 "리눅스 권한" 부분에서 배운
"디렉터리에 권한이 부여되면 그 밑 파일까지 적용되는 현상"이 특수권한에도
적용되어 나타난 현상인데요.

"디렉터리" 자체가 기능을 가진 파일이고, 사용하기 위해선 실행 권한이 필요하다 했었죠?
그리고 "SetGID"는 실행을 할 때 파일의 그룹의 GID로 적용되는 특수권한이고요

그래서 그 디렉터리 내부에 파일을 만들면 디렉터리 기능이 "실행"되는 것이기 때문에
내부 파일들에도 모두 "SetGID"가 적용하게 되는 겁니다.

그래서 이런 것을 사용해서 디렉터리에 SetGID를 설정하면 그 안에 누가 파일을 만들든
디렉터리 그룹으로 만들어진다 라는 것입니다.

그러면 여기서 의문이 드실겁니다.
'아니 SetGID가 디렉터리에 설정됐을 때 그 밑 파일까지 영향을 미친다면 SetUID로 마찬가지아냐? 그런데 왜 SetUID는 소유자를 못바꾸지?'
라고 말이죠

그런데 원래 유닉스계열 운영체제(리눅스)에선 파일의 소유자를 바꾸는 것은
관리자 "root"만 가능하게 설정이 돼 있기 때문에 다행이도 "SetUID"에선
"SetGID"와 같이 디렉터리 하위에 모두 적용되는 상황은 생기지 않는 것입니다.

다시말해서 "root"가 한 디렉터리에 SetUID를 설정했고 다른 유저가 그 디렉터리
내부에 파일을 만들었을 때, 디렉터리의 "SetUID"의 기능을 실행하는 건 "root"가 아니라 "일반유저"이기 때문에 소유자가 변경이 안되는 거죠.

그래서 이런 기능은 "SetGID"에만 있다고 외우는 것입니다.
그럼 "SetGID"가 디렉터리 안 파일에게 영향을 미치는 것을
사진을 통해 보여드릴게요, 그 과정은

1. "/"에 모두가 접근 가능하고 SetGID을 적용시킨 "everybody"란 디렉터리를 만듬

2. 일반 유저 "mamu"로 "/everybody"디렉터리에 들어가 그냥 파일과 디렉터리를 만들어
SetGID가 적용되나 확인

3. "mamu"로 만든 디렉터리 안에 또 파일을 만들어 SetGID를 사용할 디렉터리 바로 밑까지만 적용되는지 아니면 모두 적용되는 지 확인



"mkdir everybody"로 "everybody"란 디렉터리를 만듦 -->
"chmod 2777 everybody"로 everybody디렉터리에 rwxrwsrwx권한(2777)을 부여-->
"ll -d everybody"로 확인





위 사진에서 짤렸지만 "cd everybody/"로 디렉터리 내부로 이동한다음-->
"su mamu"로 "mamu"로 로그인 -->
"touch testForFile.mamu"로 파일 생성 -->
"mkdir TestForDirectory.mamu"로 디렉터리 생성-->
"ll"로 만든 모든 파일이 "SetGID"의 영향을 받아, 그룹이 "root"로 바뀐 것을 확인 -->
그리고 디렉터리는 심지어 "SetGID"가 또 설정된 것을 확인




"cd testForDirectory.mamu/"로 "mamu"가 만든 디렉터리 내부로 또 이동한 뒤-->
"mkdir 123 , touch 3535"로 디렉터리와 파일을 생성-->
"ll(ls -l)"로 SetGID가 디렉터리 바로 밑 파일까지가 아닌, 하위 모든 파일에 적용되는 것을 확인




6. 중간정리


아이고.. 오늘도 참 길고 어렵네요... 그래서 중간 정리를 또 하고 가야할 것 같습니다.

1. 특수권한 "SetUID, SetGID, StickyBit"를 부여하면 각각 u,g,o 실행권한 자리인 
"x" 대신 "s, ,s ,t"가 들어간다

2. 특수권한 숫자(SetUID{4000}, SetGID{2000}, StickyBit{1000})는 
"chmod [권한숫자] [파일]"처럼, 파일에 특수권한을 줄 때 쓰는 것이다.

3. "SetUID"란 Set(적용해라) UID(파일 소유자 UID로)서, 파일을 실행할 때 
"소유자가 되어야하는 경우" 사용하는 특수권한이다.

4. 명령어 "wall"이란 모든 터미널에 메세지를 보내는 명령어다 

5. "SetGID"란 Set(적용해라) GID(파일의 그룹 GID로)서, 파일을 실행할 때 
"그룹이 되어야하는 경우" 사용하는 특수권한이다. 

6. "SetGID"를 디렉터리에 설정하면, 디렉터리 안 모든 파일에 적용되어 누구든 그 안에 파일을 만들면 그 파일 그룹이 디렉터리의 그룹이 된다.

7. 리눅스에선 소유자를 바꾸는 건 "root"만 가능하게 설정되어 있기 때문에 디렉터리에
"SetUID"를 설정해도 그 디렉터리 안에 만드는 파일들의 소유자가 바뀌는 일이 없다.






7. StickyBit란




뭔가 SetUID, SetGID는 둘다 "Set"으로 시작하고 "UID, GID"를 쓰니까 쉽게 이해가
되는데 왜 뜬금 없이 "StickyBit"란 연관없는 용어가 나왔는지 의아하실겁니다.

왜 "StickyBit"는 혼자 이름이 이렇게 독특하냐면 이건 원래 리눅스 특수권한용으로
나온 용어가 아니기 때문입니다.

"StickyBit"는 원래 유닉스 운영체제에서 실행파일의 실행속도 향상을 위해 사용되던
개념입니다.

이 StickyBit개념을 자세하게 말하자니 "운영체제 개념"이 좀 많이 필요해 어려우니 매우 간단하게 설명을 할게요.

원래 우리가 프로그램(실행파일)을 실행하면 프로세스가 되어 메모리에 올라가죠?
그리고 프로세스 사용이 끝나면 다시 메모리에서 내려오고요.

그런데 자주 사용하는 실행파일도 사용이 끝나면 메모리에서 내려오니까, 실행할 때마다 다시 메모리에 올라가는 시간을 줄이고자 "StickyBit"란 기능을 도입했는데

이걸 파일에 적용하면 "Sticky"뜻처럼 실행이 끝나도 메모리에 딱 "붙어있어"서 내려오지않아, 매번 실행할 때 마다 메모리에 올라가는 시간이 단축되는겁니다.

하지만 시간이 지나 컴퓨터 기술이 매우 좋아지고 하드웨어 기능도 좋아져서 이젠
"StickBit"란 기능이 있으나마나 해집니다. 그래서 이젠 사용을 안하게 됐습니다.

여기까지가 과거의 "StickyBit"였고요

그럼 현재의 특수권한의 "StickyBit"란 뭐냐? 과거의 "StickyBit"기능은 아예 없고
다른 기능을 합니다.

그것은 바로 "다른 사람의 파일을 변경할 수 없다" 입니다.

이것을 이해하려면 전부터 이야기 했던 "리눅스 권한"에서의 "디렉터리의 권한이
바로 밑 파일까지 적용된다"를 이해해야 합니다.

원래 디렉터리의 o(other)에 "rwx"와 같이 권한이 있으면, 디렉터리 내 파일의 o(other)에 "rwx"권한이 없어도 다른 유저가 그 파일을 강제로 변경할 수 있었죠?

"StickyBit"는 그런 걸 일을 막는, 진정한 "공유 디렉터리"를 만들기 위해 사용하는 개념입니다.

여기서 이런 의문이 나올 수 있습니다. '아니 그러면 디렉터리 o(other)에 "wx"권한을 안주면 되는거 아님? 굳이 StickyBit를 왜 씀?' 이라고요

아니죠... 디렉터리에 o(ohter)에 "wx"권한이 없으면 소유자와 그룹에 속한사람들 말곤 디렉터리 사용을 아예 못하잖아요. 아직 개념이 부족하시군요? 다시 "리눅스 권한" 포스트를 보고오십쇼! https://mamu2830.blogspot.com/2019/09/rwx.html

그렇기에 그 누구라도 디렉터리를 사용할 수 있게, 하지만 디렉터리 내 다른 사람의 파일은
건들지 못하게 하기 위해 "StickyBit"개념을 사용하는 겁니다.

외우는 방법은 "StickyBit"를 디렉터리에 적용하면 "Sticky"란 뜻처럼, 파일이 디렉터리에 딱 붙어있어 소유자 말곤 변경할 수 없게한다! 라고 전 외웠어요...

물론 관리자는 제거할 수 있죠. 여기서 말하는 관리자란 "StickyBit가 설정된 디렉터리의
소유자" 입니다. 심지어 자기가 "StickyBit"가 설정된 디렉터리 관리자라면
그 디렉터리 안에 "root"가 만든 파일도 변경이 가능합니다.(삭제, 수정 등)

물론 일반 파일도 StickyBit를 설정할 순 있습니다만, 디렉터리가 아니기 때문에
별 의미가 없어요~



8. StickyBit 사용 예시




이 "StickyBit"는 모두 사용하는 공용디렉터리엔 대부분 설정 돼 있다고 보면 되는데요
가장 대표적인 예시엔 "/tmp(temporary files)"가 있습니다.





"/tmp/"가 뭔지 잘 모르시면 "상위 디렉터리 정리" 포스트를 보고 오셔야 되겠지만
저는 친절하니까 다시 설명을 해드릴게요~

임시파일이란 실시간으로 실행되는 프로세스가 자주 사용하는 정보가 있다면 그걸 파일 형태로 만들어 둔 다음 쓰는겁니다, 그러면 한번 만들면 갖다 쓰기만 하면 되니 매우 빨라지겠죠?

하지만 그게 영구적인 파일이라면 점점 용량을 차지할테니, 리눅스 시스템에 종료될 때 자동으로 삭제가 되는 임시파일로 만드는 겁니다.  그리고 그런 임시파일들은 이름 뜻 그대로
"/tmp(temporary files)/"디렉터리에 저장되는 겁니다.

이렇게 중요하다면 중요한 /tmp/ 디렉터리는 모든 유저가 사용하지만, 다른 유저의
임시파일을 갑자기 삭제한다거나 변경하면 다른유저는 버그가 발생할 수 있겠죠?
그렇기에 "StickyBit"로 설정해둔겁니다.




9. 특수권한 기호로 파일에 설정하기, 특수권한 설정 때 있는 버그


지금까지 SetUID, SetGID, StickyBit에 대해서 특수권한 번호로 파일에 권한을
부여하는 방법만 알려드렸는데

이제 기호로 권한을 부여하는 방법을 알려드리겠습니다.
기호로 권한 바꾸는 것도 매~~우 쉽습니다.
저희가 지금까지 SetUID(s), SetGID(s), StickyBit(t)를 기호를 외웠잖아요?

SetUID(s)는 제가 말했던 것처럼 "u(user)"의 실행권한 자리에 들어가니까
추가하거나 제거하고 싶으면
chmod u["+" or "-" or "="]s [파일] 입니다.

무슨소리냐

SetUID를 추가하고 싶으면 "chmod u+s [파일]"
제거하고 싶으면 "chmod u-s [파일]" 이렇게 하는거죠
기존권한과 똑같이 "* /" 이런 건 없습니다.


그럼 SetGID(s)는 어떻게 할까요? "g(group)"의 실행권한 자리에 들어가니까
chmod g["+" or "-" or "="]s [파일] 입니다.

SetGID를 추가하고 싶으면 ""chmod g+s [파일]" 이렇게 말이죠



StickyBit는 마지막이니 느낌이 오실겁니다 "o(other)"의 실행권한 자리에 들어가니까
chmod o["+" or "-" or "="]t [파일] 입니다.

아 참고로 "="는 말 그대로 우항의 그대로 바꾼다는 거에요
그래서 원래 파일의 권한이 rwxrwxrwx(777)라고 해도
"chmod u=s [파일]" 이렇게 해버리면 "--Srwxrwx(4077)" 이렇게 됩니다.



아 특수권한 설정 때 있는 버그가 뭐냐고요?

원래 "chmod" 이용해 파일 권한을 바꿀 때 "권한숫자"와 "권한기호"로 바꾸는 방법
총 2가지가 있다고 했죠?

그런데 "기존에 특수권한이 있는 파일"을 "권한 숫자 방법"으로 바꿨을 때
안 바뀌는 버그가 있습니다. 이럴 땐 당황하지 마시고 "권한기호"로 바꾸시면
바뀝니다.



10. 총 정리


아 사실은 정말 간단하게 포스트할려면 정말 빨리 끝낼 수 있지만 더 자세히, 더 간단히 설명하려고 나름 노력하다보니 정~말 긴 포스트가 됐네요 ㅠㅠ 긴 글 읽느라 정말 고생하셨습니다. 마지막으로 총 정리를 하고 '특수권한'편을 마치도록 하겠습니다


1. 특수권한 "SetUID, SetGID, StickyBit"를 부여하면 각각 u,g,o 실행권한 자리인 
"x" 대신 "s, ,s ,t"가 들어간다

2. 특수권한 숫자(SetUID{4000}, SetGID{2000}, StickyBit{1000})는 

"chmod [권한숫자] [파일]"처럼, 파일에 특수권한을 줄 때 쓰는 것이다.

3. "SetUID"란 Set(적용해라) UID(파일 소유자 UID로)서, 파일을 실행할 때 

"소유자가 되어야하는 경우" 사용하는 특수권한이다.

4. 명령어 "wall"이란 모든 터미널에 메세지를 보내는 명령어다 


5. "SetGID"란 Set(적용해라) GID(파일의 그룹 GID로)서, 파일을 실행할 때 

"그룹이 되어야하는 경우" 사용하는 특수권한이다. 

6. "SetGID"를 디렉터리에 설정하면, 디렉터리 안 모든 파일에 적용되어 누구든 그 안에 파일을 만들면 그 파일 그룹이 디렉터리의 그룹이 된다.


7. 리눅스에선 소유자를 바꾸는 건 "root"만 가능하게 설정되어 있기 때문에 디렉터리에

"SetUID"를 설정해도 그 디렉터리 안에 만드는 파일들의 소유자가 바뀌는 일이 없다.

8. "StickyBit"는 다른 사람의 파일을 변경하지 못하게 하는 기능이고, 디렉터리에만 효과가 있다.

9. 특수 권한을 기호로 주는 방법은 "chmod [u, g, o]["+" or "-" or "="][s, s, t] [파일]"이다

10. 기존에 특수 권한이 있는 파일을 "숫자 방법"으로 변경시 변경이 안되는 버그가 있다,
이럴 땐 "기호를 사용해" 변경하면 된다.




흐아.. 이번엔 하루에 5시간씩 3일동안 투자해서 완료했네요 정말 힘들군요 허헣
틀린 정보나 오타 지적해주시면 바로 수정하겠습니다!

구글블로그 좋아요, 팔로우, 네이버 블로그 공감 눌러주신 분들
정말 감사합니다 ㅠㅠ 정말 큰 힘을 얻어서 힘내서 오늘도 포스트를 하고 있어요!

다음에 더 좋은 퀄리티 포스트로 뵙겠습니다~!


2019년 9월 22일 일요일

리눅스 rwx, chmod, 8진수 매우 자세히!

안녕하세요! 오늘 포스팅 할 내용은 "리눅스 rwx", "rwx", "chmod", "8진수란"입니다.

이 포스트를 다 읽으시면 리눅스 파일의 권한에 대해 전부 아시게 되어 원하는데로 파일의
권한을 조정하여, 원하지 않는 사람들이 파일을 사용하지 못하게 하실 수 있으실 겁니다!

--목차--

1. 리눅스의 권한이란?

2. 리눅스 일반 파일 권한 rwx

3. 디렉토리와 일반파이 권한 차이

4. 디렉토리와 일반 파일 권한 차이 그림으로 설명

5. 디렉토리와 일반파일 권한 실제 예시

6. 디렉토리 권한 'w' 주의점

7. 중간정리 

8. 8진수와 rwx의 4,2,1

9. 리눅스 "chmod"

10. 총 정리

-----------


여기서 못 찾은 정보는
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
여기서 찾아보세요!


1. 리눅스의 권한이란?


리눅스의 권한이란 리눅스에 있는 '어떠한 파일'에 대해 어디까지 사용이 가능한가? 입니다
내가 파일을 실행하고 싶어도 '실행할 수 있는 권한(x)'이 없으면 실행을 못하고
파일을 읽고 싶어도 '읽을 수 있는 권한(r)'이 없으면 읽을 수 없는 것 처럼 말이죠

리눅스의 권한은 저희가 처음 파일의 inode에 대해 배울 때 어디에 나오는지 대략 봤듯이
"ls(list) -l(long)"으로 볼 수 있습니다.







이렇게 "ll(ls -l)"로 보니 inode 맨 왼쪽에 "drwxr-xr-x"이런 식으로 보이는데 사실 맨 앞은 
'파일 형식'이니 제외한 "rwxr-xr-x"가 바로 "파일의 권한"입니다. 주황색으로 표시한 곳
말이죠~

파일의 권한은 소유자(u{user}) , 그룹(g{group}), 그외 사람들(o{other}) 순으로 각 3칸씩
이렇게 총 9 칸이 있습니다.

그리고 각 소유자, 그룹, other의 3칸은 맨 앞은 "읽을 수 있는 권한 r(read)" , 그 다음은 "파일의 내용을 변경할 수 있는 w(write)" , 그리고 마지막으로 "파일을 실행할 수 있는 x(excute)" 순으로 "rwx" 이렇게 배치가 됩니다

그리고 권한이 없는 칸은 "-"으로 표시가 됩니다.

그림을 보시죠







이렇게 말입니다~ 저기서 만약 소유자 권한의 'x(실행권한)'이 없으면  소유자의 'x'칸에 "-"가 들어갈 것입니다. 

'그룹' 같은 경우 저희가 그룹 포스트에서 다뤘웠는데, 리눅스는 기본적으로 하나 이상의 그룹에 속해야 있어야 하므로, 일반 유저를 만들면 그 유저의 이름의 그룹이 자동으로 생성되고 그 그룹에 유저가 속하게 된다는 것. 기억나시죠?



2. 리눅스 일반 파일 권한 rwx



아까 위에서 살짝 언급한 이 "rwx"는 

r(read) : 파일을 read, 파일의 내용을 읽을 수 있는 권한
w(write) : 파일을 witre, 쓰다(라는 개념이 좀 헷갈릴 텐데)그냥 파일을 바꿀 수 있는 권한
x(excute) : 파일을 excute, 실행할 수 있는 권한

입니다. 하지만 여기서 여기서 GUI환경의 윈도우 운영체제만 사용해오던 대부분의 분들은 이 "읽다" 라는 개념이 좀 제대로 이해가 안될 겁니다 파일을 "실행" 하는 것과 "읽는 것"을 헷갈린단 말이죠

먼저 이해를 돕기위해 "파일을 읽다"와 "파일을 실행하다" 개념을 제대로 설명하자면

"r(read)"의 "읽다" 라는 개념은 말 그대로 리눅스에서 평범한 글을 "파일의 내용을 볼 수 있냐" 라는 겁니다. 저희가 배운 cat 이나 vi와 같이 파일의 내용을 읽는 개념이죠

하지만 "x(excute)"의 실행이란 "파일이 가진 기능을 실행"할 수 있느냐의 개념입니다.
예를 들어, 프로그래밍 언어로 코드를 짰을 때 컴파일을 안하면 그냥 사실 엄연히 따지면 그냥 문법이 이상한 영어죠?

하지만 그 이상한 문법의 영어 코드를 컴파일하여 2진수로 바꾸는 순간, 그것은 어떠한 명령을 컴퓨터에게 지시하는 기능을 가진 '프로그램'이 되죠. 

즉, 이러한 '실행'권한은 기능을 가진 파일(프로그램)의 기능을 사용할 수 있느냐 없느냐의 권한입니다.

리눅스는 모든 것을 파일로 다루며, 저희가 터미널에서 아무렇지 않게 사용하는 명령어들도 전부다 사실은 '기능을 가진 파일(프로그램)'입니다. 
그래서 실제로 이런 명령어들이 들어있는 '/usr/bin' 이나 '/usr/sbin' 디렉토리 내부를 보시면
명령어파일들이 전부 유저들이 사용하기 위해서, 'x'권한을 갖고 있는 걸 볼 수 있습니다.



이렇게 말이죠.
위 사진을 보시면, 우리가 자주 사용하던 'ls'와 'cd'가 사실은 기능을 가진 파일(프로그램)이라는 것을 알 수 있고, 그렇기에 'x'권한이 부여돼 있는 것을 알 수 있습니다.

'chmod'는 저희가 밑에서 배울 권한을 바꿀 명령어입니다. 권한을 바꾸는 명령어 'chmod'도 결국은 똑같이 기능을 가진 프로그램이며 'x'권한을 가졌다는 것이죠~



3. 디렉토리와 일반파일 권한 차이


사실 운영체제에서 '디렉토리(윈도우에선 폴더)'란 무엇일까요? 그렇죠 효율적으로 수 많은 
파일들을 분류하고 관리하기 위한 일종의 박스같은 존재죠.

그리고 당연하게도 이러한 박스의 역할 '디렉토리'에도 일반 파일과 똑같이 'rwx'권한이 있습니다.

뭔가 일반파일 권한과 다르다는 느낌에서부터 벌써 외워야 하는 압박 에 짜증이 나실겁니다...

하지만! 제가 쉽게 설명할 것이며, 또 맥락은 비슷하므로, 그 부분만 캐치하시면 외우는데 어렵지 않을겁니다!

먼저 디렉토리에서의 권한 'rwx'는 

r(read) : 읽겠다, 즉 디렉토리 내부(파일들)을 볼 수 있는 권한
w(write) : 쓰겠다, 일반파일과 같은 맥락으로 디렉토리 내부 파일들을 변경할 수 있는 권한
x(excute) : 실행하겠다, 디렉토리의 기능(디렉토리 내부로 이동)을 실행할 수 있는 권한

이런 기능을 합니다. 언뜻 보시면 일반파일과 많이 달라보이지만, 맥락을 보시면 
일반 파일의 rwx

r(read) : 파일을 read, 파일의 내용을 읽을 수 있는 권한
w(write) : 파일을 witre, 쓰다(라는 개념이 좀 헷갈릴 텐데)그냥 파일을 바꿀 수 있는 권한
x(excute) : 파일을 excute, 실행할 수 있는 권한

와 거의 비슷함을 알 수 있습니다.

어...비슷한...가..? 싶으실 겁니다! 워낙 처음 배우는 사람들에겐 어렵게 느껴지는 개념이니까요 ㅠㅠ

그래서! 확실한 이해를 돕기 위해 '일반 파일'은 '책'이라 비유하고, 디렉토리는 책이 담겨 있는 '방'라고 치고 그림을 통해 설명해드리겠습니다!




이렇게 디렉토리란 '큰 방'안에 파일(책)들이 있는 것처럼 말이죠!



4. 디렉토리와 일반 파일 권한 차이 그림으로 설명



*일반 파일 rwx*

r(read) : 파일을 read, 파일의 내용을 읽을 수 있는 권한은 


이렇게 파일(책)의 내용을 읽을 수 있는 권한이죠.
그리고 
w(write) : 파일을 witre, 쓰다(라는 개념이 좀 헷갈릴 텐데)그냥 파일을 바꿀 수 있는 권한은


이렇게 (파일)책의 내용을 변경할 수 있는 권한이죠.

그리고
x(excute) : 파일을 excute, 실행할 수 있는 권한은



이렇게 기능이 있는 파일(마법책)을 실행할 수 있는 권한을 말합니다.

자 그럼 이번엔 디렉토리의 rwx란?

*디렉토리 rwx*

디렉토리
r(read) : 읽겠다, 즉 디렉토리 내부(파일들)을 볼 수(읽을 수) 있는 권한은



이렇게 말 그대로 디렉토리(방)의 내부를 볼 수(읽을 수) 있는 권한이고.

디렉토리
w(write) : 쓰겠다, 일반파일과 같은 맥락으로 디렉토리 내부 파일들을 변경할 수 있는 권한은


(오타네요, '파일2'새로 추가해줘!가 아니라 '파일4' 새로 추가해줘!가 원래 쓰고자 했던 내용입니다)

이렇게 디렉토리(방) 내부를 변경할 수 있는 권한으로, 디렉토리 내부를 변경한다는건 내부에 있는 파일들을 제거하거나, 파일을 추가할 수 있는 권한이죠.

디렉토리
x(excute) : 실행하겠다, 디렉토리의 기능(디렉토리 내부로 이동)을 실행할 수 있는 권한은



이렇게 디렉토리 'x(excute)'란 디렉토리(방)의 기능을 실행할 수 있어, 디렉토리(방) 내부로 들어갈 수 있는 권한입니다.

그런데 여러분들 저희가 방 안에 있는 물건을 사용하려면 당연히 방 안에 들어가야하잖습니까?

그래서 우리가 리눅스를 사용할 때 필수인 '명령어'들도 다 실행파일이고, 이러한 실행파일(명령어)를 저희가 사용할 땐 실제와 마찬가지로 파일이 있는 방(디렉토리)에 들어갈 수 있어야 합니다.

그렇기에 리눅스 명령어들이 들어있는 '/usr/bin'이나 '/usr/sbin' 디렉토리엔 '유저'든 '그룹'이든 'other'든 다 'x'권한이 있는 겁니다.

자 여기까지 그림을 통해 일반파일 'rwx'와 디렉토리 'rwx'를 이해하고 비교해봤습니다.

하지만 인생은 이해만 해선 안되죠.. 확실히 체화시키기 위해 실제 예시를 통해 설명해보겠습니다.



5. 디렉토리와 일반파일 권한 실제 예시


가장 먼저 저희가 저~~~엉 말로 쉽게 볼 수 있는 
"디렉토리 파일"과 "그냥 파일"의 기본 권한의 차이를 보여드리겠습니다.

"기본 권한"이란 그냥 저희가 파일을 만들었을 때 "자동으로 부여돼 있는 권한"을 말해요

"mkdir directory ; touch file"이란 명령어로
디렉토리 파일과 그냥 파일을 만들어 주고 "ls -l"로 확인해봅니다.





어?? 첨 보는게 나왔다 그죠? 저 ";" 말입니다.

저 리눅스 쉘에서 ";" 이라는 기호 뜻은 "앞의 명령어를 잘 완료 했으면 ; 뒤의 명령어를 실행해라" 라는 뜻입니다.  그냥 프로그래밍할 때, 컴파일에게 '여기까지가 한줄이야'를 알려주는 세미콜론과 역활이 같다고 보시면 됩니다!

나중에 "파일의 컴파일"에 대해서 배울 때 자주 사용하게 될거에요~

어쨋든 이렇게 디렉토리와 파일을 만들어 봤습니다. 디렉토리와 일반파일의 기본 권한의 차이가 보이시나요?







이렇게 말입니다. 

위에 "디렉토리 파일"은 "rwxr-xr-x" 이렇게 "소유자"는 rwx(읽고,쓰고,실행)권한이 있고
"그룹엔" r-x(읽고,실행), "other"는 r-x(읽고,실행)인데

밑 "그냥 파일"은 "rw-r--r--"로 "소유자"는 rw(읽고,쓰고)권한이고 "그룹"과 "other"는 
r--(읽는 권한)밖에 없죠?

왜 "일반 파일"엔 x(excute)(실행)권한이 없고 "디렉토리 파일"엔 있을까요?

그것은 바로 위에서 설명했듯이, '디렉토리 자체의 기능을 실행', 즉 디렉토리 내부로 이동하는데에 'x'권한이 필요하기 때문입니다.

그럼 왜 소유자만 "x"권한을 주면 되지 다른 "그룹, other"에도 주느냐?

그것은 대부분의 유저들이 대부분의 디렉토리를 내부로 이동하고 보는 정돈 괜찮기 때문에, 디렉토리를 만들면 소유자 뿐만이 아니라 그룹 심지어 other도 "x"권한이 자동으로 부여되는 겁니다. 

물론 당연히 '일반 유저'가 절대로 이동도, 사용도 보지도 못하게 해야하는 디렉토리는 
"x" 권한이 있음 안되겠죠? 일반 유저가 루트의 홈 디렉토리인 /root/ 디렉토리에 이동 할 수 있음 뭐.. 거의 해킹 된거니까요~

또한 위에서 말했듯 명령어들을 유저들이 사용할 수 있게 'x'권한을 주는 것이죠. 

그에 반해 그냥 파일은 기능이 있나요? 저희가 touch로 만든 저 일반파일 "file"은
그저 텍스트(글들)을 적을 수 있는 빈 파일일 뿐이죠. 

저희가 저기 안에 스크립트(코드)를 쓰지 않는 한 아~무런 기능이 없는 그저 글만 적힌 파일이란 뜻입니다.

그러니 '일반파일'은 실행 권한을 가질 필요도, 가져도 실행을 못한다는 말입니다.

좀 더 확연한 차이를 느끼기 위해 사진으로 보여드릴게요 그 과정은 아래처럼 진행할
겁니다~

1. 누구나 사용할 수 있는 디렉토리를 "root"계정으로 만든다음

2. 비교를 위해 2개의 유저(mamu, korea)로 그 디렉토리 안에 각자의 파일을 만들고

3. 각 유저들은 다른 유저가 만든 파일을 cat(파일을 읽는 명령어) 명령어로 내용을 읽어봄으로 써 "r"권한의 차이를 느껴보고

4. root로 만든 디렉토리에 "x"권한을 제거함으로써 그 이후에 다른 유저들이 디렉토리에 접근 할 수 있는지를 보고, "x"권한의 차이를 느껴본다.






아! 먼저 , 아무런 설정을 안한 저희들의 기본 리눅스는 유저들의 홈 디렉토리가 있는 "/home"과 최상위 디렉토리 '/'의 other에 "rx"가 있기 때문에, 모든 유저들이 이동하고 파일의 내역을 볼 수 있다는 것을 알아두세요~








root유저로 "mkdir everybody" 명령어를 통해 'everybody' 디렉토리를 만들고 --> 밑에서 배울 "chmod 777 everybody"로 디렉토리에 "rwxrwxrwx"권한을 부여하여, 누구나 사용할 수 있는 공유디렉토리로 변경 
--> "ll -d"로 everybody 디렉토리의 권한이 모두 있음(rwxrwxrwx)을 확인합니다






"cd everybody"를 통해 everybody 디렉토리 내부로 이동 --> ll(ls -l)명령어로 확인해서 현재 아무런 파일이 없음을 확인






"su mamu"명령어로 'mamu'란 계정으로 로그인함(su - mamu가 아닌 su mamu로 했기에
원래 있던 위치 그대로 계정변경됨) --> "touch file.mamu"명령어로 'file.mamu'란 파일을 생성--> "ll" 파일이 만들어짐과 'inode' 확인






"su korea"명령어로 'korea'계정에 로그인(앞서 말했다시피 su korea이기 때문에 원래 있던
위치에서 계정변경됨) -->명령어 "ll" 로 파일들 확인후 --> "touch file.korea" 명령어로 'file.korea'란 파일을 생성 --> ll로 다시 확인 





자신이 만든 "file.korea"의 권한을 "chmod 660 file.korea"를 통해 "rw-rw----"으로 바꿔' other에겐 아무런 권한이 없게함
---> ll로 "file.korea"의 other엔 아무런 권한이 없고 "file.mamu"의 other엔 r이 있음을 확인
---> echo와 리다이렉션 ">"를 이용해 자신의 파일 "file.korea"에 "wha!"란 내용을 넣음





"su mamu"로 'mamu'로 로그인한 뒤 --> ll로 파일들 권한 확인 --> 파일의 내용을
읽어서 출력하는 "cat"으로 "file.korea"를 읽어보지만 " file.korea의 other"에 "r(read)"
권한이 없어서 못 읽습니다.






이번엔 자신의 파일의 "file.mamu"에 echo와 >를 이용하여 "yee"라는 내용을 넣음
--> ll로 file.mamu는 korea파일과는 다르게 other에 "r"이 있음을 확인 








이번엔 korea로 로그인 한 뒤에 --> ll로 파일들 권한 확인 뒤 --> cat으로 other에 "r"권한이 있는 file.korea를 읽어보자 "yee"라고 잘 읽을 수 있는 걸 확인했습니다

여기까지 "r"이 있어야 파일의 내용을 읽을 수 있다는 걸 확인해 본겁니당 

이번엔 처음에 root로 만들었던 이 "everybody" 디렉토리에서 other의 "x"권한을
제거하여 다른 유저들이 "everybody"디렉토리 안으로 이동할 수 있는지 확인해보겠습니다.





ll -d로 먼저 everybody 디렉토리 권한을 확인하고 --> chmod 776으로 everybody의
other에서 "x"권한을 제거했습니다.


이제 다른 유저들이 이 everybody 디렉토리 내부로 이동할 수 있을까요?





크으으 네~ 안됩니다~ mamu로 로그인 한 뒤 "cd everybody"로 이동하려 했지만
거부되는 모습이져

그러면!? ls명령어로 디렉토리 내부를 보는 건 어떨까요?





ls로 everybody를 보니 내부에 어떤 이름의 파일이 있는지는 보여주는데 허가 거부라길래
ll로 확인을 해보니 이름만 알려줍니다

어라?? 왜 "x"권한이 없는데 안에 무슨 이름의 파일이 있는진 볼 수 있는거죠!!?
왜일까요 ㅎ 제 그림을 제대로 보신 분들이면 바로 이해가 되실 겁니다!

그건 바로 이 'everybody 디렉토리'의 other엔 "r"권한이 있기 때문입니다. 
그래서 저흰 말 그대로 everybody 디렉토리 내부를 "읽어"본 겁니당

물론 "x(실행)"권한이 없기에 


이 그림처럼 디렉토리의 기능(내부로 들어감)을 실행할 수 없기에 어렴풋이 파일들이 있는것만 확인해 자세한 정보는 모르는거죠

자자 그럼 이번엔 "r"권한 마저 빼볼가요?





다시 root로 로그인 한 뒤 "chmod 772"로 everybody의 "other"에 w실행 말고 전부
제거해줍니다







다시 일반 유저 mamu로 로그인 한 뒤 ls와 ll로 everybody 디렉토리를 읽어보려 하지만
거부되는 모습이죠~

그럼 'r(read)'은 없고 'x(excute)'권한만 있음 어떻게 될까요? 

이건 마치, 불이 꺼져 있는 깜깜한 디렉토리(방)에 들어간 것과 같습니다.

디렉토리 내부를 읽을 수가 없으니 디렉토리안에 어떤 파일이 있는지는 못 보지만, 실행 권한은 있으므로












위 파란색으로 나타낸 것 처럼 '/'에서 'everybody' 내부로 이동한 모습입니다!

여기까지 일반파일과 디렉토리의 "r"과 "x" 권한의 차이를 알아봤네요 
이렇듯 r(read)와 x(excute)는 아예 다른 개념이란 뜻이죠~

자 그럼 w(write)의 개념도 제대로 설명을 해야죠?

일반파일의 경우 쉽게, 'w'를 "파일을 변경할 수 있는 권한"이라고 아시면 편합니다.

'w'는 파일을 변경할 수 있는 권한이기 때문에 다중 사용자를 지원하는 리눅스에서, 다른 유저가 다른 사람이 만든 파일을 멋대로 바꾸면 상당히 문제겠죠?

그래서 '일반 파일'을 만들면 소유자만 w(write)권한을 갖도록 하는 것입니다.

그리고 디렉토리의 'w'는 "디렉토리를 변경할 수 있는 권한"이라고 아시면 됩니다.
디렉토리 내부 파일들을 추가하든 지우든, 말 그대로 디렉토리(방 내부)를 변경할 수 있는 권한이죠.

마치 '도서관 사서'가 '방(디렉토리)'에 있는 '책(파일)'들을 맘대로 이동하고, 이름 바꾸고, 버리고, 새로 추가하듯 방 내부를 관리할 수 있는 것과 같습니다.

하지만 그 책(파일)의 내용을 변경할 권한이나 마법서의 기능을 실행할 권한은 없죠. 





6. 디렉토리 권한 'w'주의점



여기까지만 하면 이제 rwx권한은 다 정리한 것 같으....면 얼마나 좋을까 싶지만 리눅스에서 여러 유저로 파일을 만들고 지웠던 분들이면 의아한 현상을 목격한 적이 있으실 겁니다.  

바로 'w' 권한이 없는 다른 유저가 파일의 내용을 수정하는 것을 말이죠!

이 경우엔 2가지 경우가 있습니다.

첫 째, 'root'유저는 슈퍼유저이자 관리자기 때문에 모든 게 가능하여 때문에 다른 유저파일의 other에 권한이 없어도 모든 게 가능하다

2번 째인 경우, 파일이 들어있는 디렉토리에 'w'권한이 있는경우, 디렉토리 내부 파일을 관리할 수 있기에, 기존 파일을 덮어버릴 수 있다.

2번 째가 조금 어렵습니다만.. 이 사례가 리눅스 마스터 1급 시험에 나왔었습니다..(충격)

무슨 소리냐, 아까 만든 rwxrwxrwx(즉 모든 권한이 부여된) "everybody"안에
유저인 'mamu'가 other에 아무런 권한을 안 준 'file.mamu'을 만들었다 치면, 원랜 다른 유저 'korea'가 이 'file.mamu'파일을 수정할 수 없는게 정상이죠? 

그런데 파일에 속한 디렉토리 other에 "w"권한이 있기 때문에 덮어버리기가 가능합니다.



사진으로 보여드리자면






이렇게 'everybody' 디렉토리의 other에 "w,"권한이 있죠?





그러나 그 내부의 'file.mamu'의 other엔 아무런 권한이 없습니다. 그래서 원랜 이 'mamu'유저가 아닌 다른 유저가 파일의 내용을 수정할 수도 없는게 정상인데







이렇게 파일을 열어서 편집하는 명령어 "vi"를 쓰면, 상위 디렉토리 'everybody'의
other에 "w"권한이 있기 때문에 







이렇게 밑에 허용은 안 된다고 적혀있지만...








이렇게 내용을 적을 때도 밑에 "읽기 전용 파일을 고치고 있다"며 경고를 하지만..





이렇게 w(내용을 쓰고 저장하겠다)q(이 vi에서 나가겠다) 하면





이렇게 안된다고 합니다만...





강제로 적용하겠다는 의지 '!'를 붙여주면 파일의 내용이 저장되고 나가집니다






그리고 확인해보면!!!?





으아닛!?




말도 안돼!








놀랍게도.... "korea"라는 유저가 "mamu"유저 소유의 파일을 강제로 수정했기에... 
"file.mamu"파일의 소유자와 그룹이 "mamu"에서 "korea"로 변하는 ★매직★을 보여줍니다.

어떻게 된걸까요?

그것은 사실, 디렉토리에 파일을 생성, 제거가 가능한 권한 'w'가 있기에, 그냥 vi에서 똑같은 이름 'file.mamu'라는 것을 새로 만든 다음, 기존의 "file.mamu"에 덮어씌운겁니다 ㅋㅋ

그냥 말 그대로 기존의 'file.mamu'를 제거하고, 'korea'가 만든 새로운 'file.mamu'란 파일을 만든 셈이죠~ 

그래서 소유자도 권한도 'korea'란 유저로 돼 있던 겁니다!

이런식으로 파일에 'w'가 없어도 디렉토리에 'w'권한이 있으면, 다른 사람의 파일 쉽게 수정 및 제거가 가능하다는 것~

그렇기에 보통 디렉토리를 새로 만들면 "rwxr-xr-x"이런식으로 소유자가 아닌 경우 'w'권한을 빼는 겁니다 ㅎㅎ




7. 중간정리


와... 어렵다 그죠? 뭐가 이리 까다로운지... 그래도 이런 권한에 대해 제대로 알지 못하면
권한 부여를 잘못해서 시스템이 해킹당하는 불의가 발생할 수 있습니다..(물론 실전에서)

긴 내용을 읽느라 몽롱해졌으니 다시 한번 정리해드리겠습니다.


일반 파일의 rwx

r(read) : 파일을 read, 파일의 내용을 읽을 수 있는 권한
w(write) : 파일을 witre, 쓰다(라는 개념이 좀 헷갈릴 텐데)그냥 파일을 바꿀 수 있는 권한
x(excute) : 파일을 excute, 실행할 수 있는 권한

디렉토리에서의 권한 'rwx'

r(read) : 읽겠다, 즉 디렉토리 내부(파일들)을 볼 수 있는 권한
w(write) : 쓰겠다, 일반파일과 같은 맥락으로 디렉토리 내부 파일들을 변경할 수 있는 권한
x(excute) : 실행하겠다, 디렉토리의 기능(디렉토리 내부로 이동)을 실행할 수 있는 권한

디렉토리에 'w'권한이 있으면, 파일에 'w'권한이 없어도 그냥 덮어버릴 수 있기에 조심해야한다.




8. 8진수와 rwx의 4,2,1


위에서 제가 "chmod"라는 명령어도 파일의 권한을 변경할 때 r,w,x와 같은
문자를 안쓰고 777이니 774니 772니 숫자를 이용해 변경하는 걸 보셨죠?

이 숫자들이 어디서 나왔냐면

















요 권한이 8진수로 바꾸자면








각 u,g,o에는 8진수의 공간이 있다고 보시면 됩니다.

그리고 각 자리는 2배씩 되죠. 그래서 맨 첨 "x"는 1이고 그 다음 "w"는 2배인 2이고
그 다음 "r"은 2의 2배인 4가 되는 겁니다 그래서 총 합은 7이죠

그럼 저흰 r(4),w(2),x(1)의 적절한 사용을 통해 0~7까지 수를 만들 수 있습니다
666이면 rw-rw-rw-인 것이고 642이면 rw-r---w-인거죠~ 111이면 --x--x--x이겠고요
네? 000이요? 아무것도 없는 "---------"일 때 이겠죠 ㅎㅎ

이 숫자를 꼭 외워야하느냐? 그건 아니에요 밑에 명령어 chmod에 대해서 배울 때
u,g,o의 기호를 통해서 숫자 없이 권한을 변경할 수 있습니다.ex)chmod u+rx(유저에게 rx권한을 주겠다)

권한을 기호로 주던 번호로 주던 각자의 마음입니당 단지 시험볼 땐 둘다 알아야겠지만
번호를 외우기만 한다면 정말 빠르고 간편하게 권한을 변경할 수 있습니다~


/*************************8진수 모르는 분들만**********************************************/

아 여기서 8진수가 모르시는 분들을 위해 잠깐 설명해드리자면(아시는 분은 넘어가세요)
저희가 사용하는 대다수의 수는 10진수로서 이것의 의미는 숫자가 들어갈 수 있는
한 자리에[]이라치면 , 0~9까지 총 10개의 수가 들어갈 수 있다는 의미입니다.

[0],[1],[2]....[9] 이렇게 올라가다가 그 한자리에 들어갈 수 있는 10개의 경우의 수를 초과했기 때문에 다음 자리에 카운트가 됨으로써 [1][0]이 되는 겁니다.

그럼 2진수는 뭘까요 한 자리에 2개의 숫자가 들어갈 수 있다는 의미겠죠?

자 그럼 우리가 원하는 8진수는 뭘까요? 같은 맥락으로 한 자리에 8개의 숫자가 들어갈
수 있다는 겁니다. 그럼 0부터 시작해서 [0],[1],.....[7] 이렇게 올라가다가 8개의 경우의 수를
다 썻으니 이제 다음 칸에 1이 올라가며 [1][0] 이렇게 되는거죠
이제 8진수가 뭔지 아시겠죠?

/********************************************************************************************/




9. 리눅스 chmod


chmod(change mode) : change(바꾸겠다) mode(모드)인데 

사실 "mode" 라는 거 저희들은 외래어마냥 모드모드 자연스럽게 쓰는데 한글로 바꾸라고 하면 뭔가.. 잘 모르겠잖아요? mode라는 영어의 뜻을 잘 모르면 이 "chmod" 명령어가 잘 안 외워지니까 

"mode"의 뜻을 영영사전의 뜻,  "one of several ways that a machine or device operates" : "장치를 사용하는 여러 방법 중 하나"로 알고 갑시다 

그럼 change(바꾸겠다) mode(파일을 사용하는 방법 중 하나) 이렇게 외우면 
잘 외워지지 않을까 싶네요...(나만 그런가..)

명령어 형식은 기호를 이용하는 방법과 숫자를 이용하는 방법, 총 2가지가 있습니다.

*기호 방식*

chmod [옵션]  {[권한을 바꿀 사용자기호들][연산자][권한]},{.....}...  [파일] 
입니다

"chmod"의 쓸만한 옵션은 "-R(recurisve)"가 있네요 하도 많이 보는 옵션이라 대충 감이 오시죠? 그 하위 파일까지 전부다 바꾸겠단 의미입니다

"사용자기호"는 위에서 보여드렸던 "u(소유자),g(그룹),o(other)"를 말합니다.

"연산자"는 저희가 아는 연사자 "+" , "-" , "=" 이 있습니다. (* , /이런건 없어요)

이 연산자의 뜻은 그냥 그대로~ 받아들이면 됩니다 "+는" 뒤에 쓴 권한을 주겠다, 
"-"는 뒤에 쓴 권한을 빼겠다, "="는 뒤에 쓴 권한처럼 만들겠다 이죠 

ex) chmod u(user에게)+(주겠다)x(excute권한을)  [파일](이 파일에게) 
이렇게 말이죠


권한을 바꿀 때 "chmod ugo+wx" 이렇게나 "chmod uo=rw" 이렇게 사용자 기호를 뭉쳐서
한번에 바꿀 수도 있습니다. 하지만 이렇게 하면 모든 사용자기호에 똑같은 수식을 주니까
세밀하게 권한을 조정하기 힘들죠 

그래서 따로따로 사용자기호에게 권한을 줄 수도 있는데 
위에 보기 힘들지만 자세히 보시면 {[권한을 바꿀 사용자기호][연산자][권한]}다음에
,{...}... 파일 이렇게 보이실텐데 이건 chmod u+x,g=rwx,o-wx [파일] 이런식으로 각 사용자기호에게 따로따로 줄 수 있다는 뜻입니다.


*숫자 방식*

chmod [옵션] [권한숫자들] [파일]  입니다.

와... 위에보다 훨씬 눈으로 보기 편하다 그죠? 실제로도 편합니다.
옵션은 기호랑 똑같고요

ex) chmod 773(u에 rwx , g에 rwx , o에 wx를 주겠다) [파일](이 파일에)
chmod 552(u에 rx, g에 rx, o에 w를 주겠따) [파일](이 파일에)

와... 진짜 ... 권한 숫자만 외우면 기호보다 몇 배는 훨씬 빠르게 바꿀 수 있겠죠?
그래서 제가 숫자를 외우라고 했던 겁니다. 처음엔 기호가 더 쉽게 외워질 수도 있지만
자꾸 하다보면 숫자 금방 외워지실 겁니다 생각보다 외우기 쉬워요
"ugo"순으로, r(4),w(2),x(1)  기억하세여



10. 총 정리



1. 일반 파일의 rwx
r(read) : 파일을 read, 파일의 내용을 읽을 수 있는 권한
w(write) : 파일을 witre, 쓰다(라는 개념이 좀 헷갈릴 텐데)그냥 파일을 바꿀 수 있는 권한
x(excute) : 파일을 excute, 실행할 수 있는 권한

2. 디렉토리에서의 권한 'rwx'
r(read) : 읽겠다, 즉 디렉토리 내부(파일들)을 볼 수 있는 권한
w(write) : 쓰겠다, 일반파일과 같은 맥락으로 디렉토리 내부 파일들을 변경할 수 있는 권한
x(excute) : 실행하겠다, 디렉토리의 기능(디렉토리 내부로 이동)을 실행할 수 있는 권한

3. 디렉토리에 'w'권한이 있으면, 파일에 'w'권한이 없어도 그냥 덮어버릴 수 있기에 조심해야한다.

4. chmod 옵션엔 -R(Recursive)가 있고 권한을 주는 방법엔 기호방식,숫자방식이 있으며
기호는 chmod [옵션] [사용자기호들][연산자][권한] [파일] 또는 {[사용자기호][연산자][파일]},{....}... [파일]이 있다

5. chmod 숫자방식은 chmod [옵션] [권한 숫자] [파일] 이다






호우... 진짜 긴 글이였지만 화장실 가는 거 빼고 풀 집중해서 7시간만에 끝냈네요!
ㅎㅎ  오타나 틀린내용 지적해주시면 바로 수정하겠습니다!

도움이 되셨다면 좋겠네요 ㅠㅠ

구글 블로그 팔로우 클릭, 따듯한 댓글은 큰 도움이 되어 제가 더 퀄리티 좋은 포스트를 만들게 도와줍니다!!


-리눅스 공부할 순서 페이지-
https://mamu2830.blogspot.com/p/blog-page_13.html