Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 May 1997 13:26:18 +0400 (MSD)
From:      Dmitry Mishin <Dmitry.Mishin@wplus.net>
To:        mrcpu@cdsnet.net (Jaye Mathisen)
Cc:        hackers@FreeBSD.ORG
Subject:   Re: Correct way to chroot for shell account users?
Message-ID:  <199705260926.NAA24621@himera.wplus.net>
In-Reply-To: <Pine.NEB.3.95.970525144745.28807A-100000@mail.cdsnet.net> from Jaye Mathisen at "May 25, 97 02:50:55 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
> 
> 
> Anybody got any tips on how to write  a secure shell to exec on login to
> set a users environment to the "right thing".
> 
> (I don't mean a rsh type secure shell, but rather a good secure thing
> to have in /etc/master.passwd that execs the real shell in a chroot'd 
> environment.).
> 
> Any code appreciated as well.  Thanks.
> 
> 
> 
> 

All setup as in wu-ftpd + files in /chroot/./var/
Hope it can help you,
-- 
D.Mishin

*** /usr/src/usr.bin/login/login.c	Mon Aug 28 15:15:54 1995
--- login.c	Mon May 26 13:02:30 1997
***************
*** 130,135 ****
--- 130,137 ----
  #ifdef	SKEY
  	int permit_passwd = 0;
  #endif
+ 	char *pp;
+ 	int is_chrooted = 0;
  
  	(void)signal(SIGALRM, timedout);
  	(void)alarm(timeout);
***************
*** 401,408 ****
--- 403,457 ----
  
  	initgroups(username, pwd->pw_gid);
  
+ 	if (p = strstr(pwd->pw_dir, "/./"))
+ 	{
+ 		chmod(ttyn, 0622);
+ 		pp = strdup(pwd->pw_dir);
+ 		pp[p - pwd->pw_dir] = 0;
+ 		if (chroot(pp)) {
+ 		    syslog(LOG_INFO, "CHROOT error %s: %m", pwd->pw_name); 
+ 		    exit(1);
+ 		}
+ 		is_chrooted = 1;
+ 	
+ 	if (!(pwd = getpwnam(username)))
+ 	{
+ 		syslog(LOG_INFO, "CHROOT user %s isn't defined", username);
+ 		exit(1);
+ 	}
+ 
+ 	
+ 	/* Nothing else left to fail -- really log in. */
+ 	memset((void *)&utmp, 0, sizeof(utmp));
+ 	(void)time(&utmp.ut_time);
+ 	(void)strncpy(utmp.ut_name, username, sizeof(utmp.ut_name));
+ 	if (hostname)
+ 		(void)strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host));
+ 	(void)strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
+ 	login(&utmp);
+ 
+ 	dolastlog(quietlog);
+ 
+ 	/*
+ 	 * Set device protections, depending on what terminal the
+ 	 * user is logged in. This feature is used on Suns to give
+ 	 * console users better privacy.
+ 	 */
+ 	login_fbtab(tty, pwd->pw_uid, pwd->pw_gid);
+ 
+ 	(void)chown(ttyn, pwd->pw_uid,
+ 	    (gr = getgrnam(TTYGRPNAME)) ? gr->gr_gid : pwd->pw_gid);
+ 
+ 
+ 	(void)setgid(pwd->pw_gid);
+ 
+ 	initgroups(username, pwd->pw_gid);
+ 
+ 	}
+ 
  	if (*pwd->pw_shell == '\0')
  		pwd->pw_shell = _PATH_BSHELL;
+ 
  
  	/* Destroy environment unless user has requested its preservation. */
  	if (!pflag)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705260926.NAA24621>