스맥에 대해 하나씩 정리를 해보고자 마음을 먹었습니다만,

정리해야할 내용이 너무 많아서 고민하고 있습니다.


기본적인 원리는 간단할지 모르겠으나,

원리와 원리의 적용(현실화)에는 무척이나 깊은 간극이 있습니다.


비교적 간단한 원리부터 설명하여,

틈 나는 대로 하나씩 포스팅하겠습니다.



위의 그림은 펭귄...일겁니다.

이상한 모양의 삼각형 펭귄.

SMACK의 공식 로고입니다.

SMACK에 대한 신뢰를 한 순간에 무너뜨릴 만큼 허접한 로고입니다.


SMACK은 프로세스와 파일에 Label을 긋는 것에서 시작됩니다.

SMACK이 적용된 플랫폼의 모든 파일에는 SMACK Label이 그어지게 되죠.

Label은 흔히 그 파일을 설치한 패키지 이름이나 파일의 성격에 따라 작명합니다.


한 패키지에 다수의 파일이 있으면,

같은 패키지 이름으로 모든 파일에 같은 Label을 그어줄 수도 있고,

파일의 성격에 따라 서로 다른 Label을 지을 수도 있습니다.


이처럼 사용자가 지정하는 Label 외에 스맥이 사전에 정의한 Label도 있습니다.

아래 명시되어 있는 5가지 문자가 사전에 정의된 Label입니다.


Pronounced "floor", a single underscore character.

^  Pronounced "hat", a single circumflex character.

*  Pronounced "star", a single asterisk character.

?  Pronounced "huh", a single question mark character.

@  Pronounced "web", a single at sign character.


상위 3개(_, ^, *)는 자주 사용하지만,

아래 2개(?, @)는 사용해본 적이 없습니다.

'?' Label은 실제로 사용하는지 의문입니다.

'@' Label은 앱에서 인터넷을 특정 IP 주소를 누구나 사용하도록 열어줄때 사용합니다.

이 Label 또한 자주 사용하진 않으므로 생략하겠습니다.


상위 3개는 커널 소스에서도 그대로 사용됩니다.

커널 소스를 그대로 볼 필요는 없고,

아래 7가지 단계로 되어있다고 여기시면 됩니다.


  1. Any access requested by a task labeled "*" is denied.

2. A read or execute access requested by a task labeled "^"

   is permitted.

3. A read or execute access requested on an object labeled "_"

   is permitted.

4. Any access requested on an object labeled "*" is permitted.

5. Any access requested by a task on an object with the same

   label is permitted.

6. Any access requested that is explicitly defined in the loaded

   rule set is permitted.

7. Any other access is denied.


우선 프로세스가 "*" 실행권한인지 체크합니다(1).

프로세스가 "*" 권한이라면, 어떤 파일에도 접근할 수 없습니다.

바로 Access denied 에러를 리턴하게 되겠지요.

실행파일이지만 다른 파일에는 접근하게 하고 싶지 않을때 설정하면 됩니다.


프로세스가 "^" 실행권한이 있으면(2),

파일에 어떤 label이 그어져 있건,

읽고 실행할 수 있습니다.

쓰기 권한은 없습니다.

굉장히 막강한 권한입니다.

'^'는 제한적인 프로세스에 사용해야합니다.


파일에 "_" Label이 새겨져 있으면(3),

프로세스가 읽고 실행할 수 있는 파일입니다.

라이브러리에 "_" Label을 새겨놓으면 됩니다.

어느 프로세스나 접근할 수 있게 판을 깔아놓는 셈이지요.


파일에 "*" Label이 새겨져 있으면(4),

어느 프로세스이든 접근하여 읽고 쓰고 실행할 수 있습니다.

스맥이 적용되지 않은 시스템에 있는 파일과 같은 상태인 셈입니다.

오직 리눅스 권한만이 영향을 미칠 수 있습니다.

누구나 읽고 쓰고 실행할 수 있는 파일/디렉토리에 지정하면 됩니다.


프로세스와 파일의 Label이 같다면(5),

읽고 쓰고 실행할 수 있습니다.

같은 패키지인 경우가 이에 해당합니다.

자기가 설치한 파일을 관리하는 것이죠.


룰이 적혀있는 set에 명시적으로 프로세스와 파일을 관계가 적혀있는 경우(6),

이 경우에 룰에 적혀있는 범위 내에서의 접근할 수 있습니다.

룰 set에 읽기만 언급되어 있다면,

프로세스는 파일에 대해 읽기만 가능할테지요.


그 외의 경우는 접근할 수 없습니다(7).


이상의 7단계를 차례대로 거쳐서,

프로세스의 파일에 대한 접근이 확정됩니다.


여기서 오직 '*' 기호만 프로세스와 파일에 적용할 수 있습니다.

기호는 같지만 의미는 완전히 다릅니다.

'*'가 프로세스와 쓰일때는 프로세스가 어떤 파일에도 접근할 수 없게 됩니다.

하지만, '*'가 파일에 쓰인다면 어떤 프로세스나 읽고 쓰고 실행할 수 있게 되지요.

좀 더 분명한 역할정의를 위해,

서로 다른 기호를 썼으면 좋았을거란 생각이 듭니다.


'*' 기호와는 다르게 '^'는 프로세스에서만 사용하고,

'_'는 파일에서만 사용합니다.

만약 '^'를 파일에, '_'를 프로세스에 사용하면 의도치 않은 동작을 할 수 있습니다.


끝_


* SMACK에 대한 이야기를 쌓아본다

http://storycompiler.tistory.com/51


* References

http://www.webcitation.org/6AqzohCXq

+ Recent posts