Home | History | Annotate | Line # | Download | only in syslogd
      1  1.1  christos <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
      2  1.1  christos <html>
      3  1.1  christos <head>
      4  1.1  christos <title>NetBSD &amp; Google's Summer of Code: Martin Schuette - Improve syslogd (syslogd)</title>
      5  1.1  christos </head>
      6  1.1  christos <body>
      7  1.1  christos 
      8  1.1  christos <h1>syslog-sign</h1>
      9  1.1  christos <p><a href="http://tools.ietf.org/html/draft-ietf-syslog-sign">syslog-sign</a> defines digital signatures for logfiles. This provides end-to-end authentication for network transports, enables the detection of lost UDP messages, and also makes it possible to check a log archive for later modifications (assuming the private key was kept safe).</p>
     10  1.1  christos 
     11  1.1  christos <h2>Signature Groups</h2>
     12  1.2    andvar <p>A basic concept of syslog-sign is the signature group which describes a set of messages that are grouped and signed together. Their purpose becomes clear with an example: assume you split your messages to two logservers <em>serverA</em> and <em>serverB</em>. Now if all messages were signed as one stream, then a) where do the signatures go to? and b) how could <em>serverA</em>, having only hashes and signatures, decide which message are missing and which are on <em>serverB</em>?<br>
     13  1.1  christos Thus the messages are selected into two signature groups containing all signatures for messages to <em>serverA</em> and <em>serverB</em> respectively. Then every server has its own messages and its own signatures to verify them.</p>
     14  1.1  christos <p>There are three predefined and one custom signature groups:</p>
     15  1.1  christos <ol start="0">
     16  1.1  christos   <li>one global signature group, useful if all messages go to one central logserver anyway</li>
     17  1.1  christos   <li>every syslog priority (=combination of facility and severity) gets its own group, i.e. 192 of them, useful if there are lots of different destinations which all receive messages with different priorities</li>
     18  1.1  christos   <li>take the priorities and split them into intervals, useful to define bigger subsets, e.g. one signature group for the mail facility and two for everything else</li>
     19  1.1  christos   <li>not defined and reserved for custom strategy. I use this to have one signature group for every configured destination. In this case the selector in syslog.conf will determine which messages go into one group; it is also the only strategy that allows a message to be in multiple groups.</li>
     20  1.1  christos </ol>
     21  1.1  christos <p>Every signature group has several attributes and only the combination of several values determines one signature group unambiguously. Currently the key to identify a signature group is the tuple (hostname, reboot session ID, SG value, SPRI value). <!-- In a later draft the program name or process ID might be added to allow multiple syslog-sign senders per host.--></p>
     22  1.1  christos 
     23  1.1  christos <h2>Configuration/Activation</h2>
     24  1.1  christos <p>syslog-sign is enabled with the option "sign_sg" in syslog.conf. The value selects the signature group strategy, so for example the line "sign_sg=0" enables syslog-sign with one signature group.</p>
     25  1.2    andvar <p>The SG="2" strategy is the only one that might require additional configuration. When selected (with "sign_sg=2") the default is to use one signature group per facility (kernel, user, mail, ...). To allow custom configuration there is an additional option "sign_sg2_delim" to specify the numerical SPRI values, i.e. the boundaries between the signature groups.<br>
     26  1.1  christos Example: With "sign_sg2_delim = 15 31" syslogd will set up three signature groups: one for all priorities x &le; 15 (kernel.*,user.*), one for priorities 15 &lt; x &le; 31 (mail.*), and one for all priorities x &gt; 31.</p>
     27  1.1  christos 
     28  1.1  christos <h2>Key, Signature, and Hash Types</h2>
     29  1.1  christos <p>The current internet draft defines two values for the VERsion field for using either SHA-1 or SHA-256 hashes. Both versions mandate DSA keys and signatures.<br>
     30  1.1  christos There are several alternatives for sending the public key in the initial Certificate Block. If a X.509 certificate is available (for TLS connections) then syslogd will use key type 'C' (PKIX) and send the certificate in DER encoding. Otherwise it generates a new DSA key and uses key type 'K' (public key) to send the public key in DER encoding.</p>
     31  1.1  christos 
     32  1.1  christos <h2>Redundancy</h2>
     33  1.1  christos <p>As mentioned above one design target of syslog-sign is the detection of lost messages, e.g. due to UDP datagram loss. So one has to take extra precaution to prevent lost signature messages and send them multiple times.<br>
     34  1.1  christos This implementation sends the first Certificate block only on demand, just before the first Signature Block. After that it is resent <em>n</em> times with several seconds delay. The Signature Blocks are not repeated but use a sliding window so that every message hash is included in <em>m</em> sequential Signature Blocks.</p>
     35  1.1  christos 
     36  1.1  christos <h2>Verification</h2>
     37  1.1  christos <p>Sending signatures is only half of the job, -- they have to be verified as well. I used Perl to write an <a href="verify-sign/verify.pl">offline verification</a> tool that reads a complete logfile and prints all messages in their correct order. See the example below for a sample usage and output.</p>
     38  1.1  christos 
     39  1.1  christos <h2>Example</h2>
     40  1.1  christos <p>Here is an example of a signed message sequence. I let syslogd generate me a DSA key for a self-signed X.509 certificate and use that for signing. I also changed one message so you can see the resulting verification output below.</p>
     41  1.1  christos 
     42  1.1  christos <pre>
     43  1.1  christos $ cat test.log
     44  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg0
     45  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg1
     46  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg2
     47  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg3
     48  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg4
     49  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg5
     50  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg6
     51  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg7
     52  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg8
     53  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg9
     54  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg10
     55  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg11
     56  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - modified msg12
     57  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg13
     58  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg14
     59  1.1  christos <110>1 2008-08-02T01:09:27.773505+02:00 host.example.org syslogd - - [ssign-cert VER="0111" RSID="1217632162" SG="3" SPRI="0" TBPL="1059" INDEX="1" FLEN="1059" FRAG="2008-08-02T01:09:27.773464+02:00 C MIIC+jCCArmgAwIBAwIBATAJBgcqhkjOOAQDMCIxIDAeBgNVBAMTF2NvcmRlbGlhLm1zY2h1ZXR0ZS5uYW1lMB4XDTA4MDczMDIyMDYyMloXDTA5MDczMDIyMDYyMlowIjEgMB4GA1UEAxMXY29yZGVsaWEubXNjaHVldHRlLm5hbWUwggG3MIIBKwYHKoZIzjgEATCCAR4CgYEA92S335Kxy2TTMfdg9Vi/CJvyDCHMHpPYxWwEkEI26xEdKybzLghTfbG/RZw/nnFuhRTH4Xe6GVvlFi2zIzySSClXr+zyXg/D9uHyiVL5TEsu8uQT2IREmGOB8pu70FukL9nQGOr82YxuRFQzZ1p6KltIggivi5ffR4B33+1xoSkCFQDYe5GJKM9Cw6nkLngHkzFGRmcXIQKBgDbHeOLBKYLkRZyRpXd0aTNU2igcKTWyWlUTySJuv/iTAeB09p9WyTIPyAhtqN77CIwX8Ui2jGu6NYT6TWEYJVvL+C/TvddAvAMyefv+w+HPNF2L77IVrjNVRCneERoNKlWc6IzjKH3otl/Lh2D7NAWRid55vxF6Z0oO459+4vpRA4GFAAKBgQCzcJVR343IRntcQs8aENs/QMxoxHN6JVdpSLB9moY5/RC9ooxz32fkakSL0s8zLITLt/y+yzf0F/9JhmTC1XeD8gvPBesE6dc0ZzPCos0hg8WpKUWR0YqXFDOC//uBwIa94DncC8xZ0mCwavno6gtkz57S7ywSwnmrdjhmpdAZuqOBgDB+MBEGCWCGSAGG+EIBAQQEAwIGQDAzBglghkgBhvhCAQ0EJhYkYXV0by1nZW5lcmF0ZWQgYnkgdGhlIE5ldEJTRCBzeXNsb2dkMCYGCWCGSAGG+EIBDAQZFhdjb3JkZWxpYS5tc2NodWV0dGUubmFtZTAMBgNVHRMBAf8EAjAAMAkGByqGSM44BAMDMAAwLQIUZcsHdrbuyx9lR3tyyeiJvClj0B8CFQC+5+NlulgCd/yoSlLPZgsTHYmCYA==" SIGN="MC0CFFEHx8UX391lbmhbisJNS0zLGD/WAhUAuMfCO0BWtARt2vEWHbM2mAe2k+o="]
     60  1.1  christos <110>1 2008-08-02T01:09:27.778347+02:00 host.example.org syslogd - - [ssign VER="0111" RSID="1217632162" SG="3" SPRI="0" GBC="1" FMN="1" CNT="15" HB="siUJM358eYFHOS2K0MTlveWeH/U= zTxfthW8WqmtFhOG4k/+ZxkirTA= j9dubU1GNVp7qWShwph/w32nD08= XQDLZ/NuwirmLdMORtm84r9kIW4= RNDFNCo7hiCsK/EKumsPBbFHNZA= ANiE3KbY948J6cEB640fAtWXuO4= e2M/OqjHDfxLVUSPt1CsNJHm9wU= Y+racQst7F1gR8eEUh8O7o+M53s= JAMULRxjMPbOO5EhhKbsUkAwbl0= pd+N5kmlnyQ0BoItELd/KWQrcMg= dsMQSzPHIS6S3Vaa23/t7U8JAJ4= i4rE3x7N4qyQGTkmaWHsWDFP9SY= qgTqV4EgfUFd3uZXNPvJ25erzBI= XW0YrME5kQEh+fxhg1fetnWxfIc= 7YPcRHsDwXWnQuGRWaJtFWw9hus=" SIGN="MCwCFF5hS5GTLxLDwsDCUmOnHhzkmWzbAhRJ0io+LBKM6Ux/cM7eqZ6eRAI11Q=="]
     61  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg15
     62  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg16
     63  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg17
     64  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg18
     65  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg19
     66  1.1  christos <110>1 2008-08-02T01:09:32.399406+02:00 host.example.org syslogd - - [ssign VER="0111" RSID="1217632162" SG="3" SPRI="0" GBC="4" FMN="1" CNT="20" HB="siUJM358eYFHOS2K0MTlveWeH/U= zTxfthW8WqmtFhOG4k/+ZxkirTA= j9dubU1GNVp7qWShwph/w32nD08= XQDLZ/NuwirmLdMORtm84r9kIW4= RNDFNCo7hiCsK/EKumsPBbFHNZA= ANiE3KbY948J6cEB640fAtWXuO4= e2M/OqjHDfxLVUSPt1CsNJHm9wU= Y+racQst7F1gR8eEUh8O7o+M53s= JAMULRxjMPbOO5EhhKbsUkAwbl0= pd+N5kmlnyQ0BoItELd/KWQrcMg= dsMQSzPHIS6S3Vaa23/t7U8JAJ4= i4rE3x7N4qyQGTkmaWHsWDFP9SY= qgTqV4EgfUFd3uZXNPvJ25erzBI= XW0YrME5kQEh+fxhg1fetnWxfIc= 7YPcRHsDwXWnQuGRWaJtFWw9hus= PIvLm0mh+he5+PDihG1p7sQlx8k= lPzUvx0I1VwSGWV7yKF9W//Yb2U= X+PWYcx5AXnsDVSNAHLZUGk5ioY= okXY88MGG4QybrYMf8HJN23WO1Y= HcaPyHfQ2s1SuSciTKw4woYWuMg=" SIGN="MCwCFFr0i6taT1vWowR7yc5bEQxFfY7/AhQBCK+rBNPgzR0vUgxPeARvD24kIQ=="]
     67  1.1  christos </pre>
     68  1.1  christos <p>Just in case you wonder about the different timestamps: The messages were send with a normal syslog(3), so the syslogd received them in BSD Syslog format without subsecond resolution.</p>
     69  1.1  christos <hr>
     70  1.1  christos <pre>
     71  1.1  christos $ perl verify.pl --help
     72  1.1  christos 
     73  1.1  christos syslog-sign verifier
     74  1.1  christos reads logfile and verifies message signatures
     75  1.1  christos 
     76  1.1  christos Notes:
     77  1.1  christos - By default uses only SHA-1 hashes. Use option "--sha256" to use only
     78  1.1  christos   SHA-256 and "--sha1 --sha256"to use both types.
     79  1.1  christos - Some status messages are printed to stderr.
     80  1.1  christos   Use option "--quiet" to disable them.
     81  1.1  christos - All verified messages are printed with their identifying signature group.
     82  1.1  christos   Every line starts with a comma-separated tuple: hostname, reboot session ID,
     83  1.1  christos   SG value, SPRI value, and message number.
     84  1.1  christos - If only one hash is used then all messages not signed are printed as well.
     85  1.1  christos 
     86  1.1  christos Limitations: handles only key types 'C' (PKIX) and 'K' (public key)
     87  1.1  christos   with DSA keys and signatures
     88  1.1  christos 
     89  1.1  christos Command Line Options:
     90  1.1  christos   -i  --in         input file (default: stdin)
     91  1.1  christos   -o  --out        output file for verified messages (default: stdout)
     92  1.1  christos   -u  --unsigned   output file for unsigned messages (default: stdout)
     93  1.1  christos       --sha1       use SHA-1 hashes (default)
     94  1.1  christos       --sha256     use SHA-256 hashes
     95  1.1  christos   -v  --verbose    shows some internals (every CB,SB,hash,...)
     96  1.1  christos   -q  --quiet      no status messages to stderr
     97  1.1  christos   -h  --help       this help
     98  1.1  christos 
     99  1.1  christos $ perl verify.pl -i test.log
    100  1.1  christos reading input...
    101  1.1  christos processing CBs...
    102  1.1  christos decoding SGs...
    103  1.1  christos got PKIX DSA key
    104  1.1  christos verifying CBs...
    105  1.1  christos verified CB and got key for SG: (host.example.org,1217632162,0111,3,0), start: 2008-08-02T01:09:27.773464+02:00
    106  1.1  christos now process SBs
    107  1.1  christos signed messages:
    108  1.1  christos host.example.org,1217632162,0111,3,0,1  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg0
    109  1.1  christos host.example.org,1217632162,0111,3,0,2  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg1
    110  1.1  christos host.example.org,1217632162,0111,3,0,3  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg2
    111  1.1  christos host.example.org,1217632162,0111,3,0,4  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg3
    112  1.1  christos host.example.org,1217632162,0111,3,0,5  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg4
    113  1.1  christos host.example.org,1217632162,0111,3,0,6  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg5
    114  1.1  christos host.example.org,1217632162,0111,3,0,7  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg6
    115  1.1  christos host.example.org,1217632162,0111,3,0,8  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg7
    116  1.1  christos host.example.org,1217632162,0111,3,0,9  <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg8
    117  1.1  christos host.example.org,1217632162,0111,3,0,10 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg9
    118  1.1  christos host.example.org,1217632162,0111,3,0,11 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg10
    119  1.1  christos host.example.org,1217632162,0111,3,0,12 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg11
    120  1.1  christos host.example.org,1217632162,0111,3,0,13 **** msg lost
    121  1.1  christos host.example.org,1217632162,0111,3,0,14 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg13
    122  1.1  christos host.example.org,1217632162,0111,3,0,15 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg14
    123  1.1  christos host.example.org,1217632162,0111,3,0,16 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg15
    124  1.1  christos host.example.org,1217632162,0111,3,0,17 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg16
    125  1.1  christos host.example.org,1217632162,0111,3,0,18 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg17
    126  1.1  christos host.example.org,1217632162,0111,3,0,19 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg18
    127  1.1  christos host.example.org,1217632162,0111,3,0,20 <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - msg19
    128  1.1  christos messages without signature:
    129  1.1  christos <15>1 2008-08-02T02:09:27+02:00 host.example.org test 6255 - - modified msg12
    130  1.1  christos </pre>
    131  1.1  christos 
    132  1.1  christos <hr>
    133  1.1  christos <table border=0>
    134  1.1  christos <tr>
    135  1.1  christos <td>
    136  1.1  christos <a href="http://sourceforge.net"><img align="top" src="http://sourceforge.net/sflogo.php?group_id=141771&type=2" width="125" height="37" border="0" alt="SourceForge.net Logo"></a>
    137  1.1  christos <td>
    138  1.1  christos   <table>
    139  1.1  christos   <tr> <td> Martin Sch&uuml;tte &lt;<tt>info (a] mschuette.name</tt>&gt; </td> </tr>
    140  1.2    andvar   <tr> <td> $Id: sign.html,v 1.2 2023/05/01 11:57:53 andvar Exp $ </td> </tr>
    141  1.1  christos   </table>
    142  1.1  christos </tr>
    143  1.1  christos </table>
    144  1.1  christos 
    145  1.1  christos </body>
    146  1.1  christos </html>
    147