[명령] UID, root, su, sudo, 권한 할당, id

markyang92·2021년 6월 10일
0

linux (ubuntu/debian)

목록 보기
7/36
post-thumbnail

eUID, rUID

  • 모든 프로세스는 하나 이상의 UID를 가진다.
    • eUID: 유효 사용자 ID; effective UID: 프로세스에 대한 접근 권한 규정
    • rUID: real 사용자 ID; real UID: 프로세스를 처음 시작한 사람
$ ps -eo pid,euser,ruser,comm
    PID EUSER    RUSER    COMMAND
      1 root     root     systemd
      2 root     root     kthreadd
      3 root     root     rcu_gp
      4 root     root     rcu_par_gp
      6 root     root     kworker/0:0H-kblockd
      8 root     root     mm_percpu_wq
      9 root     root     ksoftirqd/0
     10 root     root     rcu_sched
     11 root     root     migration/0
     12 root     root     idle_inject/0
.... 중략 ....
  19314 paralle+ paralle+ prlcp
  19315 paralle+ paralle+ prlsga
  19316 paralle+ paralle+ prlshprof
  19593 paralle+ paralle+ terminator
  19601 paralle+ paralle+ zsh

  • 일부 프로그램들은 rUIDroot로 가지는 것을 좋아하지 않는다.
    • sudorUID를 변경하지 않도록 다음 라인을 /etc/sudoers파일에 덧붙인다.
Defaults	stay_setuid

보안에 대한 영향

  • 리눅스 커널은 setuid 프로그램과 뒤이어 실행되는 시스템 콜들을 통해서 모든 사용자 전환(≒파일 접근권한)을 처리하기 때문에 시스템 개발자나 관리자들은 다음 두가지 사항에 주의해야한다.
  1. setuid 권한을 가진 프로그램
  2. 그 프로그램이 하는 역할
  • 만약, setuid가 root인 'bash 셸에 대한 복사본'을 만들면, 어떤 사용자든지 이를 실행하고 시스템을 거의 완전히 사용할 수 있다.
  • 게다가 setuid가 루트인 특수 목적 프로그램도 버그가 있다면 위험을 야기할 수 있다.
  • 따라서, '사용자명'과 '비밀번호'로 사용자 인증을 실행하는 것이 좋다.

사용자 식별과 인증

legacy 식별, 인증

  • 리눅스 커널은 '프로세스'와 '파일 소유권'을 위해 숫자로 된 UID만 구별한다.
    • 커널은 setuid를 가진 실행파일을 실행하는 방법에 대한 인가 규칙을 알고 있으며 UID가 한 사용자에서 다른 사용자로 전환되기 위해 시스템 콜의 setuid() 패밀리를 실행하는 방법에 대한 인가 규칙도 알고있다.
    • 그러나, 커널은 인증에 대한 요소, 즉 사용자 명이나 비밀번호등을 알지 못한다.
  • 전통적인 UNIX system에서 프로세스는 사용자명을 얻기 위해 다음과 같이 진행한다.
  1. 프로세스는 geteuid() 시스템 콜을 통해 eUID를 커널에 요구한다.
  2. 프로세스는 /etc/passwd를 열고 시작 부분부터 읽는다.
  3. 프로세스가 /etc/passwd에서 읽을 것이 아무 것도 남아 있지 않다면 프로세스는 UID를 찾는데 실패한 것이다.
  4. 프로세스가 제대로된 라인을 읽는다면, 각 필드를 분류해 3번째 필드는 '현재 라인의 사용자 ID'이다.
  5. 프로세스는 4단계의 ID를 1단계 ID와 비교한다. 이둘이 동일하다면 4단계의 첫 번째 필드가 요구하던 사용자 명이다. 그리고 프로세스는 검색을 멈추고 이 이름을 사용한다.

현실에서는 더 복잡하다.


PAM

  • 선 마이크로 시스템에서 장착형 인증 모듈(Pluggable Authentication Modules, PAM) 표준 제안
    • 인증을 위한 공유 라이브러리 시스템 (오픈 소스 소프트웨어 재단 RFC 86.0, 1995. 6)
  • 사용자 인증을 위해 '응용 프로그램'사용자를 'PAM'으로 보내서 사용자가 스스로 성공적으로 식별할 수 있는지 확인 한다.
  • 리눅스에서 인증을 요구하는 거의 모든 프로그램은 PAM을 지원하고, 대부분의 배포판들이 PAM을 사용한다.
    • 기존 UNIX 인증 API 위에서 동작하기 때문에 지원을 클라이언트로 통합하는 데 별도의 작업이 거의 필요없다.

자세한 내용은 PAM 링크 글


root

  • 원래 Ubuntu에서 root 계정의 PW가 정해져 있지 않음
  • 그래서 사용자 계정에서 root 계정의 PW를 지정해 줘야함
  1. 사용자 계정 로그인 후 passwd 명령
$ sudo passwd root		# passwd 명령은 비밀번호 변경 명령어
Enter new UNIX password:	# 패스워드 2번 입력하면 됨

$ su

  • su (switching user): 현재 계정을 로그 아웃 XX -> 다른 계정 전환

$ su

$ su
  • $ su 명령은 root계정으로 스위칭하는 것. root의 PW를 요구한다.
    • 보안 설정에 따라 $ su 명령으로 root 계정으로의 스위칭을 거부할 수 있다.

$ su user1

$ su user1
  • user1으로 변경

$ su - user1

$ su - user1
  • user1로 변경하며 환경 변수까지 적용

$ su -c "apt update"

$ su -c "apt update"


$ sudo apt update
  • sudo 명령처럼, root권한으로 하나의 명령만 실행

$ su - [USER] -c ["CMD"]

$ su - [USER] -c ["CMD"]
  • 지정한 USER"CMD"를 실행
  • USERPW 를 요구함

su 명령 PW없이 사용하기

  1. /etc/pam.d/su 에서 su명령 configure 할 수 있다.
$ sudo vi /etc/pam.d/su

  1. /etc/pam.d/su 파일의 저기 영역!
  • auth sufficient pam_wheel.so trust 의미
    • wheel 그룹에 속한 사용자를 전적으로 신뢰하겠다는 뜻이다.

  • 저기 영역을 주석 제거하여 반영한다.

  1. password 입력 없이 su 명령을 사용하고 싶은 Userwheel 그룹에 등록한다.
  • User: dhyang
  • wheel 그룹에 dhyang 계정을 등록시킨다.
$ usermod -aG wheel dhyang
  • 잘 등록되었는지 확인한다.
$ cat /etc/group | grep wheel


  1. 확인
(dhyang) $ su
root #
  • 물론 보안상 막아뒀다면 안된다.

sudo

  • sudo는 패키지로서, 설치해야한다. (하지만 대부분의 배포판은 이미 설치되어 있다)
  • sudo명령의 configuration은 /etc/sudoers에서 적용한다.

$ sudo -u <USER> <script>

$ sudo -u dhyang ./script.sh
  • 특정 유저 에게 sudo 권한을 주어 해당 스크립트 실행
  • PW 요구함

sudo 명령 PW없이 사용하기

/etc/sudoers.d/<USER>

CentOS

  • User ID를 jenkins라 가정
  • CentOS의 경우 /etc/sudoers 파일에서 sudo를 configure할 수 있다.
    • 내용 중 Defaults requiretty를 찾아서 주석처리(#)
    • jenkins ALL=(ALL) NOPASSWD: ALL을 파일 마지막 부분에 추가

Ubuntu

  • User ID를 jenkins라 가정 (유저 등록하지 않아도 됨)
  1. /etc/sudoers에서 configuration

  1. /etc/sudoers.d에 파일을 만든다.
  • root 권한으로 만들어야함
  • password 요구 없이 sudo 명령을 쓰고 싶은 User ID는 jenkins
(USER) $ sudo su
(root) # vi /etc/sudoers.d/jenkins

위 같이 파일(/etc/sudoers.d/jenkins)을 만들고 내용을 작성한다.


  1. /etc/sudoers.d/jenkins
    파일에서 아래와 같이 내용을 작성한다.
jenkins ALL=(ALL) NOPASSWD: ALL

  1. /etc/sudoers.d/jenkins 파일의 접근 권한을 바꾼다.
(root) (/etc/sudoers/d) # chmod 0440 jenkins
			      -r--r-----

  1. 재부팅

echo로 PW 주는 방식

$ echo -n 'PASSWD' | sudo -S -u <USER> /bin/true

이후엔 sudo 명령에 Password 입력이 필요없음
$ echo -n 'PASSWD' > mypassword
# mypassword 파일을 만들어 두고
$ cat mypassword | sudo -S -u <USER> /bin/true

이후에 sudo 명령에 Password 입력이 필요없음

id [user]

  • id: 현재 로그인 된 useruid, gid, groups(소속) 을 알 수 있음
user@host:~ $ id
uid=1001(user) gid=1001(user) groups=1001(user),27(sudo)
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글