시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 34/50편 (전체 034/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
서비스는 접속 직후 자신을 소개하는 문자열(배너)을 보냅니다. 여기에 OS 종류, 커널 버전, 소프트웨어 버전이 들어 있으면 공격자는 별다른 노력 없이 "어떤 취약점이 통할지"를 추정할 수 있습니다.
| 노출 지점 | 예시 | 줄이는 방법 |
|---|---|---|
/etc/issue, /etc/issue.net | \S, Kernel \r → OS명·커널 버전 | 경고 문구로 교체 |
/etc/motd | 로그인 후 OS 정보 | 필요한 안내만 |
| SSH 식별 문자열 | SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.x | Ubuntu는 DebianBanner no로 배포판 접미사 제거(버전 자체는 제거 불가) |
SSH Banner | 인증 전 표시 문구 | 법적 경고 문구 |
| Apache | Server: Apache/2.4.57 (Rocky Linux) | ServerTokens Prod, ServerSignature Off |
| nginx | Server: nginx/1.18.0 (Ubuntu) | server_tokens off; |
배너 정리는 취약점을 없애는 것이 아니라 정찰 비용을 높이는 것입니다. 패치(024편)가 우선이고, 배너 정리는 보조 수단입니다.
| 확인 명령 | 용도 |
|---|---|
cat /etc/issue /etc/issue.net /etc/motd | 로그인 배너 내용 |
sudo sshd -T | grep -E '^(banner|debianbanner)' | SSH 배너 설정 |
curl -sI http://localhost | grep -i '^server' | 웹 서버 헤더 |
nc -w2 localhost 22 </dev/null | SSH 식별 문자열 확인(자기 서버) |
# 1) 로그인 경고 배너
sudo tee /etc/issue /etc/issue.net >/dev/null <<'EOF'
Authorized users only. All activities are monitored and recorded.
EOF
echo 'Banner /etc/issue.net' | sudo tee /etc/ssh/sshd_config.d/07-banner.conf
# Ubuntu 전용: echo 'DebianBanner no' | sudo tee -a /etc/ssh/sshd_config.d/07-banner.conf
sudo sshd -t && sudo systemctl reload sshd
# 2) Apache 버전 노출 최소화 (Rocky)
echo -e 'ServerTokens Prod\nServerSignature Off' | sudo tee /etc/httpd/conf.d/00-security.conf
sudo apachectl configtest && sudo systemctl reload httpd
# 3) 확인
curl -sI http://localhost | grep -i '^server'
nc -w2 localhost 22 </dev/null
$ curl -sI http://localhost | grep -i '^server'
Server: Apache
$ nc -w2 localhost 22 </dev/null
SSH-2.0-OpenSSH_8.7
웹 헤더에 버전·OS가 없고, SSH는 프로토콜상 필요한 최소 정보만 보이는 상태입니다(OpenSSH 버전 문자열 자체는 숨길 수 없음).
$ cat /etc/issue
\S
Kernel \r on an \m
$ curl -sI http://localhost | grep -i '^server'
Server: Apache/2.4.57 (Rocky Linux) OpenSSL/3.0.7
OS명·커널·웹 서버·OpenSSL 버전이 모두 노출되어 공격자가 버전 기반 취약점 검색을 바로 할 수 있는 상태입니다. 하드닝 이후 다시 이 상태가 되었다면 설정 파일이 원복·삭제된 것이므로 변경 추적(038편) 대상입니다.
배너 수집은 "연결 후 인증 없이 종료" 패턴으로 남습니다(가상의 예시 로그).
[sshd]
Oct 1 04:01:10 rocky9-web01 sshd[9501]: error: kex_exchange_identification: Connection closed by remote host
Oct 1 04:01:10 rocky9-web01 sshd[9501]: Connection closed by 192.168.56.77 port 40210
Oct 1 04:01:11 rocky9-web01 sshd[9503]: error: kex_exchange_identification: client sent invalid protocol identifier "GET / HTTP/1.0"
[Apache access_log]
192.168.56.77 - - [01/Oct/2026:04:01:12 +0900] "HEAD / HTTP/1.0" 200 - "-" "-"
192.168.56.77 - - [01/Oct/2026:04:01:12 +0900] "GET /nice%20ports%2C/Tri%6Eity.txt%2ebak HTTP/1.0" 404 196 "-" "-"
| 관찰 | 해석 |
|---|---|
kex_exchange_identification: Connection closed | SSH 배너만 받고 끊음 |
SSH 포트에 GET / HTTP/1.0 | 포트에 여러 프로토콜을 던져 서비스 종류를 확인 |
HEAD / + User-Agent 없음 | 헤더(Server)만 수집 |
/nice%20ports%2C/Tri%6Eity.txt%2ebak | Nmap 서비스 탐지 과정에서 알려진 요청 패턴 |
같은 IP가 짧은 시간 여러 포트에서 이런 흔적을 남기면 서비스 버전 스캔으로 판단하고 네트워크 스캔 분석(94. Port Scan)과 연결합니다.
/etc/issue*, sshd·웹 서버 보안 설정)을 기준선에 포함합니다.kex_exchange_identification 오류의 출발지별 빈도를 집계합니다.<group name="local,recon,">
<rule id="100400" level="5">
<decoded_as>sshd</decoded_as>
<match>kex_exchange_identification</match>
<description>SSH 식별 단계 비정상 종료(배너 수집 가능성)</description>
</rule>
<rule id="100401" level="9" frequency="6" timeframe="120">
<if_matched_sid>100400</if_matched_sid>
<same_source_ip />
<description>동일 IP의 반복 SSH 배너 수집</description>
</rule>
</group>
웹 측은 Wazuh 기본 웹 룰(access log 기반 스캔 탐지 계열)과 함께, nice ports 같은 알려진 패턴을 CDB 리스트로 관리하면 유지보수가 쉽습니다.
| 구분 | 핵심 내용 |
|---|---|
| 노출 지점 | /etc/issue, motd, SSH 식별 문자열, 웹 Server 헤더 |
| 조치 | 경고 배너, DebianBanner no, ServerTokens Prod, server_tokens off |
| 한계 | OpenSSH 버전 문자열은 제거 불가, 배너 정리는 보조 수단 |
| 정찰 흔적 | kex_exchange_identification, HEAD + UA 없음 |
| 면접 포인트 | "배너 정리는 취약점 제거가 아니라 정찰 비용 증가" |
다음 편 035. Linux 서버 보안 — 코어 덤프 제한과 민감정보 보호 에서는 메모리 내용이 파일로 남는 코어 덤프 제한과 민감정보 보호를 다룹니다.
이전 편: 033. Linux 서버 보안 — DNS 리졸버·hosts 파일 보안
📚 시리즈 전체 보기: 시스템 보안 · 취약점