[여기보기] 내 서버도 머글이 지나갈 수 없는 9와 4분의 3 승강장처럼

🧐 | 2022-09-05

[여기보기]는 “여기서 보안의 기본을 챙기고 가자”의 약자로, 개발 과정에서 꼭 최소한으로 챙기면 좋을 보안 기초 설정을 앞으로 하나씩 공유할 예정입니다. 기초 내용이 주를 이루겠지만, 혹시라도 빼먹고 계신 것이 없는지 가끔 한 번씩 둘러봐 주세요.

안녕하세요, 넷마블 보안실 보안개발팀 조남선입니다.

영국 런던 킹스 크로스역에는 머글은 지나다닐 수도 없고 볼 수도 없는 9와 4분의 3 승강장이 있습니다. 반면, 해리포터와 헤르미온느 같은 마법사들은 자유롭게 지나가며 호그와트로 갑니다. 마법사들만 쓸 수 있게 마법을 걸어놨다는군요. 단, 돌아서 나올 땐 시간차를 두고 나와야 하는 규칙도 있습니다.

리눅스 서버도 호그와트처럼 특정 조건이 부합할 때만 접근할 수 있는 9와 4분의 4 승강장이 있다면 어떨까요? 혹시라도 뚫고 들어온 머글이 있다면, 어떻게 들어왔는지 흔적을 빨리빨리 찾으려면 어떻게 해야 할까요? 특별한 마법을 쓰지 않아도 서버로 접근하는 경로와 머무르는 시간 등을 설정하는 방법을 살펴보겠습니다.

접속할 수 있는 IP 주소와 포트 제한

웹 서버 하나가 있다고 가정해보겠습니다. 개발한 웹페이지에 브라우저로 접근해서 서비스를 사용하는 접속도 있지만, 그 웹페이지가 동작하도록 올려둔 웹 서버 자체에 들어가서 제어하는 접속도 있습니다. 이 둘의 접속은 같은 웹 서버로 접근하는 것이므로 IP는 같겠지만, 서로 다른 포트를 사용합니다. 서비스 운영을 위해 일반 사용자의 웹 페이지 접근은 허용하는 것이 맞으나, 웹 서버 자체로 접근할 사용자는 제한해두는 것이 좋습니다.

이때, 접근할 사용자를 ID가 아니라 IP 주소와 포트로 제한한다면 통상적으로 물리적인 위치까지 제한할 수 있습니다. 인가받지 않은 사람이 들어올 수 없는 곳에서만 쓸 수 있는 IP라면, 그 자체만으로도 보호막이 하나 생긴 셈이니까요.

조치 방안

접근하는 IP와 포트를 제한하는 방법은 여러 가지가 있습니다. 방화벽 설정으로 막거나, 웹 서버 설정으로 막는 방법은 다음 기회에 소개하기로 하고, 리눅스 서버에서는 TCP 래퍼(Wrappers) 설정 파일인 ‘/etc/hosts.allow’ 파일과 ‘/etc/hosts.deny’ 파일을 수정해서 제어할 수 있습니다.

두 파일 중 ‘/etc/hosts.allow’ 파일을 우선 인식하며, 두 파일 모두에 적용돼 있지 않은 모든 접근은 허용됩니다. 가끔, 파일 인식 우선순위와 모든 접근 허용인 인식 특징으로 인해 ‘/etc/hosts.deny’에 ‘ALL:ALL’부터 설정하시는 분들도 계십니다. 하지만 전체 접근을 막는 설정으로 인해, 나머지 설정을 위해 다시 접속하지 못하는 불상사가 발생하기도 하므로 주의하시길 바랍니다.

기본 설정 형식은 “<데몬 이름> : <설정 IP 주소>” 형태를 따릅니다. 옵션을 함께 넣는 방법도 있으니, 가이드가 필요하시면 위에 첨부한 레드햇 가이드 링크를 참고해주세요. 아래 예시 설정은 192.168.0.1에서 접근하는 SSH 접속만 허용하고 나머지 접근은 모두 막는다는 의미입니다.

$ vi /etc/hosts.allow

sshd : 192.168.0.1 


$ vi /etc/hosts.deny

ALL : ALL

텔넷보단 SSH

아마 대부분 별다른 비교나 고민 없이, 이미 SSH(Secure Shell)나 SSH용 클라이언트 등을 사용하고 계실 것 같습니다.

텔넷은 대부분 원격으로 서버에 접속하는 용도로 활용했었습니다. 하지만 암호화하지 않은 상태로 데이터를 전송했기에 아이디와 패스워드 같은 중요 정보가 스니핑(Sniffing) 등의 공격을 통해 외부로 유출될 위험성이 있었습니다. SSH는 텔넷(Telnet)에서 부족했던 보안 요소인 암호화를 강화한 프로토콜로, 비교적 안전한 통신 방식을 쓴다고 볼 수 있습니다. 그래서 이 둘이 서버와 통신하는 사이에 오가는 패킷을 비교하며 시큐어 셸(Secure Shell)을 설명하는 글도 심심치 않게 찾을 수 있습니다.

조치 방안

주로 서버용으로 설치하는 리눅스에는 SSH가 기본 설치돼 있습니다만, 설치가 안 된 경우에는 ‘openssh-server’를 설치해서 사용하시면 됩니다.

$ apt-get install openssh-server

$ service sshd status

단, SSH가 기본으로 TCP 22번 포트를 사용한다는 것이 통용되는 정보이다 보니, TCP 22번 포트는 침입자가 공격하기 좋은 타깃 포트라 할 수 있습니다. 이를 막으려는 경우에는 SSH로 사용하는 포트를 다른 포트로 변경해서 쓰는 것도 좋은 방법입니다.

로그인과 로그온 배너

로그인과 로그온은 서로 비슷하면서도 다른 의미가 있습니다. 주로 통용되는 의미로 구분하자면, 로그인은 서버 접근 권한을 얻는 자격 증명 단계이며, 로그온은 서버에 접근하거나 방문하는 과정과 결과입니다. 단순히 보면, 로그인은 서버에 접근 시도한 단계고, 로그온은 서버에 접근 완료한 단계라고도 볼 수 있습니다. 로그인을 통해 로그온하는 셈이죠.

리눅스에는 로그인과 로그온 두 단계 모두에 배너를 추가할 수 있습니다. 이 배너 메시지를 활용하면, 관계자만 서버에 접근할 수 있다는 경각심을 심어 줄 경고 메시지를 보여줄 수 있습니다.

배너 메시지 자체로는 직접적인 방어 효과가 없습니다. 다만, 서버 기본 설정값으로 인해 로그인과 로그온 시도 과정에서 서버 종류와 OS 버전이 노출될 수 있습니다. 이런 정보는 공격자에게 해당 OS 취약점을 활용할 힌트가 됩니다. 또한, 공격자의 활동을 주시하고 있다는 생각을 상기시켜 간접적인 효과를 얻을 수 있습니다.

조치 방안

FTP, SMTP, DNS 등에도 아래와 같은 맥락에 맞춰 경고 메시지를 추가할 수 있으니, 필요시 설정 파일을 수정해서 사용하시면 됩니다.

로그인

‘/etc/issue.net’ 파일에 기록한 메시지는 텔넷(Telnet) 접속 시 보여주는 내용입니다. 이 파일 안에는 기본적으로 OS 버전이 표기돼 있어, 텔넷을 쓰지 않더라도 미리 수정해두는 것이 좋습니다. SSH로 로그인할 때 보여주는 파일을 ‘/etc/issue.net’으로 지정하고, 이 파일 수정하면 한 번에 관리할 수 있습니다.

$ vi /etc/ssh/sshd_config

# sshd_config 파일에서 주석 처리된 Banner에 파일 경로가 있습니다.
#Banner /some/path

# 이 경로를 issue.net 파일로 변경합니다.
Banner /etc/issue.net

이제 배너 메시지를 수정합니다.

$ vi /etc/issue.net

****************
I am Groot!!!!!!
****************

마지막으로, ‘sshd’를 재시작해서 변경한 설정을 적용합니다.

$ service sshd restart

로그온

로그온 배너는 ‘/etc/motd’ 파일을 새로 추가하거나 수정하면 됩니다.

$ vi /etc/motd

^^^^^^^^^^^^^^^
I am Groot!!!!!
^^^^^^^^^^^^^^^

세션 타임아웃

“이상한 변호사 우영우 15화”에서 나온 아이들 타임아웃(Idle Timeout)과 리눅스 서버에서 설정하는 세션 타임아웃(Session Timeout)은 본질적으로는 완전히 다른 의미입니다. 하지만 세션이나 커넥션 풀에 반응이 생기지 않는 유휴 시간을 제한하는 동작 방식으로 인해, 결과적으로는 거의 비슷한 동작 결과를 사용자에게 제공합니다. (주로 아이들 타임아웃은 데이터베이스나 네트워크 솔루션 등에서 사용합니다.)

세션(Session)은 프로세스끼리 통신하기 위해 서로 인식한 이후부터 통신을 마치는 순간까지 소요하는 시간을 의미합니다. 그래서 세션 타임아웃(Session Timeout)을 설정하면 이 사이 소요 시간이 바뀝니다. 통신을 시작하지 않은 채 세션이 끝나거나 통신을 시작했더라도 응답이 오지 않은 채 세션이 끝나면, 흔히 우리가 말하는 “세션이 끊어졌다”라는 상황인 거죠.

세션 타임아웃을 설정하지 않으면, 비인가자나 공격자가 계속 접속을 유지 중인 세션을 악용할 여지가 생깁니다. ““이상한 변호사 우영우” 15화에 나온 아이들 타임아웃 미설정으로 받은 영향이 비슷한 사례라 할 수 있습니다. 세션 시간 기본 설정값은 20분(1200초)입니다. 각자의 기준에 맞춰서 이 값을 조정하시면 됩니다.

조치 방안

세션 타임아웃은 사용하는 셸 종류에 따라 설정이 조금 다릅니다. 주로 사용하는 ‘bash’는 ‘/etc/profile’ 파일에 설정값을 추가하거나 수정하면 됩니다.

$ vi /etc/profile 

export TMOUT=1200 
# 시간 단위는 ‘초’입니다.

모니터링 용도로 세션을 유지해야 하는 계정이 있다면, 세션 타임 설정 시 해당 계정만 예외처리해 두시면 됩니다.

시스템 로깅

위와 같은 조치를 하더라도, 공격자는 수단과 방법을 가리지 않고 끊임없이 침투 시도할 것입니다. 결국 시스템 관리자가 서버에 접근할 방법이 있는 것처럼 어딘가는 열려있을 것이고, 관리 부실로 이어지는 순간을 공격자는 놓치지 않을 테니까요.

시스템 로그에는 보안 사고 발생 시, 원인이나 각종 침해 사실을 확인하기 위해 필요한 핵심 정보가 들어 있습니다. 단, 로깅 설정이 잘 됐었다는 가정이 붙어야만 합니다. 로깅 설정이 부실하다면 원인 규명이 어렵고, 법적 대응을 위한 충분한 증거도 부족할 수 있습니다.

그렇다고 감사 설정 수준을 너무 높이면, 보안 로그에 불필요한 항목이 많이 기록됩니다. ‘auth’, ‘authpriv’, ‘cron’, ‘daemon’, ‘kern’, ‘lpr’, ‘mail’, ‘syslog’, ‘user’ 등 모두 다 과유불급이죠. 너무 많은 로그는 매우 중요한 항목을 혼동하게 만들며, 시스템 성능에도 심각한 영향을 줍니다.

그래서 ‘법적 요구사항’과 ‘조직 내부 정책’이라는 기준을 명확히 세우고, 필요한 로그 수준을 잘 정의하고 정리해야 합니다.

조치 방안

주로 사용하는 시스템 로그 수집기는 ‘rsyslog’입니다. 그래서 로그 설정은 ‘rsyslog’의 전체 설정 파일인 ‘/etc/rsyslog.conf’ 파일과 추가 설정 파일이 들어있는 ‘/etc/rsyslog.d/’ 디렉터리에 있는 하위 파일들이 담당하고 있습니다.

‘rsyslog’에서 로그를 설정하는 기본 형식은 아래 형태와 같습니다. 로그 파일을 저장하는 디렉터리와 파일 이름을 넣는 위치에는 ‘rsyslog’가 지원하는 원격 저장 정보를 넣어도 됩니다. 자세한 메시지 종류, 메시지 우선순위, 실행할 액션에 대한 자세한 내용은 위에 첨부한 공식 문서를 참고해주세요.

[메시지 종류(서비스 이름)].[메시지 우선순위(로그 레벨)]	[로그 파일 저장 디렉터리와 파일 이름(실행할 액션)]

# 예시
*.info:mail.none:authpriv.none:cron.none	/var/log/messages
authpriv.*	/var/log/secure
mail.*	/var/log/maillog
cron.*	/var/log/cron
*.alert	/dev/console
*.emerg	*

‘rsyslog’ 데몬을 재시작해야 수정한 설정이 반영됩니다.

$ service rsyslogd restart

모든 로그를 남기도록 설정할 경우, 시스템 성능 저하 이외 로그 저장에 따른 서버 용량 부족 문제도 발생할 수 있습니다. 꼭, 정책에 맞는 로그 설정 기준을 세우고, 필요시에는 원격 저장소에 로그 파일을 저장하는 기능을 함께 쓰시길 추천합니다.

호그와트를 지켜보자

잠깐 언급했었지만, 얼마 전 종영한 “이상한 변호사 우영우” 드라마 다들 보셨을까요? 15화에서 데이터베이스 관리자가 본인 PC에서 접속 상태를 유지한 채 퇴근했다가 침투당한 에피소드가 나왔었습니다. 재판에서 ‘아이들 타임아웃(Idle Timeout)’이라는 단어가 나오며, 타깃 된 악성코드라 아이들 타임아웃 설정을 했더라도 뚫렸을 거라는 항변이 나오기도 했습니다. 보안을 담당하는 우리에겐 다소 가슴 아픈 이야기이긴 하지만, 실제로 아이들 타임아웃 설정 하나만으로는 조치가 부족한 것이 맞기도 합니다.

APT(Advanced Persistent Threat, 지능형 지속 공격)와 소셜 엔지니어링(Social Engineering, 사회공학) 앞에서는 단순히 잘 갖춘 시스템만으로는 방어 요소가 부족할 수 있습니다. 그럼에도 불구하고, 요소마다 한 겹 두 겹 쌓아 올린 방어막은 적시에 큰 역할을 할 것입니다. 호그와트로 가는 관문인 9와 4분의 3 승강장을 만들 수 있다는 믿음으로 오늘 하루도 힘내시길 바랍니다.