Born2beroot 과제를 하면서 수도 설정을 해야 하는데, 막연하게 수도 명령은 막강한 파워를 가졌다고만 알고 있었다. 정확히 수도란 무엇일까?
Sudo(Super User Do 또는 substitute user do)는 유닉스 계열의 운영체제에서 루트가 아닌 다른 유저에게 제한적으로 관리자 권한을 부여하는 용도로 사용된다.
각 명령어의 앞에 sudo를 붙여 사용하며, root 권한으로 명령어를 실행한다. 즉, 최고 관리자 권한으로 실행되는 것이다. sudo는 사용 시에 유저의 비밀번호를 요구한다.
$ sudo 명령어 # 명령어 실행, 주로 무언가를 설치하거나 사용시 사용한다.
$ sudo apt install aptitude
$ sudo ufw enable
sudo 명령어는 /etc/sudoers
설정 파일에 명시되어 있는 유저만 사용 가능하다.
보안상의 이유로 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
: 다른 계정으로 전환하는 명령어
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): 원격 터미널 환경