sident(3)

NAME

ident_query, ident_lookup, ident_id, ident_free,
ident_set_authtype, ident_set_authflag, ident_get_authflag,
ident_query_error - Query remote S/Ident responder

SYNOPSIS

#include <sident.h>
IDENT *ident_query(struct in_addr *laddr,  struct  in_addr
*raddr, int resp_port, int req_port, int timeout)
IDENT *ident_lookup(int fd, inttimeout)
char *ident_id(int fd, int timeout)
void ident_free(IDENT *id)
int      ident_set_authtype(char      *authtype,      void
*auth_init_data)
int ident_set_authflag(char *flag, char *value)
int ident_get_authflag(char *flag, char **value)
int  ident_query_error(char  *flag,  char  *value,   IDENT
*ident_ptr)

DESCRIPTION

The S/Ident protocol is used to authenticate a user who is
connecting to a remote network service using a protocol (or soft
ware) which does not support authentication. The user connects
to a remote server, that server opens a connection back to the
client (a callback), and the callback is answered by a daemon on
the client machine that returns the user's authentication out of
band. In the S/Ident standard, the remote server that is trying
to authenticate the user is called the requester, and the daemon
on the client system that returns the authentication information
is called the responder.
The S/Ident library, libsident, provides an API for
S/Ident requesters to make a query back to the connecting host
for authentication information associated with a particular con
nection. There are three different high-level calls, depending
on how much information is needed and whether the caller has an
open network file descriptor.
ident_query is the most "raw" of the three calls. It re
quires the local address of the requester system, the remote ad
dress, and the ports on the responder and requester systems and
returns an IDENT struct (described below). If a network connec
tion cannot be made to the responder, it returns NULL. This may
indicate a network problem, or may indicate that the remote host
is not running an S/Ident responder. If the network connection
is successful but the authentication fails, there will be a non
zero status in the result_code field of the IDENT struct.
ident_lookup does the same but instead takes the file de
scriptor of a connected network socket and gets the IP addresses
and ports from that. Its return value is the same as
ident_query.
ident_id takes the same arguments as ident_lookup but re
turns only the identifier component of the IDENT struct (see be
low) on success. The return value is newly allocated memory that
should be freed with a regular call to free(3). ident_id returns
NULL on any error, network or otherwise, and only returns
identifier on successful authentication.
All three functions take a timeout argument, which speci
fies the longest permissable time to block for an answer in sec
onds. A value of 0 says to wait indefinitely (in practice, gen
erally until the underlying network connection times out).
ident_free should be used to free a returned IDENT struct,
including all data contained in it.
ident_set_authtype sets the type of authentication to re
quest. There are currently three supported values: "KER
BEROS_V4", "GSSAPI", and "TRIVIAL". (The "TRIVIAL" authentica
tion type behaves the same as the standard Ident protocol and
doesn't do any strong authentication.) The second argument to
ident_set_authtype is a pointer to whatever initialization data
is required for that authentication type. Currently, the only
authentication type that takes additional data is "KERBEROS_V4",
which takes a pointer to the location of the srvtab file to use.
The srvtab should contain a key for ident.hostname where hostname
is the DNS name of the network interface that will be making the
request.
(There is no direct way to specify the keytab to use for
the GSS-API method because GSS-API doesn't have a way to specify
it. You can, however, set the KRB5_KTNAME environment variable
to point to the appropriate keytab.)
ident_set_authflag sets an optional flag in the initial
authentication request. Currently, the only supported flag is
"USER-INTERACTION", which can be set to "YES" or "NO". If set to
"YES", the requester asks that the user be prompted to log in if
possible and if they don't have current credentials. If set to
"NO", the requester asks that the user not be prompted and that
authentication fail if they don't have current credentials.
ident_set_authtype must be called before this call can be used.
ident_get_authflag queries the current value of a flag. A
pointer to the value string is returned in the value argument.
ident_set_authtype must be called before this call can be used.
ident_query_error interrogates an error return (in the
form of an IDENT struct) for a given flag and corresponding val
ue. If the flag and value are present, it returns
IDENT_AUTH_OKAY; otherwise, it returns IDENT_AUTH_FAIL. The two
defined flags are "CAPABILITIES" and "AUTH-MECH".
The only allowable value for "CAPABILITIES" is "USER-IN
TERACTION". It will be returned if authentication failed because
the user didn't have current credentials but the responder is ca
pable of prompting for them if the "USER-INTERACTION" flag is
set. The requester may want to set that flag with
ident_set_authflag and then retry the query.
The "AUTH-MECH" flag is used to query the responder for
its supported SASL mechanisms. Because of the nature of the
S/Ident protocol, it doesn't do the normal SASL negotation first.
Instead, the requester starts by just using some particular SASL
protocol, which the responder either supports or doesn't. If it
doesn't support it, the returned error lists the mechanisms that
are supported. This information can be queried using
ident_query_error; the flag value should be the name of a SASL
mechanism, and the return code will indicate whether the respon
der said it supported that mechanism. Note that GSS-API mecha
nisms are separately listed as type/subtype. The only currently
supported GSS-API mechanism is "GSSAPI/KERBEROS_v5".
The IDENT struct has the following definition:

typedef struct {
int resp_port; /* Responder port. */
int req_port; /* Requester port (i.e. us).
*/
char *identifier; /* Identification string. */
char *opsys; /* Operating system. */
char *charset; /* Character set. */
int result_code; /* Result code from internal
routines. */
time_t expires; /* Expiration of authenticat
ing ticket. */
char *principal; /* Principal in local realm.
*/
} IDENT;
identifier contains the authenticated identity (princi
pal@realm for Kerberos v4 or GSS-API Kerberos v5 authentication),
a colon, and identifier returned by the remote system (generally
the local Unix user name or UID). In the event of an error,
identifier will instead contain a string representation of the
error. principal will contain only the principal portion of the
Kerberos identity if its real matches the local realm. Other
wise, and on any error, it will be NULL.
The opsys and charset fields contain that information if
it's specified in the S/Ident response, but are rarely useful.
They will be set to NULL if that information was not specified.
result_code contains the error status of the call. See
ERRORS for detailed information. If there is no error, it will
be set to 0 (IDENT_AUTH_OKAY).
expires contains the time (in seconds since epoch) when
the underlying authentication credentials of the user will ex
pire.

ERRORS

The following codes are defined by the S/Ident library and
are used for the result_code field of the IDENT struct and for
other error returns. IDENT_AUTH_OKAY and IDENT_AUTH_FAIL are
used as convenient boolean return codes for some functions.
IDENT_AUTH_OKAY
The operation was successful.
IDENT_AUTH_FAIL
Verification of authentication failed. (Or, when used
outside of the IDENT struct, indicates that some error occurred.)
IDENT_AUTH_NOT_SUPPORTED
The authentication mechanism used by the requester is
not supported for authentication of the owner of the indicated
connection. The requester may wish to use ident_query_error with
the "AUTH-MECH" flag to find another acceptable, supported SASL
mechanism.
IDENT_USER_CANT_AUTH
The authentication mechanism was supported, but no au
thentication information is available for that user. Either they
don't have valid credentials, they've chosen not to authenticate,
or some similar failure occurred.
IDENT_INVALID_RESP_INFO
The response from the responder was syntactically in
valid according to the S/Ident protocol.
IDENT_INVALID_REQ_INFO
The query from the responder was syntactically invalid
according ot the S/Ident protocol.
IDENT_NO_USER
The connection specified is not currently in use or is
not currently owned by an identifiable entity.
IDENT_UNKNOWN_ERROR
Some error occurred which is not covered by the other
error codes. Optionally, this code MAY be returned in lieu of
any other specific error code if, for example, the server desires
to hide information implied by the return of that error code, or
for any other reason.
This error code is also used if the remote system
closed the connection without returning any response.
IDENT_INVALID_PORT
Either the local or foreign port was improperly speci
fied. This should be returned if either or both of the port ids
were out of range (TCP port numbers are from 1-65535), negative
integers, reals or in any fashion not recognized as a non-nega
tive integer.
IDENT_HIDDEN_USER
The server was able to identify the user of this port,
but the information was not returned at the request of the user.

EXAMPLES

The following code fragment shows how to check for an au
thenticated connection (assuming that the network connection is
on standard input, as with a server started from inetd):

IDENT *ident;
ident_set_authtype("GSSAPI", NULL);
ident = ident_lookup(fileno(stdin), 30);
if (ident != NULL) {
if (ident->result_code == IDENT_AUTH_OKAY)
printf("User authenticated as %s0,
ident->identifier);
else
printf("Authentication failed: %s0,
ident->identifier);
} else
printf("Unable to contact S/Ident responder0);
ident_free(ident);

BUGS

The S/Ident protocol has some significant flaws in the
presence of NAT, firewalls, and the like. See the sidentd(8)
manual page for more details.
For ident_lookup and ident_id, the blocking time in ex
treme cases may be as much as three times the value given in the
timeout parameter.
The described interface doesn't allow for non-blocking
queries, and the low-level API that would allow for them is not
described here and isn't particularly attractive. Ideally, the
above API should be extended slightly to allow for non-blocking
queries.
This API isn't even remotely thread-safe, as is immediate
ly apparent.

WARNING

The S/Ident protocol implemented by this package is inher
ently vulnerable to an active man-in-the-middle attack. If an
attacker can interpose themselves into a network connection ini
tiated by a victim and both impersonate that victim and selec
tively control which of their packets reach a server using
S/Ident, the attacker can make use of the victim's authentication
credentials. The attacker cannot initiate the session, only hi
jack an existing authenticated session.
Because of this, you should very carefully analyze the se
curity requirements of any service for which you're considering
deploying S/Ident authentication. Due to the requirements of the
attack, S/Ident may still be appropriate for very light authenti
cation or in secure network environments, but should not be used
for general authentication on untrusted networks.

SEE ALSO

sidentd(8).

The S/Ident protocol is described in
draft-morgan-ident-ext-04.txt, included in the S/Ident source.
This is an expired Internet Draft that was never published as an
RFC.
The basic Ident protocol is described in RFC 1413.
The S/Ident web page at <http://www.eyrie.org/~eagle/soft
ware/sident/> will have the current version of sidentd and the
libsident requester library.

AUTHORS

Originally written by Booker Bense <bbense@stanford.edu>
based on the S/Ident protocol proposed by Robert Morgan <mor
gan@stanford.edu>. GSS-API support added by Russ Allbery
<rra@stanford.edu>, who currently maintains this package.
The code is based on the pidentd/libident code from Peter
Eriksson <pen@lysator.liu.se> and Paer Emanuelsson
<pell@lysator.liu.se>. The SASL-like kerberos exchange is based
on code from CMU's imapd-1.4 release.

COPYRIGHT AND LICENSE

Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004 Board of Trustees, Leland Stanford Jr. University.
Portions based on source from Peter Eriksson
<pen@lysator.liu.se> contained in the libident library, released
into the public domain.
Portions based on code copyright (c) 1994-2000 Carnegie
Mellon University.
Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:
1. Redistributions of source code must retain the above
copyright notice, this list of conditions and the following dis
claimer.
2. Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following dis
claimer in the documentation and/or other materials provided with
the distribution.
3. The name "Carnegie Mellon University" must not be used
to endorse or promote products derived from this software without
prior written permission. For permission or any legal details,
please contact

Office of Technology Transfer
Carnegie Mellon University
5000 Forbes Avenue
Pittsburgh, PA 15213-3890
(412) 268-4387, fax: (412) 268-7395
tech-transfer@andrew.cmu.edu
4. Redistributions of any form whatsoever must retain the
following acknowledgment:

"This product includes software developed by Com
puting Services
at Carnegie Mellon University
(http://www.cmu.edu/computing/)."
STANFORD UNIVERSITY AND CARNEGIE MELLON UNIVERSITY DIS
CLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT
SHALL STANFORD UNIVERSITY OR CARNEGIE MELLON UNIVERSITY BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
3.6 2005-10-04
Copyright © 2010-2025 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout