이번에는 주요정보통신기반시설 취약점 점검 가이드에서 리눅스 서버의 53번째 점검 항목인 "사용자 shell 점검"에 대해 말씀드리겠습니다. 이전 점검 항목들을 쭉 보셨던 분들이라면, 계정관리에서는 /etc 디렉토리 내 passwd 파일을 점검하는 항목이 많다는 것을 느끼셨을텐데요. passwd 파일에는 리눅스 사용자 계정이 포함되어서, 침해사고가 발생했을 때 우선적으로 확인하는 파일이기 때문입니다. 이번 항목은 passwd 파일에서 사용자 계정이 사용하는 쉘(Shell)이 정상적으로 부여되어 있는지 점검하는 항목으로, 이전과 마찬가지로 취약점 개요에 대해 먼저 간략하게 정리해보도록 하겠습니다.

그럼 일단 쉘(Shell)이란 것이 무엇인지 먼저 설명드려야겠죠. 쉘(Shell)은 사용자가 입력하는 명령어를 시스템에 전달하여 실행하고 결과를 받아 사용자에게 보여주는 중계 역할을 하는 녀석입니다. 윈도우에서는 explorer가 리눅스의 쉘 역할을 하고 있죠.
사용자 계정에 쉘이 부여되어야지만 명령어를 입력할 수 있고, 이는 /etc/passwd 파일의 일곱 번째 필드에서 확인할 수 있는데요. 보통 /bin/bash나 /bin/sh가 부여됩니다. 해커가 서버 해킹을 시도할 때 최종적으로 얻고자 하는 녀석이 이 쉘이기 때문에, 쉘의 중요성은 더이상 말씀드리지 않아도 충분히 이해하셨으리라 생각합니다.
그럼 이제는 불필요한 계정에 쉘이 부여되어 발생하는 문제에 대해서도 이해하실 수 있으실텐데요. 저번 글에서 해커가 서버에 침투하여 root 권한을 얻었을 때 지속적인 공격을 위해, 백도어(Backdoor) 계정을 생성하여 UID를 변경하는 예시를 들었었죠. 반면 새로운 계정을 생성하지 않고, 기존에 로그인이 불필요한 계정에 쉘을 부여하여 해당 계정을 백도어로 사용하는 방법도 존재합니다.
/etc/passwd 파일의 마지막 일곱 번째 필드에 로그인이 불필요한 계정은 /bin/false 또는 /sbin/nologin으로 적혀있는 것을 보실 수 있을텐데요. 만약 시스템에서 사용하는 계정이지만 로그인이 불필요한 sys나 daemon 계정에 /bin/false를 지우고, /bin/bash라고 입력한 후 저장하면 su 명령어를 통해 해당 계정으로 로그인이 가능한 것을 확인할 수 있습니다.
root@kali:~# cat /etc/passwd | grep -E "^sys:|^daemon:" | awk -F: '{print $7}' | grep -v -E "nologin|false" | wc -l
0
이번 점검 항목은 생각보다 명령어의 길이가 긴데요. 간략하게 정리하자면 /etc/passwd의 파일을 읽어서 주통기 점검 가이드에서 제시하는 로그인이 불필요한 계정들을 먼저 필터링 합니다. 그리고 awk 명령어를 통해 필드를 나눠 일곱 번째 필드만 출력하고, nologin이나 false로 적혀있지 않은 라인의 수가 0인지 확인하면 됩니다.
웬만한 명령어들은 이제 충분히 눈에 익으셨을텐데, grep에서 -E 옵션은 처음 나왔기 때문에 이 부분에 대해 잠시 설명드리면요. 검색하고자 하는 문자열이 여러 개일 때, grep에 -E 옵션을 주고 or을 의미하는 '|' 문자를 써줄 수 있습니다. 참고로 cat /etc/passwd의 결과를 다음 명령어의 input으로 넘기는 파이프('|')와 동일한 문자입니다.
즉, 검색할 부분에 "^sys:|^daemon:"와 같이 입력하면 '^' 문자가 특정 문자열로 시작하는 패턴을 나타내기 때문에 "sys:" 또는 "daemon:"으로 시작하는 라인을 찾아달라는 의미죠. 뒤에 나오는 "grep -v -E ..." 부분은 -v가 해당 라인을 제외해달라는 의미이기 때문에, "nologin" 또는 "false" 문자열을 포함하고 있는 라인을 제외해달라는 뜻입니다.
리눅스 명령어는 제가 첫 글에서 간단한 수준부터 쭉 따라오셨다면, 이제는 어느 정도 익숙해졌으리라 생각합니다. 위와 같은 명령어를 잘 구성하실 줄 아신다면, 추후 설명드릴 쉘 스크립트로 리눅스 서버 취약점 점검 스크립트를 만드실 수 있으실텐데요. 물론 대부분 컨설팅 업체에서는 자체적인 점검 스크립트를 가지고 있겠지만, 공부를 하면서 조금 더 효과적으로 결과를 낼 수 있는 구성을 아시게 되신다면 스크립트를 개선해 보실 수도 있을겁니다.
그럼 마지막으로 조치 방법에 대해 설명하고 넘어가도록 하죠. 사실 운영 목적 상으로 시스템 계정에 쉘을 부여하는 경우는 거의 없기 때문에, 만약 항목이 취약하다고 나왔으면 침해사고가 발생했구나라고 생각하셔도 무방할 것 같습니다. 그래도 가장 먼저 취해야할 방법은 로그인이 불필요한 계정을 usermod -s 명령어를 통해 /bin/false나 /sbin/nologin으로 변경하여 로그인 못하도록 막는 것입니다. 여기까지 "사용자 shell 점검" 항목에 대해 말씀드렸고, 다음에는 "Session Timeout" 설정에 대해 이야기해보도록 하겠습니다. 감사합니다.
'취약점 점검 > 리눅스 서버' 카테고리의 다른 글
U-05) root 홈, 패스 디렉터리 권한 및 패스 설정 (0) | 2022.08.12 |
---|---|
U-54) Session Timeout 설정 (0) | 2022.08.07 |
U-52) 동일한 UID 금지 (0) | 2022.07.24 |
U-51) 계정이 존재하지 않는 GID 금지 (3) | 2022.07.23 |
U-50) 관리자 그룹에 최소한의 계정 포함 (0) | 2022.07.17 |
댓글