OldRequirementsDoc

Table of Contents

1. Table of Contents
2. Purpose of this Document
3. Other Documents / Other Sections?
4. Requirements
      1. R1. Authentication
            1. R1.a Recovery
            2. R1.b SSO
            3. R1.c  Existing methods
            4. R1.d  Add New Methods
            5. R1.e  Minimise Sign-in Torture
      2. R2. Messaging Layer
      3. R3.  Logging
            1. R3.a  Simple Identification Scheme for debugging messages
            2. R3.b Simple Debug Call
            3. R3.c  Auditable Logging
      4. R4.  i18n
      5. R5.  Features driven by Points and Binary flags
      6. R6. URL Sanity
            1. R6.a Redirects
            2. R6.b  RESTful and Cool URIs
      7. R7.  Signed Attest Statement
      8. R8.  Independence
            1. R8.a Platform Independence
            2. R8.b Package minimilisation
            3. R8.c  Language Flexibility
      9. R9.  Multiple Signers
            1. R9.a Signing Profiles
     10. R10.  Secure (email) Messaging
     11. R11.  Backups and Recovery
     12. R12.  Modern Website
     13. R13.  Not Sure:
5. Architectural Principles
      1. A1.  Outsource
      2. A2. Messaging
            1. A2.a Idempotent
            2. A2.b asynchronous operations
      3. A3.  Meta-Things
      4. A4.  File a dispute
      5. A5.  Centralised Crypto

Purpose of this Document

This document is intended as a design document specifying the architecture of the proposed CAcert software. It is also to be used to specify the requirements guiding this design process. The first use of this document should be as a guideline during the development of new CAcert software. Later on, after development has achieved some form of completion (for any value of complete), this document could also become the documentation of the new software systems.

Other Documents / Other Sections?

We possibly need a panopoly of documents. Something like:

Business Requirements => Architecture => Design => Module Specifications

Should we put this all in this one document for now? Or should we create many side-by-side documents?

Requirements

Below is the way Iang does things, as a sort of starter. Anyone got a better way?

R1. Authentication

R1.a Recovery

There should be a robust and scaleable way to handle the loss of Member authentication data.

R1.b SSO

Should support / rely / push / pull Single Sign On. E.g., CATS insists that the prospective Assurer get a certificate and install in the browser. Once that is there, certificate log-in is randomly easy :-) This is not a requirement to necessarily support SSO on the main site (security!?) but to align its actions with the community need to get SSO going elsewhere. For example, we could insist that people with 1 point get a certificate ... and use that in preference to password login (however consider this carefully in contrast to R1).

R1.c Existing methods

Support at least passphrase, client certificates and "net cafe" login methods.

R1.d Add New Methods

we should have the ability to add new methods of authentication for example biglumber.com method. PGP encrypted mail with a generated password (login token) and then the option to see how long the cookie will last. old login tokens can be invalidated.

R1.e Minimise Sign-up Torture

Incrementally enable features. E.g., it should be easier to see what certs are in existance than to see the lost-password questions.

R2. Messaging Layer

We need a fairly good robust messaging layer, something that works for everything.

R3. Logging

There should be a unified logging / event reporting / debugging approach. Some way to separate out the logs from all other data and send them through separate channels to somewhere safe.

E.g in Java, it might be that all logging is done as direct appends to open files, whereas all action data goes through IPC and is stored in databases.

R3.a Simple Identification Scheme for debugging messages

Each debugging message should include some indication as to where it is. The scheme I like it to include a car numberplate in each debug line, like: debug("A-49165; i just saw a null pointer"). Then, the investigator does a global search for A-49165 and finds the string in seconds instead of having to trawl through indexes, ontologies, and what-not.

R3.b Simple Debug Call

And, a call or framework that allows powerful messaging to be trapped. Of course this could be very old-world, maybe newer working practices dispense with debugging traces?

R3.c Auditable Logging

The logged messages should be robust and unchangeable. Easiest way to do this is hash chaining, but there may be other ideas.

R4. i18n

Probably we need some form of multilingual support. How successful is the existing set of languages?not probably, absolutetly! I think we should continue using translingo (gettext) -Alejandro Mery 19/03/2009 16:10

R5. Features driven by Points and Binary flags

A set of features that are configurable according to a number of points systems. Now we have Assurance Points and Experience Points. Also there are "support" flag, and likely others.

R6. URL Sanity

R6.a Redirects

handle redirects on current URIs which could be bookmarked or linked from somewhere.

R6.b RESTful and Cool URIs

Like https://foo/noun/arg1/arg2 instead of https://foo/doh.cmd?id=deadbeef&yousuck=1x%x%...

See RESTful and URI Style.

In short been RESTful means the URI reference the resource, and POST the actions. each domain, each mail address, each user has his own URI. Obviously ACL have to be applied.

R7. Signed Attest Statement

The system should be able to accept signed attest statements. E.g., an Assurance could be a signed statement from Alice with the tuple "Bob, 10 points, signature." However we would then have the issue that the attest would go into the system, and bounce, if the data in there could not be matched.

What is the situation on Assurers looking at user information? Are they trusted to do this or not, in the context of an Assurance?

Suggestions from AM: Member enables an Assurer to see his data (thawte's method). Assurer does not see the DoB, he has to enter it and the system compares.

R8. Independence

As much as possible the software should do its own thing, and not be dependent on difficult issues.

R8.a Platform Independence

To the extent possible it should run on all Unix platforms, including BSD (as latter have much better security profiles). Likely it is easier to develop on Linux, as they have better support.

R8.b Package minimisation

The software should try not to drag in other packages. you mean dependencies minimisation? -Alejandro Mery 19/03/2009 17:29

R8.c Language Flexibility

It would be nice to integrate in different components based on distinct languages that are better for the immediate job. This basically means using a message or request/response API (sometimes called web-api).

R9. Multiple Signers

There should be an ability to deal with multiple secure signing modules. E.g., we should be able to deal with a few of the current serial line module and also HSMs.

R9.a Signing Profiles

The current design has some form of "profiles" where the matched CSR directs the actions to follow.

R10. Secure (email) Messaging

There needs to be some way to facilitate sending a reliable/secure email to a Member. E.g., an Arbitration notification.

This may be an ability for some Members to type in a message to a user's account which is held there in an "message box", or it may just be a way to send out an email, possibly signed by CAcert, or a combination of features.

R11. Backups and Recovery

There should be a designed-in ability to export the entire data set and to incorporate the entire data set easily. It is not acceptable to throw the system over the wall and say "just back up the MySQL."

R12. Modern Website

"modern" look & feel (simple, short texts, "large fonts", colourful, visual)

The website needs an ability to re-invent itself from time to time. This means 3-tier architecture?for a web application I think MVC fits better -Alejandro Mery 19/03/2009 18:27

R13. Not Sure / Misc

5. Some sort of mobile-phone friendly basic interface. mobile use cases need to be identified -Alejandro Mery 19/03/2009 18:29

6. minimize exposing private data to assurers which could be attackers. (e.g. we show fully name and DoB to anyone claiming to be going to assure someone)

R14. Proving of Control / Ownership Methods

According to a recent decision, two checks are required for each email address and domain, in order to add a cert.

Where possible, the checks should be permanently repeatable.

R14.a Email Probe

A basic email probe and prove facility is needed. Current design is to take the registry email addresses and the added email addresses, offer them to the user, take a selection, send a URL, wait until the URL is clicked. Deliver the "proven" result back to caller. Log the time/type of check so that future checks can be conducted automatically.

R14.b DNS cookie probe

A basic probe of some fact about DNS. Design is to offer some selection of records to set, and when done, initiate a DNS check to see if there. E.g., add alias cacertxyz123.example.com. The record should be left in place, and probed occasionally for continual check. Once checked this way, this forms one of the two required checks

R14.c HTTP cookie probe

Ask for some file or header on the website to be placed there, and left there.

R14.d registry check

Ask for some field to be set such as a DNS server (extreme) or adding CAcert-123xyz into the Technical contact as authority for CAcert to be a technical issuer of certs. This method is slightly superior in legal sense because it tests ownership as well as control.

R15.e Control / Ownership Decision Module

A module that takes / provides the sum of all above and reveals a single decision on request.

Architectural Principles

A1. Outsource

Where some feature can be outsourced to a community site, it should be. A great example of this is CATS. These could also be considered for outsourcing:

Many of these rely on the certificate being used to ease the authentication into other websites. Basically, SSO.

A2. Messaging

The system should be fundamentally designed on the basis of messaging. Send a message, wait for a response. This should be at the highest level. No connection-oriented stuff at all. It should all be state machines. Send, wait. Resend or get or fail.

A2.a Idempotent

An implication of messaging (or is it the other way around?) is that all actions should be idempotent / atomic. That is, they happen either 0 or 1 times and they are repeatable. For example, Alice can add an assurance of Bob as many times as she likes, she always ends up with precisely 1 (or 0) assurances.

A2.b asynchronous operations

Everything built to be asynchronous: cert signing, pings, validation, ...

A3. Meta-Things

Things that don't need to be said?

A4. File a dispute

Where possible, consider kicking things across to Arbitration.

A5. Centralised Crypto

Where Crypto is heavily used, it should generally be centralised in a single area, and all code should work with the features used there. This enables a crypto plumber to get a good oversight of the use and reliance on crypto, and to maintain the security. It also allows a complete replacement, which is a useful thing where some crypto libraries are poor quality.