Rkinit allows you to safely forward tickets to other kerberos hosts.
Obtained from: MIT
This commit is contained in:
parent
b00d18e592
commit
43dcd8e508
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor-crypto/eBones/dist/; revision=10766
11
eBones/usr.bin/rkinit/Makefile
Normal file
11
eBones/usr.bin/rkinit/Makefile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Makefile,v 1.2 1995/01/20 22:08:14 wollman Exp
|
||||||
|
|
||||||
|
PROG= rkinit
|
||||||
|
SRCS= ${RKINITOBJDIR}/rkinit_err.h rkinit.c
|
||||||
|
CFLAGS+= -I${KRBOBJDIR} -I${RKINITOBJDIR}
|
||||||
|
LDADD+= -L${RKINITOBJDIR} -lrkinit -L${KRBOBJDIR} -lkrb -L${DESOBJDIR} -ldes
|
||||||
|
LDADD+= -lss -lcom_err
|
||||||
|
|
||||||
|
MAN1= rkinit.1
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
206
eBones/usr.bin/rkinit/rkinit.1
Normal file
206
eBones/usr.bin/rkinit/rkinit.1
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
.\"
|
||||||
|
.\" $Header: /local/cvsfiles/kerberos/src/appl/rkinit/man/rkinit.1,v 1.1 1991/12/03 23:21:25 eichin Exp $
|
||||||
|
.\" $Source: /local/cvsfiles/kerberos/src/appl/rkinit/man/rkinit.1,v $
|
||||||
|
.\" $Author: eichin $
|
||||||
|
.\"
|
||||||
|
.\"
|
||||||
|
.TH RKINIT 1 "November 12, 1989"
|
||||||
|
.UC 4
|
||||||
|
.SH NAME
|
||||||
|
rkinit \- establish kerberos tickets safely on a remote host
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B rkinit [ host ]
|
||||||
|
[ -p
|
||||||
|
.B principal
|
||||||
|
] [ -l
|
||||||
|
.B username
|
||||||
|
] [ -k
|
||||||
|
.B kerberos_realm
|
||||||
|
] [ -f
|
||||||
|
.B ticket_file
|
||||||
|
] [ -h
|
||||||
|
.B remote_host
|
||||||
|
] [ -t
|
||||||
|
.B ticket_lifetime
|
||||||
|
] [
|
||||||
|
.B \-notimeout
|
||||||
|
]
|
||||||
|
|
||||||
|
A host name must be specified either as the first command line
|
||||||
|
argument or following a \-h flag. If redundant command line
|
||||||
|
arguments are given, the last one to appear takes precedence.
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.I rkinit
|
||||||
|
is a program that allows a user to establish kerberos tickets on
|
||||||
|
a remote host registered for
|
||||||
|
rlogin service. This can be done without the user's kerberos
|
||||||
|
password ever leaving the client machine.
|
||||||
|
|
||||||
|
In order to establish tickets remotely
|
||||||
|
without the use of something like
|
||||||
|
.I rkinit,
|
||||||
|
one would have to log in to the
|
||||||
|
remote host and run
|
||||||
|
.IR kinit (1).
|
||||||
|
.I rkinit
|
||||||
|
followed by
|
||||||
|
.I rlogin
|
||||||
|
can be thought of as a safe substitute for
|
||||||
|
.I rlogin
|
||||||
|
followed
|
||||||
|
.I kinit.
|
||||||
|
|
||||||
|
.I rkinit
|
||||||
|
uses the same access checking mechanism as
|
||||||
|
.I rlogin.
|
||||||
|
That means that
|
||||||
|
.I rkinit
|
||||||
|
can be used to create any tickets for user
|
||||||
|
.I A
|
||||||
|
on remote host
|
||||||
|
.I B
|
||||||
|
if and only if
|
||||||
|
.IR A 's
|
||||||
|
tickets would entitle a login to
|
||||||
|
.I B.
|
||||||
|
This means that one can create remote tickets for himself or for
|
||||||
|
another user if he is in that user's .klogin file.
|
||||||
|
|
||||||
|
.I rkinit
|
||||||
|
understands the following command line options:
|
||||||
|
|
||||||
|
.TP 4
|
||||||
|
.B \-p \fIprincipal\fR
|
||||||
|
If
|
||||||
|
.I principal,
|
||||||
|
in the format
|
||||||
|
.I name[.inst][@realm]
|
||||||
|
is specified, the tickets created on the remote host will be the
|
||||||
|
tickets indicated by the
|
||||||
|
.I principal
|
||||||
|
field. If this option is not given, the following defaults are
|
||||||
|
used: If the user running
|
||||||
|
.I rkinit
|
||||||
|
does not have tickets on the client machine,
|
||||||
|
.I rkinit
|
||||||
|
will prompt for a password and behave effectively as if the user
|
||||||
|
had invoked
|
||||||
|
.I kinit
|
||||||
|
on the specified
|
||||||
|
remote host; i.e.,
|
||||||
|
the tickets established will be owned on the remote host
|
||||||
|
by the user who invoked
|
||||||
|
.I rkinit
|
||||||
|
and will be for the local realm of the
|
||||||
|
remote host.
|
||||||
|
If the user running
|
||||||
|
.I rkinit
|
||||||
|
already has tickets,
|
||||||
|
.I rkinit
|
||||||
|
will prompt for a password and create tickets whose principal
|
||||||
|
matches that of the
|
||||||
|
tickets that the user already has.
|
||||||
|
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-l \fIusername\fR
|
||||||
|
If
|
||||||
|
.I username
|
||||||
|
is specified, the ticket file on the remote host will be owned by the
|
||||||
|
user
|
||||||
|
.I username.
|
||||||
|
If it is not specified, the tickets will be owned by
|
||||||
|
the remote user whose login name matches that of the user invoking
|
||||||
|
.I rkinit.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-r \fIrealm\fR
|
||||||
|
.I realm
|
||||||
|
is used to tell
|
||||||
|
.I rkinit
|
||||||
|
what realm the remote host is in. This
|
||||||
|
option should not usually have to be used since
|
||||||
|
.I rkinit
|
||||||
|
uses
|
||||||
|
.IR krb_realmofhost (3)
|
||||||
|
to determine the remote host's kerberos realm. Note that this
|
||||||
|
is distinct from realm as specified in
|
||||||
|
.I principal,
|
||||||
|
which refers to the realm of the remote tickets.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-f \fIticket_file\fR
|
||||||
|
This option is used to specify the name of the ticket file that
|
||||||
|
should be used on the remote host. Note that if you
|
||||||
|
specify a location for the ticket file that is other
|
||||||
|
than the default, you will have to set the environment variable
|
||||||
|
KRBTKFILE to that filename once you get to the remote host in
|
||||||
|
order for you to use the tickets.
|
||||||
|
If a ticket file is not specified, the tickets will
|
||||||
|
be placed in the
|
||||||
|
default location as specified by
|
||||||
|
.IR tkt_file (3).
|
||||||
|
On a UNIX host, this is /tmp/tkt<uid>, where
|
||||||
|
<uid> is the user id of the person who owns the remote ticket file.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-h \fIremote_host\fR
|
||||||
|
.I remote host
|
||||||
|
is the host on which remote tickets are being obtained. This
|
||||||
|
option can be used in place of specifying the host as the first
|
||||||
|
command line argument.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-t \fIticket_lifetime\fR
|
||||||
|
.I ticket lifetime
|
||||||
|
is the lifetime in minutes of the remote tickets. If it is not
|
||||||
|
specified, the default ticket life time (as defined in krb.h) is
|
||||||
|
used.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-notimeout
|
||||||
|
prevents the client from timing out. This is mainly useful only
|
||||||
|
for debugging since the rkinit server also times out.
|
||||||
|
|
||||||
|
.SH EXAMPLES
|
||||||
|
|
||||||
|
In the following examples,
|
||||||
|
.B tabetha
|
||||||
|
and
|
||||||
|
.B soup
|
||||||
|
are machines in the
|
||||||
|
.B ATHENA.MIT.EDU
|
||||||
|
kerberos realm and
|
||||||
|
.B local
|
||||||
|
is a user who can log in
|
||||||
|
to
|
||||||
|
.B soup
|
||||||
|
and has
|
||||||
|
.B qjb.root@ATHENA.MIT.EDU
|
||||||
|
in his .klogin file.
|
||||||
|
|
||||||
|
|
||||||
|
% rkinit tabetha
|
||||||
|
.br
|
||||||
|
Kerberos initialization (tabetha)
|
||||||
|
.br
|
||||||
|
Password for qjb@ATHENA.MIT.EDU:
|
||||||
|
.br
|
||||||
|
%
|
||||||
|
.br
|
||||||
|
|
||||||
|
.br
|
||||||
|
% rkinit soup -p qjb.root -l local
|
||||||
|
.br
|
||||||
|
Kerberos initialization (soup): tickets will be owned by local
|
||||||
|
.br
|
||||||
|
Password for qjb.root@ATHENA.MIT.EDU:
|
||||||
|
.br
|
||||||
|
%
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
rkinitd(8), kerberos(1), kerberos(3), kinit(1)
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
Emanuel Jay Berkenbilt (MIT-Project Athena)
|
216
eBones/usr.bin/rkinit/rkinit.c
Normal file
216
eBones/usr.bin/rkinit/rkinit.c
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
/*
|
||||||
|
* $Id: rkinit.c,v 1.1 1993/12/10 18:41:00 dglo Exp gibbs $
|
||||||
|
* $Source: /usr/src/eBones/rkinit/RCS/rkinit.c,v $
|
||||||
|
* $Author: dglo $
|
||||||
|
*
|
||||||
|
* This is an rkinit client
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(lint) && !defined(SABER) && !defined(LOCORE) && defined(RCS_HDRS)
|
||||||
|
static char *rcsid = "$Id: rkinit.c,v 1.1 1993/12/10 18:41:00 dglo Exp gibbs $";
|
||||||
|
#endif /* lint || SABER || LOCORE || RCS_HDRS */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <krb.h>
|
||||||
|
#include <des.h>
|
||||||
|
#include <com_err.h>
|
||||||
|
|
||||||
|
#include <rkinit.h>
|
||||||
|
#include <rkinit_err.h>
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
static void usage(void)
|
||||||
|
#else
|
||||||
|
static void usage()
|
||||||
|
#endif /* __STDC__ */
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Usage: rkinit [host] options\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
"Options: [-l username] [-k krb_realm] [-p principal] [-f tktfile]\n");
|
||||||
|
fprintf(stderr, " [-t lifetime] [-h host] [-notimeout]\n");
|
||||||
|
fprintf(stderr, "A host must be specified either with the -h option ");
|
||||||
|
fprintf(stderr, "or as the first argument.\n");
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
#ifdef __STDC__
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
#else
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
#endif /* __STDC__ */
|
||||||
|
{
|
||||||
|
char *whoami; /* Name of this program */
|
||||||
|
|
||||||
|
char principal[MAX_K_NAME_SZ]; /* Principal for which to get tickets */
|
||||||
|
char *host = NULL; /* Remote host */
|
||||||
|
char *username = 0; /* Username of owner of ticket */
|
||||||
|
char r_krealm[REALM_SZ]; /* Kerberos realm of remote host */
|
||||||
|
char aname[ANAME_SZ]; /* Aname of remote ticket file */
|
||||||
|
char inst[INST_SZ]; /* Instance of remote ticket file */
|
||||||
|
char realm[REALM_SZ]; /* Realm of remote ticket file */
|
||||||
|
char *tktfilename = NULL; /* Name of ticket file on remote host */
|
||||||
|
u_long lifetime = DEFAULT_TKT_LIFE; /* Lifetime of remote tickets */
|
||||||
|
int timeout = TRUE; /* Should we time out? */
|
||||||
|
rkinit_info info; /* Information needed by rkinit */
|
||||||
|
|
||||||
|
struct passwd *localid; /* To determine local id */
|
||||||
|
|
||||||
|
int status = 0; /* general error number */
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
bzero(r_krealm, sizeof(r_krealm));
|
||||||
|
bzero(principal, sizeof(principal));
|
||||||
|
bzero(aname, sizeof(aname));
|
||||||
|
bzero(inst, sizeof(inst));
|
||||||
|
bzero(realm, sizeof(realm));
|
||||||
|
|
||||||
|
/* Parse commandline arguements. */
|
||||||
|
if ((whoami = rindex(argv[0], '/')) == 0)
|
||||||
|
whoami = argv[0];
|
||||||
|
else
|
||||||
|
whoami++;
|
||||||
|
|
||||||
|
if (argc < 2) usage();
|
||||||
|
|
||||||
|
if (argv[1][0] != '-') {
|
||||||
|
host = argv[1];
|
||||||
|
i = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i = 1;
|
||||||
|
|
||||||
|
for (/* i initialized above */; i < argc; i++) {
|
||||||
|
if (strcmp(argv[i], "-h") == NULL) {
|
||||||
|
if (++i >= argc)
|
||||||
|
usage();
|
||||||
|
else
|
||||||
|
host = argv[i];
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i], "-l") == NULL) {
|
||||||
|
if (++i >= argc)
|
||||||
|
usage();
|
||||||
|
else
|
||||||
|
username = argv[i];
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i], "-k") == NULL) {
|
||||||
|
if (++i >= argc)
|
||||||
|
usage();
|
||||||
|
else
|
||||||
|
strncpy(r_krealm, argv[i], sizeof(r_krealm) - 1);
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i], "-p") == NULL) {
|
||||||
|
if (++i >= argc)
|
||||||
|
usage();
|
||||||
|
else
|
||||||
|
strncpy(principal, argv[i], sizeof(principal) - 1);
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i], "-f") == NULL) {
|
||||||
|
if (++i >= argc)
|
||||||
|
usage();
|
||||||
|
else
|
||||||
|
tktfilename = argv[i];
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i], "-t") == NULL) {
|
||||||
|
if (++i >= argc)
|
||||||
|
usage();
|
||||||
|
else {
|
||||||
|
lifetime = atoi(argv[i])/5;
|
||||||
|
if (lifetime == 0)
|
||||||
|
lifetime = 1;
|
||||||
|
else if (lifetime > 255)
|
||||||
|
lifetime = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i], "-notimeout") == NULL)
|
||||||
|
timeout = FALSE;
|
||||||
|
else
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (host == NULL)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
/* Initialize the realm of the remote host if necessary */
|
||||||
|
if (r_krealm[0] == 0) {
|
||||||
|
/*
|
||||||
|
* Try to figure out the realm of the remote host. If the
|
||||||
|
* remote host is unknown, don't worry about it; the library
|
||||||
|
* will handle the error better and print a good error message.
|
||||||
|
*/
|
||||||
|
struct hostent *hp;
|
||||||
|
if ((hp = gethostbyname(host)))
|
||||||
|
strcpy(r_krealm, krb_realmofhost(hp->h_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If no username was specified, use local id on client host */
|
||||||
|
if (username == 0) {
|
||||||
|
if ((localid = getpwuid(getuid())) == 0) {
|
||||||
|
fprintf(stderr, "You can not be found in the password file.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
username = localid->pw_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out who will go in the ticket file */
|
||||||
|
if (! principal[0]) {
|
||||||
|
if ((status = krb_get_tf_fullname(TKT_FILE, aname, inst, realm))
|
||||||
|
!= KSUCCESS) {
|
||||||
|
/*
|
||||||
|
* If user has no ticket file and principal was not specified,
|
||||||
|
* we will try to get tickets for username@remote_realm
|
||||||
|
*/
|
||||||
|
strcpy(aname, username);
|
||||||
|
strcpy(realm, r_krealm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((status = kname_parse(aname, inst, realm, principal))
|
||||||
|
!= KSUCCESS) {
|
||||||
|
fprintf(stderr, "%s\n", krb_err_txt[status]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (strlen(realm) == 0) {
|
||||||
|
if (krb_get_lrealm(realm, 1) != KSUCCESS)
|
||||||
|
strcpy(realm, KRB_REALM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero((char *)&info, sizeof(info));
|
||||||
|
|
||||||
|
strcpy(info.aname, aname);
|
||||||
|
strcpy(info.inst, inst);
|
||||||
|
strcpy(info.realm, realm);
|
||||||
|
strcpy(info.sname, "krbtgt");
|
||||||
|
strcpy(info.sinst, realm);
|
||||||
|
strncpy(info.username, username, sizeof(info.username) - 1);
|
||||||
|
if (tktfilename)
|
||||||
|
strncpy(info.tktfilename, tktfilename, sizeof(info.tktfilename) - 1);
|
||||||
|
info.lifetime = lifetime;
|
||||||
|
|
||||||
|
if ((status = rkinit(host, r_krealm, &info, timeout))) {
|
||||||
|
com_err(whoami, status, "while obtaining remote tickets:");
|
||||||
|
fprintf(stderr, "%s\n", rkinit_errmsg(0));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user