diff options
Diffstat (limited to 'content/posts')
| -rw-r--r-- | content/posts/how-bsd-authentication-works/index.org | 80 | 
1 files changed, 48 insertions, 32 deletions
| diff --git a/content/posts/how-bsd-authentication-works/index.org b/content/posts/how-bsd-authentication-works/index.org index 35a3fb4..6eae6a5 100644 --- a/content/posts/how-bsd-authentication-works/index.org +++ b/content/posts/how-bsd-authentication-works/index.org @@ -2,13 +2,14 @@  #+DATE: 2020-06-26T18:31:36-04:00  #+DRAFT: true  #+DESCRIPTION: -#+TAGS[]: -#+KEYWORDS[]: +#+TAGS[]: openbsd +#+KEYWORDS[]: openbsd  #+SLUG:  #+SUMMARY: +#+SHOWTOC: true  [[https://web.archive.org/web/20170327150148/http://www.penzin.net/bsdauth/]] - +* History  OpenBSD is quite different from many other Unix-like operating systems  in many ways, but one way which I find interesting is the  authentication system. Most systems from AIX, Solaris, and Linux to @@ -30,32 +31,41 @@ specifically). The program or script has no ability to interfere with  the parent and can very easily revoke permissions using =pledge(3)= or  =unveil(3)=. +* Why +This one is pretty difficult, since there seems to be very little +information about how BSD Auth works apart from the source code +itself. This is my best attempt to understand the flow of BSD Auth +from what I've read. + + +* BSD Auth Modules  These programs or scripts are located in =/usr/libexec/auth/= with the -naming convention =login_<style>=. They typically take arguments in -the form of +naming convention =login_<style>=. They take arguments in the form of  #+BEGIN_SRC shell  login_<style> [-s service] [-v key=value] user [class]  #+END_SRC -<<here2>> - -- =<style>= is the authentication method. This could be =passwd=, = +- =<style>= is the authentication method. This could be =passwd=, +  =radius=, =skey=, =yubikey=, etc. +  - There's more information about available styles in =login.conf(5)=  - =service= is the service type. Typically authentication methods will    accept three values here, =login=, =challenge=, or =response=. Some -  styles take different service arguments, so read the method's man -  page for details. -  - =login= is the default method, it's typically - -This one is pretty difficult, since there seems to be very little -information about how BSD Auth works apart from the source code -itself. This is my best attempt to understand the flow of BSD Auth -from what I've read. - +  styles take different service arguments, read the style's man page +  for details. +  - =login= is typically the default method +- =-v key=value= is an optional argument. This is used to pass extra +  data to the program under certain circumstances. +- =user= is the name of the user to be authenticated. +- =class= is optional and specifies the class of the user to be +  authenticated. + +* Documentation  All of the high level authentication functions are described in  =authenticate(3)=, with the lower level functions being described in  =auth_subr(3)=. +* auth_userokay  The highest level function, and easiest to use is =auth_userokay=. It  takes four character arrays as arguments, =name=, =style=, =type=, and  =password=. It returns either a =0= for failure, of a non-zero value @@ -67,21 +77,6 @@ This function lives inside =/lib/libc/gen/authenticate.c=  int auth_userokay(char *name, char *style, char *type, char *password);  #+END_SRC -The return codes are defined inside of =login_cap.h= as - -#+BEGIN_SRC c -/* - * bits which can be returned by authenticate()/auth_scan() - */ -#define  AUTH_OKAY       0x01            /* user authenticated */ -#define  AUTH_ROOTOKAY   0x02            /* authenticated as root */ -#define  AUTH_SECURE     0x04            /* secure login */ -#define  AUTH_SILENT     0x08            /* silent rejection */ -#define  AUTH_CHALLENGE  0x10            /* a challenge was given */ -#define  AUTH_EXPIRED    0x20            /* account expired */ -#define  AUTH_PWEXPIRED  0x40            /* password expired */ -#+END_SRC -  - =name= is the name of the user to be authenticated  - =style= is the login method to be used    - If =style= is =NULL=, the user's default login style will be @@ -108,6 +103,8 @@ returns a finished auth session of type =auth_session_t=. It closes  the auth session using =auth_close= and returns the value returned  from closing. +* auth_session_t +  #+BEGIN_SRC c  struct auth_session_t {      char    *name;                 /* name of use being authenticated */ @@ -155,6 +152,7 @@ struct authdata {  };  #+END_SRC +* auth_usercheck  #+BEGIN_SRC c  auth_session_t *auth_usercheck(char *name, char *style, char *type, char *password)  #+END_SRC @@ -182,6 +180,8 @@ the user name, style, login class, and =NULL= char pointer to  arguments. It then returns the auth session pointer the call  returns. +* auth_verify +  #+BEGIN_SRC c  auth_session_t *auth_verify(auth_session_t *as, char *style, char *name, ...)  #+END_SRC @@ -208,6 +208,7 @@ auth_call(as, path, auth_getitem(as, AUTHV_STYLE), "-s",      auth_getitem(as, AUTHV_SERVICE), "--", name, (char *)NULL);  #+END_SRC +* auth_call  #+BEGIN_SRC c  int auth_call(auth_session_t *as, char *path, ...) @@ -290,9 +291,24 @@ it continues to scan for any other qualifiers such as =pwexpired= or  =silent=. The struct's =state= is set to one using the =AUTH_= values  from =login_cap.h= accordingly. +#+BEGIN_SRC c +/* + * bits which can be returned by authenticate()/auth_scan() + */ +#define  AUTH_OKAY       0x01            /* user authenticated */ +#define  AUTH_ROOTOKAY   0x02            /* authenticated as root */ +#define  AUTH_SECURE     0x04            /* secure login */ +#define  AUTH_SILENT     0x08            /* silent rejection */ +#define  AUTH_CHALLENGE  0x10            /* a challenge was given */ +#define  AUTH_EXPIRED    0x20            /* account expired */ +#define  AUTH_PWEXPIRED  0x40            /* password expired */ +#+END_SRC + +  This is the integer returned by  =auth_userokay=. +* grapgh?  # Setting env on auth_close(as)  # partual rewrite below | 
