Re: Kerberos authentication support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 10 Feb 2017, Jonathan Brown wrote:
> Hi,
> 
> I and my colleague Dheeraj Shetty are interested in adding support for 
> Kerberos authentication to Ceph.  Although new to Ceph, I have worked 
> with Kerberos before and have recently been investigating how to 
> implement this feature.  The Ceph notes in this link discuss some goals 
> and issues for possible Kerberos authentication support:
> 
> http://pad.ceph.com/p/kerberos
> 
> This looks like a good plan of attack and so we have started down that 
> path and now have the authentication exchange working using GSSAPI 
> library calls.
> 
> Some comments…
> 
> >> The ceph cluster mons would share a single principal,
> >>  e.g. ceph/mycluster.foo.com
> 
> Normally Kerberos service principals have the format 
> <service>/<hostname>@<realm>.  For my initial testing I am using a name 
> like "ceph-mon/myhost.foo.com" for the separate mon services on 
> different machines.  Is there a reason to share a single principal 
> instead of the normal Kerberos convention?

I think so.  The mons operate as a cluster and are collectively available 
even when one or more has failed.  I would suggest a convention in which 
the domain is a logical cluster name (e.g., a dns name with an A/AAAA 
record for each monitor).

> >> let's use the mit library. :)
> 
> Agreed, although I think it would be best to use the GSSAPI C-language 
> bindings instead of the MIT krb5 library APIs directly.
> 
> >> - define new auth type (krb5)
> 
> Should the new auth type be named “gssapi” instead?  Note that if the 
> code uses GSSAPI bindings, then this auth type could potentially be used 
> for mechanisms other than just krb5 by adding plugin libraries.

Sure

> >> - if negotiated, client would use kerberos lib to get the ticket
> 
> Yes, the user would use a command line tool such as kinit to get the 
> initial ticket from the KDC and store it in the credentials cache.  
> During the authentication exchange the GSSAPI/krb5 libraries would get 
> the service ticket and place it in the same cache.  Subsequent calls 
> would not need to connect to the KDC again until the tickets expire.
> 
> >> - client passes ticket to mon
> 
> This is accomplished by gss_init_sec_context() on the client side and 
> gss_accept_sec_context() on the server side.  These functions generate 
> GSS tokens containing the krb5 tickets which are then encoded by the 
> Ceph client and server into messages sent to their peer.

Sounds good!

> >> - mon uses kerberosv primitives to authenticate, extract principal 
> >> name, etc.
> 
> Yes, but with the GSSAPI library the Ceph code would not need to use 
> Kerberos primitives much if at all.

+1

> >> - establish which capabilities to use:
> >>   - mon maps principal name onto a client id, generates a cephx ticket
> >>   - ldap maps principal to a group/role, which is defined in ceph auth db  <-- what users probably want to do
> >>   - mon passes cephx ticket (session key etc) back to client
> >>   - client uses cephx thereafter
> 
> We’ll look at how to best accomplish these and other issues next.  But I 
> think we have a good start on how to implement this feature and look 
> forward to contributing to Ceph project.  Please let me know if you have 
> any advice on how you would like to see this feature implemented.  As we 
> gain more experience with Ceph I’m sure we’ll understand the issues 
> better.  Thanks!

Great!  Thank for you taking this one!  The auth code is a bit crufty, 
especially with the mon integration, so please reach out here on 
ceph-devel or in #ceph-devel with any questions.

sage



> 
> Jonathan Brown
> brownj@xxxxxxxxxx
> 
> Dheeraj Shetty
> dheerajs@xxxxxxxxxx
> 
> 
> 
> What follows are some example of commands run from my dev environment.  I have configured a krb5.conf file to point to an MIT kdc, and service principal keys have been extracted to krb5.keytab.  My ceph.conf included these global config entries:
> 
>         auth cluster required = cephx
>         auth service required = gssapi
>         auth client required = gssapi
> 
> 
> EXAMPLE: running “ceph health” without a Kerberos TGT:
> 
> brownj@ceph-dev:~/ceph/build$ kdestroy
> brownj@ceph-dev:~/ceph/build$ bin/ceph health
> *** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
> 2017-02-10 15:46:55.038277 7ff8654d4700 -1 WARNING: all dangerous and experimental features are enabled.
> 2017-02-10 15:46:55.046886 7ff8654d4700 -1 WARNING: all dangerous and experimental features are enabled.
> 2017-02-10 15:46:55.093679 7ff85ca9f700  0 gssapi client: Unspecified GSS failure.  Minor code may provide more information
> 2017-02-10 15:46:55.093836 7ff8654d4700  0 librados: client.admin authentication error (1) Operation not permitted
> Error connecting to cluster: PermissionError
> brownj@ceph-dev:~/ceph/build$
> 
> 
> EXAMPLE: running “ceph health" with an expired TGT:
> 
> brownj@ceph-dev:~/ceph/build$ kinit -l 2
> Password for client.admin@CEPHTEST.LOCAL:
> brownj@ceph-dev:~/ceph/build$ klist
> Ticket cache: FILE:/tmp/krb5cc_1000
> Default principal: client.admin@CEPHTEST.LOCAL
> 
> Valid starting     Expires            Service principal
> 02/10/17 15:47:46  02/10/17 15:47:44  krbtgt/CEPHTEST.LOCAL@CEPHTEST.LOCAL
> brownj@ceph-dev:~/ceph/build$ bin/ceph health
> *** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
> 2017-02-10 15:47:57.273595 7facdd15e700 -1 WARNING: all dangerous and experimental features are enabled.
> 2017-02-10 15:47:57.282475 7facdd15e700 -1 WARNING: all dangerous and experimental features are enabled.
> 2017-02-10 15:47:57.298276 7facd485d700  0 gssapi client: The referenced credential has expired
> 2017-02-10 15:47:57.298387 7facdd15e700  0 librados: client.admin authentication error (1) Operation not permitted
> Error connecting to cluster: PermissionError
> brownj@ceph-dev:~/ceph/build$
> 
> 
> EXAMPLE: running “ceph health” with a valid TGT:
> 
> brownj@ceph-dev:~/ceph/build$ kinit
> Password for client.admin@CEPHTEST.LOCAL:
> brownj@ceph-dev:~/ceph/build$ klist
> Ticket cache: FILE:/tmp/krb5cc_1000
> Default principal: client.admin@CEPHTEST.LOCAL
> 
> Valid starting     Expires            Service principal
> 02/10/17 15:49:13  02/11/17 01:49:13  krbtgt/CEPHTEST.LOCAL@CEPHTEST.LOCAL
>         renew until 02/11/17 15:49:09
> brownj@ceph-dev:~/ceph/build$ bin/ceph health
> *** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
> 2017-02-10 15:49:21.057358 7fcd09af8700 -1 WARNING: all dangerous and experimental features are enabled.
> 2017-02-10 15:49:21.064644 7fcd08ab6700 -1 WARNING: all dangerous and experimental features are enabled.
> HEALTH_OK
> brownj@ceph-dev:~/ceph/build$ klist
> Ticket cache: FILE:/tmp/krb5cc_1000
> Default principal: client.admin@CEPHTEST.LOCAL
> 
> Valid starting     Expires            Service principal
> 02/10/17 15:49:13  02/11/17 01:49:13  krbtgt/CEPHTEST.LOCAL@CEPHTEST.LOCAL
>         renew until 02/11/17 15:49:09
> 02/10/17 15:49:21  02/11/17 01:49:13  ceph-mon/ceph-dev@
>         renew until 02/11/17 15:49:09
> 02/10/17 15:49:21  02/11/17 01:49:13  ceph-mon/ceph-dev@CEPHTEST.LOCAL
>         renew until 02/11/17 15:49:09
> brownj@ceph-dev:~/ceph/build$
> 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 

[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux