[여기보기]는 “여기서 보안의 기본을 챙기고 가자”의 약자로, 개발 과정에서 꼭 최소한으로 챙기면 좋을 보안 기초 설정을 앞으로 하나씩 공유할 예정입니다. 기초 내용이 주를 이루겠지만, 혹시라도 빼먹고 계신 것이 없는지 가끔 한 번씩 둘러봐 주세요.
안녕하세요, 넷마블 보안실 보안개발팀 박상순입니다.
[여기보기]의 첫 번째 콘텐츠로 리눅스 서버의 ‘root’를 지키는 최소한의 설정을 가져왔습니다.
다들 아시다시피, 리눅스에서 root 계정은 여러 사용자가 사용하는 서버 전체를 관리하고 총괄하는 막대한 권한을 가진 유일한 특별 계정입니다. 제한 없이 사용자 계정을 생성할 수 있고, 소프트웨어를 설치할 수 있으며, 환경 설정을 변경할 수 있고, 시스템 동작 상황을 감시하거나 제어할 수도 있습니다. 즉, 리눅스에서 root 계정은 절대 권한을 가진 계정입니다. 그래서 항상 조심하고 또 조심해야 하는 계정입니다.
root 계정을 지키기 위한 최소 원칙 4가지를 살펴보겠습니다.
원격 접속을 제한하라!
원격 접속이 허용된 서버는 각종 공격을 받을 수 있기 때문에, 늘 위험이 도사리고 있습니다. 물론 공격을 방어하기 위한 여러 장치를 마련해두기도 합니다. 하지만, 스스로 최소한의 방어를 갖추고 있어야 합니다.
특히, 무작위 대입 공격(Brute Force Attack)이나 사전 대입 공격(Dictionary Attack) 등으로 서버에 침투해 root 계정 정보를 탈취당한다면, 시스템 계정 정보 유출뿐 아니라 파일과 디렉터리 변조 등으로 인해 헬게이트가 열릴 수도 있습니다.
- 무작위 대입 공격(Brute Force Attack): 특정 암호를 풀기 위해 가능한 모든 값을 대입하는 공격 방법
- 사전 대입 공격(Dictionary Attack): 사전에 있는 통용어를 입력해 암호를 해독하거나 알아내는 공격 방법
root 계정은 이미 ID가 ‘root’이므로 비밀번호만 찾으면 되는 만큼, 무작위 대입 공격이나 사전 대입 공격 등으로부터 격리될 수 있도록 비인가자의 root 계정 접근 시도를 원천적으로 차단해야 합니다.
조치방안
리눅스 세부 설정 파일 위치나 명령어 등은 계열별(데비안 레드햇 등)이나 버전별로 다를 수 있으므로, 각자 쓰시는 환경에 맞춰서 찾아보시길 바랍니다.
securetty 파일에서 pts/x 설정 제거
securetty 파일은 텔넷(Telnet) 접속 시 root 계정 접근 제한을 설정하는 파일입니다. 이 파일 안에 ‘pts/x’ 관련 설정이 들어가 있다면, PAM 모듈 설정과 관계없이 root 계정 접속이 허용되므로, 반드시 제거(또는 주석 처리)해야 합니다.
- tty(terminal-teletype): 서버와 연결한 모니터나 키보드 등을 통해 사용자가 콘솔로 직접 로그인함.
- pts(pseudo-terminal, 가상 터미널): Telnet, SSH, 터미널 등을 이용해 접속함.
주로 ‘/etc’ 디렉터리 하위에 있습니다만, 파일이 없다면 새로 생성한 후에 적용하셔도 됩니다.
PAM 모듈의 Login 설정
PAM(Pluggable Authentication Module) 모듈은 찰탁형 인증 모듈로, 사용자 인증과 서비스 접근 제어를 관리하는 모듈입니다. 주로 ‘/etc/pam.d/’ 디렉터리 하위에 관련 파일이 있습니다. 관련 파일 중 ‘login’ 파일에는 로그인할 수 있는 사용자 인증 설정이 들어가 있습니다.
‘login’ 파일에 ‘pam_securetty.so’ 모듈을 추가하면, ‘/etc/securetty’ 파일에서 지정한 설정이 반영됩니다. 앞서서 securetty 파일에서 pts/x 설정을 제거한 부분이 반영될 수 있도록 ‘login’ 파일에 ‘pam_securetty.so’ 모듈을 추가하거나 수정하셔야 합니다.
# /etc/pam.d/login 파일 수정 또는 신규 삽입
# 수정 전:
# auth required pam_securetty.so
# 수정 후:
auth required pam_securetty.so
SSH를 사용하는 경우
서버 접근을 위해 SSH를 사용하는 경우에도 root 계정 접근은 제한해야 합니다. SSH는 ‘/etc/ssh/’ 디렉터리에 있는 ‘sshd_config’ 파일에서 설정을 변경할 수 있습니다.
# root 계정 로그인 허용이므로 취약
PermitRootLogin yes
# key를 이용해 root 계정 로그인이 허용이므로 취약
PermitRootLogin prohibit-password
# root 계정 접근을 허용하지 않으므로 양호
PermitRootLogin no
# PermitRootLogin prohibit-password
특정 조건에 부합했을 때 root 계정으로 접근할 수 있도록 허용하는 것도 root 계정의 원격 접속을 허용한 것이므로, 예외 사항을 허용하지 않고 root 계정으로 직접 원격 접근하지 못하도록 꼭 막으셔야 합니다.
UID, GID, 그룹 설정을 확인하라!
기본적으로 root 계정의 UID와 GID는 ‘0’입니다. 만약 root 계정과 동일하게 ‘0’을 UID와 GID로 부여받은 계정이 비인가자에게 노출될 경우, root 계정과 그룹이 가진 권한과 동일한 권한으로 시스템에 영향을 줄 수 있습니다. 계정 정보 유출, 환경 설정 파일 변조, 디렉터리 변조 및 삭제 등 예상할 수 없는 행위로 시스템 가용성(서비스 장애, 악성코드 유포지 감염 등)에 영향을 미칠 위협이 생깁니다. 특히 UID는 사용자 감사 로그에도 영향을 주므로 추적할 때에도 어려움이 생깁니다. 그래서 UID와 GID에 ‘0’인 계정이 존재하는지 점검해, root 계정 권한이 다른 사용자 계정이나 비인가자의 접근 위협으로부터 안전하게 보호되고 있는지 확인해야 합니다.
또한 root 그룹에는 최소한으로 꼭 필요한 계정만 있는지 점검해서, 취약한 계정 관리로 발생하는 시스템 침입에 잘 대비하고 있는지 확인해야 합니다.
조치 방안
UID와 GID
UID와 GID는 ‘/etc’ 디렉터리의 passwd 파일을 조회하면 찾을 수 있습니다.
// ID:암호:UID:GID:사용자 이름:사용자 홈 디렉터리:사용자 로그인 셸
root:x:0:0:root:/root:/bin/bash
그룹
그룹은 ‘/etc’ 디렉터리의 group 파일을 조회하면 찾을 수 있습니다.
// 그룹명:암호:GID:그룹에 속한 ID
root:x:0:root
su 명령어를 지켜라!
su 명령어는 로그인한 계정을 로그아웃하지 않고 다른 계정으로 사용자를 전환하는 명령어입니다. 그래서 최초 서버 접근은 일반 사용자로 하더라도, 일반 사용자가 su 명령어를 입력하면 root 계정으로 전환할 수 있는 빈틈이 생깁니다. 그래서 su 명령어를 제한된 그룹만 쓸 수 있도록 제한해야 합니다.
조치 방안
/etc/pam.d/su 파일 설정
‘/etc/pam.d’ 디렉터리에 있는 PAM 모듈 설정 파일 중에 ‘su’ 파일에서 ‘su’ 명령어 실행 권한을 설정할 수 있습니다.
auth sufficient pam_rootok.so
auth required pam_wheel.so debug group=<group_name>
// 또는
auth sufficient pam_rootok.so
auth required pam_whell.so use_uid
위 설정이 주석 처리돼 있다면 주석을 삭제하고, 설정 라인 자체가 없다면 직접 추가해서 입력하면 됩니다.
사용자 그룹 설정
‘su’ 명령어를 실행할 수 있는 그룹을 제한했으므로, 필요한 계정만 그룹 설정을 해서 추가하면 됩니다. 직접 ‘/etc’ 디렉터리에 있는 ‘group’ 파일을 수정해서 필요한 계정을 추가해도 됩니다.
$ usermod -G <group_name> <user_name>
사용자 그룹 설정으로 새로 추가한 계정은 모든 세션(Session)을 종료하고 재로그인해야 ‘su’ 명령어를 사용할 수 있습니다.
PATH 환경 변수를 보호하라!
환경 변수는 로컬에서 프로세스가 동작하는 방식에 영향을 주는 동적 변수입니다. 그중 PATH 환경 변수는 실행하는 명령어의 실제 파일 경로를 지정하는 변수입니다.
아래는 PATH 환경 변수 예시입니다. ‘/usr/local/sbin’, ‘/usr/local/bin’, ‘/usr/sbin’, ‘/usr/bin’, ‘/sbin:/bin’, ‘/usr/games’, ‘/usr/local/games’, ‘/snap/bin’ 등 총 7개 디렉터리가 변수로 입력돼 있습니다. (디렉터리별 구분은 ‘:’으로 합니다.)
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
만약 ‘vi’ 명령어를 사용자 홈 디렉터리에서 실행하면, PATH 환경 변수로 설정한 디렉터리를 앞에서부터 순서대로 검색해서 실행 파일을 찾습니다. 만약 여러 디렉터리에 ‘vi’ 명령어를 인식할 수 있는 파일이 들어있다면, 그중 가장 먼저 나열된 디렉터리에 있는 ‘vi’ 실행 파일을 인식합니다.
검색 순서 특징으로 인해 취약점이 생깁니다. 예시 설정값에는 있지 않지만, 디렉터리 위칫값으로 ‘.’을 넣을 수 있습니다. ‘.’은 현재 디렉터리를 지칭하므로 시스템에 영향을 줄 수 있는 악성 파일이 들어있다면, 흔히 실행하는 명령어를 악성 파일이 먼저 인식하도록 만들 수 있습니다.
조치 방안
PATH 환경 변수 자체에 ‘.’을 넣지 않는 것이 가장 나은 방법이겠지만, 개발 환경과 조건에 맞춰 필요한 경우에는 맨 앞이나 중간에 오지 않도록 설정해둬야 합니다.
특히, root 계정의 PATH 환경 변수에서는 최대한 쓰지 않기를 추천합니다. 단, PATH 환경 변수를 설정하는 파일은 리눅스 계열과 버전별로 다르므로 각자 환경에 맞춰서 수정하시면 됩니다.
// 수정전
PATH=.:$PATH:$HOME/bin
// 수정후
PATH=$PATH:$HOME/bin:.
root 계정을 아껴주세요
여러 작업을 하다 보면, root 계정으로 접속해서 모든 권한을 마음껏 쓸 수 있을 때 정말 편하긴 합니다. 한번 겪어보면 그 유혹을 쉽사리 빠져나오기가 쉽지 않습니다. 하지만 초대받지 않은 사람이 root 계정으로 들어온다면, 딱 우리가 편했던 그만큼 정말 편하게 시스템에 훼방을 놓을 수 있습니다. 짧다면 짧고 길다면 길다고 할 수 있는 시간의 탑이 한순간에 허무하게 무너질 수 있습니다.
파일, 디렉터리 모두에 적당한 권한을 설정해두고, 개인 계정이나 작업용 계정으로 접속하는 습관이 중요합니다. 나를 아끼는 만큼, root 계정도 같이 아껴주시길 부탁드립니다.