Unix 및 Linux 운영체제에 설치되는 다양한 상용 애플리케이션들은 각자의 관리자 계정을 필요로 한다. 오라클, 웹로직은 물론 국산 S/W 들도 각각의 관리자 계정을 만들 것을 요구한다. 따라서 각각의 서비스를 구동/중지하기 위해서는 각 계정의 패스워드를 알고 있어야 하며 일반 계정 혹은 root 계정으로 로그인하여 su (Switch User) 명령을 통해 해당 계정의 Shell을 획득해야 한다.
서비스를 구동/중지 하는 사람이 한명이거나 모두 신뢰할 수 있는 사용자라면 모두에게 각 서비스 관리자 계정의 패스워드를 알려주어도 관계가 없겠지만 보안 정책상 그렇게 하지 못하는 경우가 있다. 그리고 서버의 보안을 강화히기 위해서는 각각의 서비스 관리자 계정의 패스워드를 여러사람이 공유하는 것, 그리고 관제실을 운영하여 오퍼레이터가 있는 경우에는 오퍼레이터에게 서비스 관리자 계정의 패스워드를 알려주는 것은 결코 바람직하지 못하다.
많은 내부자에 의한 보안사고가 서비스 관리자와 root 계정의 패스워드를 공유하여 직접적인 관계가 없는 사람들에게 패스워드가 유출되어 발생하고 있다. 그리고 그러한 경우에는 보안사고 자체의 발생조차 인지하지 못하고 지나치는 경우가 많은 것으로 보안업계에서는 보고 있다.
이런 문제를 해결하기 위해서는 root와 서비스관리자(oracle, weblogic, tmax 등)의 Shell 획득 없이 일반계정에서 서비스 관리자 계정에서 실행해야만 하는 단순한 작업, 예를 들면 서비스의 구동/중지/상태확인 정도의 행위만 할 수 있도록 해주는 프로그램을 작성하여야 한다.
예를 들면…
1. taeho 라는 일반 계정(단순 오퍼레이터 역할)이 있다.
2. oracle 데이터베이스와 weblogic이 설치되어 있고 각각의 계정에서 실행/중지 해야한다.
3. taeho 라는 계정에게 oracle과 weblogic의 비밀번호를 알려주지 않아야 한다.
4. taeho 라는 오퍼레이터가 oracle과 weblogic의 구동과 중지만 할 수 있어야 한다.
이런 요구사항이 있을 때 Unix와 Linux의 운영체제 기능만으로는 구현할 수 없으며 이 요구사항을 충족시키기 위해서는 별도의 프로그램이 필요하다.
그래서 만든 프로그램의 구조는 다음 그림과 같다.
이 프로그램은 하나의 실행파일(C로 코딩)과 하나의 설정 파일로 구성된다.
설정파일에는 [oracle] 과 같이 [ ] 로 식별되는 Service Name, 그리고 Option (Action Type)과 해당 서비스가 구동되어야 하는 계정, 그리고 실제 실행될 스크립트로 구성된다.
이 프로그램은 두가지의 운영체제에서 지원되는 권한 이동 개념에 의해 작성되어 있다.
먼저 setuid bit를 이용해 이 프로그램을 실행하는 일반계정에서 root 권한을 얻고 root 권한을 얻은 뒤 setuid() 함수를 이용해 완전하게 root 계정으로 전환한다. 그리고 서비스 설정 파일에 설정된 서비스 구동 계정의 계정으로 다시 한번 setuid() 함수를 수행하여 서비스 관리자 계정의 권한을 얻은 뒤 구동될 스크립트를 실행한다
물론 프로그램이 종료되면 원래의 계정으로 돌아온다.
이 프로그램을 이용하면 일반 OP혹은 root 계정의 패스워드를 알려주기 껄끄러운 사용자에게 root 계정은 물론 oracle, weblogic 등 중요한 관리자 계정의 패스워드와 Shell 권한을 주지 않고도 중요 서비스의 여러 명령들을 실행하여 필요한 정보를 획득할 수 있도록 해줄 수 있다.
궂이 구동 중지가 아니더라도 어떠한 명령도 실행하도록 설정하면서 권한을 제한할 수 있다.
— 2009. 02. 봄비 내리는 어느날… —