diff --git a/SSH/PAM/Makefile b/SSH/PAM/Makefile index 9870c3e..3c0cc46 100644 --- a/SSH/PAM/Makefile +++ b/SSH/PAM/Makefile @@ -1,6 +1,11 @@ -make: +compile: gcc -fPIC -fno-stack-protector -std=c99 -c rublonPam.c src/pamApp.c src/coreHandler.c src/signatureWrapper.c lib/cfg_parse.c lib/cJSON.c lib/qrcodegen.c + +debug: + gcc -fPIC -g -std=c99 -c rublonPam.c src/pamApp.c src/coreHandler.c src/signatureWrapper.c lib/cfg_parse.c lib/cJSON.c lib/qrcodegen.c ld -x --shared -o pam_rublon.so -lcurl rublonPam.o pamApp.o coreHandler.o signatureWrapper.o cfg_parse.o cJSON.o qrcodegen.o +make: compile + ld -x --shared -o pam_rublon.so -lcurl rublonPam.o pamApp.o coreHandler.o signatureWrapper.o cfg_parse.o cJSON.o qrcodegen.o selinux: checkmodule -M -m -o login_rublon.mod login_rublon.te semodule_package -o login_rublon.pp -m login_rublon.mod @@ -17,3 +22,6 @@ install: install -m 644 pam_rublon.so $(DESTDIR)/usr/lib64/security/ clean: rm rublonPam.o pamApp.o coreHandler.o signatureWrapper.o cfg_parse.o cJSON.o qrcodegen.o + +debug-rebuild: clean debug install + \ No newline at end of file diff --git a/SSH/PAM/rublonPam.c b/SSH/PAM/rublonPam.c index 505e664..8bf7517 100644 --- a/SSH/PAM/rublonPam.c +++ b/SSH/PAM/rublonPam.c @@ -7,24 +7,6 @@ #include #include -void displayHeader(pam_handle_t *pamh) { - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++. `;+++++++++++++++: ++++++++` `+++++++++++++++++++++++++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` ++++++++++++++: ++++++++` `+++++++++++++++++++++++++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` +++++++++++++: ++++++++` `+++++++++++++++++++++++++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` ''` ++';;'++;;;++: +:,+++++` `++++++.`.+++++;;;'+..++++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` +++ ++ `++ ++: +++` `++++ `+++ ` .++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` ++: ++ `++ ++: ++` `+++ `++ ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` `++ `++ ++: `' ++` `+++ `' ++ +: ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` +++ `++ ++: +++ ;+` `++, +++ '+ .++ ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` ` .+++ `++ ++: +++ ;+` `++, +++ '+ .++ ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` +. +++` ,` ++: `; ++` +++ `; ++ .++ ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` ++ +++ ++: ++, ++ .++ .++ ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++` +++ `++, +++: ++++ +++ .+++ .++ ++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "++++++++++++++++++++;.,++++++++++;:+++++++;.,+++++.`,++++++++++++++++++++"); - pam_prompt(pamh, PAM_TEXT_INFO, NULL, "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); -} - PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv ) { return PAM_SUCCESS; } @@ -34,7 +16,6 @@ PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const c } PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ) { - displayHeader(pamh); int access = startRublon(pamh); diff --git a/SSH/PAM/src/coreHandler.c b/SSH/PAM/src/coreHandler.c index 1aceac8..4365def 100644 --- a/SSH/PAM/src/coreHandler.c +++ b/SSH/PAM/src/coreHandler.c @@ -257,7 +257,7 @@ bool isOneOfSelectedMethods(char *selectedMethod, char *methods[], int methodsSi return false; } -int postInit(pam_handle_t *pamh, cJSON **availableMethods, char **transactionId, char *systemToken, char *secretKey, const char *appUserId, char *userEmail, char *rublonApiServer) { +int postInit(pam_handle_t *pamh, cJSON **availableMethods, struct ApplicationInfoStruct* info, char **transactionId, char *systemToken, char *secretKey, const char *appUserId, char *userEmail, char *rublonApiServer) { char *status = NULL; char *transactionStatus = NULL; char *exception = NULL; @@ -286,6 +286,9 @@ int postInit(pam_handle_t *pamh, cJSON **availableMethods, char **transactionId, tosAccepted = parseNestedJsonInt(curlResponse,"result","tosAccepted"); *availableMethods = methods; + info->companyName = cJSON_GetObjectItem(resp, "companyName")->valuestring; + info->applicationName = cJSON_GetObjectItem(resp, "applicationName")->valuestring; + if(gdprAccepted != 1 || tosAccepted != 1) { pam_prompt(pamh, PAM_TEXT_INFO, NULL, "\nYou have to read and accept our:\n- Terms of Use: https://core.rublon.net/terms_of_use\n- Privacy Policy: https://core.rublon.net/privacy_policy\n"); do{ diff --git a/SSH/PAM/src/misc.h b/SSH/PAM/src/misc.h index 79681e8..e52a555 100644 --- a/SSH/PAM/src/misc.h +++ b/SSH/PAM/src/misc.h @@ -20,10 +20,15 @@ #define TOTP_SMS_INPUT_CODE_SIZE 6 #define SIGNATURE_SIZE 64 +struct ApplicationInfoStruct{ + char* companyName; + char* applicationName; +}; + bool isOneOfSelectedMethods(char *selectedMethod, char *methods[], int methodsSize); int startRublon(pam_handle_t *pamh); void curlHandlerThread(pam_handle_t *pamh, char *jsonObj, char *url, char *secretKey, char **accessToken, char **status, char **exception); -int postInit(pam_handle_t *pamh, cJSON **availableMethods, char **transactionId, char *systemToken, char *secretKey, const char *appUserId, char *userEmail, char *rublonApiServer); +int postInit(pam_handle_t *pamh, cJSON **availableMethods, struct ApplicationInfoStruct* info, char **transactionId, char *systemToken, char *secretKey, const char *appUserId, char *userEmail, char *rublonApiServer); int postMethod(pam_handle_t *pamh, char *secretKey, char *tId, char *selectedMethod, char *rublonApiServer, char *systemToken, bool onlyOneMethod); int postVerifySSH(pam_handle_t *pamh, char *secretKey, char *transactionId, char *selectedMethod, char *rublonApiServer, char *systemToken, char **accessToken); int postConfirmCode(pam_handle_t *pamh, char *secretKey, char *systemToken, char *transactionId, char *selectedMethod, char *rublonApiServer, bool onlyOneMethod); diff --git a/SSH/PAM/src/pamApp.c b/SSH/PAM/src/pamApp.c index 4cb9a4b..ae5c636 100644 --- a/SSH/PAM/src/pamApp.c +++ b/SSH/PAM/src/pamApp.c @@ -81,6 +81,7 @@ int startRublon(pam_handle_t *pamh) { char *accessToken = NULL; cJSON *methods; bool codeRequired = false; + struct ApplicationInfoStruct appInfo; struct args *threadArgs = (struct args *)malloc(sizeof(struct args)); pam_get_user(pamh, &pamUser, NULL); @@ -94,8 +95,10 @@ int startRublon(pam_handle_t *pamh) { asprintf(&userEmail, "%s%s%s", pamUser,"@",userDomain); transactionId = NULL; - int initStatus = postInit(pamh, &methods, &transactionId , systemToken, secretKey, appUserId, userEmail, rublonApiServer); - + int initStatus = postInit(pamh, &methods, &appInfo, &transactionId , systemToken, secretKey, appUserId, userEmail, rublonApiServer); + + pam_prompt(pamh, PAM_TEXT_INFO, NULL, "\nRublon MFA for %s", appInfo.applicationName); + threadArgs->pamh = pamh; threadArgs->transactionId = transactionId; threadArgs->rublonApiServer = rublonApiServer;