시스템 관리자는 sugroup을 사용하여 누가 어떤 계정에 su 액세스할 수 있는지에 관해 그룹 구성원을 기준으로 액세스를 제한할 수 있다. NOT 연산자를 사용하면 액세스 제어를 추가로 제한할 수 있다. 감사 목적으로 누가 어떤 sugroup의 구성원인지, 어떤 계정에 su 액세스할 수 있는지에 관한 보고를 식별할 필요가 있다. 이를 위해서는 sugroup 구성원 액세스에 대한 보고서를 생성해야 하며, 이는 일반적으로 준수 태스크로 간주된다.
사용자에게 su 액세스 권한을 제공하는 시스템 관리자는 사용자가 현재 계정에서 로그아웃하지 않고 다른 사용자로 전환하거나 다른 사용자를 대신할 수 있는 능력을 제공하는 것이다. 일반적으로, su 계정은 사용자가 다른 계정, 예컨대 루트 사용자 또는 애플리케이션 소유자로 임시로 전환할 수 있도록 하는 설정이다. 하지만, 애플리케이션 지원 증가에 따라 시스템 관리에 필요한 유지보수 오버헤드도 증가한다. 수많은 개인 사용자가 아니라 그룹 단위로 관리하므로, sugroup을 사용하면 su 사용 권한을 더 효율적으로 관리할 수 있다.
시스템 관리자는 sugroup을 사용하여 특정 사용자들을 그룹으로 분류하고 그들에게 각기 다른 계정에 su 액세스하는 권한을 부여할 수 있다. 실제 su 액세스는 특정 AIX® 그룹의 구성원이 됨으로써 제어된다. 사용자가 생성되면 사용자 속성의 일부로서 sugroup을 지정할 수 있고, 이 그룹의 구성원만이 그 사용자에 대해 su 액세스할 수 있도록 허용된다. 물론, su 액세스를 하는 사용자는 비밀번호를 알아야 올바로 su 액세스할 수 있다. 어떤 사용자의 비밀번호를 알지만 지정된 sugroup에 속하지 않는 다른 사용자는 알맞은 sugroup에 속하지 않으므로 그 사용자에게 su 액세스할 수 없다.
앞서 설명했듯이, 어떤 시스템에서는 다른 사용자에게 비밀번호를 알려주는 것이 보안 정책에 위배되지 않을 수도 있다. 그런 경우에는 sudo를 사용할 수 있다. 이에 대해서는 뒤에서 설명하겠다.
어떤 sugroup이 설정되어 있는지 확인할 때 유용하게 사용할 수 있는 다음 두 가지 명령이 있다.
lsuserlsgroup
다음 예제에서는 lsuser 명령을 사용하여 모든 사용자의 모든 sugroup을 출력한다. 해당 시스템에서 구성된 사용자 수에 따라
이 목록이 상당히 길 수도 있다.
# lsuser -a sugroups ALL |
사용자가 생성되었는데 아무런 sugroup도 지정되지 않을 때, AIX에서는 기본적으로 ALL로 설정된다. 즉, 어떤 그룹에서든 그 사용자에 대해 su 액세스할 수 있다는
뜻이다. 기본값이 ALL을 필터링하려면 'grep -v'를 사용하여 기본값이 ALL 속성이 설정되지 않은 sugroup을 가진 모든 사용자를
나열한다. 다음 위치에서 ALL의 시스템에 대한 기본 sugroup으로 바꾼다.
/etc/security/user: # lsuser -a sugroups ALL|grep -v ALL |
Sugroup 속성을 가진 단일 사용자(이 경우에는 사용자 pinky)를 나열하려면 다음 코드를 사용한다.
# lsuser -a sugroups pinky pinky sugroups=wasgrp,websp |
위 출력 결과에서, 사용자 pinky가 wasgrp 및 websp sugroup을 가진 것을
알 수 있다.
그 다음, wasgrp 및 websp sugroup의 구성원을 나열하려면 다음 코드를 사용한다.
# lsgroup -a users wasgrp admin users=dxtans,pxcon,jgena # lsgroup -a users websp admin users=dcand, |
이제 우리는 사용자 pinky가 wasgrp 및 websp라는 sugroup을 가지고 있고,
사용자 pinky에 대해 su 액세스가 허용되는 그룹의 구성원은 다음과 같음을 알고 있다.
dxtans,pxcon,jgena,dcand |
grep 유틸리티를 사용하여 파일에서 시스템 사용자 속성 기본값을 검색할 수 있다. 파일에서 주석의 배치에 따라, 다음 중 하나가
기본 스탠자를 정확히 추출할 것이다.
grep -p "default:" /etc/security/user grep -v ^"*" /etc/security/user| grep -p "default:" |
또는 다음과 같이 기본 스탠자에서 sugroup에 대해 grep을 수행한다.
# grep -p "default:" /etc/security/user| grep sugroups
sugroups = ALL
|
Sugroup의 구현 방법을 보여주는 예제를 살펴보자.
# lsuser -a sugroups dxtans dxtans sugroups=ALL |
Sugroup 속성이 ALL로 설정되어 있는 이전 출력 결과에서 그 방법을 확인할 수 있다. 즉, 어떤 사용자나 그룹 구성원도 사용자 dxtans의
비밀번호를 알고 있다면 dxtans의 계정에 su 액세스할 수 있다. 이제, 그룹 smoke만 포함하도록 sugroup
속성을 변경해보자.
# chuser sugroups=smoke dxtans # lsuser -a sugroups dxtans dxtans sugroups=smoke |
그룹 smoke의 구성원을 살펴보면, papa라는 한 구성원만 있다.
# lsgroup -a users smoke smoke users=papa |
그룹 smoke의 구성원이 아닌 다른 사용자가 su 액세스를 시도하면 다음과 같은 일이 생긴다.
$ whoami bravo $ su – dxtans dxtans's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "dxtans" : Account is not accessible. |
사용자 papa가 dxtans 계정에 su 액세스를 시도하고 비밀번호를 알고 있는 경우, 액세스 권한이 주어진다.
$ whoami papa $ su - dxtans dxtans's Password: $ id uid=203(dxtans) gid=1(staff) |
Su 액세스 시도는 /var/adm/sulog에 로그로 기록된다.
앞서 보여준 su 액세스 시도 데모를 사용할 때 두 가지 항목이 있다. 덧셈 기호(+)는 사용자 papa에서 사용자 dxtans로
이루어진 su 액세스 시도에 성공했음을 나타낸다. 뺄셈 기호(-)는 사용자 bravo에서 사용자 dxtans로 이루어진
su 액세스 시도에 실패했음을 나타낸다.
$ tail /var/adm/sulog SU 04/17 19:51 + pts/1 papa-dxtans SU 04/17 19:52 - pts/1 bravo-dxtans |
어떤 사용자가 다른 사용자에게 su 액세스를 시도하다가 'Account is not accessible' 메시지를 받았는데 sugroup 또는 su를 통한 인증이 올바르다고 확신하는 경우에는 대상 사용자가 규칙을 위반하여 실패한 로그인 시도를 하지 않았는지 확인한다. 아마 비밀번호가 만료되었거나 최초 비밀번호가 설정되지 않았을 것이다.
지금까지 필자가 설명한 내용으로 수많은 su 사용 권한을 개별적으로 작성하는 것보다는 sugroup을 작성하는 것이 훨씬 나은 이유가 잘 설명되었기를 바란다. Sugroup을 사용하는 방법을 채택하지 않더라도, 루트 계정에 대한 su 액세스 관리를 위해 최소한 하나 이상의 sugroup을 작성하자. 일반적으로, 시스템 관리자들은 자신의 계정으로 로그인한 다음 루트에 su 액세스한다. 이제, 어떻게 시스템 관리자인 다음 사용자들만 루트에 su 액세스가 허용되는지 보여주겠다. 여기서 사용자는 다음과 같다.
john,peter,jane |
첫 번째 태스크는 sysadmin이라는 그룹을 작성하는 것으로서, 그 구성원은 위에 나열되어 있다. 이 그룹의 구성원들만 루트에 su
액세스하도록 허용된다.
john,peter,jane이라는 구성원이 있는 그룹을 작성한다.
# mkgroup -A users="john,peter,jane" sysadmin |
그룹 구성원을 확인한다.
# lsgroup -a users sysadmin sysadmin users=john,peter,jane |
사용자에게 sugroup sysadmin의 루트 권한을 준다.
# chuser sugroups=sysadmin root # lsuser -a sugroups root root sugroups=sysadmin |
그러면 sysadmin의 구성원만이 루트에 su 액세스할 수 있다.
루트 사용자가 Telnet을 통해 직접 로그인하도록 허용하면 안 된다. 루트 사용자는 직접 콘솔을 통해서만 로그인하도록 허용해야 한다. 이때, ssh를 사용한다면 업데이트 및 파일/스크립트 롤아웃을 다룰 때 시스템 사이에서 ssh에 대한 루트 액세스를 사용하는 것이 바람직할 수 있다. 루트 사용자는 배포 서버에서 ssh out만 수행하도록 허용하는 것이 좋다.
이 사용자에 대한 su 액세스를 할 수 있는 사용자의 액세스를 금지하려는 새 사용자를 시스템에서 생성하는 경우가 있을 수 있다. 이를 수행하는 한 가지 방법은
구성원이 없는 그룹을 작성하는 것이다. 그러면 그 그룹(그룹 이름)을 그 사용자에 대한 sugroup 속성으로 사용할 수 있다. 예를 들어, brown이라는
사용자가 있다고 가정해보자. 사용자 환경의 민감한 특성 때문에, (루트 사용자를 제외한) 누구도 그 계정에 su 액세스할 수 있어서는 안 된다. 다음과 같이 구성원이 없는
none이라는 그룹을 작성할 수 있을 것이다.
# mkgroup -A none # lsgroup -a users none none users= |
그런 다음, 그 그룹을 포함하도록 사용자 계정 sugroup 속성을 변경한다.
# chuser sugroups=none brown # lsuser -a sugroups brown brown sugroups=none |
누구도 none 그룹에 속하지 않고 이 그룹을 sugroup으로 사용할 것이므로, 일반 사용자는 사용자 brown의
계정에 su 액세스할 수 없다.
이를 더욱 영구적인 기능으로 만들려면 /etc/security/user 파일을 편집하면 된다. Sugroup 항목의 기본 스탠자 내에 방금 작성한
그 그룹을 넣는다.
sugroups = none |
새 사용자가 모두 생성될 때, 기본적으로 그 sugroup 세트를 가지게 되고 누구도 그 사용자에게 su 액세스할 수 없다. 자신의 sugroup을 기본값인 ALL로 이미 설정한 모든 사용자는 이제 자신의 sugroup 속성이 'none'이 된다. 그러면 보안 정책 요구에 따라 그 사용자의 보안 레벨을 점진적으로 올릴 수 있다.
앞서 설명한 바와 같이, 기본 sugroup 값을 변경하지 않으면 모든 사용자가 기본값인 ALL을 사용할 것이다. AIX에서는 sugroup 액세스를 더욱 제한하기 위해 NOT 연산자 '!'를 제공한다. 규칙의 형식은 다음과 같다.
!<group_name > |
Sugroup 속성에서 이 규칙을 적용하면 그룹 이름 앞에 NOT 연산자가 있는 그룹 이름에 대해서는 그 계정으로의 su 액세스가 거부된다. 그러면 "왜?"라는 질문이 자연스럽게 나올 수 있다. 보통 사용자의 경우, 어떤 사용자들에 대한 su 액세스가 거부되는 그룹을 기준으로 지정할 수 있다. 또한, 임시로 어떤 그룹을 제한하여 이 방법을 사용할 수도 있다. 그러면 다른 계정에 대한 액세스를 제어하거나 충족시키기 위해 많은 그룹을 작성하지 않아도 되므로 su 관리의 유연성이 향상된다.
NOT 연산자를 사용하는 sugroup이 얼마나 효과적일 수 있는지 보여주는 예제를 살펴보자.
sun이라는 그룹이 있다고 가정하자. 다음 lsgroup의 출력 결과로부터 해당 그룹의 사용자를 결정할
수 있다.
# lsgroup -a users sun sun users=alpha,bravo |
따라서 구성원은 다음과 같다.
alpha,bravo |
모든 사용자가 사용자 charlie에게 su 액세스할 수 있도록 허용하되, sun 그룹의 구성원에 대한 액세스는
거부하려면, 다음 명령을 사용한다.
# chuser sugroups="!sun,ALL" charlie |
위 명령에서 NOT 연산자의 순서에 주목하자. 우선 거부한 다음에 허용한다.
다음 명령을 사용하면 위에서 말한 사용자들의 sugroup 및 그룹 속성이 나열된다.
alpha, bravo, charlie # lsuser -a sugroups groups alpha alpha sugroups=ALL groups=staff,sun # lsuser -a sugroups groups bravo bravo sugroups=ALL groups=staff,sun # lsuser -a sugroups groups charlie charlie sugroups=!sun,ALL groups=staff |
제한된 그룹 sun의 구성원이 아닌 사용자 delta가 사용자 charlie에게
su 액세스를 시도하고 비밀번호를 알고 있다면, 인증에 성공할 것이다.
# lsuser -a sugroups groups delta delta sugroups=ALL groups=staff,water,fire,mobgrp |
사용자 delta로서 다음 명령을 실행한다.
$ id uid=220(delta) gid=1(staff) groups=206(water),207(fire),215(mobgrp) $ su - charlie charlie's Password: $ id uid=211(charlie) gid=1(staff) |
제한된 그룹 sun의 구성원인 사용자 alpha가 사용자 charlie에 대한
su 액세스를 시도하는 경우, alpha는 액세스가 거부될 것이다.
사용자 alpha로서 다음 명령을 실행한다.
$ id uid=209(alpha) gid=1(staff) groups=214(sun) $ su - charlie charlie's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "charlie" : Account is not accessible. |
왜 우리가 NOT 연산자를 사용해도 되는지를 보여주는 다른 예제를 살펴보자. ukflag라는 계정이 있다고 가정하자. fire
및 cloud 그룹에 속하는 사용자는 사용자 ukflag에 대해 su 액세스할 수 없도록 하고, earth의
구성원만 액세스가 허용되어야 한다. 우선, 사용자 ukflag sugroup 속성을 변경한 다음 변경 내용을 확인한다.
# chuser sugroups="!fire,!cloud,earth" ukflag # lsuser -a sugroups ukflag ukflag sugroups=!fire,!cloud,earth |
earth 그룹의 구성원은 사용자 ukflag에 대한 su 액세스가 허용될 것이다.
# lsgroup -a users earth earth users=zulu |
이제 누가 cloud 및 fire 그룹에 속하고, 사용자 ukflag에 대한 su
액세스를 제한할 사용자는 누구인지 살펴보자.
# lsgroup -a users fire fire users=plutt,echoa,golf,hotel,india,juliet,kilo # lsgroup -a users cloud cloud users=hotel,india |
lsgroup 출력 결과에서 사용자 zulu만이 ukflag에 대한 su 액세스가
허용될 것이라는 점을 알 수 있다. 또한, lsgroup 출력 결과에서 사용자 plutt,echoa,golf,hotel,india,juliet,kilo가
ukflag 계정에 대한 su 액세스가 거부될 것이라는 점도 알 수 있다.
이 점은 fire 그룹의 구성원인 사용자 plutt의 계정에서 보여줄 수 있다.
$ id uid=230(plutt) gid=1(staff) groups=206(water),207(fire) $ su - ukflag ukflag's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "ukflag" : Account is not accessible. |
earth 그룹의 구성원인 사용자 zulu가 다음 명령을 실행한다.
$ id uid=228(zulu) gid=1(staff) groups=209(earth) $ su - ukflag ukflag's Password: $ |
여기서 보여준 바와 같이, NOT 연산자를 사용하면 su에 액세스할 수 있는 sugroup을 통해 사용자 계정에 대한 액세스를 미세 조정할 수 있다.
Su 액세스 권한을 제공할 때, 다른 사용자들이 su 액세스가 허용되는 계정의 비밀번호를 알 수 있게 하는 것은 적절치 못할 수 있다. 특히, 지원 사용자가 문제 해결을 위해 액세스 권한을 받을 필요가 있을 때 애플리케이션 계정에 대해 더욱 그러하다고 할 수 있다. Sudo를 사용하면 이런 사용자들이 su 액세스가 허용되는 계정의 비밀번호를 몰라도 정식으로 액세스하도록 할 수 있다.
지원 사용자 alpha, bravo,charlie가 있고, 이들이 모두 app_supp 그룹에 속한다고
생각해보자. 이런 사용자들의 책임 중에 프로덕션 환경 계정인 ukflag에 대한 액세스 권한을 얻어야 할 책임이 있다. 간단히
/etc/sudoers 파일을 편집하고 다음 항목을 넣어 rs6000을 호스트 이름으로 바꾼다.
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag |
그룹 구성원을 확인한다.
# lsgroup -a users app_supp app_supp users=alpha,bravo,charlie |
사용자가 ukflag 계정에 대해 sudo를 통해 su 액세스할 수 있는지 확인한다.
$ whoami
alpha
$ sudo -l
User alpha may run the following commands on this host:
(root) NOPASSWD: /usr/bin/su - ukflag
$ sudo -u root su - ukflag
$ whoami
ukflag
|
Sudo에 su 항목이 많을 수 있으므로, 다음과 같이 각각의 su 항목을 쉼표로 구분해야 한다.
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag, /usr/bin/su – ieflag, /usr/bin/su - plflag |
Sugroup을 사용할 때 현재 가지고 있는 모든 sugroup 액세스 권한을 검토하는 작업은 때때로 시간이 많이 걸릴 수 있고, 특히 많은 시스템을 다루는 경우에는 더욱 그러하다. Sugroup과 구성원들의 스냅샷을 생성하는 스크립트를 작성하는 것이 유리할 수 있다. 목록 1에서 필자는 준비된 sugroup의 개요를 제공할 스크립트를 제시한다. 이 스크립트는 원래는 두 개의 스크립트였지만, 데모용으로 이 둘을 한 스크립트로 병합했다. 이 스크립트는 "알아야 할 명령" 섹션에서 사용된 명령을 토대로 한 것이다.
이 스크립트를 실행하면 sugroup 속성의 일부로서 ALL을 가지고 있지 않은 사용자가 모두 표시된다. 그런 다음, 사용자와 그 사용자의 sugroup이 나열된다. 이 스크립트의 두 번째 파트에서는 각각의 sugroup과 개별 sugroup의 구성원을 표시한다.
목록 1. su_rep1
#!/bin/sh
# su_rep1
list=$(cat /etc/passwd| awk -F: '{print $1}' | sort)
echo "user su groups *(Denied su access)
========================================="
#
# display user and sugroups
for loop in $list
do
sugrp=$(lsuser -a sugroups $loop | sed s/ALL//g | awk -F= '{print $2}'|sed 's/,/ /g')
if [ "$sugrp" != "" ]
then
sugrp=$(echo $sugrp|sed 's/!/*/g')
printf "%-10s %-40s\n" "$loop" "$sugrp"
fi
done
#
# list sugroups and members
echo "\nsugroup sugroup members
=========================="
sugrp_list=$(lsuser -a sugroups ALL| sed s/ALL//g | awk -F= '{print $2}'| tr " " "\n" \
|sed 's/,/ /g' | sed 's/!//g'|tr " " "\n" |awk '!array [$0]++')
for loop in $sugrp_list
do
sugrp_list=$(lsgroup -a users $loop | awk -F= '{print $2}')
if [ "$sugrp_list" = "" ]
then
sugrp_list=" -- No Members --"
fi
printf "%-10s %-40s\n" "$loop" "$sugrp_list"
done
|
목록 1의 su_rep1 실행 시, 필자의 시스템에서는 다음과 유사한 결과가 출력된다.
user su groups *(Denied su access) ========================================= charlie *sun dxtans smoke papa syb root admin sysadmin ukflag *fire *cloud earth xray water earth *smoke zulu fire sugroup sugroup members ========================== admin dxtans sysadmin john,peter,jane smoke papa sun alpha,bravo water delta,echoa,golf,plutt earth zulu fire delta,echoa,golf,hotel,india,juliet,kilo,plutt syb wwpdpga1,wwpdclt2,ukflag cloud hotel,india,spoll |
시스템 관리자는 Sugroup을 사용하여 그룹 멤버십을 기준으로 개별 사용자 계정에 대한 액세스를 제어할 수 있다. Sugroup에서는 시스템에 대한 보안 정책을 구현하고 관리하는 한 가지 방법을 제공한다. 감사를 받을 때 감사자에게 일반 계정과 애플리케이션/시스템 계정 간의 액세스 제어와 sugroup 보안 모니터링 방법을 입증해야 한다. 본 기사에서는 sugroup의 구현 방법을 설명했다. 또한, sugroup 액세스 권한을 표시하기 위한 스크립트도 제공되었다.
교육
- 추가 정보는 su and chuser
매뉴얼 페이지를 참조한다.
토론
- Twitter의 developerWorks 페이지를 살펴보자.
- My developerWorks 커뮤니티에 참여하자.
-
AIX 및 UNIX® 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- Virtualization Forum
- 기타 AIX and UNIX Forums
