리눅스에서는 현재 사용자가 누구인지를 나타내는 방법이 바로 사용자 아이디이다. 하지만 프로그래밍을 하다보면 자신이 아닌 다른 사람이 만든 파일이나 프로그램을 사용하고 싶거나 내용을 바꿔야 할 때가 있다. 이런 상황을 위해 리눅스에서는 세 가지 ID를 사용한다.

 

사용자 아이디 종류

 

1. 실제 사용자 ID(Real User ID) : 프로그램을 실제 수행시키는 사용자에게 속한 유효 사용자 ID

  • 프로세스를 실행한 사용자의 ID이다.
  • 실제 사용자 ID는 부모 프로세스의 실제 사용자 ID로 설정된다.
  • exec() 호출 도중에 변경되지 않는다.
  • 루트 권한을 갖는 프로세스만 실제 사용자 ID를 다른 값으로 변경할 수 있다.
  • 루트 권한을 제외하고는 생성하는 자식 프로세스들은 같은 RUID를 가진다.

2. 유효 사용자 ID(Effective User ID) : 프로세스 실행 자격을 확인하는 사용자 ID

  • 프로세스가 영향을 미치는 사용자 ID이며 접근 권한을 판단할 때 사용한다.
  • 프로세스를 처음 생성할 때는 부모 프로세스의 유효 사용자 ID를 상속받는다. 따라서 EUID와 RUID가 같다.
  • exec()함수를 호출할 때에도 일반적으로 RUID는 변경되지 않는다.
  • 프로세스는 유효 사용자 ID를 변경 가능하다. -> setuid bit가 설정되어 있는 프로그램을 실행할 때만 가능하다.

3. 저장된 사용자 ID(Saved User ID) : exec()호출 시 변경되기 전 유효 사용자 ID

  • 프로세스의 원래 유효 사용자 ID
  • 프로세스가 fork()를 실행할 때 자식 프로세스는 부모 프로세스의 저장된 사용자 ID를 상속받는다. 즉 부모 프로세스의 바뀐 유효 사용자 ID가 아니라 원래 유효 사용자 ID이다.
  • exec()도 동일하게 커널은 저장된 사용자 ID를 유효 사용자 ID로 설정한다.
  • 프로그램의 사용자 ID가 유효 사용자 ID에 복사될 때 이전 유효 사용자 ID는 저장된 사용자 ID에 복사된다. 그림으로 나타내면 아래와 같다.
  • 루트 권한을 갖는 프로세스만 실제 사용자 ID와 동일한 값으로 변경 가능하다.

setuid bit가 설정된 프로그램을 실행할 경우의 RUID, EUID, SUID의 변경 과정

실제 예시

/usr/bin/passwd 파일은 패스워드를 변경하는 프로그램이고 소유자는 root이다.

패스워드가 들어있는 파일은 다른 파일에 존재하고 소유자는 root이다. 그리고 소유자만 이 파일을 읽고 쓸 수 있다.

/usr/bin/passwd 파일은 setuid설정된 파일이다.

소유자는 root이므로 일반 사용자가 이 프로세스(/usr/bin/passwd)를 실행할 경우 일반 사용자의 EUID는 root가 된다. 따라서 일반 사용자도 EUID가 root이므로 패스워드가 들어있는 파일의 접근 권한과 같으므로 패스워드가 들어있는 파일에 읽고 쓸 수 있다.

즉 일반 사용자는 패스워드가 들어있는 파일에 직접 읽고 쓸 수 있는 것이 아니라 /usr/bin/passwd라는 패스워드를 변경하는 프로그램을 이용해 패스워드가 들어있는 파일에 읽고 쓸 수 있는 권한을 얻어 변경할 수 있는 것이다.

+ Recent posts