diff options
| -rw-r--r-- | doc/guix.texi | 71 | ||||
| -rw-r--r-- | gnu/services/web.scm | 110 |
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@* | |||
| 30 | Copyright @copyright{} 2014 Pierre-Antoine Rault@* | 30 | Copyright @copyright{} 2014 Pierre-Antoine Rault@* |
| 31 | Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@* | 31 | Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@* |
| 32 | Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari@* | 32 | Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari@* |
| 33 | Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ricardo Wurmus@* | 33 | Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Ricardo Wurmus@* |
| 34 | Copyright @copyright{} 2016 Ben Woodcroft@* | 34 | Copyright @copyright{} 2016 Ben Woodcroft@* |
| 35 | Copyright @copyright{} 2016, 2017, 2018, 2021 Chris Marusich@* | 35 | Copyright @copyright{} 2016, 2017, 2018, 2021 Chris Marusich@* |
| 36 | Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022 Efraim Flashner@* | 36 | Copyright @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 | |||
| 18712 | Anonip is a privacy filter that removes IP address from web server logs. | ||
| 18713 | This service creates a FIFO and filters any written lines with anonip | ||
| 18714 | before writing the filtered log to a target file. | ||
| 18715 | |||
| 18716 | The 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 | |||
| 18727 | Configure your web server to write its logs to the FIFO at | ||
| 18728 | @file{/var/run/anonip/https.access.log} and collect the anonymized log | ||
| 18729 | file at @file{/var/web-logs/https.access.log}. | ||
| 18730 | |||
| 18731 | @deftp {Data Type} anonip-configuration | ||
| 18732 | This data type represents the configuration of anonip. | ||
| 18733 | It has the following parameters: | ||
| 18734 | |||
| 18735 | @table @asis | ||
| 18736 | @item @code{anonip} (default: @code{anonip}) | ||
| 18737 | The anonip package to use. | ||
| 18738 | |||
| 18739 | @item @code{input} | ||
| 18740 | The file name of the input log file to process. The service creates a | ||
| 18741 | FIFO of this name. The web server should write its logs to this FIFO. | ||
| 18742 | |||
| 18743 | @item @code{output} | ||
| 18744 | The file name of the processed log file. | ||
| 18745 | @end table | ||
| 18746 | |||
| 18747 | The following optional settings may be provided: | ||
| 18748 | |||
| 18749 | @table @asis | ||
| 18750 | @item @code{skip-private?} | ||
| 18751 | When @code{#true} do not mask addresses in private ranges. | ||
| 18752 | |||
| 18753 | @item @code{column} | ||
| 18754 | A 1-based indexed column number. Assume IP address is in the specified | ||
| 18755 | column (default is 1). | ||
| 18756 | |||
| 18757 | @item @code{replacement} | ||
| 18758 | Replacement string in case address parsing fails, e.g. @code{"0.0.0.0"}. | ||
| 18759 | |||
| 18760 | @item @code{ipv4mask} | ||
| 18761 | Number of bits to mask in IPv4 addresses. | ||
| 18762 | |||
| 18763 | @item @code{ipv6mask} | ||
| 18764 | Number of bits to mask in IPv6 addresses. | ||
| 18765 | |||
| 18766 | @item @code{increment} | ||
| 18767 | Increment the IP address by the given number. By default this is zero. | ||
| 18768 | |||
| 18769 | @item @code{delimiter} | ||
| 18770 | Log delimiter string. | ||
| 18771 | |||
| 18772 | @item @code{regex} | ||
| 18773 | Regular 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 |
