이번 글에서는 리눅스 서버 취약점 점검의 4번째 항목인 "패스워드 파일 보호"에 대해서 설명드리겠습니다. 오늘 말씀드리는 건 학부에서 운영체제나 리눅스에 대한 과목을 듣다보면 공부할 수 있는 부분이라고 생각하는데요. 이 항목은 옛날 운영체제가 아니라면 발견되지 않는 부분이기도 하고, 일부러 취약하게 만든게 아니라면 문제가 되지 않기 때문에 점검 항목 자체보다는 리눅스 패스워드 파일에 대한 기본적인 내용을 주로 다루겠습니다. 특히 정보보안기사에서 /etc/passwd의 구조에 대해 설명하라는 문제가 꽤 나오기 때문에 알고 계신다면 자격증을 공부하는데 많은 도움이 될 거라고 생각합니다.
이번 점검 항목은 설명할 "U-07) /etc/passwd 파일 소유자 및 권한 설정", "U-08) /etc/shadow 파일 소유자 및 권한 설정" 항목과도 관련 있는데, 해당 항목들은 추후 천천히 설명하기로 하고 우선은 리눅스의 패스워드 파일에 대해 알아보죠. 저희가 리눅스에서 사용자 계정을 새로 추가할 때, adduser 명령어를 이용해서 계정을 추가하면 해당 정보가 /etc/passwd 파일에 저장됩니다.
cat 명령어를 이용해서 /etc/passwd 파일의 내용을 출력해보면 가장 위에 root 계정의 정보를 확인할 수 있고, 리눅스에서 사용되는 다양한 서비스 계정들이 나오면서 방금 추가한 계정은 가장 마지막에 있는데요. 일단 간략하게 이 passwd 파일의 구조를 알아보겠습니다.
root@kali:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
test:x:1000:1000::/home/test:/bin/bash
/etc/passwd의 구조를 확인해보면 콜론으로 나누어진 필드가 총 7개인걸 볼 수 있습니다. 첫 번째 필드는 root와 test같은 사용자 계정의 이름을 나타내고, 두 번째 필드가 사용자 계정의 비밀번호인데 x로 표시된 것을 볼 수 있죠. 두 번째 필드에 패스워드가 어디 있는지는 나중에 보도록 하고, 세 번째 필드와 네 번째 필드를 보겠습니다. 리눅스에서는 사용자 계정에 각각 User ID(UID)와 Group ID(GID)를 부여해서 관리하는데, 세 번째와 네 번째 필드가 이에 해당합니다.
참고로 관리자 계정인 root를 제외하고는 각 사용자 계정이 만든 파일이나 디렉토리에 접근할 수 있는 권한을 UID와 GID로 제한해서 일종의 접근제어를 수행하죠. 그리고 다섯 번째 필드는 단순히 해당 계정의 정보를 표시해주는 영역이고, 여섯 번째 필드는 사용자 계정의 홈 디렉토리 위치, 마지막 일곱 번째 필드는 사용자 계정이 기본적으로 사용하는 쉘(Shell)의 종류를 나타냅니다.
그러면 위에서 두 번째 필드에 x로 표시되어 있는 사용자 계정의 비밀번호가 어디에 저장되어 있는지 알아보죠. 이 비밀번호는 다들 예상하셨다시피 /etc/shadow에 저장되어 있습니다. 정확히는 비밀번호를 입력으로 하여 특정 해시 함수를 이용하여 나온 결과인 해시값라고 해야 맞을텐데요. 초기 리눅스에서는 /etc/passwd 파일에 이 정보를 같이 넣어놨지만, 지금처럼 shadow 파일에 두는 이유는 보안을 강화하기 위해서라고 생각하시면 됩니다.
파일 권한을 보시면 /etc/passwd는 root 계정을 포함한 모든 사용자가 읽을 수 있는 데 반해, /etc/shadow 파일은 오직 root 계정만 읽을 수 있도록 설정이 되어있죠. /etc/shadow 파일의 구조도 설명드리고 싶지만, 글이 너무 길어지기 때문에 이는 추후 관련 점검 항목을 설명할 때 같이 말씀드리도록 하고, 패스워드 파일을 점검하는 방법에 대해 설명드리겠습니다.
root@kali:~# cat /etc/passwd | awk -F: '$2!="x"' | wc -l
0
패스워드 파일을 점검하는 방법은 의외로 정말 간단한데, /etc/passwd의 두 번째 필드가 x로 표시되어 있는지 확인하는 겁니다. 점검 스크립트에 이를 구현하는 방법은 여러가지가 있겠지만, 보통은 가변 길이 문자열을 다루는 awk 명령어를 이용합니다.
대부분의 리눅스 명령어가 이름만으로 어느 정도 기능을 예상할 수 있는 반면, awk 명령어는 이 기능을 만든 사람들의 첫 번째 이니셜을 조합하여 만든 것이기 때문에 처음 보시면 이게 뭘까하고 의문이 드실 수 있습니다. 보통 오크라고 부르는 이 명령어는 굉장히 많은 기능을 가졌지만 일단 파일의 내용을 필터링해서 원하는 부분만 볼 수 있는 기능 정도로 생각하고 넘어가시면 됩니다.
그래서 awk를 이용한 명령어를 보면, -F 옵션 부분은 파일의 한 라인을 특정 기호를 구분자로 해서 분리해주는 옵션이고, 그 뒤는 필터링할 조건 정도로 생각하시면 될 것 같습니다. 그래서 /etc/passwd의 각 라인을 콜론으로 구분해서 7개의 필드로 만들고, 두 번째 필드가 x가 아니라면 그 라인을 출력하는 명령어인 것이죠.
이를 파이프로 넘겨서 "wc -l" 명령어로 해당 라인 수를 출력했을 때 0이 나온다면 shadow 패스워드를 사용한 것으로 볼 수 있고, 해당 항목은 양호하다고 판단할 수 있는 겁니다. 만약 결과가 1 이상이 나온다면 일반 패스워드 정책을 따르고 있기 때문에 취약하므로 pwconv 명령어를 이용해서 shadow 패스워드 정책을 따르도록 조치를 취해주면 됩니다.
패스워드 파일 보호 점검 항목은 위에서 말씀드렸다시피, 정말 오래된 버전의 리눅스가 아닌 이상 잘 발견되지 않는 취약점 입니다. 실현 가능성은 거의 낮을뿐더러 누군가가 pwunconv 명령어를 쳐서 일반 패스워드 정책을 사용하지 않는 한 문제될 일은 없죠. 하지만 만에 하나 이 취약점이 발견된다면 굉장히 크리티컬하기 때문에 중요도가 상인 점검 항목이니, 인프라 진단을 할 때 빼놓지 않고 확인하시길 바랍니다.
사실 이 항목은 패스워드 파일에 대한 자세한 내용을 모르셔도 충분히 점검이 가능하지만, 정보보안기사 시험에서도 가끔 나오는 주제이기도 하고 그냥 명령어로 확인하는 것보다 왜 이렇게 점검해야 하는지 원리를 설명드리고 싶어 글이 길어졌는데요. 여기서 설명드리지 않은 패스워드 파일의 권한이나 리눅스에서는 암호화된 패스워드를 어떻게 관리하는지 등에 대한 이야기는 이후 글에서 천천히 풀어나가도록 하겠습니다. 그럼 오늘은 여기서 마치죠. 읽어주셔서 감사합니다.
'취약점 점검 > 리눅스 서버' 카테고리의 다른 글
U-45) root 계정 su 제한 (0) | 2022.06.19 |
---|---|
U-44) root 이외의 UID가 '0' 금지 (0) | 2022.06.18 |
U-03) 계정 잠금 임계값 설정 (0) | 2022.06.11 |
U-02) 패스워드 복잡성 설정 (0) | 2022.06.06 |
U-01) root 계정 원격접속 제한 (0) | 2022.06.05 |
댓글