* fwknop 설치
fwknop 의 설치는 http://www.cipherdyne.org/fwknop/download/ 에서 최신 소스 tarball 이나 RPM을 받는 것이다. 역시 MD5 합을 확인하는 것이 좋으며, 보안적 관점에서는 GnuPG 서명을 확인하기 위해 GnuPG를 사용하는 것이 더 좋다. 받은 파일이 안전하다고 판명되면 설치 과정을 진행할 수 있다.
이제 압축을 풀고 install.pl 스크립트를 실행하여 설치를 진행하자.
아래 보이는 에러 메시지는 필자의 서버에 make 유틸리티의 설치가 되어있지 않아 발생한 문제로, 데비안/우분투 배포판의 경우,
# apt-get install make
의 명령어로 설치가 가능하다.
fwknop 의 설치 스크립트 install.pl 은 사용자에게 권한 부여 모드(SPA 모드나 기존의 포트 노킹 모드)나 fwknop가 패킷을 스니핑할 인터페이스와 같은 몇 가지 정보를 질문할 것이다.
아래는 필자가 fwknop 프로그램을 설치하면서 선택한 옵션들이다.
[+] fwknop can act as a server (i.e. monitoring authentication packets
and sequences, and taking the appropriate action on the local system
to alter the firewall policy or execute commands), or as a client (i.e.
by manufacturing authentication packets and sequences).In which mode will fwknop be executed on the local system? (Note that
fwknop can still be used as a client even if you select “server” here).
(client/[server]): server[+] In server mode, fwknop can acquire packet through a pcap file that is
generated by a sniffer (or through the Netfilter ulogd pcap writer), or
by sniffing packets directly off the wire via the Net::Pcap perl module.
Fwknop can also acquire packet data from iptables syslog messages, but
this is only supported for the legacy port knocking mode; Single Packet
Authorization (SPA), which is used in the pcap modes, is a better
authorization strategy from every perspective (see the fwknop man page for
more information). If you intend to use iptables log messages (only makes
sense for the legacy port knocking mode), then fwknop will need to
reconfigure your syslog daemon to write kern.info messages to the
/var/lib/fwknop/fwknopfifo named pipe. It is highly recommended
to use one of the pcap modes unless you really want the old port knocking
method.Which of the following data acquistion methods would you like to use?
([pcap], file_pcap, ulogd, syslogd, syslog-ng): pcap[+] It appears that the following network interfaces are attached to the
system:
eth0
eth1
lo
Which network interface would you like fwknop to sniff packets from? eth0
[+] fwknop access alerts will be sent to:root@localhost
[+] Would you like access alerts sent to a different address ([y]/n)?
[+] To which email address(es) would you like fwknop alerts to be sent?
You can enter as many email addresses as you like; each on its own line.End with a “.” on a line by itself.
Email Address: root@localhost
Email Address: .
[+] Enable fwknop at boot time ([y]/n)? n[+] fwknop has been installed! To start in server mode, run
“/etc/init.d/fwknop start”
You may want to consider running the fwknop test suite in the test/
directory to ensure that fwknop will function correctly on your system.Note: You will need to edit /etc/fwknop/access.conf for fwknop to
function properly in server mode. More information can be found in
the fwknopd(8) manpage.
fwknop는 SPA 클라이언트로서 SPA 패킷을 전송만 할 수 있게 설치할 수도 있고 SPA 패킷을 전송하는 것뿐만 아니라 네트워크로부터 SPA 패킷을 스니핑할 수도 있게(이것이 기본 값이다) 설치할 수도 있다. fwknop를 전체 설치하면 파일 시스템에 다음과 같은 기본 동작을 지원하기 위한 다양한 파일과 디렉토리가 생성된다.
/usr/bin/fwknop : 사용자로부터 암호를 입력받고 fwknop 패킷 형식을 따르는 SPA 패킷을 구성한 후 라인달 대칭 키 알고리즘이나 GnuPG 비대칭 암호화 알고리즘(GnuPG 와 연동)으로 패킷 데이터를 암호화하고 암호화된 SPA 패킷을 UDP, TCP, 또는 ICMP 를 통해 전송하는 클라이언트 프로그램이다. 기본적으로 fwknop는 UDP 포트 62201로 SPA를 전송하지만 명령 행에서 이를 변경할 수 있다.
/usr/bin/fwknopd : SPA 패킷 데이터의 스니핑과 평문화, 재전송 공격으로부터의 보호, fwknop SPA 해킷 형식의 디코딩, 접근 권한 확인, SPA 패킷이 요청한 서비스로 일시적인 권한을 보여하기 위한 로컬 iptables 정책의 재설정을 담당하는 주요 데몬이다.
/usr/bin/fwknop_serv : SPA 패킷이 Tor 익명화 네트워크(http://tor.eff.org)를 통해 전송될 때만 쓰이는 간단한 TCP 서버다. 이 서버를 사용하면 양방향 통신을 하게 되므로 SPA 프로토콜의 통상적인 단방향 특성이 깨지게 된다.
/usr/lib/fwknop : fwknop이 사용하는 펄 모듈은 시스템 펄 라이브러리를 보존하기 위해 이 디렉토리에 설치된다. 설치되는 모듈은 Net::Pcap, Net::IPv4Addr, Net::RawIP, IPTables::Parse, IPTables::ChainMgr, Unix::Syslog, GnuPG::Interface, Crypt::CBC, Crypt::Rijndael 이다. install.pl 스크립트는 디스크 사용을 최소화하기 위해 시스템 펄 라이브러리 트리에 없는 펄 모듈만을 설치한다. 그러나 –force-mod-install 명령 행 인자를 사용해서 install.pl 이 필요한 펄 모듈 전체를 설치하게 할 수도 있다. IPTables::Parse 와 IPTables::ChainMgr 모듈은 ipfw 방화벽을 실행 중인 시스템에 설치하거나 윈도우의 시그윈(Cygwin)에 클라이언트 전용 모드로 설치하는 경우에는 절대 설ㅊ되지 않는다.
/etc/fwknop : fwknop.conf 나 access.conf와 같은 fwknop 데몬 설정 파일을 위한 주요 디렉토리이다. 이 디렉토리는 서버 모드로 실행될 때 fwknop 데몬이 사용하며, 클라이언트 모드에서 SPA 패킷을 전송할 때는 필요치 않다.
/usr/sbin/knopmd : 명명된 파이프 /var/lib/fwknop/fwknopfifo 에서 iptables 로그 메시지를 구문 분석하는 데 쓰이는 데몬이다. 이 데몬은 fwknop 가 포트 노킹 모드로 실행될 때만 쓰인다.
/usr/sbin/knoptm : fwknop가 적법한 SPA 클라이언트를 위해 접근 규칙을 추가한 iptables 체인에서 규칙 항목을 제거하는 데몬이다. 주 fwknopd 데몬은 실시간 인터페이스로부터 스니핑하며, OS는 fwknopd가 인터페이스에 의해 패킷을 수신할 때까지 fwknopd의 실행을 스케쥴링하지 않기 때문에 이 데몬이 필요하다. fwknopd가 별도의 스니퍼 프로세스나 ulogd에 의해 갱신되는 PCAP 파일에서 패킷 데이터를 읽을 때는 knoptm 데몬이 사용되지 않는다. 이 경우 fwknopd 는 인터페이스에서 패킷이 수신됐는지 여부와 무관하게 주기적으로 실행되게 스케줄링되며, iptables 규칙에 대한 시간 만료를 직접 강제할 수 있다.
/usr/sbin/knopwatched : 데몬이 죽는 경우 이를 재시작하는 감시 데몬이다. 그러나 일반적으로 fwknop는 매우 안정적이므로 knopwatchd이 실질적으로 쓰이는 경우는 거의 없다. 그러나 SPA를 실행한다는 것은 fwknop가 실행 중이지 않다면 어떤 것도 보호된 서비스로 접근할 수 없다는 것을 의미하므로 단순한 예방 조치로서 이 데몬이 필요하다.
/etc/init.d/fwknop : fwknop를 위한 초기화 스크립트로 사용자가 대부분의 리눅스 배포판과 동일한 방식(/etc/init.d/fwknop start)를 실행하는 방식으로 fwknop를 시작할 수 있게 해준다. init 스크립트를 사용하는 것은 fwknop를 서버 모드로 시작할 때만 가능하다.
* fwknop 설정
서버 모드에서 fwknop는 설정 지시어를 위해 두 개의 주요 설정 파일인 fwknop.conf 와 access.conf 를 참조한다. psad 설정 파일(5장 참조)과 마찬가지로 설정 파일의 각 행에는 설정 변수를 정의하기 위한 간단한 키-값 규약이 나온다. 주석 행은 #로 시작한다.
** /etc/fwknop/fwknop.conf
fwknop.conf 파일은 인증 모드, 방화벽 유형, 패킷을 스니핑할 인터페이스, 패킷을 무차별적으로 스니핑할지 여부(즉, fwknoop가 로컬 인터페이스의 MAC 주소를 목적지로 가지지 않는 이더넷 프레임을 처리할지 여부), 경고가 전송될 메일 주소 등과 같은 중요한 설정 변수를 정의한다.
– AUTH_MODE
AUTH_MODE 는 fwknop 데몬에게 패킷 데이터를 어떻게 수집할지 알려준다.
### This defines the general strategy fwknop uses to authenticate remote
### clients. Possible values are “PCAP” (authenticate via regular pcap; this
### is the default and puts the interface in promiscuous mode unless
### ENABLE_PCAP_PROMISC is turned off) FILE_PCAP (authenticate via a pcap file
### that is built by a sniffer), ULOG_PCAP (authenticate via the ulogd pcap
### writer). This variable can also be set to “KNOCK” if you really want to
### use the legacy port knocking mode.
AUTH_MODE PCAP;
– PCAP_INTF
PCAP_INTF 변수는 fwknop 데몬이 패킷을 감시하기 위해 사용하는 실시간 인터페이스를 정의한다. 이 변수는 AUTH_MOD 가 PCAP으로 설정된 경우에만 사용된다.
### Define the ethernet interface on which we will sniff packets. Note
### that this is only used if the AUTH_MODE keyword above is set to
### “PCAP”
PCAP_INTF eth0;
– PCAP_FILTER
실시간 인터페이스는 SPA 트래픽과 전혀 무관한 다량의 패킷을 전송하거나 수신할 수 있으며, fwknop 데몬이 이런 패킷까지 처리하게 할 필요는 없다. PCAP_FILTER 변수는 libpcap 이 네트워크 계층 주소나 전송 포트 번호 등과 같은 기준에 기반해서 fwknop에게 전달하는 패킷 유형을 제한할 수 있게 해준다.
### Define the filter used for PCAP modes; we default to udp port 62201.
### However, if an fwknop client uses the –rand-port option to send the
### SPA packet over a random port, then this variable should be updated to
### something like “udp dst portrange 10000-65535”;
PCAP_FILTER udp port 62201;
– ENALBLE_PCAP_PROMISC
이 변수는 Y로 설정될 경우 fwknop 데몬이 실시간 패킷 캡처 인터페이스를 통해 전송되는 모든 이더넷 프레임을 감시하게 한다(즉, 인터페이스가 무차별 모드로 동작한다). 이 변수는 AUTH_MODE가 PCAP으로 설정된 경우 기본적으로 활성화된다. 그러나 fwknop 데몬이 스니핑하는 인터페이스가 활성화 상태로 할당된 IP 주소를 가지고 있다면, 즉 이 인터페이스를 통해 SPA 패킷을 직접 전송할 수 있다면 기능을 비활성화 할 수 있다.
### Define whether put the pcap interface in promiscuous mode.
ENABLE_PCAP_PROMISC Y;
– FIREWALL_TYPE
FIREWALL_TYPE 변수는 fwknopd가 유효한 SPA 패킷을 수신한 후 재설정해야 하는 방화벽 유형을 알려준다. 지원되는 값은 iptables(기본 값)와 FreeBSD나 Mac OS X 시스템을 위한 ipfw 다.
### Define the firewall type. The default is “iptables” for Linux systems,
### but this can be set to “ipfw” for *BSD systems. Also supported is
### “external_cmd” to allow fwknop to invoke an external command instead of
### interfacing with the firewall at all
FIREWALL_TYPE iptables;
– IPT_AUTO_CHAIN1
IPT_AUTO_CHAIN1 변수의 기본 설정은 맞춤형 iptables 체인 FORWARD_INPUT에 ACCEPT 규칙을 추가하고 패킷을 고유 INPUT 체인에서 이 체인으로 건너뛰게 하는 것이다.
### fwknop uses the IPTables::ChainMgr module to add allow rules to a
### custom iptables chain “FWKNOP_INPUT”. This chain is called from
### the INPUT chain, and by default no other iptables chains are used.
### However, additional chains can be added (say, if access needs to
### be allowed through the local system via the FORWARD chain) by
### altering the IPT_FORWARD_ACCESS variable below. For a discussion of
### the format followed by these keywords, read on:
### Specify chain names to which iptables blocking rules will be
### added with the IPT_INPUT_ACCESS and IPT_FORWARD_ACCESS keyword.
### The format for these variables is:
### <Target>,<Direction>,<Table>,<From_chain>,<Jump_rule_position>,
### <To_chain>,<Rule_position>.
### “Target”: Can be any legitimate iptables target, but should usually
### just be “DROP”.
### “Direction”: Can be “src”, “dst”, or “both”, which correspond to the
### INPUT, OUTPUT, and FORWARD chains.
### “Table”: Can be any iptables table, but the default is “filter”.
### “From_chain”: Is the chain from which packets will be jumped.
### “Jump_rule_position”: Defines the position within the From_chain where
### the jump rule is added.
### “To_chain”: Is the chain to which packets will be jumped. This is the
### main chain where fwknop rules are added.
### “Rule_position”: Defines the position where rule are added within the
### To_chain.
IPT_INPUT_ACCESS ACCEPT, src, filter, INPUT, 1, FWKNOP_INPUT, 1;
### The IPT_OUTPUT_ACCESS variable is only used if ENABLE_IPT_OUTPUT is enabled
IPT_OUTPUT_ACCESS ACCEPT, dst, filter, OUTPUT, 1, FWKNOP_OUTPUT, 1;
### The IPT_FORWARD_ACCESS variable is only used if ENABLE_IPT_FORWARDING is enabled
IPT_FORWARD_ACCESS ACCEPT, src, filter, FORWARD, 1, FWKNOP_FORWARD, 1;
IPT_DNAT_ACCESS DNAT, src, nat, PREROUTING, 1, FWKNOP_PREROUTING, 1;
### The IPT_SNAT_ACCESS variable is not used unless both ENABLE_IPT_SNAT and
### ENABLE_IPT_FORWARDING are enabled. Also, the external static IP must be
### set with the SNAT_TRANSLATE_IP variable. The default is to use the
### IPT_MASQUERADE_ACCESS variable.
IPT_SNAT_ACCESS SNAT, src, nat, POSTROUTING, 1, FWKNOP_POSTROUTING, 1;
IPT_MASQUERADE_ACCESS MASQUERADE, src, nat, POSTROUTING, 1, FWKNOP_POSTROUTING, 1;
– ENABLE_MD5_PERSISTENCE
ENABLE_MD5_PERSISTENCE 변수는 fwknop 데몬이 성공적으로 평문화된 SPA 패킷의 MD5 합을 디스크에 기록할지 여부를 제어한다. (필자가 설치한 fwknop-1.9.12 버전은 약간 다르게 되어 있었다. DIGEST_TYPE 에서 암호화 방식을 결정한 후, 그것의 기록여부를 확인하는 방식이었다)
### Track digest sums associated with previous fwknop process. This allows
### digest sums to remain persistent across executions of fwknop.
ENABLE_DIGEST_PERSISTENCE Y;### Default to using all three of SHA256, SHA1, and MD5 for SPA replay attack
### detection. This is overkill, but performance is not usually a concern.
### Further, the variable can also be set to “SHA1” or “MD5”.
DIGEST_TYPE ALL;
– MAX_SPA_PACKET_AGE
MAX_SPA_PACKET_AGE 변수는 fwknop 서버가 SPA 패킷을 수용할 수 있는 최대 나이를 초로 정의한다. 기본 값은 2분이다. 이 변수는 ENABLE_SPA_PACKET_AGING 이 활성화된 경우에만 사용한다.
### This instructs fwknopd to not honor SPA packets that have an old time
### stamp. The value for “old” is defined by the MAX_SPA_PACKET_AGE variable.
### If ENABLE_SPA_PACKET_AGING is set to “N”, fwknopd will not use the client
### time stamp at all.
ENABLE_SPA_PACKET_AGING Y;### Defines the maximum age (in seconds) that an SPA packet will be accepted.
### This requires that the client system is in relatively close time
### synchronization with the fwknopd server system (NTP is good). The default
### age is two minutes.
MAX_SPA_PACKET_AGE 120;
– REQUIRE_SOURCE_ADDRESS
REQUIRE_SOURCE_ADDRESS 변수를 통해 fwknop 서버는 모든 SPA 패킷이 암호화된 페이로드에 iptables 를 통해 접근 권한을 부여 받을 IP 주소를 포함하게 요구할 수 있다. 이 기능을 활성화하면 fwknop 클라이언트 명령 행에서 -s 인자를 사용한 SPA 패킷에 위치한 0.0.0.0 와일드카드 IP 주소는 수용되지 않는다.
### Force all SPA packets to contain a real IP address within the encrypted
### data. This makes it impossible to use the -s command line argument on
### the fwknop client command line, so either -R has to be used to
### automatically resolve the external address (if the client behind a NAT) or
### the client must know the external IP.
REQUIRE_SOURCE_ADDRESS N;
– EMAIL_ADDRESS
fwknop 서버는 SPA 패킷이 수용되고 서비스로의 접근 권한이 부여될 때, 접근 권한이 제거될 때, 재전송 공격이 무력화됐을 때 등과 같은 여러 상황에서 메일 경고를 전송한다. 콤마를 이용해서 여러 개의 메일 주소를 명시할 수도 있다.
### Supports multiple email addresses (as a comma separated
### list).
EMAIL_ADDRESSES root@localhost;
– GPG_DEFAULT_HOME_DIR
GPG_DEFAULT_HOME 변수는 전자 서명 확인과 SPA 패킷의 평문화를 위해 GnuPG 키가 저장되는 디렉토리의 경로를 명시한다. 기본 값은 루트의 홈 데릭토리에 있는 .gnupg 디렉토리다.
### If GPG keys are used instead of a Rijndael symmetric key, this is
### the default GPG keys directory. Note that each access block in
### /etc/fwknop/access.conf can specify its own GPG directory to override
### this default.
GPG_DEFAULT_HOME_DIR /root/.gnupg;
– ENABLE_TCP_SERVER
ENABLE_TCP_SERVER 변수는 fwknop이 SPA 패킷 데이터를 수용하기 위해 특정 포트로 TCP 서버를 바인딩할지 여부를 제어한다. SPA 패킷이 데이터 전송에 TCP 만을 사용하는 Tor 네트워크를 통해 라우팅되길 바란다면 이 기능은 활성화해야 한다. 이 기능은 기본적으로 비활성화돼있다.
### Note that fwknopd still only gets its data via pcap (unless AUTH_MODE is
### set to ‘SOCKET’), so the filter defined by PCAP_FILTER needs to be updated
### to include the tcp or udp port if either of these variables are enabled.
ENABLE_TCP_SERVER N;
ENABLE_UDP_SERVER N;### Set the default port number for a “dummy” tcp or udp server (udp is
### best to use since nothing will be sent back to the client, so as far as a
### scanner can tell the port is ‘filtered’). The server is only spawned when
### ENABLE_TCP_SERVER or ENABLE_UDP_SERVER is set to “Y”.
TCPSERV_PORT 62201;
UDPSERV_PORT 62201;
** /etc/fwknop/access.conf
/etc/fwknop/access.conf 파일은 평문화 암호나 사용자에게 할당된 권한 부여 권리와 같은 내용을 담당한다.
#
# File: access.conf
#
# Purpose: This file defines how fwknop will modify firewall access controls
# for specific IPs/networks. It gets installed by default at
# /etc/fwknop/access.conf and is consulted by fwknop when run in
# “access control mode”, which is the default (i.e. when fwknop is
# run from the command line without any command line arguments).
# Normally fwknop is used in Single Packet Authorization (SPA) mode
# but the legacy port knocking mode is also supported. Multiple
# access controls can be specified for the same source machine, and
# access for arbitrary addresses is also defined in this file.
#
# See the fwknop man page for a comprehensive treatment of the various
# access control variables. See the README.ACCESS file for additional
# examples on how to configure access for various services.
#
##############################################################################
#
# $Id: access.conf 1145 2008-06-28 15:41:17Z mbr $
#### default Single Packet Authorization (SPA) via libpcap:
SOURCE: ANY;
OPEN_PORTS: tcp/22; ### for ssh (change for access to other services)
KEY: __CHANGEME__;
FW_ACCESS_TIMEOUT: 30;
### if you want to use GnuPG keys (recommended) then define the following
### variables
#GPG_HOME_DIR: /root/.gnupg;
#GPG_DECRYPT_ID: ABCD1234;
#GPG_DECRYPT_PW: myGpgPassword;
#GPG_REMOTE_ID: 1234ABCD;
– SOURCE
SOURCE는 fwknop가 유효한 SPA 패킷의 접근 수준을 결정하게 해주는 주요 구분 변수다.SOURCE 변수의 기본 값은 위에 나온 것처럼 fwknop가 임의의 주소로부터 온 SPA 패킷을 검증하게 하지만 개별 IP 주소나 CIDR 네트워크도 지원된다.
– OPEM_PORTS
OPEN_PORTS 변수는 fwknop 이 로컬 iptables 정책을 재설정해서 특정 포트에 접근 권한을 부여하게 한다. PERMIT_CLIENT_PORTS 변수가 Y로 설정돼있지 않는 한 클라이언트는 OPEN_PORTS에 나열된 것을 제외하고는 어떤 서비스로의 접근 권한도 얻을 수 없다.
– PERMIT_CLIENT_PORTS
– ENABLE_CMD_EXEC
– CMD_REGEX
– DATA_COLLECT_MODE
– REQUIRE_USERNAME
– FW_ACCESS_TIMEOUT
– KEY
– GPG_DECRYPT_ID
– GPG_DECRYPT_OW
– GPG_REMOTE_ID
* fwknop SPA 패킷 형식
모든 SPA 패킷은 잘 정의된 규칙들에 따라 구성된다. 이러한 규칙은 fwknop 서버가 iptables를 통해 요청되는 접속의 유형과 요청하는 ㅅ용자를 확신할 수 있게 해준다. fwknop 클라이언트 명령 행으로부터 사용자 입력을 받은 후 SPA 패킷은 다음을 포함한다.
– 무작위 데이터(16바이트) : fwknop이 생성하는 모든 SPA 패킷이 유일하게 보장하기에 충분한 무작위 정보를 제공한다. 패킷의 유일성은 최소한 펄 함수 rand()가 매호출 시마다 제공할 수 있는 무작위성 정도와 같다.
– 사용자명 : fwknop 명령을 실행하는 사용자명으로 getlogin()이나 getlogin()이 실패할 경우 gwtpwuid()가 반환하는 것과 동일하다. fwknop 서버는 원격 사용자에게 명령을 실행하거나 서비스에 접속할 권한을 줄 것인지 결정하기 위해 이 사용자명을 사용한다(fwknop 서버가 사용자명을 보는 시점에서 SPA 패킷이 성공적으로 평문화돼 있다).
– 타임 스탬프 : 로컬 시스템상의 타임 스탬프다.
– 소프트웨어 버전 : fwknop 클라이언트의 버전이다.
– 모드 : fwknop 서버는 이 값을 통해 SPA 클라이언트가 명령을 실행하고자 하는지 여부를 알 수 있다. 기본 값은 접근 모드에 해당하는 1이다. 명령 모드는 0으로 나타낸다.
– 접근 지시어 : 정책이 수정될 때 fwknop 서버에게 클라이언트가 iptables 방화벽에 의해 허용되길 바라는 트래픽 유형을 알려준다. fwknop 서버는 이 문자열은 구문 분석해서 포트와 프로토콜을 구한 후 iptables 가 이를 허용하게 정책을 적절히 재설정한다.
– 명령 문자열 : fwknop 클라이언트가 서버에서 실행하고자 하는 전체 명령이다.
– 패킷 MD5 합 : MD5 합은 fwknop 클라이언트가 게산하며 패킷이 네트워크를 통해 전소오디는 도중 변겨오디지 않았다는 것을 추가적으로 확인하기 위해 SPA 패킷에 포함된다.
– 서버 인증 방법 : 이 항목은 fwknop 0.9.6 배포판에서 패킷 형식에 추가됐다. fwknop 서버는 이 값을 통해서 SPA 패킷 내에 추가적인 인증 매개변수를 요구할 수 있다.