Я использую Active Domain jamie_ad1.net
, и у меня там есть пользователь greg. Когда я ssh -l greg@jamie_ad1.net x.x.x.x
успешно вхожу в систему. Однако, когда я аутентифицирую пользователя в своей программе, моя функция process_user()
(ниже) возвращает ошибку 7 (PAM_PERM_DENIED
— вызывающая сторона не обладает требуемыми полномочиями.)
Что я делаю неправильно? Обратите внимание, что во время ssh
используется /etc/pam.d/system-auth
. Я также использую то же имя службы PAM "system_auth"
в своей программе (и я также использовал «sshd» и «логин» - все не удалось.)
static int process_user( const char* uname, const char* pwd )
{
int rv = 0 ;
struct pam_conv conv ;
pam_handle_t* pamh = NULL;
conv.conv = &pamauth_conv ;
conv.appdata_ptr = ( void* )pwd ;
if (
(( rv = pam_start( "system-auth", uname, &conv, &pamh )) == PAM_SUCCESS )
&& (( rv = pam_acct_mgmt(pamh, PAM_SILENT | PAM_DISALLOW_NULL_AUTHTOK )) == PAM_SUCCESS )
&& (( rv = pam_authenticate( pamh, PAM_SILENT | PAM_DISALLOW_NULL_AUTHTOK )) == PAM_SUCCESS )
)
...
pam_end( pamh, rv ) ;
...
}
Ниже я показываю функцию диалога, используемую process_user()
. В то время как под gdb
я вижу, что num_msg
равно 1, а msg[ 0 ]->msg
равно "Password: "
, и что функция правильно устанавливает p[ 0 ].resp
в качестве пароля, введенного методом strduped (я проверил правильность пароля).
static int pamauth_conv( int num_msg, const struct pam_message** msg, struct pam_response** resp, void* appdata_ptr )
{
int rv = PAM_SUCCESS ;
struct pam_response* p = NULL ;
int i ;
p = calloc( num_msg, sizeof( struct pam_response )) ;
if ( p == NULL )
rv = PAM_BUF_ERR ;
else
{
for ( i = 0; ( rv == PAM_SUCCESS ) && ( i < num_msg ); i++ )
if ( strcmp( msg[ i ]->msg, "Password: " ) == 0 ) /* support password conversation only */
{
p[ i ].resp = strdup(( char* )appdata_ptr ) ;
if ( p[ i ].resp == NULL )
rv = PAM_BUF_ERR;
}
}
if ( rv == PAM_SUCCESS )
*resp = p ;
else if ( p )
{
for ( i = 0; i < num_msg; i++ )
if ( p[ i ].resp )
free( p[ i ].resp ) ;
free( p ) ;
}
return rv ;
}
ПРИМЕЧАНИЕ. Вызов pam_acct_mgmt()
возвращает УСПЕХ, поэтому он подтверждает существование пользователя greg@jamie_ad1.net. Это pam_authenticate()
жалуется.
Содержимое /etc/pam.d/system-auth
точно такое же, как `/etc/pam.d/password-auth':
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_ldap.so use_first_pass
auth sufficient pam_winbind.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account [default=bad success=ok user_unknown=ignore] pam_winbind.so
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3 type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_ldap.so use_authtok
password sufficient pam_winbind.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session optional pam_oddjob_mkhomedir.so umask=0077
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so
Содержимое /etc/pam.d/sshd
#%PAM-1.0 auth required pam_sepermit.so auth include password-auth account required pam_nologin.so account include password-auth password include password-auth
session required pam_selinux.so close
session required pam_loginuid.so
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth
session required pam_lastlog.so showfailed
/etc/pam.d/system-auth
и ничего больше? Обычно я ожидаю, что sshd будет использовать свою собственную конфигурацию службы (/etc/pam.d/sshd
), которая будет включать эту общую конфигурацию и добавлять свою конфигурацию службы... - person Peter Brittain   schedule 02.08.2016pam_start( "sshd" ...)
, и результат был таким же. - person Grzegorz   schedule 02.08.2016/etc/krb5.conf
, чтобы узнать, есть ли у него конфигурация для доменаjamie_ad1.net
. Или же запуститеklist
сразу после успешного сеанса ssh и проверьте, отображаются ли активные билеты Kerberos. В этом случае вам может понадобиться научиться использоватьpam_krb5
. - person void   schedule 02.08.2016/etc/krb5.conf
содержит правильную конфигурацию. Однакоklist
показывает это:klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_16777216)
- BTW/tmp/krb5cc_16777216
не существует. - person Grzegorz   schedule 02.08.2016klist
после успешногоssh-ing
(я ставлю lf› в конце каждой строки, чтобы упростить ее восстановление:)Ticket cache: FILE:/tmp/krb5cc_16777216
‹lf›Default principal: grg@JAMIE_AD1.NET
‹lf› ‹lf›Valid starting Expires Service principal
‹lf›08/02/16 15:09:59 08/03/16 01:10:05 krbtgt/JAMIE_AD1.NET@JAMIE_AD1.NET
‹lf›renew until 08/09/16 15:09:59
‹lf› - person Grzegorz   schedule 03.08.2016/etc/pam.d/
, которые ссылаются наpam_krb5.so
? - person void   schedule 03.08.2016/etc/pam.d/system-auth
и/etc/pam.d/sshd', and annotation that
password-auth` совпадает сsystem-auth
- person Grzegorz   schedule 03.08.2016pam_acct_mgmt()
возвращает успех? В коде, который вы разместили, он никогда не будет вызываться, еслиpam_authenticate()
завершится ошибкой. - person nephtes   schedule 03.08.2016