보안 공부 회고록
UMASK에 대한 공부 본문
※ 본 글에는 개인적인 의견이 포함되어 있습니다.
※ 절대 본 글의 내용만을 신뢰하고 실 서버에 적용하지 마세요.
※ 반드시 검증 검증 검증 검증 충분한 검증!!!! 후 적용하시기 바랍니다.
항상 UMASK를 계산하는 방법을 헛갈린다.
디렉터리와 파일의 기본 권한은 UMASK에 의해서 결정된다.
/etc/profile 등에서 UMASK 값을 설정 할 수도 있지만 계정별로 홈 디렉터리 아래의 .profile 파일 등에서 설정할 수도 있다.
어쨌든 UMASK를 이용해서 디렉터리와 파일의 기본 권한을 계산하는 방법은 다음과 같다.
if) UMASK가 022일 때
디렉터리 : 0777 - UMASK = 0777 - 022 = 0755
파일 : 0666 - UMASK = 0666 - 022 = 0644
→ 디렉터리를 생성하면 755(rwxr-xr-x) 권한을 갖게 되고 파일을 생성하면 644(rw-r--r--) 권한을 갖게 된다.
if) UMASK가 027일 때
디렉터리 : 0777 - UMASK = 0777 - 027 = 0750
파일 : 0666 - UMASK = 0666 - 027 = 0640
→ 디렉터리를 생성하면 권한이 750(rwxr-x---)이고 파일을 생성하면 권한이 640(rw-r-----)을 갖게 된다.
if) UMASK가 052일 때
디렉터리 : 0777 - UMASK = 0777 - 052 = 0725
파일 : 0666 - UMASK = 0666 - 052 = 0614
→ 디렉터리를 생성하면 권한이 725(rwx-w-r-x)이고 파일을 생성하면 권한이 614(rw---xr--)을 갖게 된다.
사실 뺄셈 연산으로 표현했지만 0777, 0666에서 UMASK 값을 빼는게 아니라 XOR 연산을 하는 것이다.
UMASK가 0022일 때를 기준으로 계산을 해보자면 다음과 같다.
UMASK가 0022일 때
* 가독성을 위해서 4비트별로 나눠 띄어쓰기로 구분함
[디렉터리 권한 구하기]
0777 = 0000 0111 0111 0111
0022 = 0000 0000 0010 0010
* XOR 연산 결과
0777 = 0000 0111 0111 0111
0022 = 0000 0000 0010 0010
------------------------------
0755 = 0000 0111 0101 0101
[파일 권한 구하기]
0666 = 0000 0110 0110 0110
0022 = 0000 0000 0010 0010
* XOR 연산 결과
0666 = 0000 0110 0110 0110
0022 = 0000 0000 0010 0010
------------------------------
0644 = 0000 0110 0100 0100
XOR 계산 방법을 보면 알겠지만 두 개의 피연산자 중 하나만의 1일 때 1을 반환하고
모두 0이거나 모두 1이면 0을 반환한다.
0 0 → 0
1 0 → 1
0 1 → 1
1 1 → 0
그렇기 때문에 UMASK가 027일 때, 0666 - 027 이 마이너스 값이 나오지 않는 것이다.
계산 방법은 참고로 알아두자.
XOR 연산을 이용한다는 점!
어쨌든 주요정보통신기반시설 취약점 평가기준을 보면 UMASK 022일 때 양호라고 하는데...
디렉터리는 755(rwxrw-rw-)의 권한을 갖고 파일은 644(rw-r--r--)의 권한을 갖을 때 양호라고 본다는 것이다.
→ 대충 눈치챘겠지만 UMASK를 022로 하라는 의미는 group과 others에게 과도한 권한을 주지 말라는 의미로 보인다.
주요정보통신기반시설 취약점 평가 기준에서는 UMASK가 022 이상이면 양호라고 하는데...
"이상"이라는 의미가 숫자 그대로만을 고려하라는 의미는 아닌 것 같다.
개인적인 생각으로... UMASK 022를 양호로 본다는 것은 파일 생성 권한을 기준으로 했을 때
group에게는 최소한 읽기(r) 권한만 줄 수 있고
others에게는 읽기(r) 권한만 줄 수 있다는 의미일 것으로 추측된다.
하지만 단순히 숫자만 고려해서 UMASK 값을 설정하면... UMASK가 031일 때도 양호이어야 한다.
문제는.... UMASK가 031이면 파일을 생성할 때, 실행(x) 권한을 얻게 된다.
디렉터리 : 0777 - 031 = 0756(rwxr-xrw-)
파일 : 0666 - 031 = 0635 (rw--wxr-x)
이건 오히려 더 취약한 상태가 되는게 아닐까..?
개인적인 생각으로는 022 "이상"이다, "미만"이다로 판단할게 아니라
각각의 자릿수를 보고 읽기 권한만 갖고 있는가로 판단을 해야할 것 같다.
그럼... 하나씩 계산을 하면서 양호한 상황을 생각해보자.
group과 others에게 줄 수 있는 권한은 딱 읽기(r)까지만이라고 가정한다.
("파일"을 생성했을 때 갖게 되는 기본 권한을 기준으로 한다. 디렉터리는 뭐...)
1. group 혹은 others가 파일 생성 시 읽기, 쓰기 권한을 얻는 경우 (개인적으로 취약한 경우라고 판단됨)
(1-1) 처음 디렉터리를 생성할 때, group에게 읽기(r)와 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 1이 되어야 한다.
(1-2) 처음 파일을 생성할 때, group에게 읽기(r)와 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 0이 되어야 한다.
2. group 혹은 others가 파일 생성 시 읽기 권한을 얻는 경우 (개인적으로 양호라고 판단됨)
(2-1) 처음 디렉터리를 생성할 때, group에게 읽기(r) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 3이 되어야 한다.
(2-2) 처음 파일을 생성할 때, group에게 읽기(r) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 2이 되어야 한다.
* 그럼 UMASK 값의 10의 자리는 2일 때 양호로 볼 수 있어 보인다.
3. group 혹은 others가 파일 생성 시 쓰기 권한을 얻는 경우 (개인적으로 취약이라고 판단됨)
(3-1) 처음 디렉터리를 생성할 때, group에게 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 5가 되어야 한다.
(3-2) 처음 파일을 생성할 때, group에게 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 4가 되어야 한다.
4. group 혹은 others가 파일 생성 시 어떠한 권한도 얻지 않는 경우 (개인적으로 양호라고 판단됨)
(4-1) 처음 디렉터리를 생성할 때, group에게 그 어떠한 권한도 주지 않으려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 7이 되어야 한다.
(4-2) 처음 파일을 생성할 때, group에게 그 어떠한 권한도 주지 않으려면 UMASK의 값은 어떻게 되어야 할까?
→ UMASK 값의 10의 자리는 6이 되어야 한다.
* 그럼 UMASK 값의 10의 자리는 6일 때 양호로 볼 수 있어 보인다.
즉, UMASK의 10의 자리는 2 혹은 6일 때만 양호가 될 수 있다. (= group에게 줄 수 있는 권한이 read 뿐이거나 아무것도 없을 때)
others의 권한도 마찬가지이다.
UMASK의 1의 자리는 2 혹은 6일 때만 양호가 될 수 있다. (= others에게 줄 수 있는 권한이 read 뿐이거나 아무것도 없을 때)
물론...
UMASK의 10의 자리를 6로 하게 되면 디렉터리를 생성할 때 실행 권한을 얻게 된다.
0777 - 066 = 0711 (rwx--x--x)
하지만 이건 022로 설정했을 때도 얻게 되는 권한이라서 크게 문제가 될 것 같아보이지 않는다.
마찬가지로 UMASK의 10의 자리가 4이면 일단 파일 생성 시 쓰기(w) 권한을 얻게 되는건 둘째치고 디렉터리를 만들 때 쓰기(w)와 실행(x) 권한을 얻게 되어 버린다.
주요정보통신기반시설 취약점 진단기준에서는 022를 양호의 기준으로 잡았고
022는 디렉터리를 만들 때 읽기(r)와 실행(x) 권한만 주는 것이었는데, UMASK의 10의 자리에 4가 들어가면 기준에 반(反)하여 쓰기(w) 권한을 넣어버리게 되는 것이다.
그래서 개인적인 생각으로는 UMASK의 값을 설정할 때 2 혹은 6~7이 들어가면 주요정보통신기반시설 취약점 진단 기준에 따라 잘 설정했다고 볼 수 있지 않을까 싶다.
그러니까 022, 026, 027, 062, 066, 067, 072, 076, 077만 넣는게 안전해 보인다...랄까.
'sdb: 프로젝트 및 보안 자료 > 취약점 진단 공부 기록' 카테고리의 다른 글
Linux 계정 잠금 임계값 설정 시 유의사항 (0) | 2024.01.08 |
---|