- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: id, whoami, echo
키워드: 실행 사용자, 권한, root
사용처: 어떤 스크립트를 지정한 사용자 이외는 실행 금지하고 싶을 때
실행 예제
$ whoami
user1
$ ./id-script.sh
[ERROR] batch1 사용자로 실행하세요
스크립트
#!/bin/bash
# 스크립트 실행을 허용할 사용자 정의
script_user="batch1" # --------------------------------- 1
# id 명령어로 현재 사용자를 취득, 정의와 일치하는지 확인
if [ $(id -nu) = "$script_user" ]; then # -------------- 2
# 허가 사용자면 배치처리 실행
./batch_program # ------------------------------------ 3
else
echo "[ERROR] $script_user 사용자로 실행하세요." >&2 # ---- 4
exit 1 # ---- 4
fi
해설
이 스크립트는 현재 스크립트를 실행하는 사용자명을 확인해서 지정한 사용자만 실행 할 수 있도록 제어합니다.
배치처리를 하는 프로그램이 로그 파일이나 임시 파일을 출력한다면 실행 사용자에 주의해야 합니다. 예를 들어 이 예제에서는 batch1이라는 사용자가 실행한다고 가정하는데 잛못해서 user1 사용자가 실행하면(스크립트에 따라 조금씩 다르지만) 권한 문제로 로그 파일 기록이나 임시파일 출력이 불가능할 수도 있습니다.
또한 서버 운용시 있을 법한 일을 예로 들면, root라면 에러가 발생하지 않을 거라는 생각으로 root 사용자로 배치 처리 프로그램을 실행하는 경우가 있을 수 있습니다. 그러면 로그 파일이나 임시 파일 등이 root 사용자 파일로 작성되어서 파일 소유자가 root가 되므로 다음 번에 정상적인 사용자가 실행 했을 때 처리에 실패하기도 합니다.
이런 이유에서 특정 프로그램을 실행하는 사용자를 제한하고 싶을 때가 있습니다. 그럴 때 사용하는 것이 이 예제입니다. 1 에서 프로그램 실행을 허가할 사용자를 지정합니다. 여기서는 batch1이라는 사용자를 실행 허가합니다.
2에서 현재 스크립트를 실행한 사용자가 허가된 사용자인지 확인합니다. id 명령어는 현재 사용자 정보를 표시하는 명령어입니다. id 명령어를 인수 없이 실행하면 사용자ID, 그룹ID, 소속 그룹을 표시합니다.
- id 명령어를 인수 없이 실행한 예
$ id uid=500(user1) gid=500(user1) groups=500(user1)
2에서 id 명령어에 사용자 ID만 표시하는 -u 옵션과 ID가 아니라 이름을 표시하는 -n 옵션을 조합해서 사용합니다. id -nu 결과를 명령어 치환$()으로 취득해서 현재 사용자명을 취득합니다. 이 값을 허가 사용자명을 대입한 셸 변수 script_user1과 = 연산자로 비교합니다.
현재 사용자명과 허가 사용자명이 일치하면 바른 실행 사용자라고 판별 가능하므로 3에서 외부 프로그램을 실행합니다. 또는 셸 스크립트 첫 부분에 이런 처리를 넣어서 셸 스크립트 자체를 실행할 사용자를 제한하는 방법도 자주 사용합니다. 그리고 3에서 실행하는 batch_program은 배치 처리를 하는 외부 프로그램이라고 가정합니다.
현재 사용자명과 허가 사용자명이 일치하지 않으면 에러를 표시하고 종료합니다 4. 이렇게 해서 프로그램 실행 사용자를 제한할 수 있습니다.
현재 사용자명을 취득하려면 id 명령어 이외에도 whoami 명령어를 사용하는 예와 환경변수 $USER를 사용하는 방법도 있습니다. 어느 쪽이든 결과는 같습니다.
- 현재 사용자명 취득 방법
$ whoami user1 $ echo $USER user1
사용자명을 취득하는 명령어는 자주 사용하므로 기억해두기 바랍니다.
주의사항
- 스크립트 실행할 사용자를 제한하는 방법으로 파일 권한 역시 자주 사용됩니다. 예를 들어 스크립트파일의 권한을 754(-rwxr-xr–)로 설정하면 파일 소유자와 그 그룹에 속한 사용자만 실행 할 수 있습니다. 이럴 때 배치를 실행할 그룹을 만들고 실행 허가할 사용자를 해당 그룹에 넣어 운용합니다.
- 여기서 배치 처리를 예로 설명했는데 실행 가능한 사용자를 제한하는 것은 서버에 상주하는 데몬타입 프로그램의 보안 면에서 중요합니다. 일반 사용자 권한으로 동작하는 프로그램을 실수로 root로 실행하지 못하게 하는데 자주 사용합니다.예를 들어 자바 서블릿 컨테이너인 톰캣은 root와 일반 사용자 모두 실행할 수 있는데 보안 면에서 root 권한으로 실행하는 것을 비추합니다. 만약 탑재한 자바 애플리케이션에 취약점이 있다면 일반 사용자 권한이 아니라 root 권한을 탈취 당할 가능성이 있어서 위험합니다. 이런 프로그램은 래퍼 스크립트를 만들어서 root 권한으로는 실행하지 못하도록 할 수 있습니다.