개인용 데스크탑은 OSX든 윈도우즈든 원하는 걸 쓴다지만 서버를 관리해야 하는 입장에서 요즘은 리눅스를 안 쓸 수 없다. 그리고 지금은 석기시대가 아니기 때문에 root권한으로 바로 로그인을 하는 멍청한 짓은 아무도 하지 않고 모두 sudo
를 이용해서 권한을 빌려 쓰게 된다.1
하지만 sudo를 써야 할 때 패스워드를 입력하는 건 귀찮고 그렇다고 해서 sudo
커맨드를 쓸 수 있는 계정의 암호를 쉽게 설정하는 건 또 난감하다. 시스템을 관리하기 위해 자주 써야 하는 커맨드들은 sudoer
파일을 이용해서 패스워드를 입력 받지 않도록 수정할 수 있다.
sudo visudo
커맨드를 사용하면 /etc/sudoers
파일을 수정할 수 있는 에디터가 뜬다. 이 커맨드를 이용해서만 편집을 해야 하고 그렇지 않으면 로컬에서 복구모드로 부팅하지 않는 한 영원히 sudo
를 못 쓰게 되는 경우가 있다./etc/sudoers
파일의 권한 설정은 0400
으로 되어 있어야 하고 그렇지 않을 경우 sudo
커맨드가 자체적으로 잠가버리기 때문이다.
커맨드 이름은 vi
/Vim
을 노린 것 같지만 우분투 등의 OS에서는 기본 에디터가 nano
이기 때문에 좀 이상한데 sudo EDITOR=vim visudo
등을 사용해서 원하는 에디터를 사용할 수 있으니 참고 바란다.
visudo
를 하게 되면 굉장히 난감한데 fstab
이나 crontab
같은 경우는 코멘트로 대략적인 예시가 적혀 있지만 visudo
만은 그냥 manpage를 보라고 불친절하게 쓰여있고 각각의 필드도 90% 이상이 그냥 ALL
로 적혀 있어 대체 어떤 필드가 어떤 역할인지 알 수가 없다. 대충 적어보자면 아래와 같다.
user host=(runas) command
%group host=(runas) command
user host=(ALL:ALL)OPTION command
user host=(ALL:ALL)OPTIONS:OPTIONS: command
- 첫 번째 필드는
sudo
를 실행하려고 하는 유저를 지정한다. 그냥 적으면 user고 그룹을 지정하고 싶으면%
를 붙이면 된다. - 두 번째 필드는
sudo
를 사용하려고 하는 호스트를 지정할 수 있다. 로컬에서 접속한 유저들만 권한을 주려면localhost
로 적으면 된다는데 실제로 해보면 잘 안 되는 걸 보아 그냥ALL
로 두는 게 나은 것 같다. - 세 번째 필드는
sudo
를 통해 얻으려는 권한이다.sudo
는 root 권한을 얻을 때 주로 쓰기 때문에 잘 모르는 사실이지만sudo -u postgres psql
등과 같이 굳이su
커맨드를 같이 쓰지 않고도 특정 유저의 권한으로 실행 할 수 있다. 그냥ALL
을 적으면 모든 권한을 사용할 수 있는데 콜론으로 구분해서 유저:그룹을 지정해 줄 수 있다.chown
을 사용할 때 사용하던 그것과 포맷이 일치한다. - 네 번째 필드는 옵션을 지정할 수 있는데 그냥 비워 두면 당연하겠지만 아무런 옵션이 안 붙은 거고
NOPASSWD
,SETENV
등을 사용할 수 있다. 반드시 옵션마다 콜론을 뒤에 붙여줘야 한다. 여러 가지 옵션이 있겠지만 대표적으로NOPASSWD
는sudo
를 사용할 때 패스워드를 입력 할 필요가 없게 되고(sudoers를 편집하는 가장 큰 이유),SETENV
는 환경변수를 유지시킨다. - 다섯 번째 필드는 실제 커맨드를 지정할 수 있다. 특정 유저에게
sudo
를 사용해서 nginx만 켜고 끄는 권한을 준다든지 할 때 굉장히 유용하다. 모든 커맨드를 다 실행 할 수 있게 하려면ALL
을 사용하면 된다. 당연하겠지만bash
같은 걸 실행 할 수 있게 해버리면 그 안에서 다른 커맨드들도 모조리 사용 가능하니 지양해야 한다. 커맨드는 안전을 위해서 절대경로를 적도록 강제하고 있다. (eg:nginx
가 아니라/usr/bin/nginx
로 적는다)
이를 이용해서 몇 가지 예시를 들면 아래와 같다.
# adm 그룹에 있는 유저들에게 패스워드 입력 없이도 서비스를 켜고 끄는 권한을 준다.
%adm ALL=(ALL:ALL)NOPASSWD: /usr/sbin/service * stop, /usr/sbin/service * start
#dokku 커맨드를 패스워드 입력 없이 사용하게 한다.
user ALL=(dokku:dokku)NOPASSWD:SETENV: /usr/bin/dokku
/etc/sudoers
파일을 그대로 두고 /etc/sudoers.d
디렉터리 아래에 같은 포맷으로 파일을 추가할 수 있기는 한데 별로 추천하고 싶지는 않다. visudo
의 경우 얼마 전부터 잘못 된 양식일 경우 sudo
를 아예 못 쓰는 걸 방지하기 위해 다시 편집 할 건지 아니면 수정사항을 다 취소할지 물어보게 되지만 해당 디렉터리 밑에 파일을 넣는 경우 그런 검사를 하지 않고 바로 잠겨버릴 수 있기 때문이다.
- Kali 같은 건 root권한이 기본이지만 이건 해킹을 위한 툴이지 메인 OS로 쓰라고 만든 건 아니기 때문에 예외다. ↩