Add support for a sudo-i pam.d file to be used for "sudo -i".

Adapted from a RedHat patch.
This commit is contained in:
Todd C. Miller
2010-07-12 17:57:53 -04:00
parent 684d1fd9f7
commit d9de7b5f8e
7 changed files with 65 additions and 20 deletions

View File

@@ -361,6 +361,9 @@
/* Define to 1 if you use PAM authentication. */ /* Define to 1 if you use PAM authentication. */
#undef HAVE_PAM #undef HAVE_PAM
/* Define to 1 if you use a specific PAM session for sudo -i. */
#undef HAVE_PAM_LOGIN
/* Define to 1 if you have the <pam/pam_appl.h> header file. */ /* Define to 1 if you have the <pam/pam_appl.h> header file. */
#undef HAVE_PAM_PAM_APPL_H #undef HAVE_PAM_PAM_APPL_H

51
configure vendored
View File

@@ -1004,6 +1004,7 @@ enable_libtool_lock
with_noexec with_noexec
with_netsvc with_netsvc
enable_sia enable_sia
with_pam_login
enable_pam_session enable_pam_session
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
@@ -1747,6 +1748,7 @@ Optional Packages:
--with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-noexec=PATH fully qualified pathname of sudo_noexec.so --with-noexec=PATH fully qualified pathname of sudo_noexec.so
--with-netsvc[=PATH] path to netsvc.conf --with-netsvc[=PATH] path to netsvc.conf
--with-pam-login enable specific PAM session for sudo -i
Some influential environment variables: Some influential environment variables:
CC C compiler command CC C compiler command
@@ -6928,13 +6930,13 @@ if test "${lt_cv_nm_interface+set}" = set; then :
else else
lt_cv_nm_interface="BSD nm" lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext echo "int some_variable = 0;" > conftest.$ac_ext
(eval echo "\"\$as_me:6931: $ac_compile\"" >&5) (eval echo "\"\$as_me:6933: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err) (eval "$ac_compile" 2>conftest.err)
cat conftest.err >&5 cat conftest.err >&5
(eval echo "\"\$as_me:6934: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval echo "\"\$as_me:6936: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
cat conftest.err >&5 cat conftest.err >&5
(eval echo "\"\$as_me:6937: output\"" >&5) (eval echo "\"\$as_me:6939: output\"" >&5)
cat conftest.out >&5 cat conftest.out >&5
if $GREP 'External.*some_variable' conftest.out > /dev/null; then if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin" lt_cv_nm_interface="MS dumpbin"
@@ -8139,7 +8141,7 @@ ia64-*-hpux*)
;; ;;
*-*-irix6*) *-*-irix6*)
# Find out which ABI we are using. # Find out which ABI we are using.
echo '#line 8142 "configure"' > conftest.$ac_ext echo '#line 8144 "configure"' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5 (eval $ac_compile) 2>&5
ac_status=$? ac_status=$?
@@ -9400,11 +9402,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'` -e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:9403: $lt_compile\"" >&5) (eval echo "\"\$as_me:9405: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err) (eval "$lt_compile" 2>conftest.err)
ac_status=$? ac_status=$?
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:9407: \$? = $ac_status" >&5 echo "$as_me:9409: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized # The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output. # So say no if there are warnings other than the usual output.
@@ -9739,11 +9741,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'` -e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:9742: $lt_compile\"" >&5) (eval echo "\"\$as_me:9744: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err) (eval "$lt_compile" 2>conftest.err)
ac_status=$? ac_status=$?
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:9746: \$? = $ac_status" >&5 echo "$as_me:9748: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized # The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output. # So say no if there are warnings other than the usual output.
@@ -9844,11 +9846,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'` -e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:9847: $lt_compile\"" >&5) (eval echo "\"\$as_me:9849: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err) (eval "$lt_compile" 2>out/conftest.err)
ac_status=$? ac_status=$?
cat out/conftest.err >&5 cat out/conftest.err >&5
echo "$as_me:9851: \$? = $ac_status" >&5 echo "$as_me:9853: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext if (exit $ac_status) && test -s out/conftest2.$ac_objext
then then
# The compiler can only warn and ignore the option if not recognized # The compiler can only warn and ignore the option if not recognized
@@ -9899,11 +9901,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'` -e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:9902: $lt_compile\"" >&5) (eval echo "\"\$as_me:9904: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err) (eval "$lt_compile" 2>out/conftest.err)
ac_status=$? ac_status=$?
cat out/conftest.err >&5 cat out/conftest.err >&5
echo "$as_me:9906: \$? = $ac_status" >&5 echo "$as_me:9908: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext if (exit $ac_status) && test -s out/conftest2.$ac_objext
then then
# The compiler can only warn and ignore the option if not recognized # The compiler can only warn and ignore the option if not recognized
@@ -12266,7 +12268,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 12269 "configure" #line 12271 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@@ -12362,7 +12364,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 12365 "configure" #line 12367 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@@ -16161,6 +16163,25 @@ done
AUTH_OBJS="$AUTH_OBJS pam.lo"; AUTH_OBJS="$AUTH_OBJS pam.lo";
AUTH_EXCL=PAM AUTH_EXCL=PAM
# Check whether --with-pam-login was given.
if test "${with_pam_login+set}" = set; then :
withval=$with_pam_login; case $with_pam_login in
yes) $as_echo "#define HAVE_PAM_LOGIN 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use PAM login" >&5
$as_echo_n "checking whether to use PAM login... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
;;
no) ;;
*) as_fn_error "\"--with-pam-login does not take an argument.\"" "$LINENO" 5
;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use PAM session support" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use PAM session support" >&5
$as_echo_n "checking whether to use PAM session support... " >&6; } $as_echo_n "checking whether to use PAM session support... " >&6; }
# Check whether --enable-pam_session was given. # Check whether --enable-pam_session was given.
@@ -16185,6 +16206,7 @@ else
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
fi fi
case $host in case $host in
*-*-linux*|*-*-solaris*) *-*-linux*|*-*-solaris*)
# dgettext() may be defined to dgettext_libintl in the # dgettext() may be defined to dgettext_libintl in the
@@ -20497,5 +20519,6 @@ fi

View File

@@ -2100,6 +2100,18 @@ if test ${with_pam-"no"} != "no"; then
AC_DEFINE(HAVE_PAM) AC_DEFINE(HAVE_PAM)
AUTH_OBJS="$AUTH_OBJS pam.lo"; AUTH_OBJS="$AUTH_OBJS pam.lo";
AUTH_EXCL=PAM AUTH_EXCL=PAM
AC_ARG_WITH(pam-login, [AS_HELP_STRING([--with-pam-login], [enable specific PAM session for sudo -i])],
[case $with_pam_login in
yes) AC_DEFINE([HAVE_PAM_LOGIN])
AC_MSG_CHECKING(whether to use PAM login)
AC_MSG_RESULT(yes)
;;
no) ;;
*) AC_MSG_ERROR(["--with-pam-login does not take an argument."])
;;
esac])
AC_MSG_CHECKING(whether to use PAM session support) AC_MSG_CHECKING(whether to use PAM session support)
AC_ARG_ENABLE(pam_session, AC_ARG_ENABLE(pam_session,
[AS_HELP_STRING([--disable-pam-session], [Disable PAM session support])], [AS_HELP_STRING([--disable-pam-session], [Disable PAM session support])],
@@ -2113,6 +2125,7 @@ if test ${with_pam-"no"} != "no"; then
AC_MSG_WARN([Ignoring unknown argument to --enable-pam-session: $enableval]) AC_MSG_WARN([Ignoring unknown argument to --enable-pam-session: $enableval])
;; ;;
esac], AC_MSG_RESULT(yes)) esac], AC_MSG_RESULT(yes))
case $host in case $host in
*-*-linux*|*-*-solaris*) *-*-linux*|*-*-solaris*)
# dgettext() may be defined to dgettext_libintl in the # dgettext() may be defined to dgettext_libintl in the
@@ -2801,6 +2814,7 @@ AH_TEMPLATE(HAVE_LDAP, [Define to 1 if you use LDAP for sudoers.])
AH_TEMPLATE(HAVE_LINUX_AUDIT, [Define to 1 to enable Linux audit support.]) AH_TEMPLATE(HAVE_LINUX_AUDIT, [Define to 1 to enable Linux audit support.])
AH_TEMPLATE(HAVE_OPIE, [Define to 1 if you use NRL OPIE.]) AH_TEMPLATE(HAVE_OPIE, [Define to 1 if you use NRL OPIE.])
AH_TEMPLATE(HAVE_PAM, [Define to 1 if you use PAM authentication.]) AH_TEMPLATE(HAVE_PAM, [Define to 1 if you use PAM authentication.])
AH_TEMPLATE(HAVE_PAM_LOGIN, [Define to 1 if you use a specific PAM session for sudo -i.])
AH_TEMPLATE(HAVE_PROJECT_H, [Define to 1 if you have the <project.h> header file.]) AH_TEMPLATE(HAVE_PROJECT_H, [Define to 1 if you have the <project.h> header file.])
AH_TEMPLATE(HAVE_SECURID, [Define to 1 if you use SecurID for authentication.]) AH_TEMPLATE(HAVE_SECURID, [Define to 1 if you use SecurID for authentication.])
AH_TEMPLATE(HAVE_SELINUX, [Define to 1 to enable SELinux RBAC support.]) AH_TEMPLATE(HAVE_SELINUX, [Define to 1 to enable SELinux RBAC support.])

View File

@@ -90,7 +90,12 @@ pam_init(struct passwd *pw, char **promptp, sudo_auth *auth)
if (auth != NULL) if (auth != NULL)
auth->data = (void *) &pam_status; auth->data = (void *) &pam_status;
pam_conv.conv = converse; pam_conv.conv = converse;
pam_status = pam_start("sudo", pw->pw_name, &pam_conv, &pamh); #ifdef HAVE_PAM_LOGIN
if (ISSET(sudo_mode, MODE_LOGIN_SHELL))
pam_status = pam_start("sudo-i", pw->pw_name, &pam_conv, &pamh);
else
#endif
pam_status = pam_start("sudo", pw->pw_name, &pam_conv, &pamh);
if (pam_status != PAM_SUCCESS) { if (pam_status != PAM_SUCCESS) {
log_error(USE_ERRNO|NO_EXIT|NO_MAIL, "unable to initialize PAM"); log_error(USE_ERRNO|NO_EXIT|NO_MAIL, "unable to initialize PAM");
return(AUTH_FATAL); return(AUTH_FATAL);

View File

@@ -407,7 +407,7 @@ matches_env_keep(const char *var)
* Also adds sudo-specific variables (SUDO_*). * Also adds sudo-specific variables (SUDO_*).
*/ */
void void
rebuild_env(int sudo_mode, int noexec) rebuild_env(int noexec)
{ {
char **old_envp, **ep, *cp, *ps1; char **old_envp, **ep, *cp, *ps1;
char idbuf[MAX_UID_T_LEN]; char idbuf[MAX_UID_T_LEN];

View File

@@ -146,6 +146,7 @@ char *login_style;
sigaction_t saved_sa_int, saved_sa_quit, saved_sa_tstp; sigaction_t saved_sa_int, saved_sa_quit, saved_sa_tstp;
sudo_conv_t sudo_conv; sudo_conv_t sudo_conv;
sudo_printf_t sudo_printf; sudo_printf_t sudo_printf;
int sudo_mode;
static char *runas_user; static char *runas_user;
static char *runas_group; static char *runas_group;
@@ -158,8 +159,6 @@ char **NewArgv;
/* error.c */ /* error.c */
extern sigjmp_buf error_jmp; extern sigjmp_buf error_jmp;
static int sudo_mode;
static int static int
sudoers_policy_open(unsigned int version, sudo_conv_t conversation, sudoers_policy_open(unsigned int version, sudo_conv_t conversation,
sudo_printf_t plugin_printf, char * const settings[], sudo_printf_t plugin_printf, char * const settings[],
@@ -437,7 +436,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
def_env_reset = FALSE; def_env_reset = FALSE;
/* Build a new environment that avoids any nasty bits. */ /* Build a new environment that avoids any nasty bits. */
rebuild_env(sudo_mode, def_noexec); rebuild_env(def_noexec);
/* Fill in passwd struct based on user we are authenticating as. */ /* Fill in passwd struct based on user we are authenticating as. */
auth_pw = get_authpw(); auth_pw = get_authpw();

View File

@@ -290,7 +290,7 @@ void env_init(char * const envp[]);
void init_envtables(void); void init_envtables(void);
void insert_env_vars(char * const envp[]); void insert_env_vars(char * const envp[]);
void read_env_file(const char *, int); void read_env_file(const char *, int);
void rebuild_env(int, int); void rebuild_env(int);
void validate_env_vars(char * const envp[]); void validate_env_vars(char * const envp[]);
/* fmt_string.c */ /* fmt_string.c */
@@ -315,6 +315,7 @@ int group_plugin_query(const char *user, const char *group,
extern struct sudo_user sudo_user; extern struct sudo_user sudo_user;
extern struct passwd *auth_pw, *list_pw; extern struct passwd *auth_pw, *list_pw;
extern int long_list; extern int long_list;
extern int sudo_mode;
extern uid_t timestamp_uid; extern uid_t timestamp_uid;
extern sudo_conv_t sudo_conv; extern sudo_conv_t sudo_conv;
extern sudo_printf_t sudo_printf; extern sudo_printf_t sudo_printf;