흔히들 Linux나 Unix에서는 r-service(rsh, rcp, rlogin etc)를 막고, Windows에서는 NetBIOS를 막으라고 한다. 보안을 위해서 하는 얘기다. 그럼 이렇게 위험한 것들을 해당 벤더들은 왜 만들었을까? 당연한 얘기겠지만 필요해서 만들었을 것이다. 그렇다. 경우에 따라 꼭 필요할 수가 있다. 문제가 되는 것은 위와 같은 서비스가 꼭 필요한 상황이 아님에도 이를 활성화시켜 두었거나, 보다 안전하게 사용할 수 있는 방법이 있음에도 이를 이행하지 않은 경우이다.
본 문서는 Windows를 위한 것이므로 여기서는 r-service는 제외하도록 하겠다. 사실 이는 s-service(ssh, scp, sftp etc)로 대체되는 분위기이므로 실제 거의 사용되지 않는다.
NetBIOS (139번)
- NetBIOS란?
그렇다면 NetBIOS는 무엇이고 어떤 경우에 사용되는 것일까? 이에 관한 자료는 인터넷상에 무수하게 널려있기 때문에 그리 낯설은 용어는 아니리라 여겨진다. 사실 필자는 잘 모른다. 🙂
다음은 텀즈에서 규정하고 있는 NetBIOS의 정의이다.
NetBIOS[넷 바이오스]는 별개의 컴퓨터 상에 있는 애플리케이션들이 근거리통신망 내에서 서로 통신 할 수 있게 해주는 프로그램이다. 이것은 초창기 PC 네트웍을 위해 IBM에 의해 개발되었으며, 마이크로소프트에 의해 채택되었고, 곧 사실상의 산업계 표준이 되었다. NetBIOS는 이더넷, 토큰링, 그리고 윈도우NT 네트웍 등에 사용되었다. NetBIOS는 그 자체로는 라우팅 기능을 지원하지 않으므로, 광역통신망 상에서 교신하는 애플리케이션들은 반드시 TCP와 같은 다른 트랜스포트 매커니즘을 추가하여 사용해야한다.
NetBIOS는 세션모드 내의 에러복구 등을 포함하여, 네트웍에 관한 상세한 내용을 알아야하는 부담으로부터 애플리케이션들을 해방시켜주었다. NetBIOS 요구는 메시지 위치와 수신지 이름을 다른 것들과 함께 명기하는, 네트웍 제어 블록(NCB)의 형식으로 제공된다.
NetBIOS는 OSI 모델에 기술되어 있는 세션 및 트랜스포트 계층의 서비스를 제공한다. 그러나, 이것은 표준 프레임이나 전송을 위한 데이터 형식을 제공하지는 않는다. 표준 프레임 형식은 NetBIOS의 확장판이라 할 수 있는 NetBEUI에서 제공된다.
NetBIOS는 세션과 데이터그램 등 두 가지 통신모드를 제공한다. 세션모드는 두 개의 컴퓨터들이 대화를 위해 연결을 맺을 수 있도록 해주며, 커다란 메시지들의 처리와, 에러 감지 및 복구를 제공한다. 데이터그램 모드는 비연결형(connectionless)으로서, 메시지의 크기가 작아야하며, 애플리케이션은 에러 감지와 복구에 관해 자체적으로 처리해야 한다. 데이터그램 모드는 또한 근거리통신망 상의 모든 컴퓨터들에게 메시지를 뿌리는 기능을 지원한다.
말이 조금 어려워 보이는데 쉽게 얘기하자면 Windows 9x 운영체제간에 데이타 공유를 위해 사용되는 API라고 생각하면 된다. API가 어렵다면 그냥 프로토콜이라고 생각해도 큰 문제는 없다.
요즘은 NT 커널의 운영체제(Windows 2000/XP)가 주류를 이루고 있는 실정이다.(적어도 필자의 견해로는 말이다.) 문제는 Windows 2000/XP 에서도 NetBIOS 통신을 기본값으로 허용하고 있다는 것이다. 앞에서도 말했지만 NetBIOS는 Windows 9x 운영체제에서 사용되는 것이라고 했지만 실상 Windows 2000/XP 에서 9x 운영체제와 통신을 위해서 어쩔 수 없이 사용해야 한다는 것이다. 즉, 운영체제에서 아주 중요시하는 하위호환성을 보장하려는 것이다.
이 정도를 이해했다면 결론은 간단하다. 즉, 사용자의 시스템 환경에서 Windows 9x 운영체제가 존재하지 않는다면(존재하더라도 자원 공유가 필요하지 않다면) NetBIOS를 비활성화시키면 된다. Windows 2000/XP에서는 TCP/IP 프로토콜 NetBIOS를 묶어(Binding)하여 사용하는데 이를 풀어 주면 되는 것이다. 이를 NetBIOS over TCP/IP(NBT or NetBT) 비활성화라고 이야기한다.
- NetBIOS over TCP/IP 비활성화
매우 간단한 방법이니 쉽게 따라할 수 있을 것이다.
[시작] → [실행] → ncpa.cpl → "로컬 영역 연결"의 등록정보(속성) → "인터넷 프로토콜(TCP/IP)"의 속성 → [일반]탭 → [고급] → [WINS]탭 → NetBIOS 설정 → "TCP/IP 에서 NetBIOS 사용 안 함"을 선택
CIFS (445번)
- CIFS(Common Internet File System)란?
Windows 2000이 출시되면서 새롭게 도입된 파일 공유 프로토콜이다. 이름만 보면 산업표준처럼 보이지만 실상은 Microsoft가 독자적으로 개발한 것으로, Windows 2000, XP 그리고 곧 출시된 Windows Server 2003에서도 표준적으로 사용될 프로토콜이다. 얼마전에 이 프로토콜의 API 공개와 함게 약간 말들이 많았던 것으로 기억한다. 라이센스와 관련하여…
CIFS는 NetBIOS의 약점을 극복하고 보다 안전한 데이타 공유를 위해 디자인되었다. NetBIOS의 약점이라 하면 앞에서도 언급했지만 보안에 취약하고, 브로드캐스팅 방식을 사용하기 때문에 네트워크 오버헤드가 심하다는 점을 들 수 있다. 하지만 Microsoft 의 주장과 다르게 CIFS 또한 보안 문제에 있어서 자유로울 수 없었고, 이에 대한 exploit 또한 상당수가 공개되었다.
- CIFS 꼭 사용해야 하나?
CIFS 또한 NetBIOS 처럼 Windows 2000/XP가 인스톨될때 기본값으로 설치된다. 아래 그림에서 빨간색 박스 부분이 CIFS 프로토콜을 의미한다. 대부분의 사용자들은 "Microsoft 네트워크용 파일 및 프린터 공유"가 CIFS 프로토콜임을 알지도 못하고, 이 것이 445번 포트를 사용하고 있다는 것도 알지 못한채 너무나 자연스럽게 사용하고 있다.(사실 필자도 항상 CIFS를 사용하고 있다.)
하지만 이 역시 반드시 필요한 존재는 아니다. 사무실에서 동료들과 파일 교환이 빈번하다면 이는 추천할만한 프로토콜이지만, 웹서버 전용 컴퓨터에서는 가급적 사용하지 않는 것을 권장한다. 물론 판단은 언제나 사용자들의 몫이다.
- CIFS 제거하기(TCP/IP에서 Unbinding 하기)
Windows 2000/XP 시스템에서 CIFS를 사용하지 않는 방법은 2가지가 있다. 첫째는 TCP/IP 프로토콜에 바인딩(Binding)만을 풀어 줌으로써 가능하고, 둘째는 프로토콜 자체를 아예 삭제하는 것이다.
필자는 전자를 권한다. 사실 후자를 시도해 보지 않았기 때문이다. 🙂 방법은 둘 모두 거의 비슷하다.
확인하기
NetBIOS와 CIFS를 모두 비활성화하였다면 정말로 139번과 445번이 닫혔는지 확인해 보자. netstat 명령어를 통해서도 가능하지만 필자는 nmap 이라는 꽤나 유명한 포트스캐너를 통해서 확인해 보고자 한다.
가장 좋은 방법
이제까지 설명한건 뭐고 가장 좋은 방법이라니… 라고 생각하시는 분들도 계시리라 생각된다. 위의 경우는 NetBIOS나 CIFS가 정말 필요업는 경우 이를 비활성화하는 방법을 소개한 것이다.
하지만 실제 업무환경에서는 NetBIOS나 CIFS가 아주 요긴하게 사용되는 경우가 많다. 어쩔 수 없이 사용해야 하는 경우가 있다는 얘기다. NetBIOS를 제거하고 CIFS만 사용한다? 이것도 비교적 괜찮은 방법이다. 하지만 불행히도 CIFS는 완벽하게 NetBIOS를 커버하지 못한다. 여러가지가 있겠지만 사용자에게 가장 현실적으로 다가오는 문제는 브라우징 속도이다. CIFS는 상당히 느리다는 단점이 있다.
그럼 NetBIOS와 CIFS 둘 모두를 안전하게 사용할 수 있는 방법은 없을까?
답은 방화벽(Firewall)이다. 내부 네트워크에서는 NetBIOS와 CIFS를 허용하면서 외부에서는 접근을 허용하지 않는 정책을 사용하면 된다. 물론 이는 내부 네트워크 사용자 모두가 믿을 만한 사람들이라는 것을 가정한 것이다. 🙂
방화벽 장비는 비싼 하드웨어 장비를 사용할 수 있고, 리눅스를 이용해서 값싸게 구축할 수도 있다. 업무의 중요도나 여건에 따라 결정할 문제이다. 이에 관한 내용은 본 문서 취지를 벗어 나므로 여기서는 생략하도록 하겠다.
허접한 내용이나마 도움이 되었으면 한다.