리눅스(유닉스) 시스템은 개인이 사용하는 PC를 운용하기 위한 O/S가 아니라 서버를 운용하기 위한 O/S 입니다. 이에 시스템 관리자는 일반 사용자가 보안 정책에 관심을 갖지 않아도 기본적인 보안 정책을 세울 수 있는 방안을 제공하고 있으며 그 중 가장 기본적인 것이 umask 입니다.
시스템 관리자는 파일의 접근 허가를 불허하는 최소한의 값을 설정할 수 있으며 이를 umask 값이라고 말합니다. 예를 들어 일반 사용자가 실행 파일에 접근 권한을 0777로 설정하면 소유자와 소유그릅, OTHER 모두 읽기, 쓰기, 실행 권한을 갖습니다. 이는 자신도 모르게 다른 사용자에 의해 파일을 삭제할 수 있다는 것을 의미합니다.
이러한 맹점을 없애기 위해 일반적으로 시스템 관리자는 umask값을 022로 설정하여 소유자를 제외한 다른 계정에서는 쓰기 권한을 주지 못하게 하여 다른 계정에서 만든 파일을 삭제하지 못하게 합니다.
[그림 4.6]은 umask 명령으로 022값을 설정하였을 때 hello 파일을 생성하여 파일 권한을 확인하는 것과 다시 umask 명령으로 000으로 설정하한 후 yahoo 파일을 생성하여 파일 권한을 확인한 것입니다. 보시는 것처럼 umask 022를 설정하였을 때 소유 그룹과 OTHER는 파일에 쓰기 권한이 없는 것을 알 수 있습니다. 또한 umask 값을 000으로 설정하였을 때는 쓰기 권한이 있는 것을 알 수 있습니다. 이처럼 umask값을 설정하면 파일을 생성할 때 권한 부분은 umask값을 뺀 수치로 설정합니다.
또한 시스템 호출로 umask를 제공하고 있습니다.
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
반환 값: mask값
int fchmod(int fd, mode_t mode);
반환 값: 실패 시 -1, 성공 시 0
다음은 umask값을 022로 설정한 후에 파일을 생성하고 다시 umask값을 000으로 설정한 후에 파일을 생성한 예제 코드입니다.
/*********************************************************************** * ex_umask.c * * example source - set umask value * ***********************************************************************/ #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main(int argc,char **argv) { umask(022); int fd = open("um022",O_CREAT,0777); close(fd); umask(000); fd = open("um000",O_CREAT,0777); close(fd); return 0; }