diff --git a/src/plugins/auth/Makefile.am b/src/plugins/auth/Makefile.am index 6d4deceb3a39b8e8791e381af1a34452a57f13a8..cc00ff5e7875941002548d905cb177a9ede911eb 100644 --- a/src/plugins/auth/Makefile.am +++ b/src/plugins/auth/Makefile.am @@ -25,7 +25,7 @@ auth_none_la_LDFLAGS = $(PLUGIN_FLAGS) # Authd authentication plugin -- requires libauth auth_authd_la_SOURCES = auth_authd.c auth_authd_la_LDFLAGS = $(PLUGIN_FLAGS) -auth_authd_la_LIBADD = -lauth +auth_authd_la_LIBADD = -lauth -le # Munge authentication plugin auth_munge_la_SOURCES = auth_munge.c diff --git a/src/plugins/auth/auth_authd.c b/src/plugins/auth/auth_authd.c index 7294f1c63dab2c16fa0b1d7681e9596de9d8c3d4..453267787260a1301e5ce96c4c884d3e68a10b11 100644 --- a/src/plugins/auth/auth_authd.c +++ b/src/plugins/auth/auth_authd.c @@ -26,11 +26,6 @@ #if HAVE_CONFIG_H # include "config.h" -# if HAVE_SSL -# include <openssl/rsa.h> -# include <openssl/pem.h> -# include <openssl/err.h> -# endif /* HAVE_SSL*/ # if STDC_HEADERS # include <stdio.h> # include <string.h> @@ -42,22 +37,12 @@ # include <stdio.h> # include <unistd.h> # include <string.h> -# include <openssl/rsa.h> -# include <openssl/pem.h> -# include <openssl/err.h> # include <auth.h> #endif /* HAVE_CONFIG_H */ #include <pwd.h> #include <grp.h> #include <auth.h> -#include <openssl/rsa.h> -#include <openssl/pem.h> -#include <openssl/err.h> - -/* Need these regardless of how main SLURM transport is abstracted. */ -#include <sys/socket.h> -#include <sys/un.h> #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 108 /* Cribbed from linux/un.h */ @@ -102,142 +87,6 @@ enum { SLURM_AUTH_EXPIRED }; -/* - * These come from /usr/include/auth.h which should be installed - * as part of the authd installation. - */ -static char *cli_path = AUTH_SOCK_PATH; -static char *svr_path = AUTHD_SOCK_PATH; -static char *pub_key_file = AUTH_PUB_KEY; - -/* - * Write bytes reliably to a file descriptor. - */ -static int -write_bytes( int fd, char *buf, size_t size ) -{ - ssize_t bytes_remaining, bytes_written; - char *ptr; - - bytes_remaining = size; - ptr = buf; - while ( bytes_remaining > 0 ) { - bytes_written = write( fd, ptr, size ); - if ( bytes_written < 0 ) return -1; - bytes_remaining -= bytes_written; - ptr += bytes_written; - } - return 0; -} - -/* - * Read bytes reliably from a file descriptor. - */ -static int -read_bytes( int fd, char *buf, size_t size ) -{ - ssize_t bytes_remaining, bytes_read; - char *ptr; - - bytes_remaining = size; - ptr = buf; - while ( bytes_remaining > 0 ) { - bytes_read = read( fd, ptr, size ); - if ( bytes_read < 0 ) return -1; - bytes_remaining -= bytes_read; - ptr += bytes_read; - } - return 0; -} - -/* - * These two cribbed from auth.c in the authd distribution. They would - * normally be available in the authd library, but the library relies on - * Brent Chun's enormous and irrelevant convenience library, and we only - * need to make one call to that library here. So we inline the code - * from his library and sever the dependency. - */ -static int -slurm_auth_get_signature( credentials *cred, signature *sig ) -{ - int sock; - char cli_name[ UNIX_PATH_MAX ]; - struct sockaddr_un cli_addr; - struct sockaddr_un svr_addr; - socklen_t addr_len = sizeof( struct sockaddr_un ); - - if ( ( sock = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 ) { - return -1; - } - - cli_addr.sun_family = AF_UNIX; - memset( cli_addr.sun_path, 0, UNIX_PATH_MAX ); - sprintf( cli_name, cli_path, getpid() ); - strcpy( &cli_addr.sun_path[ 1 ], cli_name ); - if ( bind( sock, (struct sockaddr *) &cli_addr, addr_len ) < 0 ) { - error( "authd plugin: cannot bind socket to authd" ); - close( sock ); - return -1; - } - - svr_addr.sun_family = AF_UNIX; - memset( svr_addr.sun_path, 0, UNIX_PATH_MAX ); - strcpy( &svr_addr.sun_path[ 1 ], svr_path ); - if ( connect( sock, (struct sockaddr *) &svr_addr, addr_len ) < 0 ) { - error( "suthd plugin: cannot connect to authd" ); - close( sock ); - return -1; - } - - if ( write_bytes( sock, (char *) cred, sizeof( credentials ) ) < 0 ) { - error( "authd plugin: cannot write to authd" ); - close( sock ); - return -1; - } - if ( read_bytes( sock, (char *) sig, sizeof( signature ) ) < 0 ) { - error( "authd plugin: cannot read from authd" ); - close( sock ); - return -1; - } - close( sock ); - return 0; -} - -static int -slurm_auth_verify_signature( credentials *cred, signature *sig ) -{ - int rc_error = 0; - RSA *pub_key = NULL; - FILE *f = NULL; - - if ( ( f = fopen( pub_key_file, "r" ) ) == NULL ) { - rc_error = -1; - error( "authd plugin: cannot open public key file %s", pub_key_file ); - goto cleanup; - } - - if ( ( pub_key = PEM_read_RSA_PUBKEY( f, NULL, NULL, NULL ) ) == NULL ) { - error( "authd plugin: cannot read RSA public key" ); - rc_error = -1; - goto cleanup; - } - - ERR_load_crypto_strings(); - if ( RSA_verify( 0, - (unsigned char *) cred, sizeof( credentials ), - sig->data, AUTH_RSA_SIGLEN, - pub_key ) == 0 ) { - rc_error = -1; - error( "authd plugin: cannot verify signature" ); - goto cleanup; - } - - cleanup: - if ( pub_key != NULL ) RSA_free( pub_key ); - if ( f != NULL ) fclose( f ); - return rc_error; -} - int init( void ) { @@ -263,6 +112,7 @@ slurm_auth_credential_t * slurm_auth_create( void *argv[] ) { int ttl; + int rc; slurm_auth_credential_t *cred; if ( argv == NULL ) { @@ -296,7 +146,8 @@ slurm_auth_create( void *argv[] ) cred->cred.valid_to = cred->cred.valid_from + ttl; /* Sign the credential. */ - if ( slurm_auth_get_signature( &cred->cred, &cred->sig ) < 0 ) { + auth_init_credentials (&cred->cred, ttl); + if ((rc = auth_get_signature( &cred->cred, &cred->sig )) < 0 ) { plugin_errno = SLURM_AUTH_INVALID; xfree( cred ); return NULL; @@ -326,9 +177,8 @@ slurm_auth_verify( slurm_auth_credential_t *cred, void *argv[] ) plugin_errno = SLURM_AUTH_BADARG; return SLURM_ERROR; } - - rc = slurm_auth_verify_signature( &cred->cred, &cred->sig ); - if ( rc < 0 ) { + + if ((rc = auth_verify_signature( &cred->cred, &cred->sig )) < 0) { cred->cr_errno = SLURM_AUTH_INVALID; return SLURM_ERROR; }