노무현 대통령 배너


2008. 12. 19. 12:59

sudo, sudoers

* Sudo *


sudo유틸리티는 RBAC와 비슷한 기능을 제공하는 것으로 비교적 rbac보다 사용하기 편리하다.

사용목적 : 관리자(root)가 특정 사용자(특정 그룹)에게 특정 명령(명령그룹)을 root계정으로 실행할 수 있는 권한부여

작동 원리 : sudo명령어 다음에 사용하고자 하는 명령어를 입력하면, sudo유틸리티는 구성파일인 /usr/local/etc/sudoers 파일내에 현재 호스트에서 그 명령어를 사용하는 것이 허가 되어 있는지를 확인한뒤, 허가 되어 있으면 패스워드를 입력하여 사용하도록 함.

한번 sudo명령어를 사용하면 5분간동안 허용된 명령어를 사용할수 있는 권한이 부여되고, 다시 sudo명령어를 사용할때마다 그 시간은 갱신된다. 만약 시간이 지나면 다시 패스워드를 입력해야함.


예) sudo shutdown -g 5 -i 0 -y

* sudo명령어 옵션

-l : 사용자에게 허용됐거나 금지된 명령어 목록을 출력

-v : 사용자의 타임스탬프 필드를 확인한 뒤 timeout시간을 늘린다.
sudo를 사용하면 로그인 패스워드를 입력한 순간부터 타이머가 시작된다.
타이머가 만료되면 그 다음부터 sudo를 사용할 때는 동작을 멈추게 함

-k : 타임스탬프를 죽임. 즉 sudo타이머 동작을 멈추게 함

-b : sudo가 명령을 백그라운드로 실행하도록 함
permit


[root@solaris203.nuxshool.org:/]#sudo -l
User root may run the following commands on this host:
(ALL) ALL



* 구성파일 : /usr/local/etc/sudoers

1. 유저, 호스트, 커멘드를 정의 가능.

2. 유저, 호스트, 커멘드의 엘리어스도 지정 가능

3. 구조

user host=commads

user : 로그인 id나 엘리어스 네임
host : hostname, 엘리어스 호스트네임
commads : 콤마로 구분되어지는 명령어 리스트


참고. host네임필드는 한개의 sudo구성파일로 엔터프라이지 혹은 분산환경에

존재하는 모든 호스트를 지원하기 위한 방법으로, 단 각 host에 sudo 유틸리티가 설치되어 있어야함

주. 명령어의 풀패스가 구성파일에 꼭 정의되어 있어야한다. 이것은 트로잔 목마를 막는데 도움이 됨.


예)

1. root ALL=(ALL) ALL

루트유저가 모든 호스트 상에서 모든 명령어를 사용 가능

2. bob hostA=/usr/sbin/shutdown

밥이라는 유저가 호스트A 상에서 shutdown명령어를 사용 가능



* Aliases

예1)유저, 호스트, 명령어를 엘리어스로 정의하는 방법

Cmnd_Alias DOWN=/usr/sbin/shutdown,/usr/sbin/reboot
Host_Alias WORKSTATIONS=hostA,hostB
User_Alias ADMIN=alice,bob


alice ALL=/usr/sbin/init
bob penguin=DOWN
ADMIN ALL=DOWN


예2) 와일트카드가 적용이 됨

Cmnd_Alias USERADMIN=/usr/sbin/user*, !/usr/sbin/userdel
Cmnd_Alias PASSWD=/usr/sbin/passwd [A-Z]*

alice ALL=USERADMIN
ADMIN ALL=PASSWD


* Defaults

많은 수의 구성가능한 목록을 위한 기본값

#sudo -L -> default목록 확인

예)

Defaults secure_path=/bin:/usr/bin:/usr/sbin:/usr/local/bin

sudo명령어에 의해서 사용될수 있는 path값을 설정
이것은 유저들이 보안되지 않은 패스를 설정하는 것을 막고 사용할수 있는 명령어를
콘트롤 하는 것을 허용

Defaults:ADMIN !lecture

ADMIN 엘리어스 사용자들이 sudo명령어를 사용했을때 표준경고 배너가 안보여지도록 함.

Defaults:alice !authenticate

alice에게는 패스워드를 요구하지 않음


Defaults timestamp_timeout=0

sudo 명령어를 사용할때마다 패스워드를 입력


* Logging sudo activity

1. 기본적으로 선 프리웨어 패키지에서는 sudo유틸리티를 위해서 logging을 정의하고 있지 않음

2. syslog daemon을 설정해서 로깅이 가능하도록 할수 있음

3. sudoers 파일내에 엔트리를 추가함으로써 가능하도록 할수 있음



방법1

- sudoers파일내 syslogd

Defaults syslog=auth

-> sudo 로그인이 성공하면 notice, 실패하면 alert가 플래그됨


- /etc/syslog.conf 엔트리에 로긴실패를 추가

auth.alert /var/adm/auth.log


방법2

Defaults logfile=/var/adm/sudo.log
Defaults:ADMIN !logfile

-> ADMIN내 유저를 제외한 모든 사용자에게 logging을 적용


참고. sudo log정보는 sudo를 실행한 일시, 권한이 있었는지 아닌지,
사용했던 커맨드 라인등이 기록됨

또한, 인증되지 않은 유저가 sudo명령어를 사용할려고 시도시 기본적으로 root유저에게
이메일이 보내진다.



* sudo 유틸리니의 장단점

1. 한개의 구성파일에 간단한 문법으로 설정하기 때문에 사용하기 편하지만

한파일에 모든 설정이 가능하므로 달리보면 복잡성을 유발할수도 있다.

2. 이기종환경에서 작업하는 관리자들에게 sudo유틸리티의 이식성때문에 매력적임





*****************************************************************

테스트


1. [root@solaris203.nuxshool.org:/usr/local/sbin]#visudo

29 Defaults syslog=auth
30
31 Cmnd_Alias PWD=/usr/bin/passwd [A-Z0-9a-z]*, !/usr/bin/passwd root
32 Cmnd_Alias USERMOD=/usr/sbin/usermod,PWD
33 Cmnd_Alias USERADD=/usr/sbin/useradd
34
35 User_Alias ADMIN=wish
36 User_Alias USERADMIN=kim
37
38 ADMIN ALL=USERMOD,USERADD
39 USERADMIN ALL=USERMOD

상기 값들을 추가한다.


2. [root@solaris203.nuxshool.org:/etc]vi syslog.conf

24 mail.debug ifdef(`LOGHOST', /var/log/syslog, @loghost)
25
26 auth.crit;auth.notice;auth.info /var/adm/sc300log -> 추가
27 #


3. 구성요소 테스트


wish로 로그인후 테스트

$ pwd
/usr/local/bin
$ sudo -l
User wish may run the following commands on this host:
(root) /usr/sbin/usermod, PWD
(root) /usr/sbin/useradd

$ /usr/sbin/useradd
UX: /usr/sbin/useradd: ERROR: Permission denied.

$ sudo useradd -u 5004 -g 10 -d /export/home/sudotest -m -s /bin/ksh sudotest
Nov 22 00:10:10 solaris203.nuxshool.org sudo: [ID 702911 auth.alert] wish : command not allowed ; TTY=pts/3 ; PWD=/usr/local/bin ; USER=root ; COMMAND=useradd -u 5004 -g 10 -d /export/home/sudotest -m -s /bin/ksh sudotest
sudo: useradd: command not found

$ sudo useradd
Nov 22 00:10:24 solaris203.nuxshool.org sudo: [ID 702911 auth.alert] wish : command not allowed ; TTY=pts/3 ; PWD=/usr/local/bin ; USER=root ; COMMAND=useradd
sudo: useradd: command not found


$ sudo /usr/sbin/useradd -u 5004 -g 10 -d /export/home/sudotest -m -s /bin/ksh sudotest
64 blocks
$ sudo passwd sudotest
New Password:
Re-enter new Password:
passwd: password successfully changed for sudotest
$


참고! 콘쉘의 엘리어스 기능을 사용해서 타이핑 수를 줄일수 있음

가령

alias usermod='sudo /usr/sbin/usermod'



-----------------------------
/etc/sudoers 파일을 열어서

root=ALL(ALL) ALL
아래에 추가 해준다.

사용자ID=권한줄파일, 권한줄파일, 권한줄파일

wowpc=ALL(ALL) ALL