We're currently working on an authentication module for ceph. This will allow us both keeping the cluster secured internally, as no bad servers will be able to join the cluster, and both externally. E.g., only permitted clients will be able to do certain specified operations. This is just a rough description of what we consider right now, but here it is:
The following are the basic requirements: * Robust, scalable, keeps up with the cluster's consistency. * Identify the different cluster modules (e.g., mon, mds and osd) and allow only the permitted entities to participate in the cluster * Identify the clients, and set up a mechanism to authenticate them. Establish a session between the client and the cluster * The created session will allow the client to communicate with the different cluster entities * It will be possible to sign (and possibly encrypt) all protocol operations 1. Implementation Considerations We need to remember that when dealing with the cluster we can't just add a server that doesn't conform with the basic cluster requirements which are robustness and scalability. So when considering a 3rd party that we could integrate in, we need to keep that in mind. I would like to hear if anyone has an idea on what other tools we can use instead of "let's just do it all ourselves". 2. General Like in other network protocols, the basic idea is that when the client first connects to the cluster it establishes a 'session'. In order for the client to authenticate that session, it first specifies the types of the different authentications mechanisms it supports. The server will respond with the selected authentication methods, and with the beginning of the authentication sequence. For a shared secret authentication the server will respond with the challenge for the authentication. The client, will respond with its own challenge, and some computed key that was generated from the secret, the client challenge and the server challenge. A secret session-key will also be calculated by both parties. Once authenticated the client's validity, the server responds with some ticket that will allow the client to communicate with the different entities. The ticket will consist of the client's id and some signature that will validate its authenticity. The monitor will probably be the natural entity to handle the session creation requests, though it might be better to create a new service that will be responsible for all authentication issues. Another issue that we discussed was whether we need to propagate the session state to the whole cluster. For example, when a client authenticates with mon1, do we actually need all the monitors to know about this authentication (that is, while the authentication sequence goes on)? If mon1 goes down while the authentication takes place, do we need the monitor that takes its place to continue on with the authentication sequnce? probably not. We can just issue some do-it-again response to the client. After authentication is completed, we will need to keep the knowledge of that session and of the calculated session-key, so that messages signing could be used. Once the client has a ticket, it is valid and can be used for all its operations. One caveat is that there's no simple way to revoke such a ticket, beside using some timestamp on it. The ticket should hold information like the user id, the ticket signature, and authorization info (e.g., which osd pools it can use). 3. Authentication Mechanisms These are the different authentication mechanisms that we actually consider right now. * Kerberos Pros: * This is probably the way to go (if done right). Kerberos has been adopted by major network protocols (e.g., nfs, cifs). * Each entity will be able to authenticate itself, and we'll be able to define trust relationships between the different entities. Kerberos helps us with the fact that we have different entities that we need to validate. Cons: * Complicates deployment * Need to embed a kerberos server within the cluster that will not be a single point of failure. Needs to be scalable and robust. * Kernel client support will probably require userspace upcall which complicates things * Shared secret Pros: * Easier to implement, much easier to deploy Cons: * Security issues * Can't delegate permissions between entities. E.g., the client can give another entity a permission to act on behalf of it. It seems that for the sake of simplicity will start with a shared-secret implementation, but will probably later on add kerberos capabilities. I'd love to hear any comment, idea or request that you might have as we're about to start implementing this stuff. Thanks, Yehuda ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Ceph-devel mailing list Ceph-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ceph-devel