Sudo

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Sudo and the translation is 54% complete.

Outdated translations are marked like this.
Other languages:
English • ‎español • ‎français • ‎italiano • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어
Resources

sudo 명령은 일반 사용자가 암호를 입력하지 않고도 가능하게 루트 권한으로 몇가지(또는 전부의)명령을 실행하는 등의 상황에서 권한 상승을 설정하는 간단하고 안전한 수단을 제공합니다.

일부 사용자에게 루트 권한을 전부 주지 않고도 시스템의 관리 과정을 수행하도록 하려면 sudo를 사용하는 것이 가장 탁월한 선택입니다. sudo를 통해서라면 누가 무엇을 할 수 있을지 통제할 수 있습니다. 이 안내서에서는 이 멋진 수단에 대한 간단한 소개를 드리고자 합니다.

이 글은 간단한 소개글을 의도합니다. app-admin/sudo 꾸러미는 여기서 언급한 내용보다 훨씬 더 강력한 기능을 보유하고 있습니다. 다른 사용자 처럼 파일을 편집하는 기능(sudoedit), 스크립트 내에서 실행하는(따라서 백그라운드에서 실행하거나 키보드 대신 표준 입력을 통해 암호 입력을 받을 수 있음), 등의 기능이 있습니다.

더 많은 내용은 sudosudoers 설명서 페이지를 읽어보십시오.

설치

USE 플래그

USE flags for app-admin/sudo Allows users or groups to run commands as other users

gcrypt Use message digest functions from dev-libs/libgcrypt instead of sudo's
ldap Add LDAP support (Lightweight Directory Access Protocol)
libressl Use message digest functions from dev-libs/libressl instead of sudo's
offensive Let sudo print insults when the user types the wrong password
secure-path Replace PATH variable with compile time secure paths
sendmail Allow sudo to send emails with sendmail
skey Enable S/Key (Single use password) authentication support
sssd Add System Security Services Daemon support
system-digest Use message digest functions from dev-libs/libgcrypt, dev-libs/libressl or dev-libs/openssl instead of sudo's internal SHA2 implementation

Emerge

root #emerge --ask app-admin/sudo

설정

활동 기록

sudo의 또 다른 장점은 프로그램을 실행하는 어떤 시도 과정(성공/실패)을 기록할 수 있다는 점입니다. 누가 10시간동안 삽질하도록 치명적인 실수를 했는지 추적할 때 유용합니다 :)

권한 부여

시스템 관리자는 app-admin/sudo 꾸러미로 사용자들이 보통 실행하지 말아야 할 하나 이상의 프로그램을 실행할 수 있도록 권한을 줄 수 있게 합니다. setuid 사용할 때와는 달리 sudo누가, 언제 각각의 명령을 실행할 수 있는지 세밀하게 관리할 수 있습니다.

sudo누가 프로그램을 실행할 수 있는지 분명한 목록을 만들 수 있습니다. setuid 비트를 설정하면 어떤 사용자든(어떤 그룹의 사용자든, 권한 설정에 따라) 이 프로그램을 실행할 수 있습니다. 사용자가 프로그램을 실행하려 할 때 암호를 입력하라고 요구(할 수 있거나 해야)합니다.

sudo 설정은 /etc/sudoers 파일에서 관리합니다. 이 파일은 nano /etc/sudoers, vim /etc/sudoers 또는 사용하고자 하는 편집기로 편집해서는 안됩니다. 이 파일의 내용을 바꾸려면 visudo를 사용하십시오.

기본 문법

sudo 를 다루는데 있어 상당히 어려운 부분은 /etc/sudoers 문법입니다. 기본 문법은 다음과 같습니다:

코드 /etc/sudoers 기본 문법
user  host = commands

이 문법은 sudo에게 user가 인증하였으며, host 시스템에서 로그인한 사용자가 명시한 commands의 어떤 명령이든 루트 권한으로 실행할 수 있음을 말합니다. 좀더 실제적인 예제를 들면 확실히 이해할 수 있을지도 모르겠습니다. 다음 예제에서는 larry 사용자가 localhost에 로그인하면 emerge를 실행할 수 있습니다:

A more real-life example might make this more clear: To allow the user larry to execute emerge when he is logged in on localhost:

코드 /etc/sudoers 실제 예제
larry  localhost = /usr/bin/emerge
참고
호스트 이름은 hostname 명령에서 반환하는 값과 일치해야합니다.
참고
In the simplest case, commands must be fully qualified paths to executables: hence /usr/bin/emerge not just emerge. Paths can also contain wildcards and may refer to entire directories. See the manpage for details.
경고
사용자가 타인의 권한을 올려줄 수 있는 프로그램을 실행하지 못하게 하십시오. 예를 들면 emerge 실행 권한을 사용자에게 주면 시스템 루트 권한을 완전히 넘겨준다는 이야기인데 emerge는 사용자의 고급 권한을 실시간으로 파일 시스템 상에서 바꿀 수 있기 때문입니다. sudo 사용자를 믿지 못하겠다면 어떤 권한도 주지 마십시오.

사용자 이름은 그룹 이름으로 분류할 수 있습니다. 이 경우 % 기호로 시작하는 그룹 이름을 적어야합니다. 예를 들어 wheel 그룹의 임의의 사용자에게 emerge 실행을 허용하려면:

코드 wheel 그룹 사용자에게 emerge 실행 허가
%wheel  localhost = /usr/bin/emerge

(각각의 명령에 대해 단일 항목을 넣는 대신)여러 명령을 한줄에 적어 실행을 허용하도록 할 수 있습니다. 예를 들면 동일한 사용자에게 emerge 뿐만 아니라 ebuildemerge-webrsync 명령을 루트 권한으로 실행하도록 허용한다면:

코드 다중 명령
larry  localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync

도구 자체 뿐만 아니라 명령을 정확하게 지정할 수도 있습니다. 각 도구별로 명령 옵션 지정 셋을 제한할 때 유용합니다. sudo 도구는 sudoers 파일에서 쉘 방식 와일드카드(메타 또는 글롭 문자)를 명령행 인자로 경로 이름에서와 같이 사용할 수 있게 합니다. 참고로 정규 표현식은 아닙니다.

시험을 위해 다음 명령을 입력해보겠습니다:

user $sudo emerge -uDN world
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
  
    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
  
Password: ## (Enter the user password, not root!)

sudo 에서 요구하는 암호는 사용자 자신의 암호입니다. 여러분이 깜빡하고 열어둔 터미널로 인해 다른 사람이 악의 목적으로 오남용을 방지하도록 확인합니다.

sudo${PATH} 변수값을 대체하지 않음을 알고 계셔야 합니다. sudo 명령 다음에 적은 명령은 여러분의 환경을 기준으로 다룹니다. /sbin 에 있는 도구를 실행하려는 경우, 다음과 같이 전체 경로를 지정하여 sudo에 알려야합니다:

LDAP 기본 문법

LDAP 기능을 지원하려면 ldappam USE 플래그가 필요합니다.

LDAP에 sudo를 사용하면 마찬가지로 LDAP 서버의 설정을 읽습니다. 따라서 다음 두개의 파일을 편집해야합니다.

파일 /etc/ldap.conf.sudo끝나면 꼭 chmod 400 명령으로 처리하십시오
# See ldap.conf(5) and README.LDAP for details
# This file should only be readable by root
  
# supported directives: host, port, ssl, ldap_version
# uri, binddn, bindpw, sudoers_base, sudoers_debug
# tls_{checkpeer,cacertfile,cacertdir,randfile,ciphers,cert,key}
  
host ldap.example.com
port 389
  
base dc=example,dc=com
  
uri ldap://ldap.example.com/
#uri ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock
  
ldap_version 3
#ssl start_tls
  
sudoers_base ou=SUDOers,dc=example,dc=com
#sudoers_debug 2
  
bind_policy soft
파일 /etc/nsswitch.confsudoers에 다음 줄을 추가하십시오
sudoers:     ldap files

또한 sudo 에 다음 LDAP 항목을 추가해야 합니다.

참고
보안 문제로 sudoers 브랜치를 트리 상단에 놓도록 설계했습니다. 따라서 이 LDAP 브랜치에 읽기/쓰기 접근 권한을 다르게 줄 수 있습니다
코드 sudo용 LDAP 항목
version: 1
DN: ou=SUDOers,dc=example,dc=com
objectClass: organizationalUnit
objectClass: top
objectClass: domainRelatedObject
associatedDomain: example.com
ou: SUDOers
  
DN: cn=defaults,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_reset
  
DN: cn=root,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: root
sudoCommand: ALL
sudoHost: ALL
sudoUser: root
  
DN: cn=%wheel,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: %wheel
sudoCommand: ALL
sudoHost: ALL
sudoOption: !authenticate
sudoUser: %wheel
코드 wheel 그룹의 LDAP 항목
version: 1
DN: cn=wheel,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: wheel
description: Wheel Group
gidNumber: 10
memberUid: useradmin1
memberUid: root

sudoer LDAP 설정은 다른 설정을 하는 파일과 비슷합니다. 아래 링크에 있는 sudo LDAP 글을 더 읽어보십시오[1].

별칭 사용

좀 더 거대한 환경에서는 모든 사용자(또는 호스트, 명령)를 계속해서 적어넣어야 하는데 그걸 다 하기엔 벅찹니다. /etc/sudoers 관리를 쉽게 하기 위해 aliases를 정의할 수 있습니다. aliases를 선언하는 형식은 약간 단순합니다:

코드 /etc/sudoers에 별칭 선언
Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...

어디에 있든, 항상 동작하는 별칭은 ALL 입니다(별칭인 것과 아닌 것을 쉽게 구분하기 위해 대문자 사용을 추천합니다). 확실히 짐작한 바와 같이 ALL 별칭은 모든 설정에서 쓸 수 있는 별칭입니다.

ALL 별칭의 용례로서, 어떤 사용자가 로컬에 접속했을 때 shutdown 을 실행할 수 있도록 허용하려면:

코드 일부 사용자에게 shutdown 실행 허가
ALL  localhost = /sbin/shutdown

다른 예제로는 larry 사용자가 로그인한 장소, 장치가 어딘지 여부와는 상관 없이 emerge 명령을 루트 권한으로 실행할 수 있게 하려면:

코드 위치에 상관 없이 사용자에게 프로그램 실행 허가
larry   ALL = /usr/bin/emerge

프로그램을 관리하는 프로그램(emergeebuild 같은 것)을 시스템에서 실행할 수 있는 여러 사용자를 정의하고 루트를 제외한 어떤 사용자의 암호든 바꿀 수 있는 관리자 그룹을 정의할 수 있다는게 얼마나 재밌을까요?!

코드 사용자와 명령에 별칭 사용
User_Alias  SOFTWAREMAINTAINERS = swift, john, danny
User_Alias  PASSWORDMAINTAINERS = swift, sysop
Cmnd_Alias  SOFTWARECOMMANDS    = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias  PASSWORDCOMMANDS    = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root
  
SOFTWAREMAINTAINERS  localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS  localhost = PASSWORDCOMMANDS

비 루트 실행

루트가 아닌 사용자중에서 각기 다른 프로그램을 실행하는 사용자를 다르게 할 수도 있습니다. (예를 들어 웹 서버 apache의 경우) 각기 다른 사용자에게 프로그램을 실행하게 하고 이 사용자들에게 관리 절차상 필요한 일을 수행할 수 있게 허용한다(이를테면 좀비 프로세스 죽이기 정도)면 꽤 흥미로울 수 있습니다.

/etc/sudoers에는 명령을 나열하기 전에 () 사이에 사용자를 나열하십시오:

코드 비 루트 실행 문법
users  hosts = (run-as) commands

larryapache 사용자 또는 gorg 사용자처럼 kill 도구를 실행하도록 하려면:

코드 비 루트 실행 예제
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
  
larry   ALL = (apache, gorg) KILL

이 설정으로 해당 사용자는 sudo -u 명령을 실행하여 프로그램을 실행하고자 하는 사용자를 선택할 수 있습니다:

user $sudo -u apache pkill apache

Runas_Alias 지시어를 활용하면 프로그램을 실행할 사용자의 별칭을 설정할 수 있습니다. 앞서보았던 _Alias 지시자에게도 이러한 활용법은 완전히 같습니다.

암호 및 기본 설정

기본적으로 sudo는 사용자 자신의 신원을 자신의 암호를 통해 증명하라고 요청합니다. 암호를 입력하면 sudo에서는 사용자 자신의 암호를 다시 입력하지 않고 작업에 집중할 수 있도록 5분동안 기억합니다.

물론 이 동작을 바꿀 수 있습니다: /etc/sudoers에서 Defaults: 지시어로 사용자에 대한 기본 동작 설정을 바꿀 수 있습니다.

기본 5분값을 0(기억하지 않음)으로 바꾸려면:

코드 제한 시간 값 바꾸기
Defaults:larry  timestamp_timeout=0

-1로 설정하면 (시스템을 다시 부팅하기 전까지) 암호를 무한대 시간동안 기억합니다.

다른 설정에도 마찬가지로 명령을 실행할 때 사용자의 암호를 요구하며 사용자 자신의 암호를 요구하지 않는 다른 설정도 있습니다. runaspw를 활용하면 됩니다. 또한, 다음 예제에서 (sudo 작업에 실패하기 전에 사용자가 몇번 다시 암호를 입력할 수 있는지) 기본값인 3 대신에 재시도 횟수를 2로 설정했습니다.

코드 사용자 명령 대신 루트 암호 요구
Defaults:john   runaspw, passwd_tries=2

그래픽 도구를 실행할 수 있게 DISPLAY 변수 설정을 유지하는 또 다른 재밌는 기능도 있습니다:

코드 DISPLAY 변수 값 유지
Defaults:john env_keep=DISPLAY

Defaults: 지시자를 활용하면 여러 기본 설정을 바꿀 수 있습니다. sudoers 설명서 페이지 표시를 실행하고 Defaults를 검색해보십시오.

허나 어쨌든간에 암호를 제공하지 않고 명령 세트를 실행할 수 있게 하려면, 다음과 같이 NOPASSWD: 지시자를 붙여 명령 기입을 시작해야합니다:

코드 암호를 묻지 않고 루트 권한으로 emerge 를 실행하도록 허용
larry     localhost = NOPASSWD: /usr/bin/emerge

배시 자동 완성

sudo에 bash 명령 완성 기능을 사용하려는 사용자는 다음 명령을 한번 실행하십시오.

user $sudo echo "complete -cf sudo" >> $HOME/.bashrc

Z쉘 명령 완성

sudo에 zsh 명령 완성 기능을 사용하려는 사용자는 .zprofile.zshrc에 각각 다음 내용을 설정할 수 있습니다

파일 .zprofilezshell 명령 완성 추가
if [[ $EUID != 0 ]]; then
    typeset -xT SUDO_PATH sudo_path
    typeset -U sudo_path 
    sudo_path=({,/usr/local,/usr}/sbin(N-/))
    alias sudo="sudo env PATH=\"SUDO_PATH:$PATH\""
fi
파일 .zshrczshell 명령 완성 추가
zstyle ':completion:*:sudo:*' environ PATH="$SUDO_PATH:$PATH"

위 내용으로 바꾸면, /sbin, /usr/sbin, /usr/local/sbin 위치에 있는 값은 'sudo' 다음에 놓은 명령에 대한 명령 완성 기능을 쉘에서 사용할 수 있습니다.

사용법

권한 확인

자신의 권한을 알아보려면 sudo -l를 실행하십시오:

user $sudo -l
User larry may run the following commands on this host:
    (root)   /usr/libexec/xfsm-shutdown-helper
    (root)   /usr/bin/emerge
    (root)   /usr/bin/passwd [a-zA-Z0-9_-]*
    (root)   !/usr/bin/passwd root
    (apache) /usr/bin/pkill
    (apache) /bin/kill

/etc/sudoers 에 암호를 입력할 필요가 없는 명령이 있다면, 항목에 있는 명령에 암호를 요구하지 않습니다. 그렇지 않아 항목에 없어 기억하지 않으면 암호를 물어봅니다.

암호 입력 제한 시간 미리 연장

기본적으로 사용자가 sudo로 자신의 암호로 진입하면 5초간 기억합니다. 사용자가 이 기간보다 더 길게 세션을 유지하길 바란다면 sudo에서 암호를 다시 묻기 전에 sudo -v 명령을 실행하여 타임 스탬프를 다시 설정하고, 5분을 다시 세도록 할 수 있습니다.

user $sudo -v

반대로, sudo -k 명령으로 타임스탬프를 없앨 수 있습니다.

References

  1. [1] Sudoers 맨 페이지