[server] iptables 'comment' match check
[fwknop.git] / server / fwknopd_common.h
1 /*
2  ******************************************************************************
3  *
4  * File:    fwknopd_common.h
5  *
6  * Author:  Damien Stuart
7  *
8  * Purpose: Header file for fwknopd source files.
9  *
10  * Copyright 2010 Damien Stuart (dstuart@dstuart.org)
11  *
12  *  License (GNU Public License):
13  *
14  *  This program is free software; you can redistribute it and/or
15  *  modify it under the terms of the GNU General Public License
16  *  as published by the Free Software Foundation; either version 2
17  *  of the License, or (at your option) any later version.
18  *
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
27  *  USA
28  *
29  ******************************************************************************
30 */
31 #ifndef FWKNOPD_COMMON_H
32 #define FWKNOPD_COMMON_H
33
34 #include "common.h"
35
36 #if PLATFORM_OPENBSD
37   #include <netinet/in.h>
38 #endif
39
40 #if HAVE_SYS_STAT_H
41   #include <sys/stat.h>
42 #endif
43
44 #if HAVE_LIBPCAP
45   #include <pcap.h>
46 #endif
47
48 /* My Name and Version
49 */
50 #define MY_NAME     "fwknopd"
51 #define MY_DESC     "Single Packet Authorization server"
52
53 /* Get our program version from VERSION (defined in config.h).
54 */
55 #define MY_VERSION VERSION
56
57 /* Some program defaults.
58 */
59 #ifndef DEF_CONF_DIR
60   /* Our default config directory is based on SYSCONFDIR as set by the
61    * configure script.
62   */
63   #define DEF_CONF_DIR      SYSCONFDIR"/"PACKAGE_NAME
64 #endif
65
66 #define DEF_CONFIG_FILE     DEF_CONF_DIR"/"MY_NAME".conf"
67 #define DEF_ACCESS_FILE     DEF_CONF_DIR"/access.conf"
68
69 #ifndef DEF_RUN_DIR
70   /* Our default run directory is based on LOCALSTATEDIR as set by the
71    * configure script. This is where we put the PID and digest cache files.
72   */
73   #define DEF_RUN_DIR       SYSRUNDIR"/run/"PACKAGE_NAME
74 #endif
75
76 /* More Conf defaults
77 */
78 #define DEF_PID_FILENAME                MY_NAME".pid"
79 #if USE_FILE_CACHE
80   #define DEF_DIGEST_CACHE_FILENAME       "digest.cache"
81 #else
82   #define DEF_DIGEST_CACHE_DB_FILENAME    "digest_db.cache"
83 #endif
84
85 #define DEF_INTERFACE                   "eth0"
86 #define DEF_ENABLE_PCAP_PROMISC         "N"
87 #define DEF_PCAP_FILTER                 "udp port 62201"
88 #define DEF_PCAP_DISPATCH_COUNT         "0"
89 #define DEF_PCAP_LOOP_SLEEP             "100000" /* a tenth of a second (in microseconds) */
90 #define DEF_ENABLE_SPA_PACKET_AGING     "Y"
91 #define DEF_MAX_SPA_PACKET_AGE          "120"
92 #define DEF_ENABLE_DIGEST_PERSISTENCE   "Y"
93 #define DEF_MAX_SNIFF_BYTES             "1500"
94 #define DEF_GPG_HOME_DIR                "/root/.gnupg"
95 #define DEF_ENABLE_SPA_OVER_HTTP        "N"
96 #define DEF_ENABLE_TCP_SERVER           "N"
97 #define DEF_TCPSERV_PORT                "62201"
98 #define DEF_SYSLOG_IDENTITY             MY_NAME
99 #define DEF_SYSLOG_FACILITY             "LOG_DAEMON"
100
101 #define DEF_FW_ACCESS_TIMEOUT           30
102
103 /* Iptables-specific defines
104 */
105 #if FIREWALL_IPTABLES
106
107   #define DEF_FLUSH_IPT_AT_INIT         "Y"
108   #define DEF_FLUSH_IPT_AT_EXIT         "Y"
109   #define DEF_ENABLE_IPT_FORWARDING     "N"
110   #define DEF_ENABLE_IPT_LOCAL_NAT      "Y"
111   #define DEF_ENABLE_IPT_SNAT           "N"
112   #define DEF_ENABLE_IPT_OUTPUT         "N"
113   #define DEF_ENABLE_IPT_COMMENT_CHECK  "Y"
114   #define DEF_IPT_INPUT_ACCESS          "ACCEPT, filter, INPUT, 1, FWKNOP_INPUT, 1"
115   #define DEF_IPT_OUTPUT_ACCESS         "ACCEPT, filter, OUTPUT, 1, FWKNOP_OUTPUT, 1"
116   #define DEF_IPT_FORWARD_ACCESS        "ACCEPT, filter, FORWARD, 1, FWKNOP_FORWARD, 1"
117   #define DEF_IPT_DNAT_ACCESS           "DNAT, nat, PREROUTING, 1, FWKNOP_PREROUTING, 1"
118   #define DEF_IPT_SNAT_ACCESS           "SNAT, nat, POSTROUTING, 1, FWKNOP_POSTROUTING, 1"
119   #define DEF_IPT_MASQUERADE_ACCESS     "MASQUERADE, nat, POSTROUTING, 1, FWKNOP_POSTROUTING, 1"
120
121 /* Ipfw-specific defines
122 */
123 #elif FIREWALL_IPFW
124
125   #define DEF_FLUSH_IPFW_AT_INIT         "Y"
126   #define DEF_FLUSH_IPFW_AT_EXIT         "Y"
127   #define DEF_IPFW_START_RULE_NUM        "10000"
128   #define DEF_IPFW_MAX_RULES             "1000"
129   #define DEF_IPFW_ACTIVE_SET_NUM        "1"
130   #define DEF_IPFW_EXPIRE_SET_NUM        "2"
131   #define DEF_IPFW_EXPIRE_PURGE_INTERVAL "30"
132   #define DEF_IPFW_ADD_CHECK_STATE       "N"
133
134 #elif FIREWALL_PF
135
136   #define DEF_PF_ANCHOR_NAME "fwknop"
137   #define DEF_PF_EXPIRE_INTERVAL "30"
138
139 #elif FIREWALL_IPF
140
141     /* --DSS Place-holder */
142
143 #endif /* FIREWALL Type */
144
145 /* fwknopd-specific limits
146 */
147 #define MAX_PCAP_FILTER_LEN 1024
148 #define MAX_IFNAME_LEN      128
149 #define MAX_SPA_PACKET_LEN  1500 /* --DSS check this? */
150 #define MAX_HOSTNAME_LEN    64
151
152 /* The minimum possible valid SPA data size.
153 */
154 #define MIN_SPA_DATA_SIZE   140
155
156 /* Configuration file parameter tags.
157  * This will correspond to entries in the configuration parameters
158  * array.
159  *
160  * Note: It is important to maintain an equivalence between this enum and the
161  *       config_map[] array in server/cmd_opts.h
162 */
163 enum {
164     CONF_CONFIG_FILE = 0,
165     CONF_OVERRIDE_CONFIG,
166     //CONF_FIREWALL_TYPE,
167     CONF_PCAP_INTF,
168     CONF_ENABLE_PCAP_PROMISC,
169     CONF_PCAP_FILTER,
170     CONF_PCAP_DISPATCH_COUNT,
171     CONF_PCAP_LOOP_SLEEP,
172     CONF_MAX_SNIFF_BYTES,
173     CONF_ENABLE_SPA_PACKET_AGING,
174     CONF_MAX_SPA_PACKET_AGE,
175     CONF_ENABLE_DIGEST_PERSISTENCE,
176     CONF_CMD_EXEC_TIMEOUT,
177     //CONF_BLACKLIST,
178     CONF_ENABLE_SPA_OVER_HTTP,
179     CONF_ENABLE_TCP_SERVER,
180     CONF_TCPSERV_PORT,
181     CONF_LOCALE,
182     CONF_SYSLOG_IDENTITY,
183     CONF_SYSLOG_FACILITY,
184     //CONF_IPT_EXEC_TRIES,
185     //CONF_ENABLE_EXTERNAL_CMDS,
186     //CONF_EXTERNAL_CMD_OPEN,
187     //CONF_EXTERNAL_CMD_CLOSE,
188     //CONF_EXTERNAL_CMD_ALARM,
189     //CONF_ENABLE_EXT_CMD_PREFIX,
190     //CONF_EXT_CMD_PREFIX,
191 #if FIREWALL_IPTABLES
192     CONF_ENABLE_IPT_FORWARDING,
193     CONF_ENABLE_IPT_LOCAL_NAT,
194     CONF_ENABLE_IPT_SNAT,
195     CONF_SNAT_TRANSLATE_IP,
196     CONF_ENABLE_IPT_OUTPUT,
197     CONF_FLUSH_IPT_AT_INIT,
198     CONF_FLUSH_IPT_AT_EXIT,
199     CONF_IPT_INPUT_ACCESS,
200     CONF_IPT_OUTPUT_ACCESS,
201     CONF_IPT_FORWARD_ACCESS,
202     CONF_IPT_DNAT_ACCESS,
203     CONF_IPT_SNAT_ACCESS,
204     CONF_IPT_MASQUERADE_ACCESS,
205     CONF_ENABLE_IPT_COMMENT_CHECK,
206 #elif FIREWALL_IPFW
207     CONF_FLUSH_IPFW_AT_INIT,
208     CONF_FLUSH_IPFW_AT_EXIT,
209     CONF_IPFW_START_RULE_NUM,
210     CONF_IPFW_MAX_RULES,
211     CONF_IPFW_ACTIVE_SET_NUM,
212     CONF_IPFW_EXPIRE_SET_NUM,
213     CONF_IPFW_EXPIRE_PURGE_INTERVAL,
214     CONF_IPFW_ADD_CHECK_STATE,
215 #elif FIREWALL_PF
216     CONF_PF_ANCHOR_NAME,
217     CONF_PF_EXPIRE_INTERVAL,
218 #elif FIREWALL_IPF
219     /* --DSS Place-holder */
220 #endif /* FIREWALL type */
221     CONF_FWKNOP_RUN_DIR,
222     CONF_FWKNOP_CONF_DIR,
223     CONF_ACCESS_FILE,
224     CONF_FWKNOP_PID_FILE,
225 #if USE_FILE_CACHE
226     CONF_DIGEST_FILE,
227 #else
228     CONF_DIGEST_DB_FILE,
229 #endif
230     CONF_GPG_HOME_DIR,
231     CONF_FIREWALL_EXE,
232
233     NUMBER_OF_CONFIG_ENTRIES  /* Marks the end and number of entries */
234 };
235
236 /* A simple linked list of uints for the access stanza items that allow
237  * multiple comma-separated entries.
238 */
239 typedef struct acc_int_list
240 {
241     unsigned int        maddr;
242     unsigned int        mask;
243     struct acc_int_list *next;
244 } acc_int_list_t;
245
246 /* A simple linked list of proto and ports for the access stanza items that
247  * allow multiple comma-separated entries.
248 */
249 typedef struct acc_port_list
250 {
251     unsigned int            proto;
252     unsigned int            port;
253     struct acc_port_list    *next;
254 } acc_port_list_t;
255
256 /* A simple linked list of strings for the access stanza items that
257  * allow multiple comma-separated entries.
258 */
259 typedef struct acc_string_list
260 {
261     char                    *str;
262     struct acc_string_list  *next;
263 } acc_string_list_t;
264
265 /* Access stanza list struct.
266 */
267 typedef struct acc_stanza
268 {
269     char                *source;
270     acc_int_list_t      *source_list;
271     char                *open_ports;
272     acc_port_list_t     *oport_list;
273     char                *restrict_ports;
274     acc_port_list_t     *rport_list;
275     char                *key;
276     int                 fw_access_timeout;
277     unsigned char       enable_cmd_exec;
278     char                *cmd_exec_user;
279     uid_t               cmd_exec_uid;
280     char                *require_username;
281     unsigned char       require_source_address;
282     char                *gpg_home_dir;
283     char                *gpg_decrypt_id;
284     char                *gpg_decrypt_pw;
285     unsigned char       gpg_require_sig;
286     unsigned char       gpg_ignore_sig_error;
287     char                *gpg_remote_id;
288     acc_string_list_t   *gpg_remote_id_list;
289     time_t              access_expire_time;
290     int                 expired;
291     unsigned char       force_nat;
292     char                *force_nat_ip;
293     char                *force_nat_proto;
294     unsigned int        force_nat_port;
295     struct acc_stanza   *next;
296 } acc_stanza_t;
297
298
299 /* Firewall-related data and types. */
300
301 #if FIREWALL_IPTABLES
302   /* --DSS XXX: These are arbitrary. We should determine appropriate values.
303   */
304   #define MAX_TABLE_NAME_LEN      64
305   #define MAX_CHAIN_NAME_LEN      64
306   #define MAX_TARGET_NAME_LEN     64
307
308   /* Fwknop custom chain types
309   */
310   enum {
311       IPT_INPUT_ACCESS,
312       IPT_OUTPUT_ACCESS,
313       IPT_FORWARD_ACCESS,
314       IPT_DNAT_ACCESS,
315       IPT_SNAT_ACCESS,
316       IPT_MASQUERADE_ACCESS,
317       NUM_FWKNOP_ACCESS_TYPES  /* Leave this entry last */
318   };
319
320   /* Structure to define an fwknop firewall chain configuration.
321   */
322   struct fw_chain {
323       int     type;
324       char    target[MAX_TARGET_NAME_LEN];
325       //int     direction;
326       char    table[MAX_TABLE_NAME_LEN];
327       char    from_chain[MAX_CHAIN_NAME_LEN];
328       int     jump_rule_pos;
329       char    to_chain[MAX_CHAIN_NAME_LEN];
330       int     rule_pos;
331       int     active_rules;
332       time_t  next_expire;
333   };
334
335   /* Based on the fw_chain fields (not counting type)
336   */
337   #define FW_NUM_CHAIN_FIELDS 6
338
339   struct fw_config {
340       struct fw_chain chain[NUM_FWKNOP_ACCESS_TYPES];
341       char            fw_command[MAX_PATH_LEN];
342   };
343
344 #elif FIREWALL_IPFW
345
346   struct fw_config {
347       unsigned short    start_rule_num;
348       unsigned short    max_rules;
349       unsigned short    active_rules;
350       unsigned short    total_rules;
351       unsigned short    active_set_num;
352       unsigned short    expire_set_num;
353       unsigned short    purge_interval;
354       unsigned char    *rule_map;
355       time_t            next_expire;
356       time_t            last_purge;
357       char              fw_command[MAX_PATH_LEN];
358   };
359
360 #elif FIREWALL_PF
361
362   #define MAX_PF_ANCHOR_LEN 64
363
364   struct fw_config {
365       unsigned short    active_rules;
366       time_t            next_expire;
367       char              anchor[MAX_PF_ANCHOR_LEN];
368       char              fw_command[MAX_PATH_LEN];
369   };
370
371 #elif FIREWALL_IPF
372
373     /* --DSS Place-holder */
374
375 #endif /* FIREWALL type */
376
377 /* SPA Packet info struct.
378 */
379 typedef struct spa_pkt_info
380 {
381     unsigned int    packet_data_len;
382     unsigned int    packet_proto;
383     unsigned int    packet_src_ip;
384     unsigned int    packet_dst_ip;
385     unsigned short  packet_src_port;
386     unsigned short  packet_dst_port;
387     unsigned char   packet_data[MAX_SPA_PACKET_LEN+1];
388 } spa_pkt_info_t;
389
390 /* Struct for (processed and verified) SPA data used by the server.
391 */
392 typedef struct spa_data
393 {
394     char           *username;
395     time_t          timestamp;
396     char           *version;
397     short           message_type;
398     char           *spa_message;
399     char            spa_message_src_ip[MAX_IPV4_STR_LEN];
400     char            pkt_source_ip[MAX_IPV4_STR_LEN];
401     char            spa_message_remain[1024]; /* --DSS FIXME: arbitrary bounds */
402     char           *nat_access;
403     char           *server_auth;
404     unsigned int    client_timeout;
405     unsigned int    fw_access_timeout;
406     char            *use_src_ip;
407 } spa_data_t;
408
409 /* fwknopd server configuration parameters and values
410 */
411 typedef struct fko_srv_options
412 {
413     /* The command-line options or flags that invoke an immediate response
414      * then exit.
415     */
416     unsigned char   dump_config;        /* Dump current configuration flag */
417     unsigned char   foreground;         /* Run in foreground flag */
418     unsigned char   kill;               /* flag to initiate kill of fwknopd */
419     unsigned char   rotate_digest_cache;/* flag to force rotation of digest */
420     unsigned char   restart;            /* Restart fwknopd flag */
421     unsigned char   status;             /* Get fwknopd status flag */
422     unsigned char   fw_list;            /* List current firewall rules */
423     unsigned char   fw_list_all;        /* List all current firewall rules */
424     unsigned char   fw_flush;           /* Flush current firewall rules */
425     unsigned char   test;               /* Test mode flag */
426     unsigned char   verbose;            /* Verbose mode flag */
427
428     int             data_link_offset;
429     int             tcp_server_pid;
430     int             lock_fd;
431
432 #if USE_FILE_CACHE
433     struct digest_cache_list *digest_cache;   /* In-memory digest cache list */
434 #endif
435
436     spa_pkt_info_t  spa_pkt;            /* The current SPA packet */
437
438     /* Counter set from the command line to exit after the specified
439      * number of SPA packets are processed.
440     */
441     unsigned int    packet_ctr_limit;
442     unsigned int    packet_ctr;  /* counts packets with >0 payload bytes */
443
444     /* This array holds all of the config file entry values as strings
445      * indexed by their tag name.
446     */
447     char           *config[NUMBER_OF_CONFIG_ENTRIES];
448
449     acc_stanza_t   *acc_stanzas;       /* List of access stanzas */
450
451     /* Firewall config info.
452     */
453     struct fw_config *fw_config;
454
455 } fko_srv_options_t;
456
457 extern fko_srv_options_t options;
458
459 /* For cleaning up memory before exiting
460 */
461 #define FW_CLEANUP          1
462 #define NO_FW_CLEANUP       0
463 void clean_exit(fko_srv_options_t *opts, unsigned int fw_cleanup_flag, unsigned int exit_status);
464
465 #endif /* FWKNOPD_COMMON_H */
466
467 /***EOF***/