1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $OpenBSD: auth-rh-rsa.c,v 1.44 2014/07/15 15:54:14 millert Exp $ */
2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Author: Tatu Ylonen <ylo@cs.hut.fi>
4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *                    All rights reserved
6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Rhosts or /etc/hosts.equiv authentication combined with RSA host
7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * authentication.
8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * As far as I am concerned, the code I have written for this software
10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * can be used freely for any purpose.  Any derived versions of this
11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * software must be clearly marked as such, and if the derived work is
12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * incompatible with the protocol description in the RFC file, it must be
13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * called by a name other than "ssh" or "Secure Shell".
14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h"
17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
18d059297112922cabb0c674840589be8db821fd9aAdam Langley#ifdef WITH_SSH1
19d059297112922cabb0c674840589be8db821fd9aAdam Langley
20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/types.h>
21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <pwd.h>
23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdarg.h>
24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "packet.h"
26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "uidswap.h"
27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "log.h"
28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "buffer.h"
29d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "misc.h"
30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "servconf.h"
31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "key.h"
32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "hostfile.h"
33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "pathnames.h"
34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "auth.h"
35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "canohost.h"
36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef GSSAPI
37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "ssh-gss.h"
38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "monitor_wrap.h"
40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* import */
42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanextern ServerOptions options;
43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanauth_rhosts_rsa_key_allowed(struct passwd *pw, char *cuser, char *chost,
46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman    Key *client_host_key)
47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	HostStatus host_status;
49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (auth_key_is_revoked(client_host_key))
51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 0;
52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* Check if we would accept it using rhosts authentication. */
54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!auth_rhosts(pw, cuser))
55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 0;
56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	host_status = check_key_in_hostfiles(pw, client_host_key,
58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	    chost, _PATH_SSH_SYSTEM_HOSTFILE,
59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	    options.ignore_user_known_hosts ? NULL : _PATH_SSH_USER_HOSTFILE);
60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return (host_status == HOST_OK);
62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Tries to authenticate the user using the .rhosts file and the host using
66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * its host key.  Returns true if authentication succeeds.
67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
68bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanauth_rhosts_rsa(Authctxt *authctxt, char *cuser, Key *client_host_key)
70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char *chost;
72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	struct passwd *pw = authctxt->pw;
73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	debug("Trying rhosts with RSA host authentication for client user %.100s",
75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	    cuser);
76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!authctxt->valid || client_host_key == NULL ||
78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	    client_host_key->rsa == NULL)
79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 0;
80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	chost = (char *)get_canonical_hostname(options.use_dns);
82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	debug("Rhosts RSA authentication: canonical host %.900s", chost);
83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!PRIVSEP(auth_rhosts_rsa_key_allowed(pw, cuser, chost, client_host_key))) {
85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		debug("Rhosts with RSA host authentication denied: unknown or invalid host key");
86bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		packet_send_debug("Your host key cannot be verified: unknown or invalid host key.");
87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 0;
88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
89bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* A matching host key was found and is known. */
90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* Perform the challenge-response dialog with the client for the host key. */
92bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!auth_rsa_challenge_dialog(client_host_key)) {
93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		logit("Client on %.800s failed to respond correctly to host authentication.",
94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		    chost);
95bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 0;
96bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
97bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/*
98bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	 * We have authenticated the user using .rhosts or /etc/hosts.equiv,
99bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	 * and the host using RSA. We accept the authentication.
100bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	 */
101bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
102bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	verbose("Rhosts with RSA host authentication accepted for %.100s, %.100s on %.700s.",
103bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	    pw->pw_name, cuser, chost);
104bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	packet_send_debug("Rhosts with RSA host authentication accepted.");
105bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 1;
106bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
107d059297112922cabb0c674840589be8db821fd9aAdam Langley
108d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif /* WITH_SSH1 */
109