034. Linux 서버 보안 — 로그인 배너와 버전 정보 노출 최소화

changseop lee·6일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 34/50편 (전체 034/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

서비스는 접속 직후 자신을 소개하는 문자열(배너)을 보냅니다. 여기에 OS 종류, 커널 버전, 소프트웨어 버전이 들어 있으면 공격자는 별다른 노력 없이 "어떤 취약점이 통할지"를 추정할 수 있습니다.

노출 지점예시줄이는 방법
/etc/issue, /etc/issue.net\S, Kernel \r → OS명·커널 버전경고 문구로 교체
/etc/motd로그인 후 OS 정보필요한 안내만
SSH 식별 문자열SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.xUbuntu는 DebianBanner no로 배포판 접미사 제거(버전 자체는 제거 불가)
SSH Banner인증 전 표시 문구법적 경고 문구
ApacheServer: Apache/2.4.57 (Rocky Linux)ServerTokens Prod, ServerSignature Off
nginxServer: nginx/1.18.0 (Ubuntu)server_tokens off;

배너 정리는 취약점을 없애는 것이 아니라 정찰 비용을 높이는 것입니다. 패치(024편)가 우선이고, 배너 정리는 보조 수단입니다.

2. 왜 중요한가

  • 자동화된 스캐너는 배너의 버전 문자열로 취약 서버를 선별합니다. 버전이 보이지 않으면 추가 탐색이 필요해지고, 그 탐색이 탐지 기회가 됩니다.
  • 경고 배너("인가된 사용자만 접속 가능, 모든 행위는 기록됨")는 내부 정책·법적 대응 측면에서 권고되는 항목입니다.
  • 배너만 받고 끊는 연결은 정찰 단계의 흔적이므로 로그에서 구분할 수 있어야 합니다.

3. 핵심 명령어 / 설정

확인 명령용도
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/nullSSH 식별 문자열 확인(자기 서버)

4. 실습 (실습 예시)

# 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

5. 정상 상태

$ curl -sI http://localhost | grep -i '^server'
Server: Apache
$ nc -w2 localhost 22 </dev/null
SSH-2.0-OpenSSH_8.7

웹 헤더에 버전·OS가 없고, SSH는 프로토콜상 필요한 최소 정보만 보이는 상태입니다(OpenSSH 버전 문자열 자체는 숨길 수 없음).

6. 이상 상태

$ 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편) 대상입니다.

7. 로그 분석 (분석 방법)

배너 수집은 "연결 후 인증 없이 종료" 패턴으로 남습니다(가상의 예시 로그).

[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 closedSSH 배너만 받고 끊음
SSH 포트에 GET / HTTP/1.0포트에 여러 프로토콜을 던져 서비스 종류를 확인
HEAD / + User-Agent 없음헤더(Server)만 수집
/nice%20ports%2C/Tri%6Eity.txt%2ebakNmap 서비스 탐지 과정에서 알려진 요청 패턴

같은 IP가 짧은 시간 여러 포트에서 이런 흔적을 남기면 서비스 버전 스캔으로 판단하고 네트워크 스캔 분석(94. Port Scan)과 연결합니다.

8. SOC 관제 포인트

  • 배너 설정 파일(/etc/issue*, sshd·웹 서버 보안 설정)을 기준선에 포함합니다.
  • kex_exchange_identification 오류의 출발지별 빈도를 집계합니다.
  • 웹 로그의 User-Agent 없음 + HEAD 요청, 알려진 스캐너 요청 패턴을 정찰 지표로 사용합니다.

9. 탐지 규칙

<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 리스트로 관리하면 유지보수가 쉽습니다.

10. 대응 방법

  1. 초기 확인 — 노출 중인 배너·헤더와 설정 파일의 변경 이력을 확인합니다.
  2. 범위 확인 — 배너 수집 IP가 다른 포트·서버에서도 정찰했는지 방화벽·IDS 로그와 연결합니다.
  3. 증거 확보 — sshd·웹 로그와 해당 시간대 방화벽 로그를 보존합니다.
  4. 차단/조치 — 배너 설정을 복원하고 반복 정찰 IP를 차단 목록에 등록합니다.
  5. 재발 방지 — 배너·헤더 설정을 기준선에 넣고 정찰 패턴 룰을 운영합니다.

11. 핵심 정리

구분핵심 내용
노출 지점/etc/issue, motd, SSH 식별 문자열, 웹 Server 헤더
조치경고 배너, DebianBanner no, ServerTokens Prod, server_tokens off
한계OpenSSH 버전 문자열은 제거 불가, 배너 정리는 보조 수단
정찰 흔적kex_exchange_identification, HEAD + UA 없음
면접 포인트"배너 정리는 취약점 제거가 아니라 정찰 비용 증가"

12. 다음 편 예고

다음 편 035. Linux 서버 보안 — 코어 덤프 제한과 민감정보 보호 에서는 메모리 내용이 파일로 남는 코어 덤프 제한과 민감정보 보호를 다룹니다.


이전 편: 033. Linux 서버 보안 — DNS 리졸버·hosts 파일 보안
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글