4fe7ec4fa2a1c8cc413699bff17ac991a4060899
[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             "10000" /* a tenth of a second */
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_IPT_INPUT_ACCESS      "ACCEPT, filter, INPUT, 1, FWKNOP_INPUT, 1"
114   #define DEF_IPT_OUTPUT_ACCESS     "ACCEPT, filter, OUTPUT, 1, FWKNOP_OUTPUT, 1"
115   #define DEF_IPT_FORWARD_ACCESS    "ACCEPT, filter, FORWARD, 1, FWKNOP_FORWARD, 1"
116   #define DEF_IPT_DNAT_ACCESS       "DNAT, nat, PREROUTING, 1, FWKNOP_PREROUTING, 1"
117   #define DEF_IPT_SNAT_ACCESS       "SNAT, nat, POSTROUTING, 1, FWKNOP_POSTROUTING, 1"
118   #define DEF_IPT_MASQUERADE_ACCESS "MASQUERADE, nat, POSTROUTING, 1, FWKNOP_POSTROUTING, 1"
119
120 /* Ipfw-specific defines
121 */
122 #elif FIREWALL_IPFW
123
124   #define DEF_IPFW_START_RULE_NUM        "10000"
125   #define DEF_IPFW_MAX_RULES             "1000"
126   #define DEF_IPFW_ACTIVE_SET_NUM        "1"
127   #define DEF_IPFW_EXPIRE_SET_NUM        "2"
128   #define DEF_IPFW_EXPIRE_PURGE_INTERVAL "30"
129   #define DEF_IPFW_ADD_CHECK_STATE       "N"
130
131 #elif FIREWALL_PF
132
133   #define DEF_PF_ANCHOR_NAME "fwknop"
134   #define DEF_PF_EXPIRE_INTERVAL "30"
135
136 #elif FIREWALL_IPF
137
138     /* --DSS Place-holder */
139
140 #endif /* FIREWALL Type */
141
142 /* fwknopd-specific limits
143 */
144 #define MAX_PCAP_FILTER_LEN 1024
145 #define MAX_IFNAME_LEN      128
146 #define MAX_SPA_PACKET_LEN  1500 /* --DSS check this? */
147 #define MAX_HOSTNAME_LEN    64
148
149 /* The minimum possible valid SPA data size.
150 */
151 #define MIN_SPA_DATA_SIZE   140
152
153 /* Configuration file parameter tags.
154  * This will correspond to entries in the configuration parameters
155  * array.
156  *
157  * Note: It is important to maintain an equivalence between this enum and the
158  *       config_map[] array in server/cmd_opts.h
159 */
160 enum {
161     CONF_CONFIG_FILE = 0,
162     CONF_OVERRIDE_CONFIG,
163     //CONF_FIREWALL_TYPE,
164     CONF_PCAP_INTF,
165     CONF_ENABLE_PCAP_PROMISC,
166     CONF_PCAP_FILTER,
167     CONF_PCAP_DISPATCH_COUNT,
168     CONF_PCAP_LOOP_SLEEP,
169     CONF_MAX_SNIFF_BYTES,
170     CONF_ENABLE_SPA_PACKET_AGING,
171     CONF_MAX_SPA_PACKET_AGE,
172     CONF_ENABLE_DIGEST_PERSISTENCE,
173     CONF_CMD_EXEC_TIMEOUT,
174     //CONF_BLACKLIST,
175     CONF_ENABLE_SPA_OVER_HTTP,
176     CONF_ENABLE_TCP_SERVER,
177     CONF_TCPSERV_PORT,
178     CONF_LOCALE,
179     CONF_SYSLOG_IDENTITY,
180     CONF_SYSLOG_FACILITY,
181     //CONF_IPT_EXEC_TRIES,
182     //CONF_ENABLE_EXTERNAL_CMDS,
183     //CONF_EXTERNAL_CMD_OPEN,
184     //CONF_EXTERNAL_CMD_CLOSE,
185     //CONF_EXTERNAL_CMD_ALARM,
186     //CONF_ENABLE_EXT_CMD_PREFIX,
187     //CONF_EXT_CMD_PREFIX,
188 #if FIREWALL_IPTABLES
189     CONF_ENABLE_IPT_FORWARDING,
190     CONF_ENABLE_IPT_LOCAL_NAT,
191     CONF_ENABLE_IPT_SNAT,
192     CONF_SNAT_TRANSLATE_IP,
193     CONF_ENABLE_IPT_OUTPUT,
194     CONF_FLUSH_IPT_AT_INIT,
195     CONF_FLUSH_IPT_AT_EXIT,
196     CONF_IPT_INPUT_ACCESS,
197     CONF_IPT_OUTPUT_ACCESS,
198     CONF_IPT_FORWARD_ACCESS,
199     CONF_IPT_DNAT_ACCESS,
200     CONF_IPT_SNAT_ACCESS,
201     CONF_IPT_MASQUERADE_ACCESS,
202 #elif FIREWALL_IPFW
203     CONF_IPFW_START_RULE_NUM,
204     CONF_IPFW_MAX_RULES,
205     CONF_IPFW_ACTIVE_SET_NUM,
206     CONF_IPFW_EXPIRE_SET_NUM,
207     CONF_IPFW_EXPIRE_PURGE_INTERVAL,
208     CONF_IPFW_ADD_CHECK_STATE,
209 #elif FIREWALL_PF
210     CONF_PF_ANCHOR_NAME,
211     CONF_PF_EXPIRE_INTERVAL,
212 #elif FIREWALL_IPF
213     /* --DSS Place-holder */
214 #endif /* FIREWALL type */
215     CONF_FWKNOP_RUN_DIR,
216     CONF_FWKNOP_CONF_DIR,
217     CONF_ACCESS_FILE,
218     CONF_FWKNOP_PID_FILE,
219 #if USE_FILE_CACHE
220     CONF_DIGEST_FILE,
221 #else
222     CONF_DIGEST_DB_FILE,
223 #endif
224     CONF_GPG_HOME_DIR,
225     CONF_FIREWALL_EXE,
226
227     NUMBER_OF_CONFIG_ENTRIES  /* Marks the end and number of entries */
228 };
229
230 /* A simple linked list of uints for the access stanza items that allow
231  * multiple comma-separated entries.
232 */
233 typedef struct acc_int_list
234 {
235     unsigned int        maddr;
236     unsigned int        mask;
237     struct acc_int_list *next;
238 } acc_int_list_t;
239
240 /* A simple linked list of proto and ports for the access stanza items that
241  * allow multiple comma-separated entries.
242 */
243 typedef struct acc_port_list
244 {
245     unsigned int            proto;
246     unsigned int            port;
247     struct acc_port_list    *next;
248 } acc_port_list_t;
249
250 /* A simple linked list of strings for the access stanza items that
251  * allow multiple comma-separated entries.
252 */
253 typedef struct acc_string_list
254 {
255     char                    *str;
256     struct acc_string_list  *next;
257 } acc_string_list_t;
258
259 /* Access stanza list struct.
260 */
261 typedef struct acc_stanza
262 {
263     char                *source;
264     acc_int_list_t      *source_list;
265     char                *open_ports;
266     acc_port_list_t     *oport_list;
267     char                *restrict_ports;
268     acc_port_list_t     *rport_list;
269     char                *key;
270     int                 fw_access_timeout;
271     unsigned char       enable_cmd_exec;
272     char                *cmd_exec_user;
273     uid_t               cmd_exec_uid;
274     char                *require_username;
275     unsigned char       require_source_address;
276     char                *gpg_home_dir;
277     char                *gpg_decrypt_id;
278     char                *gpg_decrypt_pw;
279     unsigned char       gpg_require_sig;
280     unsigned char       gpg_ignore_sig_error;
281     char                *gpg_remote_id;
282     acc_string_list_t   *gpg_remote_id_list;
283     time_t              access_expire_time;
284     int                 expired;
285     unsigned char       force_nat;
286     char                *force_nat_ip;
287     char                *force_nat_proto;
288     unsigned int        force_nat_port;
289     struct acc_stanza   *next;
290 } acc_stanza_t;
291
292
293 /* Firewall-related data and types. */
294
295 #if FIREWALL_IPTABLES
296   /* --DSS XXX: These are arbitrary. We should determine appropriate values.
297   */
298   #define MAX_TABLE_NAME_LEN      64
299   #define MAX_CHAIN_NAME_LEN      64
300   #define MAX_TARGET_NAME_LEN     64
301
302   /* Fwknop custom chain types
303   */
304   enum {
305       IPT_INPUT_ACCESS,
306       IPT_OUTPUT_ACCESS,
307       IPT_FORWARD_ACCESS,
308       IPT_DNAT_ACCESS,
309       IPT_SNAT_ACCESS,
310       IPT_MASQUERADE_ACCESS,
311       NUM_FWKNOP_ACCESS_TYPES  /* Leave this entry last */
312   };
313
314   /* Structure to define an fwknop firewall chain configuration.
315   */
316   struct fw_chain {
317       int     type;
318       char    target[MAX_TARGET_NAME_LEN];
319       //int     direction;
320       char    table[MAX_TABLE_NAME_LEN];
321       char    from_chain[MAX_CHAIN_NAME_LEN];
322       int     jump_rule_pos;
323       char    to_chain[MAX_CHAIN_NAME_LEN];
324       int     rule_pos;
325       int     active_rules;
326       time_t  next_expire;
327   };
328
329   /* Based on the fw_chain fields (not counting type)
330   */
331   #define FW_NUM_CHAIN_FIELDS 6
332
333   struct fw_config {
334       struct fw_chain chain[NUM_FWKNOP_ACCESS_TYPES];
335       char            fw_command[MAX_PATH_LEN];
336   };
337
338 #elif FIREWALL_IPFW
339
340   struct fw_config {
341       unsigned short    start_rule_num;
342       unsigned short    max_rules;
343       unsigned short    active_rules;
344       unsigned short    total_rules;
345       unsigned short    active_set_num;
346       unsigned short    expire_set_num;
347       unsigned short    purge_interval;
348       unsigned char    *rule_map;
349       time_t            next_expire;
350       time_t            last_purge;
351       char              fw_command[MAX_PATH_LEN];
352   };
353
354 #elif FIREWALL_PF
355
356   #define MAX_PF_ANCHOR_LEN 64
357
358   struct fw_config {
359       unsigned short    active_rules;
360       time_t            next_expire;
361       char              anchor[MAX_PF_ANCHOR_LEN];
362       char              fw_command[MAX_PATH_LEN];
363   };
364
365 #elif FIREWALL_IPF
366
367     /* --DSS Place-holder */
368
369 #endif /* FIREWALL type */
370
371 /* SPA Packet info struct.
372 */
373 typedef struct spa_pkt_info
374 {
375     unsigned int    packet_data_len;
376     unsigned int    packet_proto;
377     unsigned int    packet_src_ip;
378     unsigned int    packet_dst_ip;
379     unsigned short  packet_src_port;
380     unsigned short  packet_dst_port;
381     unsigned char   packet_data[MAX_SPA_PACKET_LEN+1];
382 } spa_pkt_info_t;
383
384 /* Struct for (processed and verified) SPA data used by the server.
385 */
386 typedef struct spa_data
387 {
388     char           *username;
389     time_t          timestamp;
390     char           *version;
391     short           message_type;
392     char           *spa_message;
393     char            spa_message_src_ip[MAX_IPV4_STR_LEN];
394     char            pkt_source_ip[MAX_IPV4_STR_LEN];
395     char            spa_message_remain[1024]; /* --DSS FIXME: arbitrary bounds */
396     char           *nat_access;
397     char           *server_auth;
398     unsigned int    client_timeout;
399     unsigned int    fw_access_timeout;
400     char            *use_src_ip;
401 } spa_data_t;
402
403 /* fwknopd server configuration parameters and values
404 */
405 typedef struct fko_srv_options
406 {
407     /* The command-line options or flags that invoke an immediate response
408      * then exit.
409     */
410     unsigned char   dump_config;        /* Dump current configuration flag */
411     unsigned char   foreground;         /* Run in foreground flag */
412     unsigned char   kill;               /* flag to initiate kill of fwknopd */
413     unsigned char   rotate_digest_cache;/* flag to force rotation of digest */
414     unsigned char   restart;            /* Restart fwknopd flag */
415     unsigned char   status;             /* Get fwknopd status flag */
416     unsigned char   fw_list;            /* List current firewall rules */
417     unsigned char   fw_list_all;        /* List all current firewall rules */
418     unsigned char   fw_flush;           /* Flush current firewall rules */
419     unsigned char   test;               /* Test mode flag */
420     unsigned char   verbose;            /* Verbose mode flag */
421
422     int             data_link_offset;
423     int             tcp_server_pid;
424     int             lock_fd;
425
426 #if USE_FILE_CACHE
427     struct digest_cache_list *digest_cache;   /* In-memory digest cache list */
428 #endif
429
430     spa_pkt_info_t  spa_pkt;            /* The current SPA packet */
431
432     /* Counter set from the command line to exit after the specified
433      * number of SPA packets are processed.
434     */
435     unsigned int    packet_ctr_limit;
436     unsigned int    packet_ctr;  /* counts packets with >0 payload bytes */
437
438     /* This array holds all of the config file entry values as strings
439      * indexed by their tag name.
440     */
441     char           *config[NUMBER_OF_CONFIG_ENTRIES];
442
443     acc_stanza_t   *acc_stanzas;       /* List of access stanzas */
444
445     /* Firewall config info.
446     */
447     struct fw_config *fw_config;
448
449 } fko_srv_options_t;
450
451 extern fko_srv_options_t options;
452
453 /* For cleaning up memory before exiting
454 */
455 #define FW_CLEANUP          1
456 #define NO_FW_CLEANUP       0
457 void clean_exit(fko_srv_options_t *opts, unsigned int fw_cleanup_flag, unsigned int exit_status);
458
459 #endif /* FWKNOPD_COMMON_H */
460
461 /***EOF***/