본문 바로가기

정보보안/시스템 보안

[UNIX/Linux 기본학습] 서버보안1

시스템보안

밑에 내용 정리한 그림. 출처: 나

프로세스 실행권한

평소에 당신은 주민등록증을 들고다니며 본인을 인증할 것이다.

그런데 회사에 들어갈 때는? 출입증이 필요하지 주민등록증은 필요없다. 

당신은 출입증으로 본인 부서에만 들어갈 수 있다. 물리 서버가 설치된 서버실이나, CEO가 있는 CEO 방은 들어갈 수 없다. 만약 정말정말 들어가고 싶다면 CEO의 사원증이나 서버관리자, 또는 건물 전체 관리자의 출입증을 빌려야한다.

이 출입증의 개념을 컴퓨터에 적용해보자

① 유닉스/리눅스 시스템은 프로그램(프로세스)을 실행할 때와 실행 중일 때 권한을 분류한다.

② 접근권한을 판단하기 위해 아래와 같은 4가지 ID를 사용한다. 
- RUID(실행시킨 진짜 사용자 ID, Real User ID) 
- EUID(실행 중에 부여되는 사용자 ID, Effective User ID) 
- RGID(실행시킨 진짜 그룹 ID, Real Group ID)
- EGID(실행 중에 부여되는 그룹 ID,Effective Group ID)

③ 위의 예시와 비교하면 아래와 같이 이야기 할 수 있다.
- 당신은 평소에 RUID라는 주민등록증을 들고다니며 회사에서 일할 때만 EUID라는 출입증을 사용한다.
마찬가지로 부서(그룹)개념으로 확장하면 RGID,EGID도 동일하게 적용시킬 수 있다.

④ 그렇다면 잠깐 빌리는 출입증은 뭐라고 할 수 있을까? 이때 나타나는 개념이 SUID,SGID이다.
- SUID,SGID : 프로세스가 실행 중인 동안에(일시적으로) 해당 실행파일의 소유자, 소유그룹의 권한으로 자원에 접근할 수 있도록 하는 권한 설정
- SUID,SGID가 설정되지 않은 프로세스를 실행시키면 RUID,RGID는 실행시킨 사용자의 UID,GID로 설정되고 EUID,EGID는 실행시킨 사용자의 UID,GID로 설정된다. 따라서 실행시킨 사용자와는 무관하게 프로세스가 실행 중인 동안에는 실행시킨 사용자의 권한으로 접근하게 된다.
- SUID,SGID가 설정된 프로세스를 실행시키면 RUID,RGID는 실행시킨 사용자의 UID,GID로 설정되고 EUID,EGID는 실행파일 소유자의 UID,GID로 설정된다. 따라서 실행시킨 사용자와는 무관하게 프로세스가 실행 중인 동안에는 실행파일 소유자의 권한으로 접근하게 된다.
- 위의 예시와 비교하자면 주민등록증과 출입증은 본인 권한으로 무엇을 할 수 있지만 , 빌린 출입증은 빌린 사람의 권한으로 무언가를 할 수 있다고 생각하면 될 것 같다.

⑤ SUID,SGID를 설정하는 것을 특수권한비트를 설정한다고 한다
[특수권한비트]
특수권한(3bit) user(3bit) group(3bit) other(3bit)
4 2 1 4 2 1 4 2 1 4 2 1
s(suid) s(sgid) t
(sticky
bit)
r w x r w x r w x

+ sticky bit란 파일 삭제나 파일명 변경은 소유자만이 가능하고 파일 생성은 가능하게 하는 것을 sticky bit라 함. 모든 사용자가 이용할 수 있는(777,666권한 파일) 파일을 다른 사람이 삭제,변경 못하도록 설정함.
(cf. linux: chmod o+t /tmp, unix: chmod u+t /tmp)


[설정방법]
chmod ug+s / chmod 4777.. 등

⑤ 만약 root 소유의 자원(파일 등과 같은)에 대해 일반 사용자의 직접 접근을 차단하면서 기능상 필요한 부분만 접근하도록 허용할 필요가 있는 경우, 별도의 root 소유  프로그램을 통해 SUID,SGID를 설정하여 사용하는 것이 보안 측면과 운영 측면에서 매우 효율적이다. 그렇지만 root권한이 필요 없는 프로그램에 소유주가 root로 되어 있고 SUID가 설정된 경우는 보안상으로 매우 취하다. 그래서 주기적으로 확인이 필요하다. 찾는 명령어는 다음과 같다.
- find / -user root -perm -4000
- find / -user root -perm -2000
- find / -user root  \( -perm -4000 - o -perm -2000 \) -exec ls -al {} \;