리눅스 계열의 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 의 문법은 다음과 같다.
- User or Group : 권한부여의 대상이 되는 user 명이나 group 명. 만약 그룹명일 경우 앞에 %를 붙임.
- Hosts : 명령을 사용할 호스트. localhost 와 ALL(default) 값 중 입력 가능하나, 호스트가 하나인 일반 구성의 경우, localhost 또한 ALL 을 의미
- User : 권한을 빌려 사용할 수 있는 사용자나 그룹
- 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를 사용하는 것을 권장
'소프트웨어 아키텍처 > Linux' 카테고리의 다른 글
strace 를 통한 syscall 확인과 seccomp (0) | 2022.09.22 |
---|---|
[Ubuntu] 우분투 UFW 방화벽 사용하기 (0) | 2022.09.19 |
TLS 인증서 (3) - openssl 을 통해 key, csr, crt 파일 만들기 (0) | 2022.06.17 |
TLS 인증서 (2) - 신뢰할 수 있는 인증서 (0) | 2022.06.16 |
TLS 인증서 (1) - 대칭키와 공개키 암호화 방식 (0) | 2022.06.03 |
댓글