summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2022-07-01 01:08:34 +0200
committerRicardo Wurmus <rekado@elephly.net>2022-07-03 14:12:32 +0200
commitcba98b58bf09f22dfbfb338884b80ab831e0be46 (patch)
tree44521c19750d637ada05fe241171bc909f50bca9
parente0d2f8164e6a1c15fdcae6f7dadb05c0c9e25352 (diff)
services: Add anonip-service-type.
* gnu/services/web.scm (anonip-configuration): New record type. (anonip-configuration?, anonip-configuration-anonip, anonip-configuration-input, anonip-configuration-output, anonip-configuration-skip-private?, anonip-configuration-column, anonip-configuration-replacement, anonip-configuration-ipv4mask, anonip-configuration-ipv6mask, anonip-configuration-increment, anonip-configuration-delimiter, anonip-configuration-regex): New procedures. (anonip-service-type): New service type. * doc/guix.texi (Log Rotation): Add subheading for Anonip Service.
-rw-r--r--doc/guix.texi71
-rw-r--r--gnu/services/web.scm110
2 files changed, 179 insertions, 2 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 9d9cb3dc077..b97ee9fa649 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -30,7 +30,7 @@ Copyright @copyright{} 2015, 2016 Mathieu Lirzin@*
30Copyright @copyright{} 2014 Pierre-Antoine Rault@* 30Copyright @copyright{} 2014 Pierre-Antoine Rault@*
31Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@* 31Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@*
32Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari@* 32Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari@*
33Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ricardo Wurmus@* 33Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Ricardo Wurmus@*
34Copyright @copyright{} 2016 Ben Woodcroft@* 34Copyright @copyright{} 2016 Ben Woodcroft@*
35Copyright @copyright{} 2016, 2017, 2018, 2021 Chris Marusich@* 35Copyright @copyright{} 2016, 2017, 2018, 2021 Chris Marusich@*
36Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022 Efraim Flashner@* 36Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022 Efraim Flashner@*
@@ -18706,6 +18706,75 @@ String or gexp denoting the corresponding mcron job schedule
18706@end table 18706@end table
18707@end deftp 18707@end deftp
18708 18708
18709@cindex logging, anonymization
18710@subheading Anonip Service
18711
18712Anonip is a privacy filter that removes IP address from web server logs.
18713This service creates a FIFO and filters any written lines with anonip
18714before writing the filtered log to a target file.
18715
18716The following example sets up the FIFO
18717@file{/var/run/anonip/https.access.log} and writes the filtered log file
18718@file{/var/log/anonip/https.access.log}.
18719
18720@lisp
18721(service anonip-service-type
18722 (anonip-configuration
18723 (input "/var/run/anonip/https.access.log")
18724 (output "/var/log/anonip/https.access.log")))
18725@end lisp
18726
18727Configure your web server to write its logs to the FIFO at
18728@file{/var/run/anonip/https.access.log} and collect the anonymized log
18729file at @file{/var/web-logs/https.access.log}.
18730
18731@deftp {Data Type} anonip-configuration
18732This data type represents the configuration of anonip.
18733It has the following parameters:
18734
18735@table @asis
18736@item @code{anonip} (default: @code{anonip})
18737The anonip package to use.
18738
18739@item @code{input}
18740The file name of the input log file to process. The service creates a
18741FIFO of this name. The web server should write its logs to this FIFO.
18742
18743@item @code{output}
18744The file name of the processed log file.
18745@end table
18746
18747The following optional settings may be provided:
18748
18749@table @asis
18750@item @code{skip-private?}
18751When @code{#true} do not mask addresses in private ranges.
18752
18753@item @code{column}
18754A 1-based indexed column number. Assume IP address is in the specified
18755column (default is 1).
18756
18757@item @code{replacement}
18758Replacement string in case address parsing fails, e.g. @code{"0.0.0.0"}.
18759
18760@item @code{ipv4mask}
18761Number of bits to mask in IPv4 addresses.
18762
18763@item @code{ipv6mask}
18764Number of bits to mask in IPv6 addresses.
18765
18766@item @code{increment}
18767Increment the IP address by the given number. By default this is zero.
18768
18769@item @code{delimiter}
18770Log delimiter string.
18771
18772@item @code{regex}
18773Regular expression for detecting IP addresses. Use this instead of @code{column}.
18774@end table
18775@end deftp
18776
18777
18709@node Networking Setup 18778@node Networking Setup
18710@subsection Networking Setup 18779@subsection Networking Setup
18711 18780
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index 4434fecf02c..f0c7e90cbfb 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -9,7 +9,7 @@
9;;; Copyright © 2018 Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr> 9;;; Copyright © 2018 Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr>
10;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com> 10;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
11;;; Copyright © 2019, 2020 Florian Pelz <pelzflorian@pelzflorian.de> 11;;; Copyright © 2019, 2020 Florian Pelz <pelzflorian@pelzflorian.de>
12;;; Copyright © 2020 Ricardo Wurmus <rekado@elephly.net> 12;;; Copyright © 2020, 2022 Ricardo Wurmus <rekado@elephly.net>
13;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr> 13;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
14;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net> 14;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net>
15;;; Copyright © 2020 Oleg Pykhalov <go.wigust@gmail.com> 15;;; Copyright © 2020 Oleg Pykhalov <go.wigust@gmail.com>
@@ -205,6 +205,21 @@
205 205
206 tailon-service-type 206 tailon-service-type
207 207
208 anonip-configuration
209 anonip-configuration?
210 anonip-configuration-anonip
211 anonip-configuration-input
212 anonip-configuration-output
213 anonip-configuration-skip-private?
214 anonip-configuration-column
215 anonip-configuration-replacement
216 anonip-configuration-ipv4mask
217 anonip-configuration-ipv6mask
218 anonip-configuration-increment
219 anonip-configuration-delimiter
220 anonip-configuration-regex
221 anonip-service-type
222
208 varnish-configuration 223 varnish-configuration
209 varnish-configuration? 224 varnish-configuration?
210 varnish-configuration-package 225 varnish-configuration-package
@@ -1355,6 +1370,99 @@ files.")
1355 files)))))))) 1370 files))))))))
1356 (default-value (tailon-configuration)))) 1371 (default-value (tailon-configuration))))
1357 1372
1373
1374
1375;;;
1376;;; Log anonymization
1377;;;
1378
1379(define-record-type* <anonip-configuration>
1380 anonip-configuration make-anonip-configuration
1381 anonip-configuration?
1382 (anonip anonip-configuration-anonip ;file-like
1383 (default anonip))
1384 (input anonip-configuration-input) ;string
1385 (output anonip-configuration-output) ;string
1386 (skip-private? anonip-configuration-skip-private? ;boolean
1387 (default #f))
1388 (column anonip-configuration-column ;number
1389 (default #f))
1390 (replacement anonip-configuration-replacement ;string
1391 (default #f))
1392 (ipv4mask anonip-configuration-ipv4mask ;number
1393 (default #f))
1394 (ipv6mask anonip-configuration-ipv6mask ;number
1395 (default #f))
1396 (increment anonip-configuration-increment ;number
1397 (default #f))
1398 (delimiter anonip-configuration-delimiter ;string
1399 (default #f))
1400 (regex anonip-configuration-regex ;string
1401 (default #f)))
1402
1403(define (anonip-activation config)
1404 (with-imported-modules '((guix build utils))
1405 #~(begin
1406 (use-modules (guix build utils))
1407 (for-each
1408 (lambda (directory)
1409 (mkdir-p directory)
1410 (chmod directory #o755))
1411 (list (dirname #$(anonip-configuration-input config))
1412 (dirname #$(anonip-configuration-output config)))))))
1413
1414(define (anonip-shepherd-service config)
1415 (let ((input (anonip-configuration-input config))
1416 (output (anonip-configuration-output config))
1417 (optional
1418 (lambda (accessor option)
1419 (or (and=> (accessor config)
1420 (lambda (value)
1421 (list
1422 (format #false "~a=~a"
1423 option value))))
1424 (list)))))
1425 (list (shepherd-service
1426 (provision (list (symbol-append 'anonip- (string->symbol output))))
1427 (requirement '(user-processes))
1428 (documentation "Anonimyze the given log file location with anonip.")
1429 (start #~(lambda _
1430 (unless (file-exists? #$input)
1431 (mknod #$input 'fifo #o600 0))
1432 (let ((pid (fork+exec-command
1433 (append
1434 (list #$(file-append (anonip-configuration-anonip config)
1435 "/bin/anonip")
1436 (string-append "--input=" #$input)
1437 (string-append "--output=" #$output))
1438 (if #$(anonip-configuration-skip-private? config)
1439 '("--skip-private") (list))
1440 '#$(optional anonip-configuration-column "--column")
1441 '#$(optional anonip-configuration-ipv4mask "--ipv4mask")
1442 '#$(optional anonip-configuration-ipv6mask "--ipv6mask")
1443 '#$(optional anonip-configuration-increment "--increment")
1444 '#$(optional anonip-configuration-replacement "--replacement")
1445 '#$(optional anonip-configuration-delimiter "--delimiter")
1446 '#$(optional anonip-configuration-regex "--regex"))
1447 ;; Run in a UTF-8 locale
1448 #:environment-variables
1449 (list (string-append "GUIX_LOCPATH=" #$glibc-utf8-locales
1450 "/lib/locale")
1451 "LC_ALL=en_US.utf8"))))
1452 pid)))
1453 (stop #~(make-kill-destructor))))))
1454
1455(define anonip-service-type
1456 (service-type
1457 (name 'anonip)
1458 (extensions
1459 (list (service-extension shepherd-root-service-type
1460 anonip-shepherd-service)
1461 (service-extension activation-service-type
1462 anonip-activation)))
1463 (description
1464 "Provide web server log anonymization with @command{anonip}.")))
1465
1358 1466
1359;;; 1467;;;
1360;;; Varnish 1468;;; Varnish