[Linux]multi-user 환경

공부기록·2023년 9월 29일
0
post-thumbnail

📘유저와 소유권


//user랑 group이랑 같으니 group 관련은 생략

📃Owner

  • 모든 파일은 소유중인 유저가 있다. 보통 생성한 사람이 owner이다.
  • uid : 숫자로된 user-id이다.
  • gid : 숫자로된 group-id이다.
  • root의 uid = 0이다.
  • 실행된 프로세스의 uid와 gid는 시작한 유저의 것과 같다.

📘Effective user id


Real user-id (ruid) : 프로세스를 시작한 유저의 uid

Effective user-id (euid) : SetUID이 설정된 파일에서 잠시 다른 유저의 uid로 설정되어 그 파일 소유자의 권한을 사용할 수 있게된다.

  • 대부분 ruid = euid

  • euid가 다른 경우 중 하나는 passwd 명령을 위해선 루트권한이 필요하여 이때 euid=0이 된다.

    📗예시 - id와 permission

    위의 이미지에서 볼 수 있듯이 생성된 a.out의 ruid와 euid는 usr1이고 ugid와 egid는 grp1이다.

	fd1 = open(“file1”, O_RDONLY); //usr1의 read -> 성공

	fd2 = open(“file2”, O_RDONLY); //gid1의 read -> 성공

	fd3 = open(“file3”, O_RDONLY); //실패

	fd4 = open(“file4”, O_RDONLY); //usr1의 read -> 성공

	fd4 = open(“file5”, O_RDONLY); //실패
  • euid = owner ID of file 이면 user access 권한이 설정되고 아니면 겨부된다.

📃Set user-id : S_ISUID

  • 권한을 위하여 file의 user-id를 euid로 설정하는 것이다.
$ id
uid = 100(user1) gid = 500 (group1) groups = 500 (group1)
$ ls -l
-rwxr-xr-x 1 user2 group2 0 2월 10 21:44 a.out
  • 현재 shell의 user-id와 file(a.out)의 user-id가 다른 상태로 실행 권한이 없다.
$ chmod u+s a.out
$ ls -l
 -rwsr-xr-x
  • a.out 파일에 s 권한을 추가한다. (set user-id on execution)
  • s_uid = 1
  • a.out의 euid는 100(user1)에서 200(user2)로 변경되어 a.out의 실행 권한이 주어진다.
  • passwd : root일때만 비밀번호 변경가능 but set으로 euid = 0으로 변경 시 가능

✏️access(2) system call

#include <unistd.h>

int access(const char *pathname, int amode);

//성공시 0, 실패시 1을 리턴한다.
  • access() : 접근권한을 확인하는 함수

  • amode

    R_OKW_OKX_OKF_OK
    읽기권한확인쓰기권환확인실행권한확인존재여부확인
  • errno

    • EACCES : 접근 권한이 없음.
    • ENOENT : 파일이 존재하지않음.

📗예시 - access 사용예시

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main()
{
  char *filename = "test";

  if (access (filename, R_OK) == -1) //읽기권한 확인
  {
 	fprintf (stderr, "User cannot read file %s\n", filename);
	exit (1);
  }
 
 printf ("%s readable, proceeding\n", filename); //읽기권한이 있으면 출력

}

✏️chmod(2) system call

#include <unistd.h>

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

//성공시 0, 실패시 -1 반환
  • 파일의 owner거나 superuser일때만 실행가능
if( chmod(pathname, 0644) == -1 )
    perror(“call to chmod failed”);

perror() : 오류 메세지 출력

✏️chown(2) system call

: 파일의 user-id와 group-id의 변경을 가능하게한다.

#include <unistd.h>

int chown(const char *pathname, uid_t owner_id, gid_t group_id);

//성공시 0, 실패시 -1을 반환한다.
  • owner_id : new owner
  • group_id : new group
  • error EPERM은 파일의 소유자를 바꾸는데 문제 발생시 반환되는 값이다.

    파일의 id가 변경되면 set-user-id와 set-group-id의 설정은 0이 된다.

0개의 댓글

관련 채용 정보