[42서울] Born2beroot_Sudo와 TTY

jabae·2022년 5월 23일
0

42Seoul

목록 보기
13/20

Born2beroot 과제를 하면서 수도 설정을 해야 하는데, 막연하게 수도 명령은 막강한 파워를 가졌다고만 알고 있었다. 정확히 수도란 무엇일까?

👑 Sudo

Sudo(Super User Do 또는 substitute user do)는 유닉스 계열의 운영체제에서 루트가 아닌 다른 유저에게 제한적으로 관리자 권한을 부여하는 용도로 사용된다.

🛠 Sudo 사용

각 명령어의 앞에 sudo를 붙여 사용하며, root 권한으로 명령어를 실행한다. 즉, 최고 관리자 권한으로 실행되는 것이다. sudo는 사용 시에 유저의 비밀번호를 요구한다.

$ sudo 명령어 # 명령어 실행, 주로 무언가를 설치하거나 사용시 사용한다.

$ sudo apt install aptitude

$ sudo ufw enable

sudo 명령어는 /etc/sudoers 설정 파일에 명시되어 있는 유저만 사용 가능하다.

🛠 Sudo 설정

보안상의 이유로 sudo 설정은 root 계정에서만 가능하다. root 계정에 들어가기 위해선 su - 명령어를 사용해 관리자 계정으로 직접 로그인한다. su 는 다른 계정으로 바꾸는 명령어로, 따라서 root 비밀번호를 요구한다.
/etc/sudoers 설정 파일은 읽기 전용(readonly)으로, 수정하려면 visudo 명령어를 사용해야 한다. /etc/sudoers 파일을 내에도
"# This file MUST be edited with the 'visudo' command as root."
이렇게 visudo 명령어로 수정하기를 권고하고 있다. visudo 는 편집 전용 명령어로 .tmp 파일로 생성되고 저장시에 문법에 대한 검사가 자체적으로 이루어지고 저장된다.

$ su - # root계정의 홈으로 전환

$ apt install sudo # sudo 패키지 설치

$ apt --installed list sudo # sudo 패키지 설치 여부 확인

$ mkdir /var/log/sudo # sudo log를 저장할 디렉토리 생성

$ visudo # sudo 설정하러 가기

sudo에서 제공하는 또 다른 보안 기능 중 하나가 secure path이다. secure path는 sudo 명령을 실행할 때, 명령어를 찾을 경로를 나열한 환경변수 값이다. sudo 명령어는 가상의 쉘을 생성하고 그 안에서 실행된다. 이 쉘 명령어는 secure path로 저장된 경로에서 바이너리 파일을 찾아 실행하는 것이다.(사실 모든 명령어들은 이 바이너리 파일 형태로 저장되어 있다.)
이는 트로이 목마 해킹 공격에 대한 방어 기능을 하는데, 해커가 현재 계정에서 sudo를 사용하여 path에 악의적인 경로가 포함될 경우, secure_path에 해당하지 않는다면 이를 무시한다.

secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

sudo: 현재 계정에서 루트 계정의 권한을 빌리는 명령어

su: 다른 계정으로 전환하는 명령어

⚔️ TTY

sudo 명령어 실행 시 보안상의 이유로 tty 모드를 활성화해야 한다고 요구한다. 🤔 tty란 또 뭐지? tty는 콘솔이나 터미널을 의미한다.

TTY(Teletypewriter)는 리눅스의 콘솔 및 터미널을 의미한다. tty 모드를 활성화하면, 아래와 같이 터미널을 할당하지 않은 상태에서는 sudo 명령어를 실행할 수 없다. 프로세스에 연결된 실제 tty, 즉 아직 연결된 터미널이 없기 때문이다. 터미널이 연결되기 전에 sudo 명령어를 막아주면, sudo daemon 또는 cronjobs 또는 웹서버 플러그인과 같은 다른 분리된 프로세스에서 사용되는 것을 방지할 수 있다.

$ tty # 표준 입력 장치에 연결된 터미널 출력

$ ssh jabae@127.0.0.1 -p 5000 sudo 명령어 # 터미널 할당 전에는 수도 명령어 불가

🤔 하지만 아래처럼 -tt 옵션을 쓰면 된다고 한다. 수요일에 클러스터에 가서 테스트 해봐야겠다.
🤷‍♀️ 그럼 대체 왜 requiretty가 필요한걸까? 찾아보니 redhat이 보안적 이점은 적은 편이라고 인정했다고 한다.

$ ssh -tt jabae@127.0.0.1 -p 5000 sudo 명령어 # 터미널 할당 전에는 수도 명령어 불가

❓콘솔(console): 서버의 로컬 장치에서 직접 명령어를 작성하는 입출력 장치

❓쉘(shell): 커널과 사용자를 연결하는 인터페이스, 명령어를 해석해 전달해줌

❓터미널(terminal): 콘솔의 한 종류, 컴퓨터와 사용자 간에 서로 상호작용 할 수 있는 CLI 인터페이스

❓pty(Pseudo-terminal): 가상 tty, 가상 터미널 환경

❓pts(Pseudo-terminal slave): 원격 터미널 환경

📚 참고

profile
it's me!:)

0개의 댓글