Connections over private network, Simon's GSSAPI patch
Adam Oline
adoline at scl.ameslab.gov
Tue Feb 4 10:02:42 EST 2003
I'm sending this to both Simon and openssh-unix-dev because although the
problem I'm having actually occurs in Simon's patch, it could be
resolved with a change in the main code.
We are using openssh-3.4p1 plus Simon's GSSAPI patch to support Kerberos
V5 ticket forwarding over ssh protocol 2. We are using OpenAFS for user
home directory space, and LDAP for user information, including home
directory and password. libpam-openafs-session is used to get an AFS
token from the forwarded Krb5 TGT after logging into a machine using
openssh+patch.
Everything is working fine when we ssh between two machines over a
public IP connection. No passwords are needed, krb5 tickets are
forwarded using either the external-keyx or gssapi authentication
methods, and afs tokens are retrieved. The problem occurs when ssh'ing
over the private network connection between two machines.
We have a number of two-node clusters where each node has a public IP
address, as well as any number of private IP addresses, one for each
additional network interface. The additional network interfaces are
connected back-to-back, and are used for benchmarking purposes, e.g.
seeing how well two gigabit ethernet cards perform back-to-back in the
same machine. These benchmarks may be done using raw tcp connections,
or using a message passing library such as MPI. Some of the MPI
libraries we use, including LAM and MP_Lite (implements a subset of the
MPI specification), require the use of ssh as a means of connecting to a
remote node and starting the user's executable.
Ok, so now I'll finally describe the problem.
If I do 'ssh <private ip of remote node>', the external-keyx and gssapi
auth-methods fail, and I end up having to do password authentication,
which is a pain. The external-keyx and gssapi methods essentially fail
because the server is expecting kerberos credentials for the principal
"host/<public FQDN>@<REALM>", but the client is trying to provide
credentials for "host/<private FQDN>@<REALM>". Note that we were able
to set up distinct kerberos entries for the private ip addresses by
adding entries in /etc/hosts to resolve <private ip address> to <machine
name>.<lo1>.<domain>, and using the same "private" FQDN in the kerberos
database.
In order to get a kerberos entry for private IP addresses to work with
openssh and Simon's patch, however, we would need to modify Simon's
patch to try matching kerberos credentials against all of the kerberos
host principals available for the machine, instead of just against the
kerberos host principal for the public IP/domain name. This is
certainly possible, I think, but our sysadmin has pointed out that it
would be simpler on our end to only maintain one kerberos entry per
machine, instead of 3 or 4, depending on how many additional interfaces
we're testing at once.
A somewhat simpler solution is a modification to the openssh code.
Prior to doing key exchange and user authentication in ssh_login(), a
check could be performed to determine whether the destination hostname
corresponds to a public or private IP address. If private IP, then
change it to the hostname corresponding to the public IP. Now the
client code will use kerberos credentials for the public IP/domain name,
and everything runs smoothly.
My main concerns here are the security considerations, and whether this
might break something, e.g. would the user ever *really* need to connect
using a private IP/hostname for the destination rather than the public
IP/hostname? I believe the network traffic is still actually going over
the private link.
On the other hand, the change to hostname could be made deeper inside,
specifically in Simon's patch, by passing the modified hostname only to
the kerberos code used to build the credentials that are passed to the
ssh daemon. In that case, the main concerns are directed to Simon. I'm
not sure whether this compromises the security from a Kerberos
perspective. It seems to me that a host key is used to identify the
*host*, or machine, and even though we're connecting through a different
network interface, we're still connecting to the same machine.
I apologize for my long-windedness. I hope I explained things clearly.
I would appreciate feedback from anyone, especially if this topic has
come up before and I've missed it. I tried googling for some relevant
information but couldn't find any.
I will gladly develop a patch to either the openssh code or
openssh+Simon's patch if this seems like a reasonable thing to do.
Adam
--
Adam Oline
Research Helper
SCL, Ames Laboratory
515-231-0242
adoline at scl.ameslab.gov
More information about the openssh-unix-dev
mailing list