Fundamental of Software Develop/: : Linux System Programming

Linux System Programming : 파일 접근 권한 제어

Jay.P Morgan 2023. 11. 10. 00:01

  파일 접근 권한 제어

  stat 구조체의 st_mode 항목에는 파일의 종류와 접근 권한 정보가 저장된다.

  st_mode 항목의 값을 해석하려면 sys/stat.h파일에 정의된 상수와 매크로를 이용해야 한다.

 

 

  st_mode의 구조

  먼저, st_mode 항목에 저장되는 값의 구조를 알아야 상수와 매크로의 역할을 이해할 수 있다. 

  (st_mode: 파일의 종류와 접근권한 정보)

  st_mode 항목의 데이터형인 mode_t는 unsigned int로 정의되어 실제로 16비트를 사용한다.

 

buf
    - 파일의 상태 및 정보를 저장할 buf 구조체

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* 파일의 종류 및 접근권한 */
    nlink_t   st_nlink;   /* hardlink 된 횟수 */
    uid_t     st_uid;     /* 파일의 owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* 파일의 크기(bytes) */
    blksize_t st_blksize; /* blocksize for file system I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

 이 중에서 주요 내용을 보면,
 st_mode : 파일의 종류와 file에 대한 access 권한 정보
   파일의 종류 체크하는 POSIX macro입니다.
   
  S_ISREG(buf.st_mode) : 일반 파일 여부
  S_ISDIR(buf.st_mode) : 디렉토리 여부
  S_ISCHR(buf.st_mode) : character device 여부
  S_ISBLK(buf.st_mode) : block device 여부
  S_ISFIFO(buf.st_mode) : FIFO 여부
  S_ISLNK(buf.st_mode) : symbolic link 여부
  S_ISSOCK(buf.st_mode) : socket 여부 (주로 AF_UNIX로 socket 생성된 경우)


 st_mode는 파일의 유형값으로 직접 bit & 연산으로 여부를 확인가능합니다.
  S_IFMT     0170000   파일 유형의 전체의 bit or 값
  
  /* 파일 유형 */
  S_IFSOCK   0140000   socket
  S_IFLNK    0120000   symbolic link
  S_IFREG    0100000   regular file
  S_IFBLK    0060000   block device
  S_IFDIR    0040000   directory
  S_IFCHR    0020000   character device
  S_IFIFO    0010000   FIFO
    
  /* 특수 권한 설정 bit */
  S_ISUID    0004000   set-user-ID bit
  S_ISGID    0002000   set-group-ID bit
  S_ISVTX    0001000   sticky bit

  접근 권한 값(chmod의 값과 같음)
  S_IRWXU    00700     mask for file owner permissions
  S_IRUSR    00400     owner has read permission
  S_IWUSR    00200     owner has write permission
  S_IXUSR    00100     owner has execute permission
  S_IRWXG    00070     mask for group permissions
  S_IRGRP    00040     group has read permission
  S_IWGRP    00020     group has write permission
  S_IXGRP    00010     group has execute permission
  S_IRWXO    00007     mask for permissions for others (not in group)
  S_IROTH    00004     others have read permission
  S_IWOTH    00002     others have write permission
  S_IXOTH    00001     others have execute permission    
    
 st_atime, st_mtime, st_ctime member 변수는 time관련 함수(time.h)를 이용하여 conversion후에 
 사용하면 쉽게 사용할 수 있습니다. localtime(3), ctime(3) 등

 

  sys/stat.h 파일에 정의된 상수와 매크로는 16비트 구조로 저장된 값과 상수를 AND연산한 값을 추출하는 것이다.

 

 

  파일의 종류 검색

  1) 상수를 이용한 파일 종류 검색

  st_mode는 파일의 유형값으로 직접 bit & 연산으로 여부를 확인가능합니다.
  S_IFMT     0170000   // 파일 종류 비트를 가져오기 위한 비트 마스크

  /* 파일의 유형 검색 상수 */
  S_IFSOCK   0140000   // 소켓 파일 [socket]
  S_IFLNK    0120000   // 심벌릭 링크 파일 [symbolic link]
  S_IFREG    0100000   // 일반 파일 [regular file]
  S_IFBLK    0060000   // 블록 장치 특수 파일 [block device]
  S_IFDIR    0040000   // 디렉터리 [directory]
  S_IFCHR    0020000   // 문자 장치 특수 파일 [character device]
  S_IFIFO    0010000   // FIFO 파일

※ st_mode와 S_IFMT를 AND연산한 결과 100000이 출력됨. (Regular File)

 

 

  2) 매크로를 이용한 파일 종류 검색

  st_mode는 파일의 유형값으로 직접 bit & 연산으로 여부를 확인가능합니다.
  S_IFMT     0170000   // 파일 종류 비트를 가져오기 위한 비트 마스크

  /* 파일의 종류 체크하는 POSIX macro */
  S_ISREG(buf.st_mode) : 일반 파일 여부
  S_ISDIR(buf.st_mode) : 디렉토리 여부
  S_ISCHR(buf.st_mode) : character device 여부
  S_ISBLK(buf.st_mode) : block device 여부
  S_ISFIFO(buf.st_mode) : FIFO 여부
  S_ISLNK(buf.st_mode) : symbolic link 여부
  S_ISSOCK(buf.st_mode) : socket 여부 (주로 AF_UNIX로 socket 생성된 경우)

  각 매크로는 인자로 받은 mode값을 0xF000과 AND연산한다.

 

 

  파일 접근 권한 검색

  파일의 접근 권한 역시 st_mode값으로 알 수 있으며, access()와 같은 함수를 활용할 수도 있다.

 

  1. 상수를 이용한 파일 접근 권한 검색

  /* 특수 권한 설정 bit */ (st_mode 값과 AND 연산으로 설정/권한 확인)
  S_ISUID    0004000   set-user-ID bit
  S_ISGID    0002000   set-group-ID bit
  S_ISVTX    0001000   sticky bit
  
  파일의 접근 권한 검색 상수
  S_IREAD    00400     owner read permission bit (8bit)
  S_IWRITE   00200     owner write permission bit (8bit)
  S_IEXEC    00100     owner execute permission bit (8bit)


  파일의 접근 권한 상수(POSIX, chmod의 값과 같음)
  S_IRWXU    00700     mask for file owner permissions
  S_IRUSR    00400     owner has read permission
  S_IWUSR    00200     owner has write permission
  S_IXUSR    00100     owner has execute permission
  S_IRWXG    00070     mask for group permissions
  S_IRGRP    00040     group has read permission
  S_IWGRP    00020     group has write permission
  S_IXGRP    00010     group has execute permission
  S_IRWXO    00007     mask for permissions for others (not in group)
  S_IROTH    00004     others have read permission
  S_IWOTH    00002     others have write permission
  S_IXOTH    00001     others have execute permission

 

 

 

 

  2. 함수를 이용한 접근 권한 검색 : access(2)

    access()함수는 pathname에 지정된 파일이 mode로 지정한 권한을 지니고있는지 확인하고 반환한다.

    (단, EUID(Effective User ID, 유효 사용자 ID)가 아닌 RUID(Real User ID, 실제 사용자 ID)에 대한 접근권한만 확인 가능.

#include <unistd.h>

int access(const *pathname, int mode);

    pathname : 접근 권한을 알고자 하는 파일의 경로,  mode : 접근 권한

  두 번째 인자 mode에 사용할 수 있는 상수는 unistd.h 파일에 정의되어있다.

R_OK	// 읽기 권한 확인
W_OK	// 쓰기 권한 확인
X_OK	// 실행 권한 확인
F_OK	// 파일 유무 확인

 

 

  파일 접근 권한 변경

   파일의 접근 권한을 명경할때 사용하는 명령도 chmod이고, 이에 해당하는 시스템 호출도 chmod()이다.

 

  1. 파일 명으로 접근 권한 변경 : chmod(2)

#include <sys/stat.h>

int chmod(const char *pathname, mode_t mode);

    pathname : 접근 권한을 변경하려는 파일의 경로,  mode : 접근 권한

 

    chmod() 함수는 접근 권한을 변경할 파일의 경로를 받아 mode에 지정한 상수값으로 권한을 변경한다.

    기존 접근 권한을 모두 새로 지정하려면 상수를 이용하여 권한을 생성한 후 인자로 지정한다.
  chmod(pathname, S_IRWXU);
  chmod(pathname, S_IRWXU | S_IRGRP | S)IXGRP | S_IROTH);
  
    기존 접근 권한을 더할 때는 OR 연산자를 사용한다.
  mode |= S_IWGRP;
    기존 접근 권한을 제거할 때는 NOT, AND 연산자를 사용한다.
  mode &= ~(S_IROTH);
  
    mode값을 변경한 후 chmod() 함수를 호출해야 변경된 접근 권한이 적용된다.
  chmod(pathname, mode);

 

 

  2. 파일 기술자로 접근 권한 변경 : fchmod(2)

#include <sys/stat.h>

int fchmod(int fd, mode_t mode);

    fd : 열려 있는 파일의 파일 기술자,  mode : 접근 권한