[BACK]Return to auth1.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/Attic/auth1.c between version 1.10 and 1.11

version 1.10, 2001/01/07 19:06:25 version 1.11, 2001/01/18 16:59:59
Line 43 
Line 43 
                 return "rhosts-rsa";                  return "rhosts-rsa";
         case SSH_CMSG_AUTH_RHOSTS:          case SSH_CMSG_AUTH_RHOSTS:
                 return "rhosts";                  return "rhosts";
           case SSH_CMSG_AUTH_TIS:
           case SSH_CMSG_AUTH_TIS_RESPONSE:
                   return "challenge-response";
 #ifdef KRB4  #ifdef KRB4
         case SSH_CMSG_AUTH_KERBEROS:          case SSH_CMSG_AUTH_KERBEROS:
                 return "kerberos";                  return "kerberos";
 #endif  #endif
 #ifdef SKEY  
         case SSH_CMSG_AUTH_TIS_RESPONSE:  
                 return "s/key";  
 #endif  
         }          }
         snprintf(buf, sizeof buf, "bad-auth-msg-%d", type);          snprintf(buf, sizeof buf, "bad-auth-msg-%d", type);
         return buf;          return buf;
 }  }
   
 /*  /*
  * read packets and try to authenticate local user 'luser'.   * read packets, try to authenticate the user and
  * return if authentication is successful. not that pw == NULL   * return only if authentication is successful
  * if the user does not exists or is not allowed to login.  
  * each auth method has to 'fake' authentication for nonexisting  
  * users.  
  */   */
 void  void
 do_authloop(struct passwd * pw, char *luser)  do_authloop(Authctxt *authctxt)
 {  {
         int authenticated = 0;          int authenticated = 0;
         int attempt = 0;  
         u_int bits;          u_int bits;
         RSA *client_host_key;          RSA *client_host_key;
         BIGNUM *n;          BIGNUM *n;
         char *client_user, *password;          char *client_user, *password;
         char user[1024];          char info[1024];
         u_int dlen;          u_int dlen;
         int plen, nlen, elen;          int plen, nlen, elen;
         u_int ulen;          u_int ulen;
         int type = 0;          int type = 0;
         void (*authlog) (const char *fmt,...) = verbose;          struct passwd *pw = authctxt->pw;
   
           debug("Attempting authentication for %s%.100s.",
                authctxt->valid ? "" : "illegal user ", authctxt->user);
   
           /* If the user has no password, accept authentication immediately. */
           if (options.password_authentication &&
   #ifdef KRB4
               (!options.kerberos_authentication || options.kerberos_or_local_passwd) &&
   #endif
               auth_password(pw, "")) {
                   auth_log(authctxt, 1, "without authentication", "");
                   return;
           }
   
         /* Indicate that authentication is needed. */          /* Indicate that authentication is needed. */
         packet_start(SSH_SMSG_FAILURE);          packet_start(SSH_SMSG_FAILURE);
         packet_send();          packet_send();
         packet_write_wait();          packet_write_wait();
   
         for (attempt = 1;; attempt++) {          for (;;) {
                 /* default to fail */                  /* default to fail */
                 authenticated = 0;                  authenticated = 0;
   
                 strlcpy(user, "", sizeof user);                  info[0] = '\0';
   
                 /* Get a packet from the client. */                  /* Get a packet from the client. */
                 type = packet_read(&plen);                  type = packet_read(&plen);
Line 105 
Line 113 
                                 char *tgt = packet_get_string(&dlen);                                  char *tgt = packet_get_string(&dlen);
                                 packet_integrity_check(plen, 4 + dlen, type);                                  packet_integrity_check(plen, 4 + dlen, type);
                                 if (!auth_kerberos_tgt(pw, tgt))                                  if (!auth_kerberos_tgt(pw, tgt))
                                         verbose("Kerberos tgt REFUSED for %.100s", luser);                                          verbose("Kerberos tgt REFUSED for %.100s", authctxt->user);
                                 xfree(tgt);                                  xfree(tgt);
                         }                          }
                         continue;                          continue;
Line 119 
Line 127 
                                 char *token_string = packet_get_string(&dlen);                                  char *token_string = packet_get_string(&dlen);
                                 packet_integrity_check(plen, 4 + dlen, type);                                  packet_integrity_check(plen, 4 + dlen, type);
                                 if (!auth_afs_token(pw, token_string))                                  if (!auth_afs_token(pw, token_string))
                                         verbose("AFS token REFUSED for %.100s", luser);                                          verbose("AFS token REFUSED for %.100s", authctxt->user);
                                 xfree(token_string);                                  xfree(token_string);
                         }                          }
                         continue;                          continue;
Line 127 
Line 135 
 #ifdef KRB4  #ifdef KRB4
                 case SSH_CMSG_AUTH_KERBEROS:                  case SSH_CMSG_AUTH_KERBEROS:
                         if (!options.kerberos_authentication) {                          if (!options.kerberos_authentication) {
                                 /* packet_get_all(); */  
                                 verbose("Kerberos authentication disabled.");                                  verbose("Kerberos authentication disabled.");
                                 break;                                  break;
                         } else {                          } else {
Line 137 
Line 144 
                                 char *kdata = packet_get_string((u_int *) &auth.length);                                  char *kdata = packet_get_string((u_int *) &auth.length);
                                 packet_integrity_check(plen, 4 + auth.length, type);                                  packet_integrity_check(plen, 4 + auth.length, type);
   
                                 if (auth.length < MAX_KTXT_LEN)                                  if (authctxt->valid) {
                                         memcpy(auth.dat, kdata, auth.length);                                          if (auth.length < MAX_KTXT_LEN)
                                 xfree(kdata);                                                  memcpy(auth.dat, kdata, auth.length);
   
                                 if (pw != NULL) {  
                                         authenticated = auth_krb4(pw->pw_name, &auth, &tkt_user);                                          authenticated = auth_krb4(pw->pw_name, &auth, &tkt_user);
                                         if (authenticated) {                                          if (authenticated) {
                                                 snprintf(user, sizeof user, " tktuser %s", tkt_user);                                                  snprintf(info, sizeof info,
                                                       " tktuser %.100s", tkt_user);
                                                 xfree(tkt_user);                                                  xfree(tkt_user);
                                         }                                          }
                                 }                                  }
                                   xfree(kdata);
                         }                          }
                         break;                          break;
 #endif /* KRB4 */  #endif /* KRB4 */
Line 169 
Line 176 
                         /* Try to authenticate using /etc/hosts.equiv and .rhosts. */                          /* Try to authenticate using /etc/hosts.equiv and .rhosts. */
                         authenticated = auth_rhosts(pw, client_user);                          authenticated = auth_rhosts(pw, client_user);
   
                         snprintf(user, sizeof user, " ruser %s", client_user);                          snprintf(info, sizeof info, " ruser %.100s", client_user);
                         xfree(client_user);                          xfree(client_user);
                         break;                          break;
   
Line 205 
Line 212 
                         authenticated = auth_rhosts_rsa(pw, client_user, client_host_key);                          authenticated = auth_rhosts_rsa(pw, client_user, client_host_key);
                         RSA_free(client_host_key);                          RSA_free(client_host_key);
   
                         snprintf(user, sizeof user, " ruser %s", client_user);                          snprintf(info, sizeof info, " ruser %.100s", client_user);
                         xfree(client_user);                          xfree(client_user);
                         break;                          break;
   
Line 242 
Line 249 
                         xfree(password);                          xfree(password);
                         break;                          break;
   
 #ifdef SKEY  
                 case SSH_CMSG_AUTH_TIS:                  case SSH_CMSG_AUTH_TIS:
                         debug("rcvd SSH_CMSG_AUTH_TIS");                          debug("rcvd SSH_CMSG_AUTH_TIS");
                         if (options.skey_authentication == 1) {                          if (options.skey_authentication == 1) {
                                 char *skeyinfo = NULL;                                  char *challenge = get_challenge(authctxt, authctxt->style);
                                 if (pw != NULL)                                  if (challenge != NULL) {
                                         skeyinfo = skey_keyinfo(pw->pw_name);                                          debug("sending challenge '%s'", challenge);
                                 if (skeyinfo == NULL) {  
                                         debug("generating fake skeyinfo for %.100s.", luser);  
                                         skeyinfo = skey_fake_keyinfo(luser);  
                                 }  
                                 if (skeyinfo != NULL) {  
                                         /* we send our s/key- in tis-challenge messages */  
                                         debug("sending challenge '%s'", skeyinfo);  
                                         packet_start(SSH_SMSG_AUTH_TIS_CHALLENGE);                                          packet_start(SSH_SMSG_AUTH_TIS_CHALLENGE);
                                         packet_put_cstring(skeyinfo);                                          packet_put_cstring(challenge);
                                         packet_send();                                          packet_send();
                                         packet_write_wait();                                          packet_write_wait();
                                         continue;                                          continue;
Line 268 
Line 267 
                         debug("rcvd SSH_CMSG_AUTH_TIS_RESPONSE");                          debug("rcvd SSH_CMSG_AUTH_TIS_RESPONSE");
                         if (options.skey_authentication == 1) {                          if (options.skey_authentication == 1) {
                                 char *response = packet_get_string(&dlen);                                  char *response = packet_get_string(&dlen);
                                 debug("skey response == '%s'", response);                                  debug("got response '%s'", response);
                                 packet_integrity_check(plen, 4 + dlen, type);                                  packet_integrity_check(plen, 4 + dlen, type);
                                 authenticated = (pw != NULL &&                                  authenticated = verify_response(authctxt, response);
                                     skey_haskey(pw->pw_name) == 0 &&                                  memset(response, 'r', dlen);
                                     skey_passcheck(pw->pw_name, response) != -1);  
                                 xfree(response);                                  xfree(response);
                         }                          }
                         break;                          break;
 #else  
                 case SSH_CMSG_AUTH_TIS:  
                         /* TIS Authentication is unsupported */  
                         log("TIS authentication unsupported.");  
                         break;  
 #endif  
   
                 default:                  default:
                         /*                          /*
Line 291 
Line 283 
                         log("Unknown message during authentication: type %d", type);                          log("Unknown message during authentication: type %d", type);
                         break;                          break;
                 }                  }
                 if (authenticated && pw == NULL)                  if (!authctxt->valid && authenticated)
                         fatal("internal error: authenticated for pw == NULL");                          fatal("INTERNAL ERROR: authenticated invalid user %s",
                               authctxt->user);
   
                 /*                  /* Special handling for root */
                  * Check if the user is logging in as root and root logins                  if (authenticated && authctxt->pw->pw_uid == 0 && !auth_root_allowed())
                  * are disallowed.                          authenticated = 0;
                  * Note that root login is allowed for forced commands.  
                  */  
                 if (authenticated && pw && pw->pw_uid == 0 && !options.permit_root_login) {  
                         if (forced_command) {  
                                 log("Root login accepted for forced command.");  
                         } else {  
                                 authenticated = 0;  
                                 log("ROOT LOGIN REFUSED FROM %.200s",  
                                     get_canonical_hostname());  
                         }  
                 }  
   
                 /* Raise logging level */                  /* Log before sending the reply */
                 if (authenticated ||                  auth_log(authctxt, authenticated, get_authname(type), info);
                     attempt == AUTH_FAIL_LOG ||  
                     type == SSH_CMSG_AUTH_PASSWORD)  
                         authlog = log;  
   
                 authlog("%s %s for %s%.100s from %.200s port %d%s",  
                         authenticated ? "Accepted" : "Failed",  
                         get_authname(type),  
                         pw ? "" : "illegal user ",  
                         pw && pw->pw_uid == 0 ? "ROOT" : luser,  
                         get_remote_ipaddr(),  
                         get_remote_port(),  
                         user);  
   
                 if (authenticated)                  if (authenticated)
                         return;                          return;
   
                 if (attempt > AUTH_FAIL_MAX)                  if (authctxt->failures++ > AUTH_FAIL_MAX)
                         packet_disconnect(AUTH_FAIL_MSG, luser);                          packet_disconnect(AUTH_FAIL_MSG, authctxt->user);
   
                 /* Send a message indicating that the authentication attempt failed. */  
                 packet_start(SSH_SMSG_FAILURE);                  packet_start(SSH_SMSG_FAILURE);
                 packet_send();                  packet_send();
                 packet_write_wait();                  packet_write_wait();
Line 344 
Line 313 
 void  void
 do_authentication()  do_authentication()
 {  {
         struct passwd *pw, pwcopy;          Authctxt *authctxt;
           struct passwd *pw;
         int plen;          int plen;
         u_int ulen;          u_int ulen;
         char *user;          char *user, *style = NULL;
   
         /* Get the name of the user that we wish to log in as. */          /* Get the name of the user that we wish to log in as. */
         packet_read_expect(&plen, SSH_CMSG_USER);          packet_read_expect(&plen, SSH_CMSG_USER);
Line 356 
Line 326 
         user = packet_get_string(&ulen);          user = packet_get_string(&ulen);
         packet_integrity_check(plen, (4 + ulen), SSH_CMSG_USER);          packet_integrity_check(plen, (4 + ulen), SSH_CMSG_USER);
   
           if ((style = strchr(user, ':')) != NULL)
                   *style++ = 0;
   
           authctxt = authctxt_new();
           authctxt->user = user;
           authctxt->style = style;
   
         setproctitle("%s", user);          setproctitle("%s", user);
   
 #ifdef AFS  #ifdef AFS
Line 369 
Line 346 
         /* Verify that the user is a valid user. */          /* Verify that the user is a valid user. */
         pw = getpwnam(user);          pw = getpwnam(user);
         if (pw && allowed_user(pw)) {          if (pw && allowed_user(pw)) {
                 /* Take a copy of the returned structure. */                  authctxt->valid = 1;
                 memset(&pwcopy, 0, sizeof(pwcopy));                  pw = pwcopy(pw);
                 pwcopy.pw_name = xstrdup(pw->pw_name);  
                 pwcopy.pw_passwd = xstrdup(pw->pw_passwd);  
                 pwcopy.pw_uid = pw->pw_uid;  
                 pwcopy.pw_gid = pw->pw_gid;  
                 pwcopy.pw_class = xstrdup(pw->pw_class);  
                 pwcopy.pw_dir = xstrdup(pw->pw_dir);  
                 pwcopy.pw_shell = xstrdup(pw->pw_shell);  
                 pw = &pwcopy;  
         } else {          } else {
                   debug("do_authentication: illegal user %s", user);
                 pw = NULL;                  pw = NULL;
         }          }
           authctxt->pw = pw;
   
         /*          /*
          * If we are not running as root, the user must have the same uid as           * If we are not running as root, the user must have the same uid as
Line 390 
Line 361 
         if (getuid() != 0 && pw && pw->pw_uid != getuid())          if (getuid() != 0 && pw && pw->pw_uid != getuid())
                 packet_disconnect("Cannot change user when server not running as root.");                  packet_disconnect("Cannot change user when server not running as root.");
   
         debug("Attempting authentication for %s%.100s.", pw ? "" : "illegal user ", user);          /*
            * Loop until the user has been authenticated or the connection is
            * closed, do_authloop() returns only if authentication is successful
            */
           do_authloop(authctxt);
   
         /* If the user has no password, accept authentication immediately. */  
         if (options.password_authentication &&  
 #ifdef KRB4  
             (!options.kerberos_authentication || options.kerberos_or_local_passwd) &&  
 #endif /* KRB4 */  
             auth_password(pw, "")) {  
                 /* Authentication with empty password succeeded. */  
                 log("Login for user %s from %.100s, accepted without authentication.",  
                     user, get_remote_ipaddr());  
         } else {  
                 /* Loop until the user has been authenticated or the  
                    connection is closed, do_authloop() returns only if  
                    authentication is successful */  
                 do_authloop(pw, user);  
         }  
         if (pw == NULL)  
                 fatal("internal error, authentication successful for user '%.100s'", user);  
   
         /* The user has been authenticated and accepted. */          /* The user has been authenticated and accepted. */
         packet_start(SSH_SMSG_SUCCESS);          packet_start(SSH_SMSG_SUCCESS);
         packet_send();          packet_send();
         packet_write_wait();          packet_write_wait();
         xfree(user);  
           xfree(authctxt->user);
           xfree(authctxt);
   
         /* Perform session preparation. */          /* Perform session preparation. */
         do_authenticated(pw);          do_authenticated(pw);

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.11