본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Linux

Linux - sudo 와 su 명령어의 차이

by bluefriday 2022. 9. 8.
반응형

리눅스 계열의 OS 를 사용하다보면, sudo 명령어나 su 명령을 자주 사용하게 된다.

1. 리눅스 계정

먼저 리눅스 운영체제에서 사용자(계정)는 다음의 4가지 타입으로 구분된다.

  Normal User account   adduser 등의 명령어로 생성 가능한 일반 유저

  ex) harang, tester1, user1, ....
  Superuser account   리눅스 시스템의 루트 유저로 UID 0번으로 지정.

  시스템 내 제한 없는 권한을 보유

  ex) root
  System account   주로 운영체제의 설치 과정에서 생성되는 계정으로,

  superuser 로 동작하지 않아도 되는 소프트웨어나 서비스에 사용

  ex) ssh, mail
  Service account   system account 와 유사하며, 서비스나 패키지가 설치될 때 생성

  ex) nginx, http

.


2. sudo 명령어

서버 작업을 수행할 때 항상 superuser(root 유저)로 로그인하여 무제한 적인 권한으로 작업을 수행하면 간편하겠지만, 이렇게 매번 root 유저로 로그인하는 것은 보안상 취약점이 발생할 수 있어서 권장하지 않는다.

sudo <일반 명령어>

#사용 예
sudo apt-get update

sudo 명령어를 사용하게 되면, root 유저가 아닌 유저가, root 의 권한으로 명령을 실행하게 된다. sudo 명령은 원래 "superuser do" 의 줄임말로 사용되었으나, 후에 기능이 확장되면서, 다른 사용자나 그룹의 권한을 계승받아 수행하는 "substitute user do" 로 의미가 변경 되었다. 즉, 반드시 root 유저의 권한만을 가져와서 사용하는 것은 아니다. 

sudo -u username <command>

위와 같이 username 을 지정하여 해당 user의 권한으로 명령어를 수행할 수 있다. 하지만 여기서는 일반적으로 사용하는 경우인 root 유저에 대해서 조금 더 다뤄보기로 한다.

이렇게 sudo 명령은, 권한을 얻어서 명령어를 실행하지만, 후술할 su 와는 달리 계정은 그대로 유지된다.

모든 사용자가 사용할 수 있는 명령어는 아니고, 특정 파일(/etc/sudoers)에 정의된 사용자에 한하여 사용자 패스워드를 입력한 후에 사용가능 하며, sudoers 파일의 설정을 통해 패스워드를 입력하지 않고도 사용할 수 있다.

 

2-1. /etc/sudoers 파일

sudo 를 사용할 수 있도록 해주는 sudoers 파일을 열어 내용을 확인해 보면 다음과 같다.

# /etc/sudoers
#
...
Defaults        env_reset
 
...
# User privilege specification
root    ALL=(ALL) ALL

가장 마지막 줄에 보면 이렇게 권한에 대하여 기술되어 있는데, sudoer 의 문법은 다음과 같다.

  1. User or Group : 권한부여의 대상이 되는 user 명이나 group 명. 만약 그룹명일 경우 앞에 %를 붙임.
  2. Hosts : 명령을 사용할 호스트. localhost 와 ALL(default) 값 중 입력 가능하나, 호스트가 하나인 일반 구성의 경우, localhost 또한 ALL 을 의미
  3. User : 권한을 빌려 사용할 수 있는 사용자나 그룹
  4. Command : 사용자가 실행할 수 있는 명령

정리하면 1)root 사용자는, 2)모든 위치(호스트)에서, 3)모든 사용자의 권한으로, 4)모든 명령어를 수행할 수 있다고 해석할 수 있다.

 

2-2. sudo su 명령어

sudo 명령을 명령어와 함께 사용하여, 권한을 빌려올 수 있지만 매번 이렇게 sudo 명령을 사용하기 번거로울 경우, 다음의옵션을 사용하여 최초 한 번만 sudo 명령을 사용하고 그 이후 관리자 권한으로 명령들을 수행할 수 있다.

 sudo su 옵션  sudo 명령으로 su 명령을 수행하게 되어 결과적으로 'su' 명령을 수행한 것과 동일
 sudo -i 옵션 (login)  대상 사용자로 직접 로그인 하여 계정 자체가 대상 계정으로 변경된다. sudoer에 허가된 사용자라면 root 암호가 아닌 사용자 암호로, root 유저 전환이 가능하다.

 이 경우 "su" 명령어와 결과적으로는 동일해진다.
 sudo -s 옵션 (shell)  대상 사용자의 권한을 획득한다. 기존 계정에서 권한만 획득하는 경우이며, 터미널이 끝날때까지 유지된다. sudoer에 허가된 사용자라면 root 암호가 아닌 사용자 암호로, root 유저 전환이 가능하다.

3. su 명령어

Substitute User 의 약어로, 현재 계정에서 로그아웃 하지 않고, 다른 사용자로 로그인할 수 있게 해준다. 별도의 파라미터 없이 su를 입력하게 되면 su root 와 동일하며 이 경우 root 사용자의 암호 입력이 필요하다.

su # 이 경우 su root 와 동일하다.
su == su root

기본적으로는, su 명령을 사용하게 되면 로그인 계정만 변경되고, 기존 계정의 컨텍스트(환경변수)를 그대로 사용하게 된다. 그러나 su 명령 뒤에 하이픈(-) 을 추가로 붙이게 되면, 새로 로그인한 계정의 환경 변수를 사용하게 된다.

# 최초 root 유저일때 환경 변수 확인
[root@localhost:/root] env | grep SSH_TTY
SSH_TTY=/dev/pts/0

# user를 바꾸었지만, root 유저의 환경 변수 유지
[root@localhost:/root] su testuser
[testuser@localhost:/root] env | grep SSH_TTY
SSH_TTY=/dev/pts/0
[testuser@localhost:/root] exit
exit

# 하이픈을 추가할 경우 testuser 의 변수에는 해당 변수가 없음
[root@localhost:/root] su - testuser
[testuser@localhost:/home/testuser] env | grep SSH_TTY
[testuser@localhost:/home/testuser]

위와 같이, su 만을 사용할 경우 컨텍스트가 그대로 유지되어 경로 또한 그대로 유지되나, 하이픈(-)을 붙여서 실행한 경우 해당 계정의 홈 디렉토리로 이동하게 되는 것을 확인할 수 있다.

'-c' 옵션을 줄 경우, 해당 계정의 권한으로 명령은 실행하나, 해당 계정으로 로그인 하지 않고 원래 계정을 유지한다. 만약 root를 대상으로 사용할 경우 root 계정의 패스워드가 필요하며 수행 후 결과적으로,  'sudo' 명령과 동일한 명령이 된다.

su는 root 암호를 알아야 사용 가능하므로, 결과적으로 root 계정의 비밀번호가 어떻게든 전파되는 경우가 발생한다. 사용자 본인의 비밀번호를 알아야 하는 sudo 에 비하여 보안성이 낮아진다고 볼 수 있다.


정리

  • sudo 는 '특정 사용자의 권한'을 가져와서 그 권한으로 일시적으로 명령을 수행
  • su 는 '특정 사용자로 로그인하여' 해당 사용자의 권한으로 명령을 수행
  • /etc/sudoer 파일을 잘 관리하고, 보안상으로 안정된 sudo를 사용하는 것을 권장

댓글