이번 글에서는 주통기 점검 가이드의 45번째 항목인 "root 계정 su 제한"에 대해 다뤄보도록 하겠습니다. 개정 전 가이드에서는 6번째로 나와있던 점검 항목이면서 계정 관리 부분에 포함된 부분이죠. 오늘 설명드리는 항목도 지난 "U-44) root 이외의 UID가 '0' 금지" 항목처럼 일반 계정의 root의 권한을 사용할 수 없도록 점검하는 것과 비슷한 맥락으로 보시면 됩니다. 이번에는 이전에 언급하지 못했던 리눅스의 권한 체계와 그룹 계정에 대해서 설명드릴텐데, 일단 점검 항목에 대해 개요를 간단하게 정리하도록 하겠습니다.
점검 내용을 보시면, su 명령어를 사용할 수 있는 사용자 계정을 지정한 그룹이 존재하는지 점검한다고 써있죠. 리눅스에서 su 명령어는 한 번씩 써 보셨겠지만 "Switch User" 또는 "Select User"의 약자로 사용자 계정을 전환하는 명령어입니다. 보통 "su test"와 같이 뒤에 계정명을 붙임으로 다른 계정으로 바꿀 수 있지만, "su"만 입력했을 때는 root 계정으로 전환이 가능하죠.
보통 리눅스를 처음 공부하실 때 Vmware나 VirtualBox 같은 가상 머신 위에 설치해보셨을 텐데, root 계정 외에 sudo 권한을 가지는 사용자 계정을 만들어서 사용하다가 sudo 명령어를 붙이는게 귀찮아서 root 계정으로 스위치해서 사용해본 경험이 있으실 겁니다. 이 때 발생하는 문제가 아무 사용자 계정이나 su 명령어를 이용해서 root 계정으로 스위치가 된다면, 루트 권한을 마음대로 이용할 수 있다는 것이죠.
리눅스 서버의 경우 다중 사용자 운영체제이기 때문에, 한 서버에 여러 사용자가 ssh와 같은 원격 터미널 프로그램을 이용해서 접속할 수 있다는 것은 다들 아실겁니다. 그런데 리눅스 서버에 root 계정으로 원격 접속을 제한해놨다고 하더라도, 일반 사용자 계정가 su 명령어를 통해 root로 접속할 수 있다면 이는 root 계정으로 원격 접속한 것과 동일하게 취급될 수 있겠죠.
root로 원격 접속하는 것을 탐지하는 방법과 일반 사용자 계정으로 su 명령을 통해 root 계정으로 접속하는 것을 탐지하는 방법은 각각 다릅니다. 전자의 경우 외부에서 ssh와 같은 원격 터미널을 이용하는 것이기 때문에 ssh의 원격 접속 로그를 확인해야 하고, 후자의 경우는 시스템 내부에서 발생하는 것이기 때문에 /var/log 디렉토리의 sulog나 auth.log를 확인해야하죠. 물론 이것도 리눅스 배포판이나 버전마다 다르기 때문에 구글링을 통해 각 로그의 위치를 확인하셔야 합니다.
그래서 다시 한번 정리하면, su 명령을 이용해서 아무 계정이나 root 계정으로 전환하면 안된다라는 것이 요지입니다. 진단 방법을 살펴보자면, 가장 먼저 su 명령어를 사용할 수 있는 구성원이 누구인지.. 즉, su 바이너리(=파일)의 권한을 확인하는 겁니다.
혹시 몰라서 더 설명드리자면, 저희가 ls나 su와 같은 명령어를 입력하는 것도 프로그램을 실행시키는 것과 마찬가지입니다. "which ls"와 같이 입력하시면 해당 명령어의 바이너리가 어디에 존재하는지 확인할 수 있는데, 칼리리눅스는 /usr/bin 디렉토리 하위에 있는 것을 볼 수 있죠.
root@kali:~# which su
/usr/bin/su
root@kali:~# ls -al /usr/bin/su
-rwsr-x--- 1 root root 63568 Jan 10 2019 /usr/bin/su
위의 명령어를 보면 "ls -al /usr/bin/su"를 입력했을 때 파일의 정보들이 나오게 됩니다. 첫번째 필드 "-rwsr-x---"가 퍼미션(Permission)이라고 부르는 파일의 권한을 의미하고, 세번째와 네번째 필드가 해당 파일의 소유자와 그룹을 나타내는데요. 우선 파일의 권한 부터 보시면 10자리로 이루어 진 것을 볼 수 있죠.
첫 번째 자리는 해당 파일이 디렉토리인지 아닌지를 알려주며, 디렉토리라면 'd'라고 나오고 파일이면 '-'로 표시합니다. 그리고 두번째에서 네번째까지의 세 자리가 파일 소유자의 권한을 나타냅니다. 즉, 파일을 만든 사람이 해당 파일을 읽고, 쓰고, 실행할 수 있는 권한을 지정해주는 겁니다.
리눅스의 퍼미션에는 r(read/읽기), w(write/쓰기), x(execute/실행) 권한이 존재하고, 각 권한이 있는 경우 해당 알파벳을, 없는 경우에는 '-'로 나타냅니다. 소유자 권한 세 자리가 "rwx"면 읽기, 쓰기, 실행 권한이 모두 존재하는 것이고, "r-x"라면 읽기와 실행 권한만 존재하는 것이죠.
물론 위의 su 바이너리의 경우 권한이 "rws"로 나와있는데, 아직 SetUID에 대해 설명을 드리지 않았기에, 일단 's'는 실행 권한인 'x'와 동일하구나라고 생각하시면 됩니다. 그래서 정리하면 root라는 소유자 계정이 해당 파일을 읽기, 쓰기, 실행을 할 수 있다라는 의미입니다.
다음 다섯번째부터 일곱번째의 세 자리는 그룹 권한을 나타내며, 여기서는 root라는 그룹이 "r-x" 권한을 가지기 때문에 su 파일을 읽고, 실행할 수 있다는 의미입니다. 리눅스에서는 사용자 계정 외에도 그룹이라는 개념이 존재하는데요. 물론 리눅스 이외에 윈도우와 같은 다른 운영체제들도 마찬가지로 그룹 계정이라는 개념을 가지고 있죠. 회사로 치면 영업, 마케팅, 인사, 개발 부서 등 각각의 부서가 접근할 수 있는 디렉토리나 파일의 권한을 별도로 둔다고 생각하시면 되는데요.
한 가지 더 말씀드리자면, 사용자 계정이 만들어질 때 계정 이름과 동일한 그룹도 기본적으로 생성이 됩니다. 해당 그룹에는 한 그룹에 여러 사용자 계정이 포함될 수 있다고 생각하시면 되는데, "cat /etc/group" 명령어를 현재 리눅스에 만들어진 그룹을 볼 수 있으니 이용하면 참고하시기 바랍니다.
마지막으로 여덟번째에서 열번째의 세 자리는 파일 소유자와 그룹 권한 외에 다른 사용자가 가지는 권한을 나타냅니다. 여기서는 "---"이기 때문에 파일 소유자도 아니고 그룹에 속한 사람들도 사용자는 읽기, 쓰기, 실행 모두 불가능하다는 의미인거죠. 여기까지 길게 파일의 권한과 그룹에 대한 개념을 소개드렸는데, 모두 이해하셨다면 su 바이너리의 권한을 왜 진단해야하는지 이해하셨을 겁니다.
결국 모든 사용자가 su를 이용해서 root 계정으로 전환하면 문제가 생기기 때문에, 특정 그룹에 속한 사용자만 su 명령어를 이용할 수 있도록 권한을 제한해야하는데요. 만약 su 바이너리의 권한을 확인했는데 다른 사용자가 실행할 수 있는 권한이 있다고 생각해보죠. 그렇다면 다른 사용자들이 su 바이너리를 실행할 수 없도록 chmod(change mode) 명령어를 이용해서, "chmod o-x /usr/bin/su"와 같이 파일에서 다른 사용자(other)의 실행 권한(x)을 빼주면(-) 조치가 될 겁니다.
또한 특정 그룹만 su 명령어를 이용할 수 있도록 되어있지 않다면 groupadd 명령어로 특정 그룹을 생성하고, 해당 그룹에 속할 계정을 추가해준 뒤 chgrp(change group)나 chown(change owner) 명령어로 su 바이너리의 그룹 소유권을 변경해주면 특정 그룹만 su 바이너리를 실행시킬 수 있습니다.
조금 더 설명드리고 싶지만 각 명령어에 대한 옵션까지 설명하려면 정말 길어지기 때문에, 나머지는 구글링이나 주통기 점검 가이드를 참고하시면 될 것 같습니다. 오늘은 리눅스 권한 체계에 대해 길게 설명드렸는데 이미 아시는 내용일 수도 있지만, 리눅스 취약점을 점검하면서 이 명령어를 왜 사용하는지 왜 이렇게 조치를 해야하는지를 조금 더 자세히 이해하셨으면 해서 말씀드렸습니다. 그럼 이번 글은 여기서 마치죠. 긴 글 읽어주셔서 감사합니다.
'취약점 점검 > 리눅스 서버' 카테고리의 다른 글
U-47) 패스워드 최대 사용기간 설정 (0) | 2022.07.02 |
---|---|
U-46) 패스워드 최소 길이 설정 (0) | 2022.06.25 |
U-44) root 이외의 UID가 '0' 금지 (0) | 2022.06.18 |
U-04) 패스워드 파일 보호 (0) | 2022.06.16 |
U-03) 계정 잠금 임계값 설정 (0) | 2022.06.11 |
댓글