![]() ![]() | |
최상위 dns 의 정보가 기록되어있는 파일 named.ca 가 갱신되어 일부 사이트의 정보를 제대로 가져오지 못할 경우가 있다. zone "." { named.ca 의 갱신은 아래와 같은 커맨드로 진행한다. dig . ns >/var/named/named.ca |
![]() ![]() | |
최상위 dns 의 정보가 기록되어있는 파일 named.ca 가 갱신되어 일부 사이트의 정보를 제대로 가져오지 못할 경우가 있다. zone "." { named.ca 의 갱신은 아래와 같은 커맨드로 진행한다. dig . ns >/var/named/named.ca |
![]() ![]() | ||
![]() ![]()
|
최신 PortSentry 2.0 설치 및 설정 메뉴얼 한글판 글쓴이 : 장훈 (2002년 08월 24일 오후 12:05) 읽은수: 6,357 |
![]() =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- $Id: README.install,v 1.30 2002/04/08 17:24:14 crowland Exp crowland $ E-Mail : sentrysupport@psionic.com Date : 04-08-2002 Version: 2.0b1 소 개 =-=-= 이것은 긴 인스톨 매뉴얼이다. 만일 여러분이 뒤에 이어질 모든 것과 프로그램 로직안에 깃든 나의 광기어린 방법을 이해하길 원한다면, 여러분은 이 매뉴얼 파일을 읽어야만 한다. 만일 여러분이 이런 것에 대해 관심이 없다면 아래의 내용들을 뛰어넘어라. PortSentry는 보안 제품들 중에 Psionic의 TriSentry Suite의 일부분이다. 만약 여러분들이 이 도구가 마음에 들고 여러분들이 정말 우리의 다른 제품들에 관심이 있다면 우리의 웹사이트를 참고하라: http://www.psionic.com PortSentry는 포트스캔을 탐지하기 위한 많은 옵션들을 가지고 있다. 포트스캔이 발견되면, PortSentry는 다음과 같은 방식들로 반응한다. - 사건을 나타내는 log 는 syslog()를 통해 만들어진다. - 타겟 호스트(포트 스캔 공격을 한 컴퓨터)는 TCP Wrappers를 위해서 자동적으로 /etc/hosts.deny에 기록된다. - 로컬 호스트에서는 타겟 시스템을 데드 호스트(인터넷상에 없는 컴퓨터)로 간주하여, 타겟 호스트를 경유하는 모든 경로가 자동적으로 재구성된다. - 로컬 호스트는 로컬패킷필터를 통하여, 타겟 호스트로부터 오는 모든 패킷을 무시하기 위하여 자동적으로 재구성된다. 이러한 의도는 관리자에게 그들의 호스트가 스캔되고 있다는 것을 확신시켜주기 위함이다. 이미 이러한 동작을 하는 유사한 프로그램들이 있다.( klaxon 등등) 나는 단지 전체적인 아이디어에 작은 변화(auto blocking 과 같은)를 더했을 뿐이다. 더하여, 스텔스 스캔 탐지(stealth scan detection)를 위한 포괄적인 지원까지... PortSentry 2.x는 libpcap을 사용하기 위해서 재구성되었다. 이전에 공격을 감지하기 위해 묶여진 포트들을 사용하던 "고전적인" 모드들은 사라졌다. 만약 그 "고전적인" 모드들을 선호한다면, PortSentry 1.1 버전을 사용하길 바란다. 설치 =-=-=-= 첫 단계: 여러분의 에디터로 portsentry_config.h 파일을 가져와서 다음사항이 여러분이 원하는 바와 맞는지 확인해라: CONFIG_FILE - PortSentry 구성파일의 경로 WRAPPER_HOSTS_DENY - TCP wrapper의 hosts.deny 파일의 경로와 이름 SYSLOG_FACILITY - PortSentry가 사용할 syslog 프로그램 SYSLOG_LEVEL - 메시지를 보내기 위한 syslog level 나는 여러분이 무엇을 하고 있는지 알지 못한다면 이러한 옵션들을 절대 바꾸지 말 것을 제안한다. ※ 참고 1. 고급사용자들은 SYSLOG_FACILITY를 LOG_DAEMON에서 LOG_LOCAL0로 바꾸고 싶어할 수도 있을 것이다. (아니면, 또 다른 LOCAL log 감시프로그램) 여러분은 syslog.conf 파일을 편집할 수 있으며 이것으로 분리된 모니터링을 위해 PortSentry 메시지를 직접 시스템에 있는 PortSentry 자신만의 파일에 가져다 놓을 수도 있다. 2. [경고] : 절대로 이 파일 내용에서 "#" 표시를 지우지 마시오. 이런 "#" 표시들은 주석표시가 아니라, 헤더들을 예비적으로 처리하기 위해 C 컴파일러를 요구하는 것들입니다. 만약 여러분들이 "#" 표시들을 지워버린다면 여러분들은 컴파일 에러들을 보게 될 것입니다. 3. 참고 2번을 다시 한번 읽어보라. 우리는 "#" 표시를 지우고 그로 인해서 프로그램을 컴파일 할 수 없게 되어 문의를 해오는 수많은 사람들을 보았다. portsentry_config.h 파일은 2.x 버전이 베타 버전으로 있는 한은 계속 같이 존재할 것이다. 두번째 단계: 이어서, portsentry.conf를 여러분의 에디터로 가져와서 다음의 옵션을 체크하고 바꿔라: INTERFACE - 여러분이 모니터 하기를 원하는 interface(CPU와 단말 장치와의 연결 부분을 이루는 회로) 이름. 대부분의 사람들은 이 부분을 "auto"로 남겨둘 수 있고 이 때 PortSentry는 첫번째 interface를 선택하여 모니터 할 것이다. 다른 분들은 아마도 여러개의 interface들을 가지고 있음에도 오직 하나만 보기를 원할 것이다(말하자면 외부 방화벽 interface). 이런 경우는 여러분들이 interface 이름을 직접 설정해 줄 수도 있다. eth0를 보기 위해서는 "/dev/eth0"과 같이 경로명을 포함시키지 말고, 단순히 interface 이름 "eth0"를 적어 넣는다. 등등.. 이런 식으로... PortSentry는 한 번에 오직 한 개의 interface 만을 볼 수 있기 때문에 여러개의 Interface 이름을 적어 넣으면 안된다. INTERFACE_ADDRESS - PortSentry는 당신이 감시하려 하는 Interface의 IP 주소를 필요로 한다. 현재 버전의 PortSentry는 자동으로 해당 Interface의 IP주소를 찾아내지 못한다. 하지만 앞으로 곧 지원될 것이다. 만약 여러분이 IP 주소를 적어 넣지 않는다면 PortSentry는 당연히 아무런 일도 하지 않을 것이다. 이것은 DHCP 또는 유동 IP 사용자들에게는 적합하지 못하다(매번 바뀌어지는 IP주소를 적어 넣어주고 재시작 해야하므로...-.-a). 하지만 베타 버전이 버전업 되면서 DHCP나 유동 IP 사용자들도 편리하게 사용할 수 있도록 할 것이다. 현재로서는 매번 IP주소를 적어주거나 아니면 스크립트를 작성하여 매번 시스템을 재시작 할 때마다 자동으로 실행되어 새로이 바뀐 IP주소를 자동으로 지정해 주도록 해줘야 한다. TCP_PORTS - 콤마(,)로 분리된 PortSentry가 감시하기를 원하는 TCP포트의 문자열. 이 문자열은 그 안에 어떠한 공백문자도 가져서는 안된다. 여러분은 여러분이 원하는 만큼의 소켓을 집어넣을 수 있다. 하지만 아마도 Berkely Packet Filter (BPF) 의 길이가 너무 커져서 문제가 될 수도 있다. 만일 이런 문제가 발생한다면 여러분들은 로그 파일에서 에러 메시지를 볼 수 있을 것이고 문자열의 길이를 더 줄여야만 할 것이다. UDP_PORTS - 이것은 UDP 포트 라는 것을 제외하고는 위와 동일하다. IGNORE_FILE - 여러분이 항상 무시하길 바라는 호스트의 IP 주소들의 목록이 기록된 파일의 경로. 이것은 나중에 설명될 것이다. BLOCKED_FILE - 접속금지(blocked)된 호스트의 IP 주소들의 목록이 기록된 파일의 경로. RESOLVE_HOST - 이 옵션은 호스트들에 대한 DNS 해석을 꺼버린다. 만약 여러분이 느린 DNS 서버를 가지고 있다면 해석을 끄는 것은 더욱 효과적일 것이다. 또한 만약 여러분이 이것을 켜놓는다면 공격자는 되돌아 오는 DNS 응답을 볼 수 있을 것이고 여러분이 연결상태를 감시하고 있다는 것을 (공격자가) 알게 될 것이다. 기본값으로 이 옵션을 꺼놓는다. BLOCK_UDP -이 옵션(0)은 UDP탐지에 대한 모든 자동적인 반응을 못하도록 한다. UDP는 쉽게 위조될 수 있기 때문에, 정상적으로 존재해야 할 모든 호스트들을 접근금지 시키는 방식으로, 공격자가 보호받는 호스트에 대해 DOS공격(서비스거부공격)을 할 수 있다. 이 옵션을 "0"으로 하면 연결이 여전히 log된 상태라도, 모든 자동적인 반응을 못하게 할 것이다. 이 옵션(0)은 주로 인터넷에 노출되어 있는 호스트에 유용하다. 내부 호스트에 대해서는 여러분은 이 옵션을 (자동적인 반응이) 가능 하도록 놔둬야 할 것이다. 만약 누군가 내부적으로 여러분에게 스푸핑된(spoofed) 패킷을 보낸다면 여러분은 서비스거부보다 더 큰 문제점에 직면하게 될 것이기 때문이다. BLOCK_TCP - TCP라는 것을 제외하곤 BLOCK_UDP와 같다. (패킷 위조는 그리 큰 문제가 아니다. 왜냐면 PortSentry가 완전한 접속이 이루어지를 기다리고 있고, 이것은 베이직모드에 있어 패킷위조를 하는 것보다 더 힘들기 때문이다. 나는 이것을 인터넷에 연결된 호스트에 대해서도 사용가능하도록 남겨둘 것이다.) 스텔스 스캔 탐지모드에 있어서 UDP 경고는 다음과 같다: 공격자는 패킷 위조를 통하여, 여러분이 막지 않길 원하는 호스트에 대해서 접근금지(block)시킬 수 있다. (나는 이것이 문제가 될 때까진 걱정하지 않지만 여러분은 이것에 대해 인식하고 있어야 한다.) 수개월간 우리는 이 명백한 문제에 대해서 글을 올리고 말해주는 사람들을 접해왔다. 그렇다. 우리는 패킷 위조, 서비스 거부, 등등에 대해서 알고 있다. 우리는 단지 그 문제의 심각성을 시스템 절충안과 비교하지 않는다. 우리는 이 옵션을 대부분의 호스트([방화벽] 위에서 싸우기 일쑤인 특정 호스트들을 제외하고)들에 대해서 사용 가능하게(막도록) 놔둘 것이다. 여러분이 어떤 설정을 해야 할 지에 대한 좀 더 자세한 답변은 README.stealth를 읽어보라. KILL_ROUTE - 여기에는 공격이 탐지되었을 때, 공격자가 타고온 경로를 없애기(drop) 위해 실행될 명령을 정의할 수 있다. 정상적인 실행을 위해서는, *절대경로* 전체와 필요한 옵션을 다 붙인 route 명령이 필요하다. $TARGET$ 문자열은 공격하고 있는 호스트 IP주소로 대체될 것이며, 반드시 이 옵션안에서 존재해야 한다. 자신의 gateway는 local subnet상에서 *죽어있는 호스트*가 될 것이다. 어떤 시스템에서는 로컬호스트 주소인 (127.0.0..1)을 넣더라도 아마 작동을 할 것이다. 공격중인 호스트로부터의 모든 패킷은 이 주소로 보내질 것이며, 호스트를 엉망으로 만들지 않을 것이다. 좀 더 현대적인(발전된) route 명령어는 "-blackhole" or "-reject" 옵션을 포함할 것이다. 여러분의 man(1) 페이지를 체크해 보라. 만약 route 명령어가 이런 기능을 지원한다면 이것을 사용할 수 있다.(비록 그럴지라도 나는 그 대신에 패킷필터링을 사용할 것을 권장한다. 아래를 참조하라.) 또한 "asynchronous route"라고 알려진, 기본적으로는 하나의 루트를 통해 여러분의 호스트에 들어가고 다른 (죽은) 루트에 보내져버리는 패킷을 의미하는, 것이 생길 수 있음을 알고 있어야 한다. 이것은 완전한(full) TCP 접속요구에는 잘 동작하지만, UDP나 스텔스 스캔모드에 있어서는 이것은 패킷이 PortSentry를 활성화시키는 것을 여전히 허용하고 여러분은 PortSentry가 보내주는 "already blocked"라는 경고를 계속하여 받게 될 것이다. UDP 스캔에 대해서 이 방법은 ICMP message들이 공격자에게 되돌아가는 것을 막아서 모든 포트가 open 된 상태로 나타나게 된다. 그러나, 만약 공격자가 실제 공격소스 exploit를 실행하고 있다면, 앞의 drop route 방법은 소용이 없다. asynchronous route는 만약 공격자가 대응되는 응답이 어떻게 진행 될지 알고 있으면, 패킷이 시스템에 도달하게 되고, 공격자가 UDP를 이용하여 장님상태의 (blind) 공격을 할 수 있도록 허용할 것이다. 이것을 막는 최선의 방법은 Linux ipfwadm/ipchains 나 *BSD ipfw와 같은 로컬 패킷필터를 사용하는 것이다. 이것은 매우 깔끔한 방법이며 config 파일안에 자세하게 설명되어 있다. $PORT$ 문자열은 공격자에 의해 연결된 포트로 대체될 것이지만, 이 옵션이 항시 요구되는 것은 아니다. $MODE$ 문자열은 (tcp, udp)에서 blocking이 일어난 모드를 나타내는 것이지만, 이 역시 항시 요구되는 것은 아니다. KILL_HOSTS_DENY - 이것은 TCP wrappers가 사용하는 hosts.deny 파일에 적기 위한 스트링의 포맷이다. 다시말해 $TARGET$ 문자열은 공격자의 IP로 대체되기 위해 확장되며 반드시 요구된다. 여러분은 (%h, twist 등)뿐만 아니라 어떠한 TCP wrapper의 escape 코드들을 넣을 수 있다. $PORT$ 문자열은 공격자에 의해 연결된 포트로 대체될 것이지만, 이 옵션이 항시 요구되는 것은 아니다. $MODE$ 문자열은 (tcp, udp)에서 blocking이 일어난 모드를 나타내는 것이지만, 이 역시 항시 요구되는 것은 아니다. KILL_RUN_CMD - 이것은 공격자를 향한 route를 제거하기 *이전에* 작동시키기 원하는 명령이다. 공격이 탐지되었을 때, 여러분이 실행하기 원하는 어떠한 program이나 script를 집어넣을 수 있다. 나는 절대 ATTACKING HOST(공격하는 호스트)에 대해서 보복공격 작업을 집어넣지 않길 권고한다. 실제로, 포트스캔을 하고 있는 호스트는 해킹을 당한 임의의 호스트이다. 그러므로, 만약 여러분이 보복을 한다면, 아마도 여러분은 선량한(?) 사람들을 공격하는 것이 될 것이다. 보안의 목적은 쫓아버리는 것이다. 여러분은 그들을 화나게 해서 여러분에게 개인적인 복수를 하게 되기를 원치 않을 것이다. 유념하라. 비록 13살 어린이도 그들의 윈도우 컴퓨터에서 DoS(서비스거부) 공격을 실행하여서, 여러분의 인생을 비참하게 만들 수 있다는 것을... 위에서 보았듯이 $TARGET$, $PORT$, 그리고 $MODE$ 문자열은 유용하지만 이 옵션에 반드시 요구되는 것은 아니다. KILL_RUN_CMD_FIRST - 이 값을 "0"으로 설정하면 위의 명령이 route가 제거되기 전에 실행되도록 만든다. 이 값을 "1"로 설정하면 위의 명령이 이미 blocking이 된 후에 실행되도록 만든다. (역자 주: portsentry.conf 파일의 해당 설정 부분의 주석 설명을 보면 "0"이 이후에 실행되는 것이고 "1"이 이전에 실행되는 것으로 반대로 설명이 되어 있습니다. 아마도 portsentry.conf 파일에 있는 내용이 맞는 것 같습니다.. README.install 파일 내용이 틀린 듯 하네요.. 쩝.. );P SCAN_TRIGGER - PortSentry는 자신의 호스트에 접속하였던 호스트를 기억하는 state engine를 가지고 있다. 이 값의 설정은 PortSentry가 반응동작하기 전에 PortSentry에게 감시되는 port의 몇 번까지의 접속을 허용하도록 말해줄 것이다. 이것은 순차인 것과 임의적인 포트스캔을 둘 다 탐지한다. 디폴트값은 0이며, 이는 즉각 반응한다. 그 값을 1 또는 2로 해주면 잘못된 경고를 줄일 것이다. 그리고 이보다 높은 값들은 3회이상 다른 포트들에 접근했을 때와 같은 경우, 아주 수상한 행동을 감지하게 될 것이다. 일반적으로 여러분은 아무런 생각없이, 이 값을 0으로 놔둘 수 있다. 세번째 단계: 여러분의 문서 편집기로 portsentry.ignore 파일을 가져와서 그 안에 감시되고 있는 포트에 접근해도 (보안장치를 작동하지 않고) 무시해 버릴 호스트를 추가하라. 이것은 적어도 localhost(127.0.0.1)와 내부 네트워크의 IP주소를 포함해야만 한다. 우리는 *절대* 여러분과 동일네트워크상에 있는 모든 호스트 IP 주소를 집어넣는 것을 권장하지 않으며, 대신 그렇게 하기 위해서 여러분들은 netmask를 사용할 수 있다. 설정하는 형식은 아래와 같다: <IP Address>/<Netmask Bits> 192.168.2.0/24 192.168.0.0/16 등등... 우리는 너무 많은 호스트들을 적어 넣는 것을 권장하지 않는다. 아주 "신뢰관계"에 있는(friendly) 호스트일지라도 여러분에게 있어 누가 여러분에게 연결을 하고 있는지를 보는 것은 아주 중요한 일일 것이다. 이것은 여러분이 내부 호스트의 결탁(외부의 해킹에 의한)을 보다 빨리 탐지하는데 도움을 줄 것이다. 자신의 편집증에 충실해라. 그렇다. 이런 일은 일어나며 우리는 *상당수*의 경우 관리자들이 너무 많은 무시해버릴 호스트들을 적어 넣었고 그들 *내부 호스트들의 결탁(외부의 해킹에 의한)*에 의해서 해킹당했다는 사례들을 들었다. 네번째 단계: 컴파일(Compile). make 명령을 내리면, 여러분은 여러분의 시스템타입을 고르고, build하고 인스톨할 수 있게 된다. 원래 default directory는 /usr/local/psionic/portsentry2 이다. 만약 여러분이 이 디렉토리가 마음에 들지 않는다면 Makefile을 수정하고 새로운 경로에 영향을 주는 여러분의 portsentry.conf 와 portsentry_config.h 파일들을 확인하라. build한 후에 make install 명령을 내리면 여러분이 지정한 인스톨 디렉토리에 복사본 파일들을 만들어 준다. 다섯번째 단계: PortSentry를 작동시켜라. 설치한 후에 PortSentry를 작동하는데 있어 두 가지 방법이 있다: 1) 설치 디렉토리(/usr/local/psionic/portsentry2, 등등..)로 이동(cd)하여 다음을 실행시켜라: ./portsentry 2) 바로 명령을 실행시켜라: /usr/local/psionic/portsentry2/portsentry "Stealth" TCP scan detection mode [BETA] (스텔스 TCP 스캔 탐지 모드 - 베타) PortSentry는 자신의 호스트로 들어오는 모든 패킷들을 감시할 것이다. 만일 들어오는 패킷이 portsentry.conf 설정 파일에서 TCP_PORTS 변수에 입력되어진 감시 대상 포트 목록의 포트를 향한다면 그에 대응하여 호스트를 막아버릴 것이다. 이 방법은 connect() 스캔, SYN/half-open 스캔, XMAS 스캔, FIN 스캔, NULL 스캔, 등을 감지해 낼 것이다. UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.) "Stealth" UDP scan detection mode [BETA] (스텔스 UDP 스캔 탐지 모드 - 베타) 이것은 위의 TCP stealth mode와 작동방법은 동일하다. UDP 포트들을 나열하면, 그 포트들은 감시된다. 이것은 어떠한 소켓도 묶지 않으며, 실제 스텔스 스캔 탐지 모드가 아닌 중에도 거의 동일하게 동작한다.( 모든 UDP 패킷에 반응한다.) UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.) ** Advanced Logic Mode ** -PortSentry는 포트들을 감시하는 방법이 아주 뛰어나다. FTP와 같은 몇몇 프로토콜에 있어서, 클라이언트는 실제적으로 ephemeral range인 1024번에서 65535번까지의 범위에서 포트들을 연다. 그리고 서버는 *역으로* 여러분에게 접속한다. 보통은 이런 방식이 포트스캐너가 동작할 수 있게 해준다. 그러나 PortSentry는 호스트로 들어오는 접속을 감시할 것이고, 이러한 "임의적인" 접속연결(binding)로 향하는 것인지 아닌지를 결정할 것이다. 만약 임의적인 접속연결로 향한다면, 그 한번의 접속이 무시된다. 접속이 끊어지자마자 window는 닫히고 모든 방어체계가 다시 활동한다. 이것은 실제로 초보적인 stateful inspection engine이다. UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.) 인스톨을 확인하라: local log 파일의 마지막부분에 PortSentry의 초기화 메시지가 있어야 한다. 성공적인 PortSentry의 초기화 메시지는 아래와 같이 나타날 것이다: Mar 5 21:16:00 nemesis portsentry[2286]: adminalert: Monitoring interface eth0 and address: 10.1.1.1 Mar 5 21:16:00 nemesis portsentry[2286]: adminalert: Monitoring TCP ports: 1,11,110,143,635,1080. . . Mar 5 21:16:00 nemesis portsentry[2286]: adminalert: PortSentry is initialized and monitoring. ******************************************************************** ** 마지막 줄은 PortSentry가 적절하게 초기화되었음을 나타낸다...... ** ** 만약 여러분이 이런 메시지를 보지 못했다면 무언가가 틀린 것이다. ** ******************************************************************** 이제 여러분은 다른 호스트로 가서 텔넷으로 은폐된 폭팔물(PortSentry)이 장치된 포트로 접근할 수 있다. [주의] 절대로 여러분이 서비스 받을 위치에서 보호받는 호스트로 접근하지 마시오. 이유는 만일 그렇게 하면 여러분은 스스로 자신을 막아버리게 될 것이기 때문이다. 위의 주의점을 다시 한 번 숙지하라. 우리는 아래와 비슷한 것을 우리에게 알리는 사람들을 봤다.(만들어진 예기지만, 여러분들은 이 예기를 참고 할 수 있다) "안녕하세요, 제가 일년에 일주 정도만 헬리콥터를 타고서만 접근가능한 north atlantic의 고립된 석유 시추선에 있는 나의 웹 서버에다가 port sentry 를 설치했는데요. 그리고 나서 저는 웹 서버에 접속할 수 있는 온전한 행성에서 유일한 관리 시스템으로 가서 보호받는 포트에 텔넷으로 접근하여 port sentry 를 테스트 해 보았습니다. 지금으로서는 port sentry가 온전하게 작동하는 것 같습니다. 왜냐하면 제가 저의 컴퓨터에 접근할 수 없기 때문입니다. 하지만 이젠 제 컴퓨터에 접근해야겠는데요. 저 좀 도와주시겠어요?" 그건 그렇고... 여러분은 곧 다음과 같은 것들을 보게 될 것이다: Mar 5 21:17:39 packetmonkey portsentry[2286]: attackalert: Host 192.168.2.15 has been blocked via wrappers with string: "ALL: 192.168.2.15" Mar 5 21:17:39 packetmonkey portsentry[2286]: attackalert: TCP SYN scan from host 192.168.2.15/192.168.2.15 to TCP port: 143 from TCP port: 31337 만약 여러분이 접속이 끊어지고 다시 telnet으로 접속하기를 시도한다면 여러분은 방금 전의 호스트에 접근할 수 없음을 확인해야 한다. 이러한 동작이 확인된다면, 축하한다! 여러분은 PortSentry를 제대로 작동시킨 것이다. 만약 여러분의 로그체크 데몬이 띄워져 있다면 여러분이 서버에 접속할 때, 위의 접근거부 상황에 대한 경고 메시지 내용이 로그파일에 나타나는 것을 확인할 수 있을 것이다. 만약 여러분이 netstat -rn 명령을 하면 여러분은 이전에 동작하던 의심가는 호스트로의 죽은 경로를 보게 될 것이다.( 내가 이전에 권장했던 것과 같이, 패킷필터를 사용하지 않으면...) PortSentry 명령들을 리눅스 시작 스크립트파일(startup file)에 쓰고 나서, 여러분이 한 작업으로 돌아와라. 이게 어떻게 도움이 될 것인가 하면?? 여기 몇몇 좋은 생각들이 있다. - Run as a UDP service on port 69 to catch TFTP probes. (TFTP 침입을 잡기 위해서는 포트 69에 UDP 감지모드를 가동하라.) - Run as a UDP service on port 161,162 to catch SNMP probes. (SNMP 침입을 잡기 위해서는 포트 161,162에 UDP 감지모드를 가동하라.) - Run as a UDP service in the port range 32000-33000 to catch RPC probes. (RPC 침입을 잡기 위해서는 포트범위 32000-33000 에 UDP 감지모드를 가동하라.) - Run as a TCP service on port 143 to catch IMAP probes. (IMAP 침입을 잡기 위해서는 포트 143에 TCP 감지모드를 가동하라.) - Run as a TCP service on ports 11,15 to catch netstat/systat probes. (netstat/systat 침입을 잡기 위해서는 포트 11,15에 TCP 감지모드를 가동하라.) - etc. 등등 실제로 PortSentry는 빠르게 반응해서, 공격자에 의한 호스트 포트스캔은 감시대상 포트에 접근이 있은 후 1초이내에 차단될 것이다. UDP 스캔에 대해서는 모든 포트가 "열려진 상태"로 나타나게 함으로써 여러분을 스캔하는 이들을 매우 짜증스럽게 만들 것이다. TCP 스캔에서 공격자는 어떠한 응답도 얻을 수 없을 것이다. 안전성 =-=-=- 만약 우리가 프로그램의 안전에 대한 고려사항 중 잊고 놓친 것이 있다면, 여러분이 그 내용을 BugTraq에 올리기 전에 우리에게 알려주기를 원한다 :). 메시지 =-=-=-=- 가능한 모든 states/errors/successes and unknowns(상태/오류/성공 그리고 알 수 없는 것들)은 syslog 파일에 쓰여진다. 다음의 tag들이 의미하는 바는: adminalert: - PortSentry의 상태를 나타내는 메시지. securityalert: - 보안 관련 사건들이 일어났음을 나타내는 메시지 attackalert: - 스캔을 감지했다는 것과 그에 따른 동작이 실행되었다는 것. 파일들 =-=-= 현 상태로는, 모든 호스트들은 그들이 접속금지(blocked) 되었을 때 portsentry.history 파일뿐만 아니라 portsentry.blocked 파일에 기록된다. blocked file은 PortSentry가 다시 시작될 때마다 지워진다. history file은 간단히 덧붙여지며 일정한 기한까지 접속금지(blocked)된 호스트들의 기록으로 사용할 수 있다. 기한이 지난 후에 여러분은 공격했던 호스트들에 대해 죽은 경로를 삭제하고, 호스트를 hosts.deny 파일에 저장하길 원할 수도 있다. 이것은 전적으로 여러분의 결정에 달려있다. 만약 여러분이 공격자가 다시 접근할 때 접근금지(blocking)을 작동시키기를 원한다면, 단지 PortSentry를 재시작하거나 혹은 blocked file에서 개개의 호스트를 제거하면 된다. 대부분의 시스템에서 여러분이 접근금지시킨 호스트로의 경로를 회복시키길 원한다면 여러분은 단순히 아래와 같이 경로를 지움으로써 회복시킬 수 있다: 리눅스: route del <ip_address> reject 기타: route delete <ip_address> <dead_route> 또는 간단히 여러분의 패킷 필터들을 쏟아냄으로써 가능하다. 이것이 바로 내가 말하고자 한 것이다. 로그파일의 내용을 보는 것뿐만이 아니라 여러분이 다른 문제점들도 알 수 있도록 하기 위해서, 나는 여러분이 Abacus 프로젝트의 Logcheck를 사용하길 강력히 권장한다. 그리고 PortSentry가 여러분에게 무엇을 알리려고 하는지 살펴보길 권장한다. 여러분은 본 프로그램을 아래 주소에서 찾을 수 있다: http://www.psionic.com 이 문서를 읽어준 것에 감사히 생각하고, 질문이나 추가적인 조언이 있다면 내게 메일로 써 주기를 바란다. 감사한다, -- Craig |
![]() ![]() | |
SUBJECT: SED 명령어 사용법 o sed 스트림 편집기 ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다. sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 화일을 수정할 수 있게 하는 반면 ed처럼 대화식 처리는 불가능하다. sed 명령어는 1개 라인씩 입력 라인을 읽어들여 표준 출력에 출력한다. sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다. 일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은 수정되지 않고 그대로 출력된다. 이 sed 명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고 , 수정하고, 출력하기 때문에 기억장치 안의 버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 화일의 크기에 제한 없이 작업을 할 수 있다. ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 화일은 처리할 수 없으며 대개 버퍼의 크기는 1MB정도이다. 따라서 sed는 아주 큰 화일을 처리할 때 주로 사용된다. sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다. # sed "s/hello/goodbye" in.file 위의 명령어는 in.file이라는 화일에 있는 각 라인에서 첫번째 등장하는 hello라는 문자열을 goodbye로 교체한 후 그 라인을 표준 출력에 출력한다. # echo "1234hello5678" | sed "s/hello/goodbye/" 대치 명령어를 따옴표로 둘러싸야 올바로 사용할 수 있다. 여기서 문자열은 정규식으로 표현될수 도 있다. 그외에도 sed명령어에는 여러 가지 연산자를 사용할 수 있다. 다음의 명령어를 사용하면 hello라는 문자열을 포함하고 있는 모든 문자열을 삭제할 수 있다. # sed "/hello/d" in.file 위 명령어의 의미는 "hello라는 문자열을 포함하고 있는 라인을 찾아 그 라인을 삭제하라"는 것이다. 이 sed 명령어는 다음 명령어와 같은 의미이다. # grep -v hello in.file 라인을 전부 삭제하지 않고 hello라는 문자열만을 삭제하려면 다음 명령어를 사용하다. # sed "s/hello//" in.file ed와 같이 sed에서도 화일의 일부만을 대상으로 작업하는 경우는 라인의 범위를 지정할 수 있다. # sed "3,7s/hello//" in.file 위의 명령어는 in.file이라는 화일의 라인3에서 7까지만을 대상으로 첫번째 hello를 삭제하고 화일의 그 외의 부분은 변경시키지 않는다. 또한 다음과 같이 사용하면 라인 번호 대신 문맥을 범위로 지정할 수 있다. # sed "/hello/,/goodbye/s/bad/good/g" in.file 위의 명령어는 hello라는 단어를 포함하고 있는 첫번째 라인부터 goodbye라는 단어를 포함하고 있는 라인까지 검색하면서 bad라는 문자열을 모두 good으로 변경한다. 또한 문자열 goodbye를 만난 이후에도 다시 다른 hello가 등장하면 다음 goodbye가 나올 때까지 대치 작업은 반복된다. sed명령어의 기능은 지금까지 우리가 살펴본 것보다 더 강력하다. sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 화일에 기억시켜 놓고 사용할 수도 있다. # sed -f command.file in.file 여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 화일이 유용하게 사용된다. 예를 들어 다음과 같은복수 개의 명령어가 화일에 기억되어 있는 경우는 # vi command.file s/hello/goodbye s/good/bad 다음과 같은 명령어를 입력하면 # echo "1234hello5678" | sed -f command.file 다음과 같이 출력된다. # echo "1234hello5678" | sed -f command.file 1234badbye5678 o sed 기본 # sed '' ljs --> cat ljs 와 동일 o sed 편집 명령어 일상적인 sed 명령 --------------------------------------------------------------------------------------- a\ 다음 라인(들)을 적용될 라인들에 부가한다 (라인뒤) c\ 적용될 라인들을 다음 라인(들)로 변경한다 (라인 대체) d 적용될 라인들을 삭제한다 g 단지 첫번째의 것만이 아니라 라인의 모든 부합 패턴 대체가 적용 되게 한다 i\ 다음 라인(들)을 적용될 라인들 위에 삽입한다 (라인앞) p - n 옵션하에 있을지라도, 라인을 프린트한다 q 명시된 라인에 도달할 때 중지한다 r filename filename을 판독한다. 내용을 출력에 부가한다 s/old/new/ "old"를 "new"로 대체한다 = 라인 번호를 프린트한다 !command 라인이 선택되지 않는 경우 command를 적용한다. -------------------------------------------------------------------------------------- o 라인 명시 sed명령은 두가지 방법을 사용한다. 첫 번째는 번지를 번호로 명시하는것이다. 여러분은 특정한 라인을 가리키기 위해 단일 번호를 사용할 수 있다. # sed '3d' ljs --> 세번째 라인을 삭제 또는, 라인들의 범위를 가리키기 위해 콤마(,)로 분리된 두 번호들을 사용할 수 있다. # sed '2,4 s/e/#/' ljs --> 대체 명령은 단지 2-4 라인들에만 적용된다. (단순 대체 명령은 라인에서 첫번째 어커런스에만 적용된다는 점을 기억하라. 따라서 각 적용 라인의 첫 번째 e만이 #로 대체된다) # sed -n '/kingdom/p' ljs --> kingdom이 들어있는 line만 프린트 # sed '/kingdom/p' ljs --> 모든 line이 나타나고 그와 동시에 kingdom line이 중복해서 나타남 # sed '[Pp]rincess/d' ljs --> princess 또는 Princess를 포함하고 있는 라인들을 삭제함 # sed '1,/fragrant/d' ljs --> 라인 1로부터 fragrant를 포함하고 있는 첫번째 라인까지의 모든 라인들을 삭제함 o sed 명령 하이라이트 # more ljs I am a boy You are a girk He is a doctor # sed 'a\\ Hey la la\! Doo de dah\!' ljs --> 각 라인뒤에다 Hey la la!를 입력 I am a boy Hey ! You are a girk Hey ! He is a doctor Hey ! # sed 'a\\ Oh\! good\\ --> \\을 사용함으로써 하나 이상의 라인들을 부가할 수 있다 yeh' ljs # sed '3a\\ Good Morning' ljs --> 3 line뒤에다 내용 삽입 # sed 'c\\ Oh marvelous delight! sing to me! ' ljs --> 기존의 라인들을 이것으로 대체시킴 Oh marvelous delight! sing to me! Oh marvelous delight! sing to me! Oh marvelous delight! sing to me! # sed '2q' ljs = sed 2q ljs --> q명령은 편집기로 하여금 그것이 명시된 라인에 도착한 뒤 중지하게 한다. 즉 2라인만 보여줌 # sed -n '1s/a/#/gp' ljs --> 전체적으로 바꿔줌 o sed의 패턴-부합 패턴-부합에 대한 sed메타 문자 ------------------------------------------------------------------- 메타 문자 작 용 ------------------------------------------------------------------- \ 다음 문자의 특수한 의미를 부정한다 ^ 라인의 시작과 부합한다 $ 라인의 끝과 부합한다 . 어떠한 단일 문자와도 부합한다 [ ] 둘러싸인 문자들 중의 어느 하나와 부합한다 [^...] ...리스트에 없는 어떠한 문자와도 부합한다 pat* 0 또는 그 이상의 pat 어커런스들과 부합한다 여기에서 pat는 단일문자 또는 [ ]패턴이다 & s 명령의 newpattern부분에서 사용되어 oldpattern 부분의 재 산출을 나타낸다 ------------------------------------------------------------------- o 간략한 예 ---------------------------------------------------------------------------------------- 명 령 결 과 ---------------------------------------------------------------------------------------- /Second/ Second를 포함하고 있는 어떠한 라인과도 부합한다. /^Second/ Second로 시작하는 어떠한 라인과도 부합한다. /^$/ 공백라인, 즉 라인의 시작과 끝 사이에 아무것도 없는 라인과 부합한다. 이것은 공백 스페이스들로 된 라인과는 부합하지 않는바, 스페이스 자체가 문자이기 때문이다. /c.t/ cat, cot, 기타 등을 포함하고 있는 라인들과 부합한다. 이 패턴은 단어의 일부일 수 있음에 유의하라. 예를 들어, apricot와 acute도 부합된다. /./ 적어도 한 문자를 포함하고 있는 라인들과 부합한다. /\./ 피리어드를 포함하고 있는 라인들과 부합한다. \는 .의 특수한 의미를 부정 /s[oa]p/ sop또는 sap와는 부합하지만 sip 또는 sup와는 부합하지 않는다. /s[ ^oa]p/ sip또는 sup와는 부합하지만 sop또는 sap와는 부합하지 않는다. s/cow/s&s/ cow를 scows로 대체한다. /co*t/ * --> 어떠한 수 ---------------------------------------------------------------------------------------- o 간단한 sed 해법 # sed '/^$/d' ljs --> 모든 공백 라인 제거 # sed '/^ *$/d' --> space로 만들어진 공백까지 제거 (조심! ^와 *사이에 공백이 있어야 한다) # sed 'a\\ ' ljs --> 각 line마다 공백라인 추가 # sed '/^#/d' ljs --> 첫번째 열에 #을 가진 라인 제거 # sed 's/^/ /' ljs --> 각 line의 시작을 5 space로 대체 o 다중 명령 # sed 's/Bob/Robert/g\ s/Pat/Patricia/g' ljs --> sh을 사용하는 경우에는 \을 생략하라 # sed 's/cat/dog/g\ s/dog/pigs/g' ljs --> 먼저 모든 cats를 dogs로 변환한 다음에 모든 dogs를 pigs로 변환한다. # sed 's/Bob/Robert/g\ s/Pat[^a-z]/Patricia/g' ljs --> ^a-z은 a에서 z까지의 문자들이 아닌 모든 문자를 의미한다는 점을 상기하라 o 태그 위에서 Pat!와 같은 것이 발견될때 !를 포함한 전체 문자열이 Patricia로 대체되므로 !가 소실된다. 우리는 !를 유지하면서 Pat를 대체하는 방법을 필요로 한다. 우리는 이것을 태그(tag)를 사용하여 수행할 수 있다. 패턴의 일부를 "태그"하려면, 그것을 좌측에는 \(로 우측에는 \)로 둘러싸라. 그 다음에, 명령의 newpattern부분에서, 여러분은 그렇게 둘러싸인 패턴의 첫 번째 것은 \1로, 두번째 것은 \2 등으로 인용할 수 있다. 이 방법을 사용하면 다음의 명령이 부여된다. # sed 's/\(Pat\)\([^a-z]\)/\1ricia\2/g' ljs o 쉘 스크립트와 sed # vi twospace sed 'a\\ ' $* --> $*은 모든 인자들을 나타냄 # twospace ljs | pr | lpr 위 예는 sed가 어떻게 하여 UNIX 프로그래밍과 쉘 스크립트에 적합한가를 나타낸다. |
![]() ![]() | |
1. nmap 은 네트워크 어떤포트가 열려있는가 listening되고 있는가를 스캔하기 위한 tool입니다. 자료출처 : 한서버 |
![]() ![]() | |
========================= ------------------------- 2. 삭제 3. 저장 4. ! 5. 문서의 모든 부분[혹은 부분(라인 넘버를 넣어줌)]을 소문자->대문자, 7. copy ------------------------ ----------------------------- - 수정된지 2일이 됬고 apr 로 시작하는 jsp 파일들의 목록 - 오늘 수정된 jsp 파일 목록 - 특정 문자를 포함하고 있는 파일 이름리스트 찾기 2. ls & wc 3. Back quote(`) 는 명령어를 실행하라는 의미의 문자이다. 4. Exit Status 4. Redirection 6. Shell Script 를 디버그 할때 유용한 명령어(-x, -v 옵션) 7. /bin/bash 명령어의 두가지 의미 8. 도스 버젼의 text 파일(^M 들어 있는 것들)을 유닉스로 변환시켜주는 명령어 :
2. Memory |
![]() ![]() | |
파일 나누기
|
안녕하세요."rootman.co.kr" 운영자입니다.
"shc" 는 스크립트 파일을 바이너리로 바꿔 주는 역할을 합니다. php encoder 같은 역할을 한다고 보면 됩니다.
예전엔 중요한 소스 같은 경우, php로 스크림트 파일 위치를 열어서 특정 디렉터리에 위치해 놓고 컴파일하여 사용했는데, "shc"를 사용하니 더욱 강력(?)하고 손 쉽게 인코딩하더군요.
역시 아는 것이 힘입니다.
쉘 스크립트도 역시 중요한 "root" 패스워드 정보, "DB" 정보 등 공유되거나 유출되면 안 되는 파일들이 존재합니다.
이럴 때 정말 유용하게 사용될 수 있으니, 아직까지 모르셨던 분들 아래 문서 참고하셔서 도움되시길 바랍니다. 좋은 날, 기쁜 날 되시길 빕니다.
-------------------------------------------------------
1. 다운로드
-------------------------------------------------------
(1) 공식
http://www.datsi.fi.upm.es/~frosal/
(2) rootman 사이트
http://www.rootman.co.kr/NFS/Util/shc-3.8.3.tgz
-------------------------------------------------------
2. 설치
-------------------------------------------------------
[root@ns1 local]# tar xvfz shc-3.8.3.tgz
shc-3.8.3/CHANGES
shc-3.8.3/Copying
shc-3.8.3/Makefile
shc-3.8.3/match
shc-3.8.3/pru.sh
shc-3.8.3/shc.1
shc-3.8.3/shc.c
shc-3.8.3/shc.html
shc-3.8.3/shc.README
shc-3.8.3/test.bash
shc-3.8.3/test.csh
[root@ns1 shc-3.8.3]# make install
*** Installing shc and shc.1 on /usr/local
*** ¿Do you want to continue? y
install -c -s shc /usr/local/bin/
install -c -m 644 shc.1 /usr/local/man/man1/
"shc" 파일은 /usr/local/bin/ 디렉터리에 설치됩니다.
-------------------------------------------------------
3. 테스트
-------------------------------------------------------
(1) 파일 생성 (__EOF___ 까지 쉘 상태에서 긁어다가 붙이시면 됩니다.)
cat > /root/tmp/script.sh << __EOF__
#!/bin/sh
#------------------------------
# this file is not encrypted
#------------------------------
echo "I love Duane's articles and will send him a donation via PayPal."
exit 0;
__EOF__
(2) 명령행 실행
[root@ns1 tmp]# shc /root/tmp/script.sh
"script.sh.x"라는 바이너리 파일이 생성된다.
(3) 생성된 스크립트 수행
[root@ns1 tmp]# ./script.sh.x
I love Duane's articles and will send him a donation via PayPal.
-------------------------------------------------------
4. 특이한 기능
-------------------------------------------------------
[root@ns1 tmp]# shc -e 09/10/2004 -m "Dude it is too late to run this script." -f script.sh
[root@ns1 tmp]# ./script.sh.x
./script.sh.x: has expired!
Dude it is too late to run this script.
- 쉘 스크립트에 대한 만료일을 지정하여 실행할 수 있습니다.
- 지정된 날짜 이후는 실행되지 아니합니다.
- 위 예는 "2004년 10월 9일"을 스크립트 만료일로 지정하여 만료 후에는 "Dude it is too late to run this script."라는 메시지를 출력하라고 지정한 내용입니다.
-------------------------------------------------------
5. 참고사항
-------------------------------------------------------
- "shc" 명령어는 스크립트에 대한 C 소스 코드를 생성합니다.
- binary로 파일이 생성되므로 "./파일명" 형태로 실행하여야 합니다.
- 생성된 스크립트 파일은 이름을 변경해도 무관합니다.
-------------------------------------------------------
6. 기본 실행 옵션 설명
-------------------------------------------------------
(1) -e date
만료일을 지정합니다. (dd/mm/yyyy format)
(2) -m message
만기 시 메시지를 출력합니다.
(3) -f script_name
컴파일할 스크립트 파일을 지정합니다.
출처 : rootman.co.kr
![]() ![]() | |||||||||||||||||||||||||||||||||||||||||
chmod 600 /web/quota.user convertquota -u /web mount cat /etc/fstab mount mount -o /dev/hda2 mount -o remount /dev/hda2 cd /web/ quotacheck -m /web rpm -qa quota mount pstree /usr/local/apache/bin/apachectl stop vi /etc/fstab dmesg umount /dev/hda2 pstree mount -o remount /web dmesg mount -o remount /dev/hda2 quotacheck -m /web mount -o remount /web quotacheck -m /web dmesg uname -a vi /etc/fstab mount mount -o remount /dev/hda2 quotacheck -m /dev/hda2 quotacheck -m /web mount rm -rf quota.user ll mount quotacheck -m /web touch quota.user quotacheck -m /web ll touch aquota.user quotacheck -m /web quotaon -a rm -rf quota.user quotacheck -m /web touch quota.user quotacheck -m /web touch aquota.user quotacheck -m /web quotaon -a |
0