1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
|
****** rcynic RPKI validator ******
rcynic is the core RPKI relying party tool, and is the code which performs the
actual RPKI validation. Most of the other relying party tools just use rcynic's
output.
The name is short for "cynical rsync", because rcynic's task involves an
interleaved process of rsync retrieval and RPKI validation.
This code was developed on FreeBSD, and has been tested most heavily on FreeBSD
versions 6-STABLE through 8-STABLE. It is also known to work on Ubuntu (12.04
LTS), Debian (Wheezy) and Mac OS X (Snow Leopard). In theory it should run on
any reasonably POSIX-like system. As far as we know, rcynic does not use any
seriously non-portable features, but neither have we done a POSIX reference
manual lookup for every function call. Please report any portability problems.
***** Don't panic *****
rcynic has a lot of options, but it attempts to choose reasonable defaults
where possible. The installation process will create a basic working rcynic
configuration for you and arrange for this to run hourly under cron. If all
goes well, this should "just work".
rcynic has the ability to do all of its work in a chroot jail. This used to be
the default configuration, but integrating this properly with platform-specific
packaging systems (FreeBSD ports, apt-get on Ubuntu and Debian, etc) proved
impractical. You can still get this behavior if you need it, by installing from
source and using the --enable-rcynic-jail option to ./configure.
The default configuration set up by make install and the various packaging
systems will run rcynic under cron using the rcynic-cron wrapper script. See
the instructions for setting up your own cron jobs if you need something more
complicated; also see the instructions for setting up hierarchical rsync if you
need to build a complex topology of rcynic validators.
***** Overview *****
rcynic depends heavily on the OpenSSL libcrypto library, and requires a
reasonably current version of OpenSSL with both RFC 3779 and CMS support.
rcynic expects all certificates, CRLs, and CMS objects to be in DER format.
rcynic stores its database using filenames derived from the RPKI rsync URIs at
which the data are published.
All configuration is via an OpenSSL-style configuration file, except for
selection of the name of the configuration file itself. A few other parameters
can also be set from the command line. The default name for the configuration
is "rcynic.conf"; you can override this with the -c option on the command line.
The configuration file uses OpenSSL's configuration file syntax, and you can
set OpenSSL library configuration paramaters (eg, "engine" settings) in the
config file as well. rcynic's own configuration parameters are in a section
called "[rcynic]".
Most configuration parameters are optional and have defaults which should do
something reasonable if you are running rcynic in a test directory. If you're
running rcynic as a system program, perhaps under cron via the rcynic-cron
script, you'll want to set additional parameters to tell rcynic where to find
its data and where to write its output (the installation process sets these
parameters for you). The configuration file itself, however, is not optional.
In order for rcynic to do anything useful, your configuration file MUST at
minimum tell rcynic where to find one or more RPKI trust anchors or trust
anchor locators (TALs).
**** Trust anchors ****
* To specify a trust anchor, use the trust-anchor directive to name the local
file containing the trust anchor.
* To specify a trust anchor locator (TAL), use the trust-anchor-locator
directive to name a local file containing the trust anchor locator.
* To specify a directory containing trust anchors or trust anchor locators, use
the trust-anchor-directory directive to name the directory. Files in the
specified directory with names ending in ".cer" will be processed as trust
anchors, while files with names ending in ".tal" will be processed as trust
anchor locators.
You may use a combination of these methods if necessary.
Trust anchors are represented as DER-formatted X.509 self-signed certificate
objects, but in practice trust anchor locators are more common, as they reduce
the amount of locally configured data to the bare minimum and allow the trust
anchor itself to be updated without requiring reconfiguration of validators
like rcynic. A trust anchor locator is a file in the format specified in RFC-
6490, consisting of the rsync URI of the trust anchor followed by the Base64
encoding of the trust anchor's public key.
Strictly speaking, trust anchors do not need to be self-signed, but many
programs (including OpenSSL) assume that trust anchors will be self-signed. See
the allow-non-self-signed-trust-anchor configuration option if you need to use
a non-self-signed trust anchor, but be warned that the results, while
technically correct, may not be useful.
See the make-tal.sh script in this directory if you need to generate your own
TAL file for a trust anchor.
As of this writing, there still is no single global trust anchor for the RPKI
system, so you have to provide separate trust anchors for each Regional
Internet Registry (RIR) which is publishing RPKI data. The installation process
installs the ones it knows about.
Example of a minimal config file specifying nothing but trust anchor locators:
[rcynic]
trust-anchor-locator.0 = trust-anchors/apnic.tal
trust-anchor-locator.1 = trust-anchors/ripe.tal
trust-anchor-locator.2 = trust-anchors/afrinic.tal
trust-anchor-locator.3 = trust-anchors/lacnic.tal
Eventually, this should all be collapsed into a single trust anchor, so that
relying parties don't need to sort this out on their own, at which point the
above configuration could become something like:
[rcynic]
trust-anchor-locator = trust-anchors/iana.tal
**** Output directories ****
By default, rcynic uses two writable directory trees:
unauthenticated::
Raw data fetched via rsync. In order to take full advantage of
rsync's optimized transfers, you should preserve and reuse this
directory across rcynic runs, so that rcynic need not re-fetch data
that have not changed.
authenticated::
Data which rcynic has checked. This is the real output of the
validation process.
authenticated is really a symbolic link to a directory with a name of the form
"authenticated.<timestamp>", where <timestamp> is an ISO 8601 timestamp like
2001-04-01T01:23:45Z. rcynic creates a new timestamped directory every time it
runs, and moves the symbolic link as an atomic operation when the validation
process completes. The intent is that authenticated always points to the most
recent usable validation results, so that programs which use rcynic's output
don't need to worry about whether an rcynic run is in progress.
rcynic installs trust anchors specified via the trust-anchor-locator directive
in the unauthenticated tree just like any other fetched object, and copies them
into the authenticated trees just like any other object once they pass rcynic's
checks.
rcynic copies trust anchors specified via the trust-anchor directive into the
top level directory of the authenticated tree with filenames of the form
<xxxxxxxx>.<n>.cer, where <xxxxxxxx> and <n> are the OpenSSL object name hash
and index within the resulting virtual hash bucket, respectively. These are the
same values that OpenSSL's c_hash Perl script would produce. The reason for
this naming scheme is that these trust anchors, by definition, are not fetched
automatically, and thus do not really have publication URIs in the sense that
every other object in these trees do. So rcynic uses a naming scheme which
insures:
* that each trust anchor has a unique name within the output tree and
* that trust anchors cannot be confused with certificates: trust anchors always
go in the top level of the tree, data fetched via rsync always go in
subdirectories.
Trust anchors and trust anchor locators taken from the directory named by the
trust-anchor-directory directive will follow the same naming scheme trust
anchors and trust anchor locators specified via the trust-anchor and trust-
anchor-locator directives, respectively.
***** Usage and configuration *****
**** Logging levels ****
rcynic has its own system of logging levels, similar to what syslog() uses, but
customized to the specific task rcynic performs.
log_sys_err Error from operating system or library
log_usage_err Bad usage (local configuration error)
log_data_err Bad data (broken certificates or CRLs)
log_telemetry Normal chatter about rcynic's progress
log_verbose Extra verbose chatter
log_debug Only useful when debugging
**** Command line options ****
-c configfile Path to configuration file (default: rcynic.conf)
-l loglevel Logging level (default: log_data_err)
-s Log via syslog
-e Log via stderr when also using syslog
-j Start-up jitter interval (see below; default: 600)
-V Print rcynic's version to standard output and exit
-x Path to XML "summary" file (see below; no default)
***** Configuration file reference *****
rcynic uses the OpenSSL libcrypto configuration file mechanism. All libcrypto
configuration options (eg, for engine support) are available. All rcynic-
specific options are in the "[rcynic]" section. You MUST have a configuration
file in order for rcynic to do anything useful, as the configuration file is
the only way to list your trust anchors.
**** authenticated ****
Path to output directory (where rcynic should place objects it has been able to
validate).
Default: rcynic-data/authenticated
**** unauthenticated ****
Path to directory where rcynic should store unauthenticatd data retrieved via
rsync. Unless something goes horribly wrong, you want rcynic to preserve and
reuse this directory across runs to minimize the network traffic necessary to
bring your repository mirror up to date.
Default: rcynic-data/unauthenticated
**** rsync-timeout ****
How long (in seconds) to let rsync run before terminating the rsync process, or
zero for no timeout. You want this timeout to be fairly long, to avoid
terminating rsync connections prematurely. It's present to let you defend
against evil rsync server operators who try to tarpit your connection as a form
of denial of service attack on rcynic.
Default: 300
**** max-parallel-fetches ****
Upper limit on the number of copies of rsync that rcynic is allowed to run at
once. Used properly, this can speed up synchronization considerably when
fetching from repositories built with sub-optimal tree layouts or when dealing
with unreachable repositories. Used improperly, this option can generate
excessive load on repositories, cause synchronization to be interrupted by
firewalls, and generally creates create a public nuisance. Use with caution.
As of this writing, values in the range 2-4 are reasonably safe. Values above
10 have been known to cause problems.
rcynic can't really detect all of the possible problems created by excessive
values of this parameter, but if rcynic's report shows that both successful
retrivial and skipped retrieval from the same repository host, that's a pretty
good hint that something is wrong, and an excessive value here is a good first
guess as to the cause.
Default: 1
**** rsync-program ****
Path to the rsync program.
Default: rsync, but you should probably set this variable rather than just
trusting the PATH environment variable to be set correctly.
**** log-level ****
Same as -l option on command line. Command line setting overrides config file
setting.
Default: log_log_err
**** use-syslog ****
Same as -s option on command line. Command line setting overrides config file
setting.
Values: true or false.
Default: false
**** use-stderr ****
Same as -e option on command line. Command line setting overrides config file
setting.
Values: true or false.
Default: false, but if neither use-syslog nor use-stderr is set, log output
goes to stderr.
**** syslog-facility ****
Syslog facility to use.
Default: local0
**** syslog-priority-xyz ****
(where xyz is an rcynic logging level, above)
Override the syslog priority value to use when logging messages at this rcynic
level.
Defaults:
syslog-priority-log_sys_err err
syslog-priority-log_usage_err err
syslog-priority-log_data_err notice
syslog-priority-log_telemetry info
syslog-priority-log_verbose info
syslog-priority-log_debug debug
**** jitter ****
Startup jitter interval, same as -j option on command line. Jitter interval,
specified in number of seconds. rcynic will pick a random number within the
interval from zero to this value, and will delay for that many seconds on
startup. The purpose of this is to spread the load from large numbers of rcynic
clients all running under cron with synchronized clocks, in particular to avoid
hammering the global RPKI rsync servers into the ground at midnight UTC.
Default: 600
**** lockfile ****
Name of lockfile, or empty for no lock. If you run rcynic directly under cron,
you should use this parameter to set a lockfile so that successive instances of
rcynic don't stomp on each other. If you run rcynic under rcynic-cron, you
don't need to touch this, as rcynic-cron maintains its own lock.
Default: no lock
**** xml-summary ****
Enable output of a per-host summary at the end of an rcynic run in XML format.
Value: filename to which XML summary should be written; "-" will send XML
summary to standard output.
Default: no XML summary.
**** allow-stale-crl ****
Allow use of CRLs which are past their nextUpdate timestamp. This is usually
harmless, but since there are attack scenarios in which this is the first
warning of trouble, it's configurable.
Values: true or false.
Default: true
**** prune ****
Clean up old files corresponding to URIs that rcynic did not see at all during
this run. rcynic invokes rsync with the --delete option to clean up old objects
from collections that rcynic revisits, but if a URI changes so that rcynic
never visits the old collection again, old files will remain in the local
mirror indefinitely unless you enable this option.
Note: Pruning only happens when run-rsync is true. When the run-rsync option is
false, pruning is not done regardless of the setting of the prune option
option.
Values: true or false.
Default: true
**** allow-stale-manifest ****
Allow use of manifests which are past their nextUpdate timestamp. This is
probably harmless, but since it may be an early warning of problems, it's
configurable.
Values: true or false.
Default: true
**** require-crl-in-manifest ****
Reject publication point if manifest doesn't list the CRL that covers the
manifest EE certificate.
Values: true or false.
Default: false
**** allow-object-not-in-manifest ****
Allow use of otherwise valid objects which are not listed in the manifest. This
is not supposed to happen, but is probably harmless.
Enabling this does, however, often result in noisier logs, as it increases the
chance that rcynic will attempt to validate data which a CA removed from the
manifest but did not completely remove and revoke from the repository.
Values: true or false
Default: false
**** allow-digest-mismatch ****
Allow use of otherwise valid objects which are listed in the manifest with a
different digest value.
You probably don't want to touch this.
Values: true or false
Default: true
**** allow-crl-digest-mismatch ****
Allow processing to continue on a publication point whose manifest lists a
different digest value for the CRL than the digest of the CRL we have in hand.
You probably don't want to touch this.
Values: true or false
Default: true
**** allow-non-self-signed-trust-anchor ****
Experimental. Attempts to work around OpenSSL's strong preference for self-
signed trust anchors.
We're not going to explain this one in any further detail. If you really want
to know what it does, Use The Source, Luke.
Do not even consider enabling this option unless you are intimately familiar
with both X.509 and the internals of OpenSSL's X509_verify_cert() function and
really know what you are doing.
Values: true or false.
Default: false
**** run-rsync ****
Whether to run rsync to fetch data. You don't generally want to change this
except when building complex topologies where rcynic running on one set of
machines acts as aggregators for another set of validators. A large ISP might
want to build such a topology so that they could have a local validation cache
in each POP while minimizing load on the global repository system and
maintaining some degree of internal consistancy between POPs. In such cases,
one might want the rcynic instances in the POPs to validate data fetched from
the aggregators via an external process, without the POP rcynic instances
attempting to fetch anything themselves.
Values: true or false.
Default: true
**** use-links ****
Whether to use hard links rather than copying valid objects from the
unauthenticated to authenticated tree. Using links is slightly more fragile
(anything that stomps on the unauthenticated file also stomps on the
authenticated file) but is a bit faster and reduces the number of inodes
consumed by a large data collection. At the moment, copying is the default
behavior, but this may change in the future.
Values: true or false.
Default: false
**** rsync-early ****
Whether to force rsync to run even when we have a valid manifest for a
particular publication point and its nextUpdate time has not yet passed.
This is an experimental feature, and currently defaults to true, which is the
old behavior (running rsync regardless of whether we have a valid cached
manifest). This default may change once we have more experience with rcynic's
behavior when run with this option set to false.
Skipping the rsync fetch when we already have a valid cached manifest can
significantly reduce the total number of rsync connections we need to make, and
significantly reduce the load that each validator places on the authoritative
publication servers. As with any caching scheme, however, there are some
potential problems involved with not fetching the latest data, and we don't yet
have enough experience with this option to know how this will play out in
practice, which is why this is still considered experimental.
Values: true or false
Default: true (but may change in the future)
**** trust-anchor ****
Specify one RPKI trust anchor, represented as a local file containing an X.509
certificate in DER format. Value of this option is the pathname of the file.
No default.
**** trust-anchor-locator ****
Specify one RPKI trust anchor locator, represented as a local file in the
format specified in RFC-6490. This a simple text format containing an rsync URI
and the RSA public key of the X.509 object specified by the URI; the first line
of the file is the URI, the remainder is the public key in Base64 encoded DER
format.
Value of this option is the pathname of the file.
No default.
**** trust-anchor-directory ****
Specify a directory containing trust anchors, trust anchor locators, or both.
Trust anchors in such a directory must have filenames ending in ".cer"; trust
anchor locators in such a directory must have names ending in ".tal"; any other
files will be skipped.
This directive is an alternative to using the trust-anchor and trust-anchor-
locator` directives. This is probably easier to use than the other trust anchor
directives when dealing with a collection of trust anchors. This may change on
that promised day when we have only a single global trust anchor to deal with,
but we're not there yet.
No default.
***** Post-processing rcynic's XML output *****
The distribution includes several post-processors for the XML output rcynic
writes describing the actions it has taken and the validation status of the
objects it has found.
**** rcynic-html ****
rcynic-html converts rcynic's XML output into a collection of HTML pages
summarizing the results, noting problems encountered, and showing some history
of rsync transfer times and repository object counts in graphical form.
rcynic-cron runs rcynic-html automatically, immediately after running rcynic.
If for some reason you need to run rcynic-html by hand, the command syntax is:
$ rcynic-html rcynic.xml /web/server/directory/
rcynic-html will write a collection of HTML and image files to the specified
output directory, along with a set of RRD databases. rcynic-html will create
the output directory if necessary.
rcynic-html requires `rrdtool`, a specialized database and graphing engine
designed for this sort of work. You can run rcynic-html without rrdtool by
giving it the --no-show-graphs option, but the result won't be as useful.
rcynic-html gets its idea of where to find the rrdtool program from autoconf,
which usually works. If for some reason it doesn't work in your environment,
you will need to tell rcynic-html where to find rrdtool, using the --rrdtool-
binary option:
$ rcynic-html --rrdtoolbinary /some/where/rrdtool rcynic.xml /web/server/
directory/
**** rcynic.xsl ****
rcynic.xsl was an earlier attempt at the same kind of HTML output as rcynic-
html generates. XSLT was a convenient language for our initial attempts at
this, but as the processing involved got more complex, it became obvious that
we needed a general purpose programming language.
If for some reason XSLT works better in your environment than Python, you might
find this stylesheet to be a useful starting point, but be warned that it's
significantly slower than rcynic-html, lacks many features, and is no longer
under development.
**** rcynic-text ****
rcynic-text provides a quick flat text summary of validation results. This is
useful primarily in test scripts (smoketest uses it).
Usage:
$ rcynic-text rcynic.xml
**** validation_status ****
validation_status provides a flat text translation of the detailed validation
results. This is useful primarily for checking the detailed status of some
particular object or set of objects, perhaps using a program like grep or awk
to filter validation_status's output.
Usage:
$ validation_status rcynic.xml
$ validation_status rcynic.xml | fgrep rpki.misbehaving.org
$ validation_status rcynic.xml | fgrep object_rejected
**** rcynic-svn ****
rcynic-svn is a tool for archiving rcynic's results in a Subversion repository.
rcynic-svn is not integrated into rcynic-cron, because this is not something
that every relying party is going to want to do. However, for relying parties
who want to analyze rcynic's output over a long period of time, rcynic-svn may
provide a useful starting point starting point.
To use rcynic-svn, you first must set up a Subversion repository and check out
a working directory:
$ svnadmin create /some/where/safe/rpki-archive
$ svn co file:///some/where/safe/rpki-archive /some/where/else/rpki-archive
The name can be anything you like, in this example we call it "rpki-archive".
The above sequence creates the repository, then checks out an empty working
directory /some/where/else/rpki-archive.
The repository does not need to be on the same machine as the working
directory, but it probably should be for simplicity unless you have some strong
need to put it elsewhere.
Once you have the repository and working directory set up, you need to arrange
for rcynic-svn to be run after each rcynic run whose results you want to
archive. One way to do this would be to run rcynic-svn in the same cron job as
rcynic-cron, immediately after rcynic-cron and specifying the same lock file
that rcynic-cron uses.
Sample usage, assuming that rcynic's data is in the usual place:
$ rcynic-svn --lockfile /var/rcynic/data/lock \
/var/rcynic/data/authenticated \
/var/rcynic/data/unauthenticated \
/var/rcynic/data/rcynic.xml \
/some/where/else/rpki-archive
where the last argument is the name of the Subversion working directory and the
other arguments are the names of those portions of rcynic's output which you
wish to archive. Generally, the above set (authenticated, unauthenticated, and
rcynic.xml) are the ones you want, but feel free to experiment.
|