Jakub Jelen 1ce235
/*
Jakub Jelen 1ce235
This simple pam module saves the content of SSH_USER_AUTH variable to /tmp/SSH_USER_AUTH
Jakub Jelen 1ce235
file.
Jakub Jelen 1ce235
Jakub Jelen 1ce235
Setup:
Jakub Jelen 1ce235
  - gcc -fPIC -DPIC -shared -rdynamic -o pam_save_ssh_var.o pam_save_ssh_var.c
Jakub Jelen 1ce235
  - copy pam_save_ssh_var.o to /lib/security resp. /lib64/security
Jakub Jelen 1ce235
  - add to /etc/pam.d/sshd
Jakub Jelen 1ce235
	auth	requisite	pam_save_ssh_var.o
Jakub Jelen 1ce235
*/
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* Define which PAM interfaces we provide */
Jakub Jelen 1ce235
#define PAM_SM_ACCOUNT
Jakub Jelen 1ce235
#define PAM_SM_AUTH
Jakub Jelen 1ce235
#define PAM_SM_PASSWORD
Jakub Jelen 1ce235
#define PAM_SM_SESSION
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* Include PAM headers */
Jakub Jelen 1ce235
#include <security/pam_appl.h>
Jakub Jelen 1ce235
#include <security/pam_modules.h>
Jakub Jelen 1ce235
#include <stdlib.h>
Jakub Jelen 1ce235
#include <stdio.h>
Jakub Jelen 1ce235
Jakub Jelen 1ce235
int save_ssh_var(pam_handle_t *pamh, const char *phase) {
Jakub Jelen 1ce235
	FILE *fp;
Jakub Jelen 1ce235
	const char *var;
Jakub Jelen 1ce235
Jakub Jelen 1ce235
	fp = fopen("/tmp/SSH_USER_AUTH","a");
Jakub Jelen 1ce235
	fprintf(fp, "BEGIN (%s)\n", phase);
Jakub Jelen 1ce235
	var = pam_getenv(pamh, "SSH_USER_AUTH");
Jakub Jelen 1ce235
	if (var != NULL) {
Jakub Jelen 1ce235
		fprintf(fp, "SSH_USER_AUTH: '%s'\n", var);
Jakub Jelen 1ce235
	}
Jakub Jelen 1ce235
	fprintf(fp, "END (%s)\n", phase);
Jakub Jelen 1ce235
	fclose(fp);
Jakub Jelen 1ce235
Jakub Jelen 1ce235
	return 0;
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* PAM entry point for session creation */
Jakub Jelen 1ce235
int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
Jakub Jelen 1ce235
	return(PAM_IGNORE);
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* PAM entry point for session cleanup */
Jakub Jelen 1ce235
int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
Jakub Jelen 1ce235
	return(PAM_IGNORE);
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* PAM entry point for accounting */
Jakub Jelen 1ce235
int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
Jakub Jelen 1ce235
	return(PAM_IGNORE);
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* PAM entry point for authentication verification */
Jakub Jelen 1ce235
int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
Jakub Jelen 1ce235
	save_ssh_var(pamh, "auth");
Jakub Jelen 1ce235
	return(PAM_IGNORE);
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/*
Jakub Jelen 1ce235
   PAM entry point for setting user credentials (that is, to actually
Jakub Jelen 1ce235
   establish the authenticated user's credentials to the service provider)
Jakub Jelen 1ce235
 */
Jakub Jelen 1ce235
int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv) {
Jakub Jelen 1ce235
	return(PAM_IGNORE);
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235
Jakub Jelen 1ce235
/* PAM entry point for authentication token (password) changes */
Jakub Jelen 1ce235
int pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv) {
Jakub Jelen 1ce235
	return(PAM_IGNORE);
Jakub Jelen 1ce235
}
Jakub Jelen 1ce235