我在ubuntu下用c编程写了一个linux pam认证模块。我的想法是当登录时输入用户名和密码与web服务器保存的用户名和密码进行比较,如果它们相同,那么你可以进入系统,或者你可以不进入系统。
因为网络服务器就像https://xxxxxxxxx.com,所以我用openssl编写c代码,我的c代码(sensepam.c)是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* read, write, close */
#include <string.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include <security/pam_ext.h>
#include <sys/socket.h> /* socket, connect */
#include <netinet/in.h> /* struct sockaddr_in, struct sockaddr */
#include <netdb.h> /* struct hostent, gethostbyname */
#include <arpa/inet.h>
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
void error(const char *msg) { perror(msg); exit(0); }
int sendreq(pam_handle_t *pamh, int argc, const char *uname, const char *pwd)
{
int i;
pam_syslog(pamh, 5, "********into sendreq******");
/* first where are we going to send it? */
int portno = 1234;
char *host = "xxxxxxx.com";
char *method = "GET";
char *path = "/authModule/authenticate";
char *header = "Host:xxxxxxx.com:1234";
char body[1024];
char* test_ok = "aaaaaaa";
SSL *ssl = NULL;
int OK_status = 0;
X509 *server_cert;
char* str = NULL;
int err;
char querystring[1024];
//int argc = 6;
int ret = 0;
struct hostent *server;
struct sockaddr_in serv_addr;
struct in_addr ip;
SSL_CTX *ctx = NULL;
int sockfd, bytes, sent, received, total, message_size;
const SSL_METHOD *client_method;
char *message, response[4096];
if (argc < 5) { puts("Parameters: <host> <port> <method> <path> [<data> [<headers>]]"); exit(0); }
memset(querystring,0,1024);
strcat(querystring,"username=");
strcat(querystring,uname);
strcat(querystring,"&password=");
strcat(querystring,pwd);
strcat(querystring,"&reamId=1024");
printf("querystring is %s-%d", querystring, strlen(querystring));
SSL_library_init();
ERR_load_crypto_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
client_method = SSLv23_client_method( );
ctx = SSL_CTX_new(client_method);
if (!ctx) {
fprintf (stderr, "SSL_CTX_new failed:\n");
ERR_print_errors_fp (stderr);
return 0;
}
server = gethostbyname(host);
if (server == NULL) error("ERROR, no such host");
bcopy(server->h_addr, &(ip.s_addr), server->h_length);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '\0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
memcpy(&(serv_addr.sin_addr.s_addr),
server->h_addr, server->h_length);
err = connect(sockfd, (struct sockaddr*) &serv_addr,
sizeof(serv_addr));
if (err < 0) { perror("can't connect to server port"); exit(1); }
ssl = SSL_new(ctx);
if (!ssl) {
fprintf (stderr, "SSL_new failed:\n");
ERR_print_errors_fp (stderr);
return 0;
}
SSL_set_fd(ssl, sockfd);
err = SSL_connect(ssl);
server_cert = SSL_get_peer_certificate(ssl);
printf("(6) server's certificate was received:\n\n");
str = X509_NAME_oneline(X509_get_subject_name(server_cert), 0, 0);
printf(" subject: %s\n", str);
str = X509_NAME_oneline(X509_get_issuer_name(server_cert), 0, 0);
printf(" issuer: %s\n\n", str);
X509_free(server_cert);
/* How big is the message? */
message_size=0;
if(!strcmp(method,"GET"))
{
message_size+=strlen("%s %s%s%s HTTP/1.0\r\n"); /* method */
message_size+=strlen(path); /* path */
message_size+=strlen(header); /* headers */
if(argc>5)
message_size+=strlen(querystring); /* query string */
for(i=6;i<argc;i++) /* headers */
message_size+=strlen(header)+strlen("\r\n");
message_size+=strlen("\r\n"); /* blank line */
}
else
{
message_size+=strlen("%s %s HTTP/1.0\r\n");
message_size+=strlen(method); /* method */
message_size+=strlen(path); /* path */
for(i=6;i<argc;i++) /* headers */
message_size+=strlen(header)+strlen("\r\n");
if(argc>5)
message_size+=strlen("Content-Length: %d\r\n")+10; /* content length */
message_size+=strlen("\r\n"); /* blank line */
if(argc>5)
message_size+=strlen(body); /* body */
}
/* allocate space for the message */
message=malloc(message_size);
/* fill in the parameters */
if(!strcmp(method,"GET"))
{
if(argc>5)
sprintf(message,"%s %s%s%s HTTP/1.0\r\n",
strlen(method)>0?method:"GET", /* method */
strlen(path)>0?path:"/", /* path */
strlen(querystring)>0?"?":"", /* ? */
strlen(querystring)>0?querystring:""); /* query string */
else
sprintf(message,"%s %s HTTP/1.0\r\n",
strlen(method)>0?method:"GET", /* method */
strlen(path)>0?path:"/"); /* path */
//for(i=6;i<argc;i++) /* headers */
{strcat(message,header);strcat(message,"\r\n");}
strcat(message,"\r\n"); /* blank line */
pam_syslog(pamh, 5, message);
}
else
{
sprintf(message,"%s %s HTTP/1.0\r\n",
strlen(method)>0?method:"POST", /* method */
strlen(path)>0?path:"/"); /* path */
//for(i=6;i<argc;i++) /* headers */
// {strcat(message,argv[i]);strcat(message,"\r\n");}
//if(argc>5)
// sprintf(message+strlen(message),"Content-Length: %d\r\n",strlen(argv[5]));
strcat(message,"\r\n"); /* blank line */
//if(argc>5)
// strcat(message,argv[5]); /* body */
}
/* What are we going to send? */
printf("Request:\n%s\n",message);
/* create the socket */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("ERROR opening socket");
/* lookup the ip address */
server = gethostbyname(host);
if (server == NULL) error("ERROR, no such host");
/* fill in the structure */
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
/* connect the socket */
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
/* send the request */
total = strlen(message);
sent = 0;
do {
bytes = SSL_write(ssl,message+sent,total-sent);
if (bytes < 0)
error("ERROR writing message to socket");
if (bytes == 0)
break;
sent+=bytes;
} while (sent < total);
shutdown (sockfd, 1); /* send EOF to server */
pam_syslog(pamh, 5, response);
memset(response,0,sizeof(response));
total = sizeof(response)-1;
received = 0;
do {
bytes = SSL_read(ssl,response+received,total-received);
if (bytes < 0)
error("ERROR reading response from socket");
if (bytes == 0)
break;
received+=bytes;
} while (bytes > 0);
printf("Response:\n%s\n",response);
SSL_shutdown(ssl);
close(sockfd);
SSL_free(ssl);
SSL_CTX_free(ctx);
}
PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv ) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
printf("Acct mgmt\n");
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ) {
int retval;
const char* pUsername;
const char* pPassword;
char cmd[255];
memset(cmd, 0, 255);
retval = pam_get_user(pamh, &pUsername, "Username: ");
printf("Welcome %s\n", pUsername);
if (retval != PAM_SUCCESS) {
return retval;
}
retval = pam_get_authtok(pamh, PAM_AUTHTOK, &pPassword , NULL);
pam_syslog(pamh, 5, "mypam.so login");
pam_syslog(pamh, 5, pUsername);
pam_syslog(pamh, 5, pPassword);
if (!sendreq(pamh, 6, pUsername, pPassword)) {
return PAM_AUTH_ERR;
}
pam_syslog(pamh, 5, "add user...");
sprintf(cmd,"useradd -m %s",pUsername);
system(cmd);
return PAM_SUCCESS;
}
int main(int argc, char *argv[])
{
char *uname="aaaaa";
char *pwd="123";
sendreq(NULL, 6, uname, pwd);
}
我的 gdm 密码如下:
aaa@ubuntu:/etc/pam.d$ cat gdm-password
auth sufficient sensepam.so
account sufficient sensepam.so
#%PAM-1.0
auth requisite pam_nologin.so
auth required pam_succeed_if.so user != root quiet_success
@include common-auth
auth optional pam_gnome_keyring.so
@include common-account
# SELinux needs to be the first session rule. This ensures that any
# lingering context has been cleared. Without this it is possible
# that a module could execute code in the wrong domain.
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
# SELinux needs to intervene at login time to ensure that the process
# starts in the proper default security context. Only sessions which are
# intended to run in the user's context should be run after this.
# pam_selinux.so changes the SELinux context of the used TTY and configures
# SELinux in order to transition to the user context with the next execve()
# call.
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
session optional pam_keyinit.so force revoke
session required pam_limits.so
session required pam_env.so readenv=1
session required pam_env.so readenv=1 user_readenv=1 envfile=/etc/default/locale
@include common-session
session optional pam_gnome_keyring.so auto_start
@include common-password
我的系统信息如下:
aaa@ubuntu:~$ uname -a
Linux ubuntu 5.8.0-59-generic #66~20.04.1-Ubuntu SMP Thu Jun 17 11:14:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
我已经安装了 openssl :
aaa@ubuntu:~$ openssl version -a
OpenSSL 1.1.1k 25 Mar 2021
built on: Fri Jul 2 10:45:57 2021 UTC
platform: linux-x86_64
options: bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/lib/engines-1.1"
Seeding source: os-specific
我使用下面的命令来编译:
#!/bin/bash
gcc -fPIC -fno-stack-protector -c src/sensepam.c -lssl -lcrypto
sudo ld -x --shared -o /usr/lib/x86_64-linux-gnu/security/sensepam.so sensepam.o
rm sensepam.o
但是当我尝试登录系统时,它无法工作,所以我在/var/log/auth.log查看日志
Jul 5 15:50:54 ubuntu systemd-logind[644]: System is rebooting.
Jul 5 15:51:03 ubuntu systemd-logind[646]: New seat seat0.
Jul 5 15:51:03 ubuntu systemd-logind[646]: Watching system buttons on /dev/input/event0 (Power Button)
Jul 5 15:51:03 ubuntu systemd-logind[646]: Watching system buttons on /dev/input/event1 (Sleep Button)
Jul 5 15:51:03 ubuntu systemd-logind[646]: Watching system buttons on /dev/input/event2 (AT Translated Set 2 keyboard)
Jul 5 15:51:03 ubuntu gdm-launch-environment]: pam_unix(gdm-launch-environment:session): session opened for user gdm by (uid=0)
Jul 5 15:51:03 ubuntu systemd-logind[646]: New session c1 of user gdm.
Jul 5 15:51:04 ubuntu systemd: pam_unix(systemd-user:session): session opened for user gdm by (uid=0)
Jul 5 15:51:04 ubuntu su: (to aaa) root on none
Jul 5 15:51:04 ubuntu su: pam_unix(su:session): session opened for user aaa by (uid=0)
Jul 5 15:51:04 ubuntu systemd: pam_unix(systemd-user:session): session opened for user aaa by (uid=0)
Jul 5 15:51:04 ubuntu su: pam_unix(su:session): session closed for user aaa
Jul 5 15:51:06 ubuntu polkitd(authority=local): Registered Authentication Agent for unix-session:c1 (system bus name :1.71 [/usr/bin/gnome-shell], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jul 5 15:51:12 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 15:51:12 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 15:51:12 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:51:14 ubuntu systemd: pam_unix(systemd-user:session): session closed for user aaa
Jul 5 15:51:15 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:51:15 ubuntu gdm-password]: pam_unix(gdm-password:auth): authentication failure; logname= uid=0 euid=0 tty=/dev/tty1 ruser= rhost= user=uos001
Jul 5 15:51:19 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 15:51:19 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 15:51:19 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:51:22 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:51:22 ubuntu gdm-password]: gkr-pam: unable to locate daemon control file
Jul 5 15:51:22 ubuntu gdm-password]: gkr-pam: stashed password to try later in open session
Jul 5 15:51:22 ubuntu gdm-password]: pam_unix(gdm-password:session): session opened for user aaa by (uid=0)
Jul 5 15:51:22 ubuntu systemd-logind[646]: New session 3 of user aaa.
Jul 5 15:51:22 ubuntu systemd: pam_unix(systemd-user:session): session opened for user aaa by (uid=0)
Jul 5 15:51:22 ubuntu gdm-password]: gkr-pam: gnome-keyring-daemon started properly and unlocked keyring
Jul 5 15:51:23 ubuntu gnome-keyring-daemon[1830]: The Secret Service was already initialized
Jul 5 15:51:23 ubuntu gnome-keyring-daemon[1830]: The PKCS#11 component was already initialized
Jul 5 15:51:24 ubuntu polkitd(authority=local): Registered Authentication Agent for unix-session:3 (system bus name :1.142 [/usr/bin/gnome-shell], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jul 5 15:51:27 ubuntu gdm-launch-environment]: pam_unix(gdm-launch-environment:session): session closed for user gdm
Jul 5 15:51:27 ubuntu systemd-logind[646]: Session c1 logged out. Waiting for processes to exit.
Jul 5 15:51:27 ubuntu systemd-logind[646]: Removed session c1.
Jul 5 15:51:27 ubuntu polkitd(authority=local): Unregistered Authentication Agent for unix-session:c1 (system bus name :1.71, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Jul 5 15:51:29 ubuntu dbus-daemon[608]: [system] Failed to activate service 'org.bluez': timed out (service_start_timeout=25000ms)
Jul 5 15:51:38 ubuntu systemd: pam_unix(systemd-user:session): session closed for user gdm
Jul 5 15:51:39 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:51:41 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:51:41 ubuntu sudo: aaa : TTY=pts/0 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/su
Jul 5 15:51:41 ubuntu sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 5 15:51:41 ubuntu su: (to root) aaa on pts/0
Jul 5 15:51:41 ubuntu su: pam_unix(su:session): session opened for user root by (uid=0)
Jul 5 15:57:28 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:57:32 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:57:32 ubuntu sudo: pam_unix(sudo:auth): authentication failure; logname= uid=1000 euid=0 tty=/dev/pts/1 ruser=aaa rhost= user=aaa
Jul 5 15:57:35 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:57:37 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 15:57:37 ubuntu sudo: aaa : TTY=pts/1 ; PWD=/home/aaa ; USER=root ; COMMAND=/usr/bin/ld -x --shared -o /usr/lib/x86_64-linux-gnu/security/sensepam.so /usr/local/lib/libcrypto.so sensepam.o
Jul 5 15:57:37 ubuntu sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 5 15:57:37 ubuntu sudo: pam_unix(sudo:session): session closed for user root
Jul 5 15:57:40 ubuntu sudo: aaa : TTY=pts/1 ; PWD=/home/aaa ; USER=root ; COMMAND=/usr/bin/ld -x --shared -o /usr/lib/x86_64-linux-gnu/security/sensepam.so /usr/local/lib/libcrypto.so sensepam.o
Jul 5 15:57:40 ubuntu sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 5 15:57:40 ubuntu sudo: pam_unix(sudo:session): session closed for user root
Jul 5 16:07:15 ubuntu sudo: aaa : TTY=pts/1 ; PWD=/usr/lib/x86_64-linux-gnu/security ; USER=root ; COMMAND=/usr/bin/su -
Jul 5 16:07:15 ubuntu sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 5 16:07:15 ubuntu su: (to root) aaa on pts/1
Jul 5 16:07:15 ubuntu su: pam_unix(su-l:session): session opened for user root by (uid=0)
Jul 5 16:09:04 ubuntu systemd-logind[649]: New seat seat0.
Jul 5 16:09:04 ubuntu systemd-logind[649]: Watching system buttons on /dev/input/event0 (Power Button)
Jul 5 16:09:04 ubuntu systemd-logind[649]: Watching system buttons on /dev/input/event1 (Sleep Button)
Jul 5 16:09:04 ubuntu systemd-logind[649]: Watching system buttons on /dev/input/event2 (AT Translated Set 2 keyboard)
Jul 5 16:09:04 ubuntu gdm-launch-environment]: pam_unix(gdm-launch-environment:session): session opened for user gdm by (uid=0)
Jul 5 16:09:05 ubuntu systemd-logind[649]: New session c1 of user gdm.
Jul 5 16:09:05 ubuntu systemd: pam_unix(systemd-user:session): session opened for user gdm by (uid=0)
Jul 5 16:09:05 ubuntu su: (to aaa) root on none
Jul 5 16:09:05 ubuntu su: pam_unix(su:session): session opened for user aaa by (uid=0)
Jul 5 16:09:05 ubuntu systemd: pam_unix(systemd-user:session): session opened for user aaa by (uid=0)
Jul 5 16:09:05 ubuntu su: pam_unix(su:session): session closed for user aaa
Jul 5 16:09:07 ubuntu polkitd(authority=local): Registered Authentication Agent for unix-session:c1 (system bus name :1.71 [/usr/bin/gnome-shell], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jul 5 16:09:17 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 16:09:17 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 16:09:17 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 16:09:20 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 16:09:20 ubuntu gdm-password]: pam_unix(gdm-password:auth): authentication failure; logname= uid=0 euid=0 tty=/dev/tty1 ruser= rhost= user=uos001
Jul 5 16:09:24 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 16:09:24 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 16:09:24 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 16:09:27 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 16:09:27 ubuntu gdm-password]: gkr-pam: unable to locate daemon control file
Jul 5 16:09:27 ubuntu gdm-password]: gkr-pam: stashed password to try later in open session
Jul 5 16:09:27 ubuntu gdm-password]: pam_unix(gdm-password:session): session opened for user aaa by (uid=0)
Jul 5 16:09:27 ubuntu systemd-logind[649]: New session 3 of user aaa.
Jul 5 16:09:27 ubuntu systemd: pam_unix(systemd-user:session): session opened for user aaa by (uid=0)
Jul 5 16:09:27 ubuntu gdm-password]: gkr-pam: gnome-keyring-daemon started properly and unlocked keyring
Jul 5 16:09:28 ubuntu gnome-keyring-daemon[1842]: The PKCS#11 component was already initialized
Jul 5 16:09:28 ubuntu gnome-keyring-daemon[1842]: The Secret Service was already initialized
Jul 5 16:09:29 ubuntu polkitd(authority=local): Registered Authentication Agent for unix-session:3 (system bus name :1.147 [/usr/bin/gnome-shell], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jul 5 16:09:30 ubuntu dbus-daemon[606]: [system] Failed to activate service 'org.bluez': timed out (service_start_timeout=25000ms)
Jul 5 16:09:32 ubuntu gdm-launch-environment]: pam_unix(gdm-launch-environment:session): session closed for user gdm
Jul 5 16:09:32 ubuntu systemd-logind[649]: Session c1 logged out. Waiting for processes to exit.
Jul 5 16:09:32 ubuntu systemd-logind[649]: Removed session c1.
Jul 5 16:09:32 ubuntu polkitd(authority=local): Unregistered Authentication Agent for unix-session:c1 (system bus name :1.71, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Jul 5 16:17:01 ubuntu CRON[3961]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 5 16:17:01 ubuntu CRON[3961]: pam_unix(cron:session): session closed for user root
Jul 5 16:30:01 ubuntu CRON[6263]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 5 16:30:01 ubuntu CRON[6263]: pam_unix(cron:session): session closed for user root
Jul 5 16:42:09 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 16:42:09 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 16:42:09 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 16:42:14 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 16:42:14 ubuntu gdm-password]: gkr-pam: unlocked login keyring
Jul 5 17:01:25 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 17:01:25 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 17:01:25 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:02:23 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:02:23 ubuntu gdm-password]: gkr-pam: unlocked login keyring
Jul 5 17:17:01 ubuntu CRON[14250]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 5 17:17:01 ubuntu CRON[14250]: pam_unix(cron:session): session closed for user root
Jul 5 17:22:02 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 17:22:02 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 17:22:02 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:22:05 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:22:05 ubuntu gdm-password]: gkr-pam: unlocked login keyring
Jul 5 17:30:01 ubuntu CRON[16439]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 5 17:30:01 ubuntu CRON[16439]: pam_unix(cron:session): session closed for user root
Jul 5 17:34:46 ubuntu gdm-password]: PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
Jul 5 17:34:46 ubuntu gdm-password]: PAM adding faulty module: sensepam.so
Jul 5 17:34:46 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:34:50 ubuntu gdm-password]: pam_unix(gdm-password:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:34:50 ubuntu gdm-password]: gkr-pam: unlocked login keyring
Jul 5 17:35:03 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:35:05 ubuntu sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
Jul 5 17:35:05 ubuntu sudo: aaa : TTY=pts/0 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/su
Jul 5 17:35:05 ubuntu sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 5 17:35:05 ubuntu su: (to root) aaa on pts/0
Jul 5 17:35:05 ubuntu su: pam_unix(su:session): session opened for user root by (uid=0)
我认为错误点是:
PAM unable to dlopen(sensepam.so): /lib/security/sensepam.so: undefined symbol: OPENSSL_init_crypto
那么有什么办法可以解决这个问题吗?谢谢!
答案1
链接共享库时,您应该添加-llib
参数:
ld -x --shared -o sensepam.so sensepam.o -lcrypto -lssl
然后,安装到后/lib/security
,使用以下命令查找缺少的依赖项:
ldd -r /lib/security/sensepam.so
该ldd
命令将打印所有缺少的依赖项、未定义的符号以及丢失的库文件。
现在,将缺少的 lib 文件从 OpenSSL lib 文件夹复制到系统库。默认的系统库路径是/usr/lib/x86_64-linux-gnu/
.