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