summaryrefslogtreecommitdiff
path: root/monitor/josef_monitor.py
diff options
context:
space:
mode:
Diffstat (limited to 'monitor/josef_monitor.py')
-rwxr-xr-x[-rw-r--r--]monitor/josef_monitor.py209
1 files changed, 53 insertions, 156 deletions
diff --git a/monitor/josef_monitor.py b/monitor/josef_monitor.py
index d84be8e..cf5357c 100644..100755
--- a/monitor/josef_monitor.py
+++ b/monitor/josef_monitor.py
@@ -6,7 +6,8 @@ import datetime
import base64
import argparse
import errno
-from certtools import *
+from copy import deepcopy
+from josef_lib import *
NAGIOS_OK = 0
NAGIOS_WARN = 1
@@ -17,7 +18,7 @@ DEFAULT_CUR_FILE = 'all-sth.json'
DEFAULT_CERT_FILE = "plausible_cert_data.json"
base_urls = [
- "https://plausible.ct.nordu.net/",
+ # "https://plausible.ct.nordu.net/",
# "https://ct1.digicert-ct.com/log/",
# "https://ct.izenpe.com/",
# "https://log.certly.io/",
@@ -25,26 +26,26 @@ base_urls = [
# "https://ct.googleapis.com/pilot/",
# "https://ct.googleapis.com/rocketeer/",
# "https://ctlog.api.venafi.com/",
- # "https://ct.ws.symantec.com/",
+ "https://ct.ws.symantec.com/",
]
parser = argparse.ArgumentParser(description="")
-parser.add_argument('--audit', action='store_true', help="run lightweight auditor verifying consistency in STH")
-parser.add_argument('--monitor', action='store_true', help="run full monitoring for all logs")
-parser.add_argument('--audit2', action='store_true', help="run medium-weight auditor verifying consistency in STH and inclusion proofs of new entries")
-parser.add_argument('--audit3', action='store_true', help="continously run medium-weight auditor verifying consistency in STH and inclusion proofs of new entries")
-parser.add_argument('--audit4', action='store_true', help="run one check on one server")
-parser.add_argument('--build-sth', action='store_true', help="get all entries and construct STH")
-parser.add_argument('--verify-index', default=None, help="Verify a specific index in all logs" )
-parser.add_argument('--host', default=None, help="Base URL for CT log")
-parser.add_argument('--roots', action='store_true', help="Check accepted root certificates for all logs" )
-parser.add_argument('--cur-sth',
- metavar='file',
- default=DEFAULT_CUR_FILE,
- help="File containing current STH (default=%s)" % DEFAULT_CUR_FILE)
-
-timings = {}
-errors = []
+# parser.add_argument('--audit', action='store_true', help="run lightweight auditor verifying consistency in STH")
+# parser.add_argument('--monitor', action='store_true', help="run full monitoring for all logs")
+# parser.add_argument('--audit2', action='store_true', help="run medium-weight auditor verifying consistency in STH and inclusion proofs of new entries")
+# parser.add_argument('--audit3', action='store_true', help="continously run medium-weight auditor verifying consistency in STH and inclusion proofs of new entries")
+# parser.add_argument('--audit4', action='store_true', help="run one check on one server")
+# parser.add_argument('--build-sth', action='store_true', help="get all entries and construct STH")
+# parser.add_argument('--verify-index', default=None, help="Verify a specific index in all logs" )
+# parser.add_argument('--host', default=None, help="Base URL for CT log")
+# parser.add_argument('--roots', action='store_true', help="Check accepted root certificates for all logs" )
+# parser.add_argument('--cur-sth',
+# metavar='file',
+# default=DEFAULT_CUR_FILE,
+# help="File containing current STH (default=%s)" % DEFAULT_CUR_FILE)
+
+# timings = {}
+# errors = []
monitored_domains = [
# "google.com",
@@ -56,46 +57,10 @@ monitored_domains = [
# ".se",
]
-class UTC(datetime.tzinfo):
- def utcoffset(self, dt):
- return datetime.timedelta(hours=0)
- def dst(self, dt):
- return datetime.timedelta(0)
-
-def reduce_layer(layer):
- new_layer = []
- while len(layer) > 1:
- e1 = layer.pop(0)
- e2 = layer.pop(0)
- new_layer.append(internal_hash((e1,e2)))
- return new_layer
-
-def reduce_tree(entries, layers):
- if len(entries) == 0 and layers is []:
- return [[hashlib.sha256().digest()]]
-
- layer_idx = 0
- layers[layer_idx] += entries
-
- while len(layers[layer_idx]) > 1:
- if len(layers) == layer_idx + 1:
- layers.append([])
-
- layers[layer_idx + 1] += reduce_layer(layers[layer_idx])
- layer_idx += 1
- return layers
-
-def reduce_subtree_to_root(layers):
- while len(layers) > 1:
- if len(layers[1]) == 0:
- layers[1] = layers[0]
- else:
- layers[1] += next_merkle_layer(layers[0])
- del layers[0]
+class ctlog:
+ def __init__(name, url):
+ self.name = name
- if len(layers[0]) > 1:
- return next_merkle_layer(layers[0])
- return layers[0]
def fetch_all_sth():
sths = {}
@@ -148,7 +113,6 @@ def verify_progress(old, new):
except:
print time.strftime('%H:%M:%S') + " ERROR: Failed to verify progress for " + url
-
def verify_consistency(old, new):
for url in old:
try:
@@ -205,7 +169,6 @@ def check_domain(raw_entry, log=None):
cert_info["log"] = log[8:-1] # strip generic URL stuff
return cert_info
-
def fetch_and_increment_subtree(old_sth, new_sth_in, subtree, base_url):
try:
print "Initial hash:", hash(str(subtree))
@@ -268,7 +231,11 @@ def fetch_and_build_subtree(old_sth, base_url):
def verify_subtree(old_sth, subtree, base_url):
try:
sth = old_sth[base_url]
- tmp = list(subtree)
+
+ ### BUG ###!!
+ tmp = deepcopy(subtree)
+
+
root = base64.b64encode(reduce_subtree_to_root(tmp)[0])
if root == sth["sha256_root_hash"]:
@@ -385,105 +352,35 @@ def append_file(fn, content):
def main(args):
- # print time.strftime("%H:%M:%S") + " Starting..."
- if args.verify_index is None and not args.build_sth and not args.audit and not args.audit2 \
- and not args.audit3 and not args.audit4 and not args.roots and not args.monitor:
-
- print time.strftime('%H:%M:%S') + " Nothing to do."
- return
- elif args.audit4:
- pass
- else:
- sth = fetch_all_sth()
-
- if args.verify_index is not None:
- for url in base_urls:
- verify_inclusion_by_index(url, int(args.verify_index))
-
- if args.roots:
- print time.strftime('%H:%M:%S') + " Getting accepted Root Certs from all logs..."
- for url in base_urls:
- get_all_roots(url)
-
-
- if args.build_sth:
- print time.strftime('%H:%M:%S') + " Building trees from entries. This may take a while, go get coffee or something..."
- for base_url in base_urls:
- subtree = fetch_and_build_subtree(sth, base_url)
- verify_subtree(sth, subtree, base_url)
- # fetch_and_build_tree(sth, base_urls[2])
-
- if args.audit:
- print time.strftime('%H:%M:%S') + " Running auditor1 for " +str(len(base_urls)) + " logs..."
- old_sth = read_sth(args.cur_sth)
- if old_sth:
- verify_consistency(old_sth, sth)
- else:
- print "No old sth found..."
- write_file(args.cur_sth, sth)
-
-
- if args.audit3:
- print time.strftime('%H:%M:%S') + " Running auditor3 for " +str(len(base_urls)) + " logs..."
- while True:
- time.sleep(30)
- new_sth = fetch_all_sth()
- verify_consistency(sth, new_sth)
- verify_inclusion_all(sth, new_sth)
- sth = new_sth
-
- if args.audit2:
- print time.strftime('%H:%M:%S') + " Running auditor2 for " +str(len(base_urls)) + " logs..."
- old_sth = read_sth(args.cur_sth)
- # print "Verifying progress..."
- verify_progress(old_sth, sth)
- if old_sth:
- print "Verifying consistency..."
- verify_consistency(old_sth, sth)
- print "Verifying inclusion..."
- verify_inclusion_all(old_sth, sth)
- write_file(args.cur_sth, sth)
-
- if args.monitor:
- all_subtrees = {}
- print time.strftime('%H:%M:%S') + " Building trees from entries. This may take a while, go get coffee or something..."
+ # TODO read state
+ sth = fetch_all_sth()
+ all_subtrees = {}
+ print time.strftime('%H:%M:%S') + " Building trees from entries. This may take a while, go get coffee or something..."
+ for url in base_urls:
+ all_subtrees[url] = fetch_and_build_subtree(sth, url)
+ verify_subtree(sth, all_subtrees[url], url)
+
+ while True:
+ time.sleep(30)
+ new_sth = fetch_all_sth()
for url in base_urls:
- all_subtrees[url] = fetch_and_build_subtree(sth, url)
- verify_subtree(sth, all_subtrees[url], url)
-
- while True:
- time.sleep(30)
- new_sth = fetch_all_sth()
- for url in base_urls:
- if url in sth and url in new_sth and sth[url]["tree_size"] != new_sth[url]["tree_size"]:
- # print "Len before:", len(all_subtrees[url])
- all_subtrees[url] = fetch_and_increment_subtree(sth, new_sth, all_subtrees[url], url)
- # print "Len between:", len(all_subtrees[url])
- verify_subtree(new_sth, all_subtrees[url], url)
- # print "Len after:", len(all_subtrees[url])
- print "Old sth:", sth[url]["sha256_root_hash"]
- print "New sth:", new_sth[url]["sha256_root_hash"]
- sth = new_sth
+ if url in sth and url in new_sth and sth[url]["tree_size"] != new_sth[url]["tree_size"]:
+ all_subtrees[url] = fetch_and_increment_subtree(sth, new_sth, all_subtrees[url], url)
+ verify_subtree(new_sth, all_subtrees[url], url)
+ print "Old sth:", sth[url]["sha256_root_hash"]
+ print "New sth:", new_sth[url]["sha256_root_hash"]
+ sth = new_sth
if __name__ == '__main__':
- # try:
- main(parser.parse_args())
- if len(errors) == 0:
- print time.strftime('%H:%M:%S') + " Everything OK."
- sys.exit(NAGIOS_OK)
- else:
- # print "errors found!"
- print_errors(errors)
- sys.exit(NAGIOS_WARN)
- # except:
- # pass
- # finally:
- # # print_timings(timings)
- # print_errors(errors)
-
-
-
+ main(parser.parse_args())
+ # TODO read config
+ if len(errors) == 0:
+ print time.strftime('%H:%M:%S') + " Everything OK."
+ sys.exit(NAGIOS_OK)
+ else:
+ print_errors(errors)
+ sys.exit(NAGIOS_WARN)