일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- container
- IntelliJ
- sonarQube
- DevOps
- docker
- 방화벽
- 액세스회선
- Pipeline
- 허브
- Jenkins
- STREAM
- JPA
- ansible
- Set
- tomcat
- 캐시서버
- Java
- 소켓
- LAN어댑터
- jdk
- mybatis
- cloud
- Collection
- 라우터
- map
- Spring
- Linux
- AOP
- post
- gradle
- Today
- Total
거북이-https://velog.io/@violet_evgadn 이전완료
Root 계정 관련 메서드 본문
su
◎ su란?
su는 "Substitue User"의 줄임말로써 현재 계정을 로그아웃하지 않은 상태로 다른 사용자의 권한을 획득하기 위해 활용하는 명령어이다.
"su [Username]"을 통해 명령어를 사용할 수 있으며 Root 권한을 가진 계정에 접근하기 위한 용도로 많이 활용한다.
참고로 Username을 입력하지 않고 "su" 명령어만 입력하면 자동으로 Root 권한 계정으로 로그인을 시도한다.
◎ Option '-'
su를 제대로 활용하기 위해선 Option "-"를 잘 알아야 한다.
"-"는 "-l" 혹은 "--login"과 동일한 옵션인데 이 '-'의 유무는 환경변수 및 Working Directory에 영향을 준다.
그렇다면 "su root"와 "su - root"를 비교해 보자.
1. Working Directory(로그인 시 접속되는 Path)
위 사진을 보면 "su root" 명령어를 통해 Root 계정으로 로그인할 시 Working Directory가 그대로 유지됨을 알 수 있다.
(/home/djlim으로 동일함)
하지만 "su - root" 명령어를 통해 Root 계정으로 로그인할 시 "/root" Directory로 Working Directory가 변경됨을 알 수 있다.
이 /root는 Root 계정의 Home Directory로 "su - [Username]"으로 로그인할 경우 해당 계정의 Home Directory로 이동한다.
2. 환경변수(Custom 환경변수 & PATH)
"su root"로 로그인 할 경우 기존에 로그인했던 사용자 환경에서 설정된 환경변수를 그대로 유지시킨다.
하지만 "su - root"로 로그인할 경우 기존 사용자 환경에서 설정된 환경변수를 모두 초기화시키고 로그인 한 계정의 환경변수를 가져와 사용하게 된다.
이는 PATH 환경변수에도 적용된다.
아래 사진을 보면 현재 로그인한 djlim User에 "env"라는 환경변수를 설정했다.
"su root"로 로그인했을 경우 "echo $env"를 통해 djlim User가 설정한 환경변수 값을 출력할 수 있지만 "su - root"로 로그인했을 때는 아무런 출력값도 내지 않는 것을 알 수 있다. 환경변수가 초기화되어 로그인된 것이다.
즉, "su" 명령어로만 로그인할 경우 환경변수를 그대로 가지고 오므로 단순히 로그인 계정만 바꾼다는 것이고 "su -"의 경우 기존에 설정한 환경변수들을 초기화시키고 로그인할 계정에 설정된 환경변수를 모두 가져오는 것이다.
"su - root"를 추천하는 것은 첫째로 root 계정에만 설정되어 있는 환경변수가 있을 수도 있기 때문이며 둘째로는 현재 로그인한 계정에서 설정한 환경변수를 root 계정으로 들고 갔을 때 혹시나 모를 보안상 문제가 발생할 수도 있기 때문이다.
◎ su 사용 방법
su: Authentication failure
아마 처음 "su" 명령어를 활용하면 위와 같은 에러가 발생할 수도 있다.
이는 root 계정의 비밀번호를 설정하지 않아서 그렇다.
따라서 "sudo passwd root" 명령어를 통해 먼저 Root 계정의 패스워드를 설정하자.
로그아웃(원래 로그인한 계정으로 돌아가기)
su로 로그인한 경우 logout이나 exit 명령어를 통해 원래 계정으로 돌아갈 수 있다.
sudo
◎ sudo란?
sudo는 "SuperUser DO"의 축약어로써 sudo 이후 명령어를 수행할 때만 잠시 Root 권한을 빌려 실행시키는 것이다.
Linux에서는 Root 권한을 사용하고 싶을 때 "su" 명령어는 잘 사용하지 않고 "sudo" 명령어를 많이 활용한다.
이는 보안의 "최소 권한 규칙"을 지키기 위함이다.
최소 권한 규칙이란 "최소 권한 액세스"라고도 부르며 사용자는 업무를 수행하기 위해 필요한 최소 권한만 사용해야 한다는 것이다.
사용자가 업무를 수행하는 과정에서 더 많은 항목에 액세스 가능 할수록 실수든 고의든 내부에 위협이 되는 행위를 할 가능성이 커진다.
이는 "Zero Trust" 보안 철학과도 연결되는데 내부 네트워크의 모든 연결은 신뢰할 수 있는 것으로 간주하는 이전 보안 모델에 비해 Zero Trust 보안은 모든 사용자 및 장치를 위협으로 간주하여 한 번에 하나씩 연결을 설정하고 정기적으로 인증한다.
예시로 알아보자. A라는 방이 있고 a라는 Key로 방문을 열 수 있다고 가정하자.
"su" 명령어는 마스터키를 통해 A 방에 들어가는 것이다. 문제는 A 방뿐만이 아닌 B, C 같은 다른 방에도 들어갈 수 있기 때문에 보안상 위험이 커진다.
"최소 권한 액세스"를 지켜 이런 문제를 피하기 위해 "sudo" 명령어를 사용하는데 이 상황은 a키만 사용자에게 주는 것이다. 이 경우 a키를 가지고 있는 사람은 모두 A 방에 들어갈 수 있으며 네트워크상에서는 VPN을 통해 이런 상황을 만들 수 있다. VPN을 가지고 있는 사람이라면 내부 시스템을 모두 활용할 수 있게 하는 것이다.
A라는 방에는 매우 중요한 계약 문서가 있다. VPN은 이 계약 문서가 책상 위에 놓여 있는 상황으로 A방에 들어갈 수만 있다면(즉 VPN을 가지고만 있다면) 이 계약 문서를 볼 수 있는 것이다.
하지만 Zero Trust 보안 철학은 A방에 들어온 사람이라 하더라도 a키를 탈취하여 들어왔을 가능성을 배제하지 않는다. 이 사람이 공격할 수 있는 가능성이 있다고 생각하여 계약 문서를 금고에 저장해 놓은 것이며 네트워크 상에서는 ZTNA(Zero Trust Network Access)로 이런 상황을 만들 수 있다.
중간 부가 설명이 길었지만 어쨌든 최소 권한 규칙에 의거해 명령어를 실행할 때만 관리자 권한이 필요한 것인데 그 1개 명령어를 위해 관리자 권한을 영구적으로 얻은 후 명령어를 실행할 필요는 없다는 것이다.
명령어를 실행할 때만 관리자 권한을 잠시 빌렸다 돌려주는 것이 최소 권한 규칙을 지키기 위한 방법이며 이를 위해 "sudo" 명령어를 활용하는 것이다.
◎ sudoers란?
Zero Trust 보안 철학을 다시 떠올려보자.
이 서버에 접속한 모든 User가 관리자 권한을 사용할 수 있게 한다면 보안 상 문제가 생길 수도 있을 것이다.
따라서 sudoers를 통해 특정 User가 특정 실행 파일이나 명령어에 대해서만 sudo 명령어를 사용할 수 있도록 설정하는 것이다.
sudo를 사용할 수 있는 사용자와 명령어는 /etc/sudoers 파일에 지정되어 있는데 보안을 위해서 sudoers 파일은 오직 Root 계정만 읽을 수 있으며 Root 계정 또한 수정은 불가능하게 설정되어 있다.
그렇다면 sudoers 파일은 영원히 수정하지 못하는 것일까?
chmod로 파일 권한을 바꿔 수정하는 방법도 존재하지만 실수로 root 외의 사용자에게도 쓰기 권한을 줄 수 있으므로 보안상 좋은 방법은 아니며 "visudo" 명령어를 사용해 수정하는 것을 권장하고 있다.
◎ sudoers 파일 수정
"vi sudoers"를 통해 sudoers 파일을 수정하면 위에서 말했듯 수정이 불가하다.
또한 sudoers 파일 내에서도 visudo 명령어를 추천하고 있다.
visudo -f /etc/sudoers
위 명령어를 통해 sudoers 파일 내용을 수정할 수 있다.
◎ sudoers 형식
# []내에 있는 것은 필수 입력 값이 아님
Username host=(runUser[:runGroup]) [NOPASSWD:] command
- Username : sudo를 사용할 수 있게 설정할 계정의 Username
- %를 앞에 붙임으로써 Group 내 모든 계정에 일괄적으로 권한을 부여할 수 있음
- (ex) %sudoGroup ALL=(ALL) ALL : sudoGroup 그룹 내에 있는 모든 사용자에게 일괄적으로 권한 부여
- Host : sudo를 사용할 수 있는 서버명이나 IP Address
- 만약 모든 서버가 대상일 경우 ALL 입력
- (ex) djlim localhost=(ALL) ALL : djlim User가 localhost에서 접속했을 때 sudo 사용을 허락함
- runUser[:runGroup]
- sudo 명령어를 사용할 때 runGroup에 속해 있는 runUser의 권한으로 명령어를 실행하도록 함
- ALL을 입력하거나 생략할 경우 "root" 권한을 가지도록 설정
- (ex) djlim ALL=(lim:sudoGroup) ALL : djlim User는 sudoGroup에 속해 있는 lim 계정이 가진 권한으로 명령들을 실행한다.
- NOPASSWD:
- 설정할 경우 sudo 명령어를 실행할 때 암호를 물어보지 않음
- command
- sudo를 통해 실행할 수 있는 명령어나 Bash 실행 파일
- ALL을 입력할 경우 모든 명령어에 sudo 사용 가능
- (ex) djlim ALL=(ALL) /sbin/shutdown : djlim User는 /sbin/shutdown에만 sudo 사용 가능
그렇다면 실제로 사용해 보자
일단 현재 내 계정이 어떤 Group에 속해있는지 알아보자.
정말 별의별 Group에 포함되어 있다
이제 Root 계정으로 로그인하여 sudoers 파일 내용을 살펴보자
...
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
...
기타 내용이 많지만 여기서 중요한 것은 위 3 줄이다.
admin Group과 sudo Group에 속해 있는 모든 User는 모든 명령어에 대하여 sudo가 사용 가능하게 되어 있다.
그렇다면 "%sudo ~"에 NOPASSWD:를 붙여 sudo 명령을 수행할 때 Password를 물어보지 않는지 확인해 보자.
실제 NOPASSWD:를 붙이자 오른쪽 사진처럼 Password를 묻지 않고 바로 sudo 명령을 실행함을 알 수 있다.
두 번째로 sudo와 admin Group에 속해있지 않은 User는 sudo 명령을 실행시키지 못하는지 알아보자.
Root 계정에서 "useradd -r sample"을 통해 sample이라는 User를 만들고 "su - sample"을 통해 로그인해 보았다.
만들어진 sample 계정이 속한 Group은 오직 sample 1개이다.
그렇다면 이 계정으로 "sudo su - root"를 실행해 보자.
Password를 올바르게 쳤음에도 불구하고 "sample is not in the sudoers file."이라는 문구가 뜨며 sudo 명령 실행이 실패된 것을 볼 수 있다.
즉, sudoers에 존재하지 않는 계정일 경우 sudo를 사용할 수 없음을 알 수 있다.
'Linux' 카테고리의 다른 글
Linux 시스템 Booting 관련 명령어 (0) | 2023.02.14 |
---|---|
Linux 부팅 과정 (0) | 2023.02.10 |
VI(VIM) (0) | 2023.02.08 |
Linux 기본 명령어 (2) (0) | 2023.02.08 |
Linux 기본 명령어 (0) | 2023.02.07 |