Sudo
sudo 명령은 일반 사용자가 암호를 입력하지 않고도 가능하게 루트 권한으로 몇가지(또는 전부의)명령을 실행하는 등의 상황에서 권한 상승을 설정하는 간단하고 안전한 수단을 제공합니다.
일부 사용자에게 루트 권한을 전부 주지 않고도 시스템의 관리 과정을 수행하도록 하려면 sudo를 사용하는 것이 가장 탁월한 선택입니다. sudo를 통해서라면 누가 무엇을 할 수 있을지 통제할 수 있습니다. 이 안내서에서는 이 멋진 수단에 대한 간단한 소개를 드리고자 합니다.
이 글은 간단한 소개글을 의도합니다. app-admin/sudo 꾸러미는 여기서 언급한 내용보다 훨씬 더 강력한 기능을 보유하고 있습니다. 다른 사용자 처럼 파일을 편집하는 기능(sudoedit), 스크립트 내에서 실행하는(따라서 백그라운드에서 실행하거나 키보드 대신 표준 입력을 통해 암호 입력을 받을 수 있음), 등의 기능이 있습니다.
더 많은 내용은 sudo 와 sudoers 설명서 페이지를 읽어보십시오.
설치
sudo is not part of the system set, so it must be installed manually, if it is needed.
The su command should always be available, in case sudo is not installed.
USE 플래그
USE flags for app-admin/sudo Allows users or groups to run commands as other users
+secure-path
|
Replace PATH variable with compile time secure paths |
+sendmail
|
Allow sudo to send emails with sendmail |
gcrypt
|
Use message digest functions from dev-libs/libgcrypt instead of sudo's |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
nls
|
Add Native Language Support (using gettext - GNU locale utilities) |
offensive
|
Let sudo print insults when the user types the wrong password |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
sasl
|
Add support for the Simple Authentication and Security Layer |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
skey
|
Enable S/Key (Single use password) authentication support |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
sssd
|
Add System Security Services Daemon support |
verify-sig
|
Verify upstream signatures on distfiles |
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를 사용하십시오.
The /etc/sudoers should never be edited through nano /etc/sudoers or vim /etc/sudoers, or any other editor that is normally used. When altering the /etc/sudoers file, always use visudo. This tool makes sure that no two system administrators are editing this file at the same time, preserves the permissions on the file, and performs some syntax checking to make sure no fatal mistakes in the file.
기본 문법
sudo 를 다루는데 있어 상당히 어려운 부분은 /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:
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 localhost = /usr/bin/emerge
(각각의 명령에 대해 단일 항목을 넣는 대신)여러 명령을 한줄에 적어 실행을 허용하도록 할 수 있습니다. 예를 들면 동일한 사용자에게 emerge 뿐만 아니라 ebuild와 emerge-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 기능을 지원하려면 ldap 및 pam USE 플래그가 필요합니다.
LDAP에 sudo를 사용하면 마찬가지로 LDAP 서버의 설정을 읽습니다. 따라서 다음 두개의 파일을 편집해야합니다.
# 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
sudoers: ldap files
또한 sudo 에 다음 LDAP 항목을 추가해야 합니다.
보안 문제로 sudoers 브랜치를 트리 상단에 놓도록 설계했습니다. 따라서 이 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
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를 선언하는 형식은 약간 단순합니다:
Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...
어디에 있든, 항상 동작하는 별칭은 ALL
입니다(별칭인 것과 아닌 것을 쉽게 구분하기 위해 대문자 사용을 추천합니다). 확실히 짐작한 바와 같이 ALL
별칭은 모든 설정에서 쓸 수 있는 별칭입니다.
ALL
별칭의 용례로서, 어떤 사용자가 로컬에 접속했을 때 shutdown 을 실행할 수 있도록 허용하려면:
ALL localhost = /sbin/shutdown
다른 예제로는 larry 사용자가 로그인한 장소, 장치가 어딘지 여부와는 상관 없이 emerge 명령을 루트 권한으로 실행할 수 있게 하려면:
larry ALL = /usr/bin/emerge
프로그램을 관리하는 프로그램(emerge와 ebuild 같은 것)을 시스템에서 실행할 수 있는 여러 사용자를 정의하고 루트를 제외한 어떤 사용자의 암호든 바꿀 수 있는 관리자 그룹을 정의할 수 있다는게 얼마나 재밌을까요?!
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
larry가 apache 사용자 또는 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
변수 설정을 유지하는 또 다른 재밌는 기능도 있습니다:
Defaults:john env_keep=DISPLAY
Defaults:
지시자를 활용하면 여러 기본 설정을 바꿀 수 있습니다. sudoers 설명서 페이지 표시를 실행하고 Defaults
를 검색해보십시오.
허나 어쨌든간에 암호를 제공하지 않고 명령 세트를 실행할 수 있게 하려면, 다음과 같이 NOPASSWD:
지시자를 붙여 명령 기입을 시작해야합니다:
larry localhost = NOPASSWD: /usr/bin/emerge
배시 자동 완성
sudo에 bash 명령 완성 기능을 사용하려는 사용자는 다음 명령을 한번 실행하십시오.
user $
sudo echo "complete -cf sudo" >> $HOME/.bashrc
Z쉘 명령 완성
sudo에 zsh 명령 완성 기능을 사용하려는 사용자는 .zprofile 와 .zshrc에 각각 다음 내용을 설정할 수 있습니다
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
zstyle ':completion:*:sudo:*' environ PATH="$SUDO_PATH:$PATH"
위 내용으로 바꾸면, /sbin, /usr/sbin, /usr/local/sbin 위치에 있는 값은 'sudo' 다음에 놓은 명령에 대한 명령 완성 기능을 쉘에서 사용할 수 있습니다.
This alias will disrupt sudo configurations specifying commands like
larry localhost = NOPASSWD: /usr/bin/emerge
사용법
권한 확인
자신의 권한을 알아보려면 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 명령으로 타임스탬프를 없앨 수 있습니다.