1 .\" Copyright (c) 1998, 2001, 2002, Juniper Networks, Inc.
2 .\" All rights reserved.
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\" notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\" notice, this list of conditions and the following disclaimer in the
11 .\" documentation and/or other materials provided with the distribution.
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 .\" $FreeBSD: src/lib/libtacplus/libtacplus.3,v 1.3.2.7 2002/10/09 08:50:42 pst Exp $
26 .\" $DragonFly: src/lib/libtacplus/libtacplus.3,v 1.6 2006/11/11 19:50:04 swildner Exp $
33 .Nd TACACS+ client library
37 .Fn tac_add_server "struct tac_handle *h" "const char *host" "int port" "const char *secret" "int timeout" "int flags"
39 .Fn tac_clear_avs "struct tac_handle *h"
41 .Fn tac_close "struct tac_handle *h"
43 .Fn tac_config "struct tac_handle *h" "const char *path"
45 .Fn tac_create_authen "struct tac_handle *h" "int action" "int type" "int service"
47 .Fn tac_create_author "struct tac_handle *h" "int method" "int type" "int service"
49 .Fn tac_get_av "struct tac_handle *h" "u_int index"
51 .Fn tac_get_av_value "struct tac_handle *h" "const char *attribute"
53 .Fn tac_get_data "struct tac_handle *h" "size_t *len"
55 .Fn tac_get_msg "struct tac_handle *h"
56 .Ft struct tac_handle *
59 .Fn tac_send_authen "struct tac_handle *h"
61 .Fn tac_send_author "struct tac_handle *h"
63 .Fn tac_set_av "struct tac_handle *h" "u_int index" "const char *av_pair"
65 .Fn tac_set_data "struct tac_handle *h" "const void *data" "size_t data_len"
67 .Fn tac_set_msg "struct tac_handle *h" "const char *msg"
69 .Fn tac_set_port "struct tac_handle *h" "const char *port"
71 .Fn tac_set_priv "struct tac_handle *h" "int priv"
73 .Fn tac_set_rem_addr "struct tac_handle *h" "const char *addr"
75 .Fn tac_set_user "struct tac_handle *h" "const char *user"
77 .Fn tac_strerror "struct tac_handle *h"
81 library implements the client side of the TACACS+ network access
82 control protocol. TACACS+ allows clients to perform authentication,
83 authorization, and accounting by means of network requests to remote
84 servers. This library currently supports only the authentication
85 and authorization portion of the protocol.
87 To use the library, an application must first call
90 .Va struct tac_handle * ,
91 which provides context for subsequent operations.
94 always succeed unless insufficient virtual memory is available. If
95 the necessary memory cannot be allocated,
100 Before issuing any TACACS+ requests, the library must be made aware
101 of the servers it can contact. The easiest way to configure the
105 causes the library to read a configuration file whose format is
108 The pathname of the configuration file is passed as the
112 This argument may also be given as
114 in which case the standard configuration file
115 .Pa /etc/tacplus.conf
118 returns 0 on success, or -1 if an error occurs.
120 The library can also be configured programmatically by calls to
124 parameter specifies the server host, either as a fully qualified
125 domain name or as a dotted-quad IP address in text form.
128 parameter specifies the TCP port to contact on the server. If
130 is given as 0, the library uses port 49, the standard TACACS+ port.
131 The shared secret for the server host is passed to the
133 parameter. It may be any null-terminated string of bytes.
134 The timeout for receiving replies from the server is passed to the
136 parameter, in units of seconds.
139 parameter is a bit mask of flags to specify various characteristics of
140 the server. It may contain:
143 .It Dv TAC_SRVR_SINGLE_CONNECT
144 Causes the library to attempt to negotiate single connection mode
145 when communicating with the server. In single connection mode, the
146 original TCP connection is held open for multiple TACACS+ sessions.
147 Older servers do not support this mode, and some of them become
148 confused if the client attempts to negotiate it.
152 returns 0 on success, or -1 if an error occurs.
155 may be called multiple times, and it may be used together with
157 At most 10 servers may be specified.
158 When multiple servers are given, they are tried in round-robin
159 fashion until a working, accessible server is found. Once the
160 library finds such a server, it continues to use it as long as it
162 .Sh CREATING A TACACS+ AUTHENTICATION REQUEST
163 To begin constructing a new authentication request, call
164 .Fn tac_create_authen .
170 arguments must be set to appropriate values as defined in the
171 TACACS+ protocol specification. The
173 header file contains symbolic constants for these values.
174 .Sh CREATING A TACACS+ AUTHORIZATION REQUEST
175 To begin constructing a new authorization request, call
176 .Fn tac_create_author .
182 arguments must be set to appropriate values as defined in the
183 TACACS+ protocol specification. The
185 header file contains symbolic constants for these values.
186 .Sh SETTING OPTIONAL PARAMETERS ON A REQUEST
187 After creating a request,
188 various optional parameters may be attached to it through calls to
193 .Fn tac_set_rem_addr ,
196 The library creates its own copies of any strings provided to these
197 functions, so that it is not necessary for the caller to preserve
198 them. By default, each of these parameters is empty except for the
199 privilege level, which defaults to
204 only applies to the context of an authorization request. The format
205 for an attribute value pair is defined in the TACACS+ protocol
206 specification. The index specified can be any value between 0 and
207 255 inclusive and indicates the position in the list to place the
208 attribute value pair. Calling
210 with same index twice effectively replaces the value at that position.
213 to clear all attribute value pairs that may have been set.
214 .Sh SENDING THE AUTHENTICATION REQUEST AND RECEIVING THE RESPONSE
215 After the TACACS+ authentication request has been constructed, it is
217 .Fn tac_send_authen .
218 This function connects to a server if not already connected, sends
219 the request, and waits for a reply. On failure,
221 returns -1. Otherwise, it returns the TACACS+ status code and flags,
222 packed into an integer value. The status can be extracted using the
224 .Fn TAC_AUTHEN_STATUS .
225 Possible status codes, defined in
229 .Bl -item -compact -offset indent
231 .Dv TAC_AUTHEN_STATUS_PASS
233 .Dv TAC_AUTHEN_STATUS_FAIL
235 .Dv TAC_AUTHEN_STATUS_GETDATA
237 .Dv TAC_AUTHEN_STATUS_GETUSER
239 .Dv TAC_AUTHEN_STATUS_GETPASS
241 .Dv TAC_AUTHEN_STATUS_RESTART
243 .Dv TAC_AUTHEN_STATUS_ERROR
245 .Dv TAC_AUTHEN_STATUS_FOLLOW
248 The only flag is the no-echo flag, which can be tested using the
250 .Fn TAC_AUTHEN_NOECHO .
251 .Sh EXTRACTING INFORMATION FROM THE SERVER'S AUTHENTICATION RESPONSE
252 An authentication response packet from the server may contain a
253 server message, a data string, or both. After a successful call to
254 .Fn tac_send_authen ,
255 this information may be retrieved from the response by calling
259 These functions return dynamically-allocated copies of the
260 information from the packet. The caller is responsible for freeing
261 the copies when it no longer needs them. The data returned from
262 these functions is guaranteed to be terminated by a null byte.
268 argument points to a location into which the library will store the
269 actual length of the received data, not including the null
270 terminator. This argument may be given as
272 if the caller is not interested in the length.
273 .Sh SENDING AUTHENTICATION CONTINUE PACKETS
276 returns a value containing one of the status codes
277 .Dv TAC_AUTHEN_STATUS_GETDATA ,
278 .Dv TAC_AUTHEN_STATUS_GETUSER ,
280 .Dv TAC_AUTHEN_STATUS_GETPASS ,
281 then the client must provide additional information to the server by
282 means of a TACACS+ CONTINUE packet. To do so, the application must
283 first set the packet's user message and/or data fields using
287 The client then sends the CONTINUE packet with
288 .Fn tac_send_authen .
290 .Fn tac_create_authen
293 be called to construct a CONTINUE packet; it is used only for the
294 initial authentication request.
296 When it receives the CONTINUE packet, the server may again request
297 more information by returning
298 .Dv TAC_AUTHEN_STATUS_GETDATA ,
299 .Dv TAC_AUTHEN_STATUS_GETUSER ,
301 .Dv TAC_AUTHEN_STATUS_GETPASS .
302 The application should send further CONTINUEs until some other
303 status is received from the server.
304 .Sh SENDING THE AUTHORIZATION REQUEST AND RECEIVING THE RESPONSE
305 After the TACACS+ authorization request has been constructed, it
307 .Fn tac_send_author .
308 This function connects to a server if not already connected, sends
309 the request, and waits for a reply. On failure,
311 returns -1. Otherwise, it returns the TACACS+ status code and
312 number of attribute value (AV) pairs received packed into an
313 integer value. The status can be extracted using the macro
314 .Fn TAC_AUTHOR_STATUS .
315 Possible status codes, defined in
319 .Bl -item -compact -offset indent
321 .Dv TAC_AUTHOR_STATUS_PASS_ADD
323 .Dv TAC_AUTHOR_STATUS_PASS_REPL
325 .Dv TAC_AUTHOR_STATUS_FAIL
327 .Dv TAC_AUTHOR_STATUS_ERROR
330 The number of AV pairs received is obtained using
331 .Fn TAC_AUTHEN_AV_COUNT .
332 .Sh EXTRACTING INFORMATION FROM THE SERVER'S AUTHORIZATION RESPONSE
333 Like an authentication response packet, an authorization
334 response packet from the
335 server may contain a server message, a data string, or both. Refer
336 to EXTRACTING INFORMATION FROM THE SERVER'S AUTHENTICATION RESPONSE
337 for instruction on extraction of those values.
339 An authorization response packet from the server may also contain
340 attribute value (AV) pairs. To extract these, use
343 .Fn tac_get_av_value .
345 takes the index of the AV pair as it is positioned in the list.
346 The indexes start at 0 (use
347 .Fn TAC_AUTHEN_AV_COUNT
348 on the return value of
350 to get the total number of items in this list).
355 takes the attribute name and returns the
356 corresponding value only, not the AV pair. These functions return
357 dynamically-allocated copies of the information from the packet.
358 The caller is responsible for freeing the copies when it no longer
359 needs them. The data returned from these functions is guaranteed
360 to be terminated by a null byte.
361 .Sh OBTAINING ERROR MESSAGES
362 Those functions which accept a
363 .Va struct tac_handle *
364 argument record an error message if they fail. The error message
365 can be retrieved by calling
367 The message text is overwritten on each new error for the given
368 .Va struct tac_handle * .
369 Thus the message must be copied if it is to be preserved through
370 subsequent library calls using the same handle.
372 To free the resources used by the TACACS+ library, call
375 The following functions return a non-negative value on success. If
376 they detect an error, they return -1 and record an error message
377 which can be retrieved using
380 .Bl -item -offset indent -compact
386 .Fn tac_create_authen
388 .Fn tac_create_author
409 The following functions return a
411 pointer on success. If they are unable to allocate sufficient
412 virtual memory, they return
414 and record an error message which can be retrieved using
417 .Bl -item -offset indent -compact
428 The following functions return a
430 pointer on success. If they are unable to allocate sufficient
431 virtual memory, they return
433 without recording an error message.
435 .Bl -item -offset indent -compact
440 .Pa /etc/tacplus.conf
446 .%T The TACACS+ Protocol, Version 1.78
447 .%O draft-grant-tacacs-02.txt (Internet Draft)
451 This software was written by
457 project by Juniper Networks, Inc.