본문 바로가기
취약점 점검/리눅스 서버

U-01) root 계정 원격접속 제한

by _Jay_ 2022. 6. 5.
반응형

 

 

오늘부터 "주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드"(이하 주통기 점검 가이드)를 기반으로 각 취약점 점검 항목을 쉽게 풀어서 정리해보도록 하겠습니다. 사실 이런 내용들은 구글에 검색하면 이미 티스토리를 포함한 많은 블로그에서 다루고는 있지만, 주통기 점검 가이드의 점검 항목을 요약하거나 핵심만 정리한 글들이 많아서 제가 쓰는 글에서는 책을 읽는 느낌으로 좀 더 자세히 설명을 하고자 합니다. 물론 최근 트렌드가 필요한 정보만 딱 집어서 핵심만 전달하고 그런 글들이 인기가 많다는 것을 알고 있지만, 추후 책 집필도 염두해두고 있기에 제 경험을 살려서 나름대로 진행해보고자 합니다.

주통기 점검 가이드에서는 첫 번째 대단원으로 Unix 서버 보안을 다루고 있고, 그 안에 계정 관리파일 및 디렉토리 관리, 서비스 관리, 패치 관리, 로그 관리로 나눠지게 됩니다. 이번 글에서는 Unix 서버 보안의 계정 관리에서 가장 첫 점검 항목인 "root 계정 원격 접속 제한" 항목에 대해서 이야기해볼텐데요. 가이드에서는 Unix 서버 안에 솔라리스(Solaris)나 AIX, HP, 리눅스(Linux) 서버로 나눠서 각 점검 방법과 조치 방법을 설명하고 있지만, 처음 시작하는 분들 입장에서 리눅스 서버를 가장 많이 배우기도 하고, 실제 점검을 나가도 리눅스 서버를 많이 보기에 리눅스 서버를 기준으로 설명해보도록 하죠.

먼저 주통기 점검 가이드에 설명되어 있는 점검 내용, 목적, 판단 기준, 조치 방법에 대해 요약해서 보여드리고, 그 후에 각 관련 내용을 같이 설명해보도록 하겠습니다. 여기서 점검 항목에 있는 운영체제 별 파일 위치나 점검 방법에 대해 별도로 이야기하지 않는 것은 리눅스 운영체제에도 데비안(Debian), 레드햇(Redhat), 우분투(Ubuntu), 센토스(CentOS)와 같은 다양한 배포판이 존재하고, 각 배포판 마다도 점검해야할 파일의 위치가 조금씩 달라지기 때문입니다. 그래서 실제 보안 업체에서도 배포판 마다 점검 스크립트를 다르게 사용하고, 리눅스 버전에 따라서 제대로 결과가 나오지 않을 때는 수동으로 처리하기도 합니다.

여기서는 모의해킹이나 취약점 진단 공부를 할 때 가장 많이 사용하는 칼리리눅스를 기준으로 설명하려고 합니다. 하지만 또 칼리리눅스의 버전에 따라 실제 파일 위치가 달라질 수 있으니, 이럴땐 당황하지 마시고 구글링을 통해서 찾아보시기 바랍니다. 보안 컨설팅 업체에서도 실제 고객사에 나가서 점검 스크립트를 통해 인프라 취약점을 점검할 때, 환경이 다르다 싶으면 그때 그때 구글링을 통해 스크립트를 변경해서 대응하곤 합니다. 구글에 검색을 하다보면 대부분 영문으로 작성된 글이 많겠지만, 필요한 내용만 찾으면 되기에 익숙하지 않으신 분들도 금방 익숙해지실 겁니다.

 

 

사실 리눅스 서버의 root 계정 접속 제한 점검 항목은 지루할 만큼 많이 보셔서 굳이 다시봐야하나 하는 느낌이 드실 수 있습니다. 그런데 너무 당연하다 생각해서 쉽게 지나칠 수 있는 부분이기도 하죠. 저희가 처음 리눅스를 접했을 때, 윈도우 운영체제 위에 Vmware와 같은 가상화 프로그램을 설치해서 그 위에 리눅스 서버를 설치하고 Putty와 같은 원격 접속 터미널 프로그램으로 붙을 때를 생각해봅시다. 아마 대부분은 OpenSSH와 같은 SSH 서비스 설정에서 "PermitRootLogin"을 옵션을 yes로 바꾸고 Putty에 원격으로 접속했을텐데요. 왜냐하면 처음 배우는 입장에서 root 계정으로 접속해야 조금 더 편하게 실습을 할 수 있기 때문이죠.

굳이 초기 설정이 주석으로 되어있던 설정을 바꿔서 root로 로그인하다니, 이미 첫 실습부터 의도적으로 취약한 리눅스 서버 환경을 만든 것과 다름 없는데요. 결국 root라는 계정 자체가 관리자 계정인 만큼, 일반 계정에 비해서 더 높은 권한을 가지고 있어서 외부에 노출되면 문제가 됩니다.

 

리눅스가 다중 사용자 환경이다보니 일반 계정의 경우 /home 디렉토리 밑에 각각의 계정 디렉토리가 생성되고, 그 안에서만 각 유저가 자유롭게 파일을 생성하고 삭제할 수 있죠. 리눅스에서 소위 퍼미션(Permission)이라고 하는 권한을 관리해서 다른 유저(계정)의 디렉토리에 접근하지 못하도록 막는데, root 계정의 경우 이런 것들을 싸그리 무시하고 모든 파일 시스템에 접근할 수 있습니다.

쉽게 생각해서 A라는 기업의 리눅스 서버에 웹 서버를 운영하는데 필요한 소스코드와 같은 중요한 자료가 있을 때, root 계정으로 원격 접속이 활성화가 되어 있고 Brute Force(무작위 대입) 공격 등을 통해 패스워드를 알아내서 정보를 유출한다면.. 당연히 여러 개발자가 일반 계정으로 작업을 할텐데 root 계정으로 정보가 유출되는 것이 일반 계정으로 유출되는 것보다 더 큰 피해를 입겠죠.

 

사실 Brute Force 공격은 추후 설명할 "U-03) 계정 잠금 임계값 설정" 부분에 의해 막힐 것이고, 워낙 보안 솔루션들이 잘되어 있다보니 비정상 접근이 발생하면 해당 IP 접속은 금방 차단되긴 합니다. 극단적인 예를 들었지만 그만큼 가장 기본적인 부분이라는 걸 말씀드리고 싶네요.

그러면 이 부분을 어떻게 점검할 것인가에 대해 말씀드리기 전에, 리눅스 서버 취약점 점검 스크립트에 대해서 잠깐 설명드리면, 보통 쉘 스크립트로 작성되고 sudo 명령어를 통해 관리자 권한으로 실행해야 합니다. 왜냐면 보통 리눅스 설정 파일들이 들어있는 /etc 디렉토리의 내용을 읽어야 하는데 이때는 일반 권한으로 접근이 불가하기 때문이죠. 쉘 스크립트에 대한 자세한 설명은 나중에 하도록 하고, 간단히 root 계정 원격접속 제한을 점검하는 방법에 대해 설명해보도록 하겠습니다.

칼리리눅스를 기준으로 SSH 서비스의 설정은 /etc/ssh/sshd_config 파일에 존재합니다. 이 파일을 vi를 통해 아래로 내리다보면 "PermitRootLogin" 옵션이 있을테고, root 계정으로 원격접속을 허용한 경우 yes로 되어있겠죠. 그럼 결국에 이 파일에서 해당 옵션이 yes라면 취약하다는 이야기 일테고, 파일의 내용을 보여주는 cat 명령어파일의 내용을 검색하는 grep 명령어를 파이프('|')로 조합하여 다음과 같이 검색해볼 수 있을 겁니다.

 

root@kali:~# cat /etc/ssh/sshd_config | grep "PermitRootLogin yes" | wc -l
1

 

"wc -l" 명령어는 검색된 문자열의 라인 수를 알려주는 명령어로 만약 결과가 1이 나왔다면, root 계정으로 원격 접속을 허용했다는 말이 됩니다. 보통 쉘 스크립트에서는 저 명령어를 실행시킨 결과를 변수에 넣고 1과 비교해서 결과를 양호와 취약으로 분류를 하게 되죠. 여기서는 SSH만 예를 들었지만 주통기 점검 가이드에서는 Telnet에 대한 내용도 나오는데, 설정 파일의 위치와 옵션만 안다면 위의 명령어를 활용해서 점검하실 수 있습니다. 그리고 마지막으로 조치 방법은 해당 설정 파일에서 "PermitRootLogin" 옵션을 다시 주석처리하거나 no로 바꿔주는 것이겠죠. 이로써 root 계정 원격접속 제한 항목의 점검 방법부터 점검 조치까지 알아봤습니다.

여기서 한 가지 더 말씀드리면 추후 모바일 앱도 취약점을 점검하실 때도 이와 비슷한 "루팅 기기에서 정상 동작" 점검 항목이 존재합니다. 안드로이드 기준으로 말씀드리면 안드로이드도 결국 리눅스 커널 기반으로 개발된 운영체제다 보니, 리눅스 서버에서 문제가 되었던 root 계정이 안드로이드에서도 동일하게 문제가 됩니다.

 

삼성과 같은 제조사에서 모바일 기기를 출시할 때는 root 계정이 아닌 일반 권한으로 동작하게끔 만드는데, 리눅스 커널 취약점 등을 이용하여 root 권한을 얻는 루팅(Rooting)을 수행할 수 있습니다. 그러면 루팅된 안드로이드 기기에서는 모든 파일 시스템에 접근이 가능하게 되고 이러한 루팅된 기기에서 앱을 실행시키는 건 당연히 문제가 되겠죠. 이 항목도 같이 알아두시면 추후 모바일 앱 취약점 점검을 할 때도 도움이 되시리라 생각합니다.

여기까지 주통기 점검 가이드의 리눅스 서버 계정 관리 부분 첫 번째 항목인 root 계정 원격접속 제한에 대해 알아보았습니다. 그림도 없이 죄다 글로만 서술하고 기본적인 설명만 있기에 자칫 지루했을 것 같은데요. 사실 비전공자 입장에서 처음 공부할 때 어떻게 하면 좀 더 쉽게 설명할 수 있을지 생각하면서 썼기에, 이미 이 부분에 대해 잘 아는 전공자시라면 진부한 이야기일 수 있습니다. 그래도 이쪽 분야를 준비하시는 분에게 제가 대학원과 실제 현업에서 겪었던 경험을 공유하는 차원으로 썼기 때문에 도움이 되었으면 하는 바람입니다. 그럼 이번 글은 여기서 마치도록 하고 다음 글에서 뵙도록 하겠습니다. 감사합니다.

 

 

반응형

댓글