sudoers 커스텀 하기

개인용 데스크탑은 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 등을 사용할 수 있다. 반드시 옵션마다 콜론을 뒤에 붙여줘야 한다. 여러 가지 옵션이 있겠지만 대표적으로 NOPASSWDsudo를 사용할 때 패스워드를 입력 할 필요가 없게 되고(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를 아예 못 쓰는 걸 방지하기 위해 다시 편집 할 건지 아니면 수정사항을 다 취소할지 물어보게 되지만 해당 디렉터리 밑에 파일을 넣는 경우 그런 검사를 하지 않고 바로 잠겨버릴 수 있기 때문이다.


  1. Kali 같은 건 root권한이 기본이지만 이건 해킹을 위한 이지 메인 OS로 쓰라고 만든 건 아니기 때문에 예외다. 

Synergy를 리눅스에서 쓸 때 스크롤이 먹통이 되는 문제

Synergy를 이용해서 맥과 리눅스의 입력장치를 하나로 묶어서 사용하고 있는데 이게 몇 가지 문제가 있다. 첫 번째로는 윈도우즈에선 UAC 창이 떠서 어두워지면 Synergy도 먹통이 되는 것이고(…) 두 번째는 리눅스에서 스크롤이 이상하게 된다는 것이다.
난 윈도우즈를 거의 안 쓰니 첫 번째는 넘어가기로 하고 두 번째 문제는 스크롤을 그냥 하면 잘 안 되고 엄청 많이 스크롤을 하겠다는듯이 막 돌리면 되는 걸 봐서 임계점이 이상하게 설정된 것 같았다.

구글링을 해보니 대충 고치는 방법이 있기는 했다. 간단히 설명하면 그냥 synergyc에 –yscroll 30을 붙여 실행하는 것이다. 하지만 synergy가 synergyc를 내부적으로 실행하는데 저 방법을 쓰면 synergyc가 또 synergyc.orig를 실행시켜서 synergy 메인 창에서 로그도 제대로 안 뜨고 Start/Stop 버튼도 이상해진다.

하지만 이렇게 하면 아주 간단하게 해결 된다(사실 몇 글자 추가한 게 전부다).

#!/bin/bash
# /usr/bin/synergyc

exec /usr/bin/synergyc --yscroll 30 $*

원본 프로세스를 자식으로 실행하지 않고 그냥 exec를 이용해서 replace 시켜버리면 되는 거였다. 메데타시메데타시.