init
This commit is contained in:
		
							
								
								
									
										288
									
								
								freeradius/clients.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								freeradius/clients.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,288 @@
 | 
				
			|||||||
 | 
					# -*- text -*-
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					## clients.conf -- client configuration directives
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					##	$Id: 60f9f4bf8a32804182e4516ac69ac510d25215d1 $
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Define RADIUS clients (usually a NAS, Access Point, etc.).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Defines a RADIUS client.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  '127.0.0.1' is another name for 'localhost'.  It is enabled by default,
 | 
				
			||||||
 | 
					#  to allow testing of the server after an initial installation.  If you
 | 
				
			||||||
 | 
					#  are not going to be permitting RADIUS queries from localhost, we suggest
 | 
				
			||||||
 | 
					#  that you delete, or comment out, this entry.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Each client has a "short name" that is used to distinguish it from
 | 
				
			||||||
 | 
					#  other clients.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  In version 1.x, the string after the word "client" was the IP
 | 
				
			||||||
 | 
					#  address of the client.  In 2.0, the IP address is configured via
 | 
				
			||||||
 | 
					#  the "ipaddr" or "ipv6addr" fields.  For compatibility, the 1.x
 | 
				
			||||||
 | 
					#  format is still accepted.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					client localhost {
 | 
				
			||||||
 | 
						#  Only *one* of ipaddr, ipv4addr, ipv6addr may be specified for
 | 
				
			||||||
 | 
						#  a client.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  ipaddr will accept IPv4 or IPv6 addresses with optional CIDR
 | 
				
			||||||
 | 
						#  notation '/<mask>' to specify ranges.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  ipaddr will accept domain names e.g. example.org resolving
 | 
				
			||||||
 | 
						#  them via DNS.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If both A and AAAA records are found, A records will be
 | 
				
			||||||
 | 
						#  used in preference to AAAA.
 | 
				
			||||||
 | 
						ipaddr = 127.0.0.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Same as ipaddr but allows v4 addresses only. Requires A
 | 
				
			||||||
 | 
						#  record for domain names.
 | 
				
			||||||
 | 
					#	ipv4addr = *	# any.  127.0.0.1 == localhost
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Same as ipaddr but allows v6 addresses only. Requires AAAA
 | 
				
			||||||
 | 
						#  record for domain names.
 | 
				
			||||||
 | 
					#	ipv6addr = ::	# any.  ::1 == localhost
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  A note on DNS:  We STRONGLY recommend using IP addresses
 | 
				
			||||||
 | 
						#  rather than host names.  Using host names means that the
 | 
				
			||||||
 | 
						#  server will do DNS lookups when it starts, making it
 | 
				
			||||||
 | 
						#  dependent on DNS.  i.e. If anything goes wrong with DNS,
 | 
				
			||||||
 | 
						#  the server won't start!
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The server also looks up the IP address from DNS once, and
 | 
				
			||||||
 | 
						#  only once, when it starts.  If the DNS record is later
 | 
				
			||||||
 | 
						#  updated, the server WILL NOT see that update.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The transport protocol.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If unspecified, defaults to "udp", which is the traditional
 | 
				
			||||||
 | 
						#  RADIUS transport.  It may also be "tcp", in which case the
 | 
				
			||||||
 | 
						#  server will accept connections from this client ONLY over TCP.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						proto = *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The shared secret use to "encrypt" and "sign" packets between
 | 
				
			||||||
 | 
						#  the NAS and FreeRADIUS.  You MUST change this secret from the
 | 
				
			||||||
 | 
						#  default, otherwise it's not a secret any more!
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The secret can be any string, up to 8k characters in length.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Control codes can be entered vi octal encoding,
 | 
				
			||||||
 | 
						#	e.g. "\101\102" == "AB"
 | 
				
			||||||
 | 
						#  Quotation marks can be entered by escaping them,
 | 
				
			||||||
 | 
						#	e.g. "foo\"bar"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  A note on security:  The security of the RADIUS protocol
 | 
				
			||||||
 | 
						#  depends COMPLETELY on this secret!  We recommend using a
 | 
				
			||||||
 | 
						#  shared secret that is composed of:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	upper case letters
 | 
				
			||||||
 | 
						#	lower case letters
 | 
				
			||||||
 | 
						#	numbers
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  And is at LEAST 8 characters long, preferably 16 characters in
 | 
				
			||||||
 | 
						#  length.  The secret MUST be random, and should not be words,
 | 
				
			||||||
 | 
						#  phrase, or anything else that is recognisable.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The default secret below is only for testing, and should
 | 
				
			||||||
 | 
						#  not be used in any real environment.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						secret = testing123
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Old-style clients do not send a Message-Authenticator
 | 
				
			||||||
 | 
						#  in an Access-Request.  RFC 5080 suggests that all clients
 | 
				
			||||||
 | 
						#  SHOULD include it in an Access-Request.  The configuration
 | 
				
			||||||
 | 
						#  item below allows the server to require it.  If a client
 | 
				
			||||||
 | 
						#  is required to include a Message-Authenticator and it does
 | 
				
			||||||
 | 
						#  not, then the packet will be silently discarded.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  allowed values: yes, no
 | 
				
			||||||
 | 
						require_message_authenticator = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The short name is used as an alias for the fully qualified
 | 
				
			||||||
 | 
						#  domain name, or the IP address.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  It is accepted for compatibility with 1.x, but it is no
 | 
				
			||||||
 | 
						#  longer necessary in >= 2.0
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	shortname = localhost
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						# the following three fields are optional, but may be used by
 | 
				
			||||||
 | 
						# checkrad.pl for simultaneous use checks
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						# The nas_type tells 'checkrad.pl' which NAS-specific method to
 | 
				
			||||||
 | 
						#  use to query the NAS for simultaneous use.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Permitted NAS types are:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	cisco
 | 
				
			||||||
 | 
						#	computone
 | 
				
			||||||
 | 
						#	livingston
 | 
				
			||||||
 | 
						#	juniper
 | 
				
			||||||
 | 
						#	max40xx
 | 
				
			||||||
 | 
						#	multitech
 | 
				
			||||||
 | 
						#	netserver
 | 
				
			||||||
 | 
						#	pathras
 | 
				
			||||||
 | 
						#	patton
 | 
				
			||||||
 | 
						#	portslave
 | 
				
			||||||
 | 
						#	tc
 | 
				
			||||||
 | 
						#	usrhiper
 | 
				
			||||||
 | 
						#	other		# for all other types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						nas_type	 = other	# localhost isn't usually a NAS...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The following two configurations are for future use.
 | 
				
			||||||
 | 
						#  The 'naspasswd' file is currently used to store the NAS
 | 
				
			||||||
 | 
						#  login name and password, which is used by checkrad.pl
 | 
				
			||||||
 | 
						#  when querying the NAS for simultaneous use.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	login	   = !root
 | 
				
			||||||
 | 
					#	password	= someadminpas
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  As of 2.0, clients can also be tied to a virtual server.
 | 
				
			||||||
 | 
						#  This is done by setting the "virtual_server" configuration
 | 
				
			||||||
 | 
						#  item, as in the example below.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	virtual_server = home1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  A pointer to the "home_server_pool" OR a "home_server"
 | 
				
			||||||
 | 
						#  section that contains the CoA configuration for this
 | 
				
			||||||
 | 
						#  client.  For an example of a coa home server or pool,
 | 
				
			||||||
 | 
						#  see raddb/sites-available/originate-coa
 | 
				
			||||||
 | 
					#	coa_server = coa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Response window for proxied packets.  If non-zero,
 | 
				
			||||||
 | 
						#  then the lower of (home, client) response_window
 | 
				
			||||||
 | 
						#  will be used.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  i.e. it can be used to lower the response_window
 | 
				
			||||||
 | 
						#  packets from one client to a home server.  It cannot
 | 
				
			||||||
 | 
						#  be used to raise the response_window.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	response_window = 10.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Connection limiting for clients using "proto = tcp".
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This section is ignored for clients sending UDP traffic
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						limit {
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Limit the number of simultaneous TCP connections from a client
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The default is 16.
 | 
				
			||||||
 | 
							#  Setting this to 0 means "no limit"
 | 
				
			||||||
 | 
							max_connections = 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  The per-socket "max_requests" option does not exist.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The lifetime, in seconds, of a TCP connection.  After
 | 
				
			||||||
 | 
							#  this lifetime, the connection will be closed.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Setting this to 0 means "forever".
 | 
				
			||||||
 | 
							lifetime = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The idle timeout, in seconds, of a TCP connection.
 | 
				
			||||||
 | 
							#  If no packets have been received over the connection for
 | 
				
			||||||
 | 
							#  this time, the connection will be closed.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Setting this to 0 means "no timeout".
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  We STRONGLY RECOMMEND that you set an idle timeout.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							idle_timeout = 30
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# IPv6 Client
 | 
				
			||||||
 | 
					client localhost_ipv6 {
 | 
				
			||||||
 | 
						ipv6addr	= ::1
 | 
				
			||||||
 | 
						secret		= testing123
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# All IPv6 Site-local clients
 | 
				
			||||||
 | 
					#client sitelocal_ipv6 {
 | 
				
			||||||
 | 
					#	ipv6addr	= fe80::/16
 | 
				
			||||||
 | 
					#	secret		= testing123
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#client example.org {
 | 
				
			||||||
 | 
					#	ipaddr		= radius.example.org
 | 
				
			||||||
 | 
					#	secret		= testing123
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  You can now specify one secret for a network of clients.
 | 
				
			||||||
 | 
					#  When a client request comes in, the BEST match is chosen.
 | 
				
			||||||
 | 
					#  i.e. The entry from the smallest possible network.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#client private-network-1 {
 | 
				
			||||||
 | 
					#	ipaddr		= 192.0.2.0/24
 | 
				
			||||||
 | 
					#	secret		= testing123-1
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#client private-network-2 {
 | 
				
			||||||
 | 
					#	ipaddr		= 198.51.100.0/24
 | 
				
			||||||
 | 
					#	secret		= testing123-2
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Per-socket client lists.  The configuration entries are exactly
 | 
				
			||||||
 | 
					#  the same as above, but they are nested inside of a section.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  You can have as many per-socket client lists as you have "listen"
 | 
				
			||||||
 | 
					#  sections, or you can re-use a list among multiple "listen" sections.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Un-comment this section, and edit a "listen" section to add:
 | 
				
			||||||
 | 
					#  "clients = per_socket_clients".  That IP address/port combination
 | 
				
			||||||
 | 
					#  will then accept ONLY the clients listed in this section.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  There are additional considerations when using clients from SQL.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  A client can be link to a virtual server via modules such as SQL.
 | 
				
			||||||
 | 
					#  This link is done via the following process:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If there is no listener in a virtual server, SQL clients are added
 | 
				
			||||||
 | 
					#  to the global list for that virtual server.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If there is a listener, and the first listener does not have a
 | 
				
			||||||
 | 
					#  "clients=..." configuration item, SQL clients are added to the
 | 
				
			||||||
 | 
					#  global list.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If there is a listener, and the first one does have a "clients=..."
 | 
				
			||||||
 | 
					#  configuration item, SQL clients are added to that list.  The client
 | 
				
			||||||
 | 
					#  { ...} ` configured in that list are also added for that listener.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The only issue is if you have multiple listeners in a virtual
 | 
				
			||||||
 | 
					#  server, each with a different client list, then the SQL clients are
 | 
				
			||||||
 | 
					#  added only to the first listener.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#clients per_socket_clients {
 | 
				
			||||||
 | 
					#	client socket_client {
 | 
				
			||||||
 | 
					#		ipaddr = 192.0.2.4
 | 
				
			||||||
 | 
					#		secret = testing123
 | 
				
			||||||
 | 
					#	}
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
							
								
								
									
										712
									
								
								freeradius/mods-available/ldap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										712
									
								
								freeradius/mods-available/ldap
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,712 @@
 | 
				
			|||||||
 | 
					# -*- text -*-
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  $Id: 997d41efcbdf26282dad8bd87f051abecc6f88e9 $
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Lightweight Directory Access Protocol (LDAP)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					ldap {
 | 
				
			||||||
 | 
						#  Note that this needs to match the name(s) in the LDAP server
 | 
				
			||||||
 | 
						#  certificate, if you're using ldaps.  See OpenLDAP documentation
 | 
				
			||||||
 | 
						#  for the behavioral semantics of specifying more than one host.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Depending on the libldap in use, server may be an LDAP URI.
 | 
				
			||||||
 | 
						#  In the case of OpenLDAP this allows additional the following
 | 
				
			||||||
 | 
						#  additional schemes:
 | 
				
			||||||
 | 
						#  - ldaps:// (LDAP over SSL)
 | 
				
			||||||
 | 
						#  - ldapi:// (LDAP over Unix socket)
 | 
				
			||||||
 | 
						#  - ldapc:// (Connectionless LDAP)
 | 
				
			||||||
 | 
						server = 'localhost'
 | 
				
			||||||
 | 
					#	server = 'ldap.rrdns.example.org'
 | 
				
			||||||
 | 
					#	server = 'ldap.rrdns.example.org'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Port to connect on, defaults to 389, will be ignored for LDAP URIs.
 | 
				
			||||||
 | 
					#	port = 389
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Administrator account for searching and possibly modifying.
 | 
				
			||||||
 | 
						#  If using SASL + KRB5 these should be commented out.
 | 
				
			||||||
 | 
					#	identity = 'cn=admin,dc=example,dc=org'
 | 
				
			||||||
 | 
					#	password = mypass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Unless overridden in another section, the dn from which all
 | 
				
			||||||
 | 
						#  searches will start from.
 | 
				
			||||||
 | 
						base_dn = 'dc=example,dc=org'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You can run the 'ldapsearch' command line tool using the
 | 
				
			||||||
 | 
						#  parameters from this module's configuration.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#    ldapsearch -D ${identity} -w ${password} -h ${server}  -b 'CN=user,${base_dn}'
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  That will give you the LDAP information for 'user'.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Group membership can be queried by using the above "ldapsearch" string,
 | 
				
			||||||
 | 
						#  and adding "memberof" qualifiers.  For ActiveDirectory, use:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#    ldapsearch ... '(&(objectClass=user)(sAMAccountName=user)(memberof=CN=group,${base_dn}))'
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Where 'user' is the user as above, and 'group' is the group you are querying for.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  SASL parameters to use for admin binds
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  When we're prompted by the SASL library, these control
 | 
				
			||||||
 | 
						#  the responses given, as well as the identity and password
 | 
				
			||||||
 | 
						#  directives above.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If any directive is commented out, a NULL response will be
 | 
				
			||||||
 | 
						#  provided to cyrus-sasl.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Unfortunately the only way to control Keberos here is through
 | 
				
			||||||
 | 
						#  environmental variables, as cyrus-sasl provides no API to
 | 
				
			||||||
 | 
						#  set the krb5 config directly.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Full documentation for MIT krb5 can be found here:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	http://web.mit.edu/kerberos/krb5-devel/doc/admin/env_variables.html
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  At a minimum you probably want to set KRB5_CLIENT_KTNAME.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						sasl {
 | 
				
			||||||
 | 
							# SASL mechanism
 | 
				
			||||||
 | 
					#		mech = 'PLAIN'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# SASL authorisation identity to proxy.
 | 
				
			||||||
 | 
					#		proxy = 'autz_id'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# SASL realm. Used for kerberos.
 | 
				
			||||||
 | 
					#		realm = 'example.org'
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Generic valuepair attribute
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  If set, this will attribute will be retrieved in addition to any
 | 
				
			||||||
 | 
						#  mapped attributes.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Values should be in the format:
 | 
				
			||||||
 | 
						#  	<radius attr> <op> <value>
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Where:
 | 
				
			||||||
 | 
						#  	<radius attr>:	Is the attribute you wish to create
 | 
				
			||||||
 | 
						# 			with any valid list and request qualifiers.
 | 
				
			||||||
 | 
						#  	<op>: 		Is any assignment operator (=, :=, +=).
 | 
				
			||||||
 | 
						#  	<value>:	Is the value to parse into the new valuepair.
 | 
				
			||||||
 | 
						# 			If the value is wrapped in double quotes it
 | 
				
			||||||
 | 
						#			will be xlat expanded.
 | 
				
			||||||
 | 
					#	valuepair_attribute = 'radiusAttribute'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Mapping of LDAP directory attributes to RADIUS dictionary attributes.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  WARNING: Although this format is almost identical to the unlang
 | 
				
			||||||
 | 
						#  update section format, it does *NOT* mean that you can use other
 | 
				
			||||||
 | 
						#  unlang constructs in module configuration files.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Configuration items are in the format:
 | 
				
			||||||
 | 
						# 	<radius attr> <op> <ldap attr>
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Where:
 | 
				
			||||||
 | 
						#  	<radius attr>:	Is the destination RADIUS attribute
 | 
				
			||||||
 | 
						# 			with any valid list and request qualifiers.
 | 
				
			||||||
 | 
						#  	<op>: 		Is any assignment attribute (=, :=, +=, -=).
 | 
				
			||||||
 | 
						#  	<ldap attr>:	Is the attribute associated with user or
 | 
				
			||||||
 | 
						#			profile objects in the LDAP directory.
 | 
				
			||||||
 | 
						# 			If the attribute name is wrapped in double
 | 
				
			||||||
 | 
						# 			quotes it will be xlat expanded.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Request and list qualifiers may also be placed after the 'update'
 | 
				
			||||||
 | 
						#  section name to set defaults destination requests/lists
 | 
				
			||||||
 | 
						#  for unqualified RADIUS attributes.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Note: LDAP attribute names should be single quoted unless you want
 | 
				
			||||||
 | 
						#  the name value to be derived from an xlat expansion, or an
 | 
				
			||||||
 | 
						#  attribute ref.
 | 
				
			||||||
 | 
						update {
 | 
				
			||||||
 | 
							control:Password-With-Header	+= 'userPassword'
 | 
				
			||||||
 | 
					#		control:NT-Password		:= 'ntPassword'
 | 
				
			||||||
 | 
					#		reply:Reply-Message		:= 'radiusReplyMessage'
 | 
				
			||||||
 | 
					#		reply:Tunnel-Type		:= 'radiusTunnelType'
 | 
				
			||||||
 | 
					#		reply:Tunnel-Medium-Type	:= 'radiusTunnelMediumType'
 | 
				
			||||||
 | 
					#		reply:Tunnel-Private-Group-ID	:= 'radiusTunnelPrivategroupId'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Where only a list is specified as the RADIUS attribute,
 | 
				
			||||||
 | 
							#  the value of the LDAP attribute is parsed as a valuepair
 | 
				
			||||||
 | 
							#  in the same format as the 'valuepair_attribute' (above).
 | 
				
			||||||
 | 
							control:			+= 'radiusControlAttribute'
 | 
				
			||||||
 | 
							request:			+= 'radiusRequestAttribute'
 | 
				
			||||||
 | 
							reply:				+= 'radiusReplyAttribute'
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Set to yes if you have eDirectory and want to use the universal
 | 
				
			||||||
 | 
						#  password mechanism.
 | 
				
			||||||
 | 
					#	edir = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Set to yes if you want to bind as the user after retrieving the
 | 
				
			||||||
 | 
						#  Cleartext-Password. This will consume the login grace, and
 | 
				
			||||||
 | 
						#  verify user authorization.
 | 
				
			||||||
 | 
					#	edir_autz = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  LDAP "bind as user" configuration to check PAP passwords.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Active Directory needs "bind as user", which can be done by
 | 
				
			||||||
 | 
						#  adding the following "if" statement to the authorize {} section
 | 
				
			||||||
 | 
						#  of the virtual server, after the "ldap" module.  For
 | 
				
			||||||
 | 
						#  example:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#    ...
 | 
				
			||||||
 | 
						#    ldap
 | 
				
			||||||
 | 
						#    if ((ok || updated) && User-Password && !control:Auth-Type) {
 | 
				
			||||||
 | 
						#        update {
 | 
				
			||||||
 | 
						#            control:Auth-Type := ldap
 | 
				
			||||||
 | 
						#        }
 | 
				
			||||||
 | 
						#    }
 | 
				
			||||||
 | 
						#    ...
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You will also need to uncomment the "Auth-Type LDAP" block in the
 | 
				
			||||||
 | 
						#  "authenticate" section.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This configuration is required because AD will not return the users
 | 
				
			||||||
 | 
						#  "known good" password to FreeRADIUS.  Instead, FreeRADIUS has to run
 | 
				
			||||||
 | 
						#  "Auth-Type LDAP" in order to do an LDAP "bind as user", which will hand
 | 
				
			||||||
 | 
						#  the user name / password to AD for verification.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Name of the attribute that contains the user DN.
 | 
				
			||||||
 | 
						#  The default name is LDAP-UserDn.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you have multiple LDAP instances, you should
 | 
				
			||||||
 | 
						#  change this configuration item to:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	${.:instance}-LDAP-UserDn
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  That change allows the modules to set their own
 | 
				
			||||||
 | 
						#  User DN, and to not conflict with each other.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						user_dn = "LDAP-UserDn"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  User object identification.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						user {
 | 
				
			||||||
 | 
							#  Where to start searching in the tree for users
 | 
				
			||||||
 | 
							base_dn = "${..base_dn}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Filter for user objects, should be specific enough
 | 
				
			||||||
 | 
							#  to identify a single user object.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  For Active Directory, you should use
 | 
				
			||||||
 | 
							#  "samaccountname=" instead of "uid="
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  For Active Directory nested group, you should comment out the previous 'filter = ...'
 | 
				
			||||||
 | 
							#  and use the below. Where 'group' is the group you are querying for.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  NOTE: The string '1.2.840.113556.1.4.1941' specifies LDAP_MATCHING_RULE_IN_CHAIN.
 | 
				
			||||||
 | 
							#  This applies only to DN attributes. This is an extended match operator that walks
 | 
				
			||||||
 | 
							#  the chain of ancestry in objects all the way to the root until it finds a match.
 | 
				
			||||||
 | 
							#  This reveals group nesting. It is available only on domain controllers with
 | 
				
			||||||
 | 
							#  Windows Server 2003 SP2 or Windows Server 2008 (or above).
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  See: https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
					#		filter = "(&(objectClass=user)(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})(memberOf:1.2.840.113556.1.4.1941:=cn=group,${..base_dn}))"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  SASL parameters to use for user binds
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  When we're prompted by the SASL library, these control
 | 
				
			||||||
 | 
							#  the responses given.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Any of the config items below may be an attribute ref
 | 
				
			||||||
 | 
							#  or and expansion, so different SASL mechs, proxy IDs
 | 
				
			||||||
 | 
							#  and realms may be used for different users.
 | 
				
			||||||
 | 
							sasl {
 | 
				
			||||||
 | 
								# SASL mechanism
 | 
				
			||||||
 | 
					#			mech = 'PLAIN'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								# SASL authorisation identity to proxy.
 | 
				
			||||||
 | 
					#			proxy = &User-Name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								# SASL realm. Used for kerberos.
 | 
				
			||||||
 | 
					#			realm = 'example.org'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Search scope, may be 'base', 'one', sub' or 'children'
 | 
				
			||||||
 | 
					#		scope = 'sub'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Server side result sorting
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  A list of space delimited attributes to order the result
 | 
				
			||||||
 | 
							#  set by, if the filter matches multiple objects.
 | 
				
			||||||
 | 
							#  Only the first result in the set will be processed.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If the attribute name is prefixed with a hyphen '-' the
 | 
				
			||||||
 | 
							#  sorting order will be reversed for that attribute.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If sort_by is set, and the server does not support sorting
 | 
				
			||||||
 | 
							#  the search will fail.
 | 
				
			||||||
 | 
					#		sort_by = '-uid'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  If this is undefined, anyone is authorised.
 | 
				
			||||||
 | 
							#  If it is defined, the contents of this attribute
 | 
				
			||||||
 | 
							#  determine whether or not the user is authorised
 | 
				
			||||||
 | 
					#		access_attribute = 'dialupAccess'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Control whether the presence of 'access_attribute'
 | 
				
			||||||
 | 
							#  allows access, or denys access.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If 'yes', and the access_attribute is present, or
 | 
				
			||||||
 | 
							#  'no' and the access_attribute is absent then access
 | 
				
			||||||
 | 
							#  will be allowed.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If 'yes', and the access_attribute is absent, or
 | 
				
			||||||
 | 
							#  'no' and the access_attribute is present, then
 | 
				
			||||||
 | 
							#  access will not be allowed.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If the value of the access_attribute is 'false', it
 | 
				
			||||||
 | 
							#  will negate the result.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  e.g.
 | 
				
			||||||
 | 
							#    access_positive = yes
 | 
				
			||||||
 | 
							#    access_attribute = userAccessAllowed
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  With an LDAP object containing:
 | 
				
			||||||
 | 
							#    userAccessAllowed: false
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Will result in the user being locked out.
 | 
				
			||||||
 | 
					#		access_positive = yes
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  User membership checking.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						group {
 | 
				
			||||||
 | 
							#  Where to start searching in the tree for groups
 | 
				
			||||||
 | 
							base_dn = "${..base_dn}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Filter for group objects, should match all available
 | 
				
			||||||
 | 
							#  group objects a user might be a member of.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If using Active Directory you are likely to need "group"
 | 
				
			||||||
 | 
							#  instead of "posixGroup".
 | 
				
			||||||
 | 
							filter = '(objectClass=posixGroup)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Search scope, may be 'base', 'one', sub' or 'children'
 | 
				
			||||||
 | 
					#		scope = 'sub'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Attribute that uniquely identifies a group.
 | 
				
			||||||
 | 
							#  Is used when converting group DNs to group
 | 
				
			||||||
 | 
							#  names.
 | 
				
			||||||
 | 
					#		name_attribute = cn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Filter to find all group objects a user is a member of.
 | 
				
			||||||
 | 
							#  That is, group objects with attributes that
 | 
				
			||||||
 | 
							#  identify members (the inverse of membership_attribute).
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Note that this configuration references the "user_dn"
 | 
				
			||||||
 | 
							#  configuration defined above.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
					#		membership_filter = "(|(member=%{control:${..user_dn}})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  The attribute, in user objects, which contain the names
 | 
				
			||||||
 | 
							#  or DNs of groups a user is a member of.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Unless a conversion between group name and group DN is
 | 
				
			||||||
 | 
							#  needed, there's no requirement for the group objects
 | 
				
			||||||
 | 
							#  referenced to actually exist.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If the LDAP server does not support the "memberOf"
 | 
				
			||||||
 | 
							#  attribute (or equivalent), then you will need to use the
 | 
				
			||||||
 | 
							#  membership_filter option above instead. If you can't see
 | 
				
			||||||
 | 
							#  the memberOf attribute then it is also possible that the
 | 
				
			||||||
 | 
							#  LDAP bind user does not have the correct permissions to
 | 
				
			||||||
 | 
							#  view it.
 | 
				
			||||||
 | 
							membership_attribute = 'memberOf'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  If cacheable_name or cacheable_dn are enabled,
 | 
				
			||||||
 | 
							#  all group information for the user will be
 | 
				
			||||||
 | 
							#  retrieved from the directory and written to LDAP-Group
 | 
				
			||||||
 | 
							#  attributes appropriate for the instance of rlm_ldap.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  For group comparisons these attributes will be checked
 | 
				
			||||||
 | 
							#  instead of querying the LDAP directory directly.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  This feature is intended to be used with rlm_cache.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If you wish to use this feature, you should enable
 | 
				
			||||||
 | 
							#  the type that matches the format of your check items
 | 
				
			||||||
 | 
							#  i.e. if your groups are specified as DNs then enable
 | 
				
			||||||
 | 
							#  cacheable_dn else enable cacheable_name.
 | 
				
			||||||
 | 
					#		cacheable_name = 'no'
 | 
				
			||||||
 | 
					#		cacheable_dn = 'no'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Override the normal cache attribute (<inst>-LDAP-Group or
 | 
				
			||||||
 | 
							#  LDAP-Group if using the default instance) and create a
 | 
				
			||||||
 | 
							#  custom attribute.  This can help if multiple module instances
 | 
				
			||||||
 | 
							#  are used in fail-over.
 | 
				
			||||||
 | 
					#		cache_attribute = 'LDAP-Cached-Membership'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  If the group being checked is specified as a name, but
 | 
				
			||||||
 | 
							#  the user's groups are referenced by DN, and one of those
 | 
				
			||||||
 | 
							#  group DNs is invalid, the whole group check is treated as
 | 
				
			||||||
 | 
							#  invalid, and a negative result will be returned.
 | 
				
			||||||
 | 
							#  When set to 'yes', this option ignores invalid DN
 | 
				
			||||||
 | 
							#  references.
 | 
				
			||||||
 | 
					#		allow_dangling_group_ref = 'no'
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  User profiles. RADIUS profile objects contain sets of attributes
 | 
				
			||||||
 | 
						#  to insert into the request. These attributes are mapped using
 | 
				
			||||||
 | 
						#  the same mapping scheme applied to user objects (the update section above).
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						profile {
 | 
				
			||||||
 | 
							#  Filter for RADIUS profile objects
 | 
				
			||||||
 | 
					#		filter = '(objectclass=radiusprofile)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  The default profile.  This may be a DN or an attribute
 | 
				
			||||||
 | 
							#  reference.
 | 
				
			||||||
 | 
							#  To get old v2.2.x style behaviour, or to use the
 | 
				
			||||||
 | 
							#  &User-Profile attribute to specify the default profile,
 | 
				
			||||||
 | 
							#  set this to &control:User-Profile.
 | 
				
			||||||
 | 
					#		default = 'cn=radprofile,dc=example,dc=org'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  The LDAP attribute containing profile DNs to apply
 | 
				
			||||||
 | 
							#  in addition to the default profile above.  These are
 | 
				
			||||||
 | 
							#  retrieved from the user object, at the same time as the
 | 
				
			||||||
 | 
							#  attributes from the update section, are are applied
 | 
				
			||||||
 | 
							#  if authorization is successful.
 | 
				
			||||||
 | 
					#		attribute = 'radiusProfileDn'
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Bulk load clients from the directory
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						client {
 | 
				
			||||||
 | 
							#   Where to start searching in the tree for clients
 | 
				
			||||||
 | 
							base_dn = "${..base_dn}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Filter to match client objects
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							filter = '(objectClass=radiusClient)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Search scope, may be 'base', 'one', 'sub' or 'children'
 | 
				
			||||||
 | 
					#		scope = 'sub'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Sets default values (not obtained from LDAP) for new client entries
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							template {
 | 
				
			||||||
 | 
					#			login				= 'test'
 | 
				
			||||||
 | 
					#			password			= 'test'
 | 
				
			||||||
 | 
					#			proto	 			= tcp
 | 
				
			||||||
 | 
					#			require_message_authenticator	= yes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								# Uncomment to add a home_server with the same
 | 
				
			||||||
 | 
								# attributes as the client.
 | 
				
			||||||
 | 
					#			coa_server {
 | 
				
			||||||
 | 
					#				response_window = 2.0
 | 
				
			||||||
 | 
					#			}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Client attribute mappings are in the format:
 | 
				
			||||||
 | 
							#      <client attribute> = <ldap attribute>
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The following attributes are required:
 | 
				
			||||||
 | 
							#    * ipaddr | ipv4addr | ipv6addr - Client IP Address.
 | 
				
			||||||
 | 
							#    * secret - RADIUS shared secret.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  All other attributes usually supported in a client
 | 
				
			||||||
 | 
							#  definition are also supported here.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Schemas are available in doc/schemas/ldap for openldap and eDirectory
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							attribute {
 | 
				
			||||||
 | 
								ipaddr				= 'radiusClientIdentifier'
 | 
				
			||||||
 | 
								secret				= 'radiusClientSecret'
 | 
				
			||||||
 | 
					#			shortname			= 'radiusClientShortname'
 | 
				
			||||||
 | 
					#			nas_type			= 'radiusClientType'
 | 
				
			||||||
 | 
					#			virtual_server			= 'radiusClientVirtualServer'
 | 
				
			||||||
 | 
					#			require_message_authenticator	= 'radiusClientRequireMa'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Load clients on startup
 | 
				
			||||||
 | 
					#	read_clients = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Modify user object on receiving Accounting-Request
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Useful for recording things like the last time the user logged
 | 
				
			||||||
 | 
						#  in, or the Acct-Session-ID for CoA/DM.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  LDAP modification items are in the format:
 | 
				
			||||||
 | 
						# 	<ldap attr> <op> <value>
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Where:
 | 
				
			||||||
 | 
						#  	<ldap attr>:	The LDAP attribute to add modify or delete.
 | 
				
			||||||
 | 
						#  	<op>: 		One of the assignment operators:
 | 
				
			||||||
 | 
						#			(:=, +=, -=, ++).
 | 
				
			||||||
 | 
						#			Note: '=' is *not* supported.
 | 
				
			||||||
 | 
						#  	<value>:	The value to add modify or delete.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  WARNING: If using the ':=' operator with a multi-valued LDAP
 | 
				
			||||||
 | 
						#  attribute, all instances of the attribute will be removed and
 | 
				
			||||||
 | 
						#  replaced with a single attribute.
 | 
				
			||||||
 | 
						accounting {
 | 
				
			||||||
 | 
							reference = "%{tolower:type.%{Acct-Status-Type}}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							type {
 | 
				
			||||||
 | 
								start {
 | 
				
			||||||
 | 
									update {
 | 
				
			||||||
 | 
										description := "Online at %S"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								interim-update {
 | 
				
			||||||
 | 
									update {
 | 
				
			||||||
 | 
										description := "Last seen at %S"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								stop {
 | 
				
			||||||
 | 
									update {
 | 
				
			||||||
 | 
										description := "Offline at %S"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Post-Auth can modify LDAP objects too
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						post-auth {
 | 
				
			||||||
 | 
							update {
 | 
				
			||||||
 | 
								description := "Authenticated at %S"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  LDAP connection-specific options.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  These options set timeouts, keep-alives, etc. for the connections.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						options {
 | 
				
			||||||
 | 
							#  Control under which situations aliases are followed.
 | 
				
			||||||
 | 
							#  May be one of 'never', 'searching', 'finding' or 'always'
 | 
				
			||||||
 | 
							#  default: libldap's default which is usually 'never'.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  LDAP_OPT_DEREF is set to this value.
 | 
				
			||||||
 | 
					#		dereference = 'always'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The following two configuration items control whether the
 | 
				
			||||||
 | 
							#  server follows references returned by LDAP directory.
 | 
				
			||||||
 | 
							#  They are  mostly for Active Directory compatibility.
 | 
				
			||||||
 | 
							#  If you set these to 'no', then searches will likely return
 | 
				
			||||||
 | 
							#  'operations error', instead of a useful result.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  'rebind' causes any connections being established to follow
 | 
				
			||||||
 | 
							#  referrals to be bound using the admin credentials defined
 | 
				
			||||||
 | 
							#  for this module.  If it is set to 'no' libldap will bind
 | 
				
			||||||
 | 
							#  to those connections anonymously.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							chase_referrals = yes
 | 
				
			||||||
 | 
							rebind = yes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# SASL Security Properties (see SASL_SECPROPS in ldap.conf man page).
 | 
				
			||||||
 | 
							# Note - uncomment when using GSS-API sasl mechanism along with TLS
 | 
				
			||||||
 | 
							# encryption against Active-Directory LDAP servers (this disables
 | 
				
			||||||
 | 
							# sealing and signing at the GSS level as required by AD).
 | 
				
			||||||
 | 
							#sasl_secprops = 'noanonymous,noplain,maxssf=0'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Seconds to wait for LDAP query to finish. default: 20
 | 
				
			||||||
 | 
							res_timeout = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Seconds LDAP server has to process the query (server-side
 | 
				
			||||||
 | 
							#  time limit). default: 20
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  LDAP_OPT_TIMELIMIT is set to this value.
 | 
				
			||||||
 | 
							srv_timelimit = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Seconds to wait for response of the server. (network
 | 
				
			||||||
 | 
							#  failures) default: 10
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  LDAP_OPT_NETWORK_TIMEOUT is set to this value.
 | 
				
			||||||
 | 
							net_timeout = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  LDAP_OPT_X_KEEPALIVE_IDLE
 | 
				
			||||||
 | 
							idle = 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  LDAP_OPT_X_KEEPALIVE_PROBES
 | 
				
			||||||
 | 
							probes = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  LDAP_OPT_X_KEEPALIVE_INTERVAL
 | 
				
			||||||
 | 
							interval = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  ldap_debug: debug flag for LDAP SDK
 | 
				
			||||||
 | 
							#  (see OpenLDAP documentation).  Set this to enable
 | 
				
			||||||
 | 
							#  huge amounts of LDAP debugging on the screen.
 | 
				
			||||||
 | 
							#  You should only use this if you are an LDAP expert.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#	default: 0x0000 (no debugging messages)
 | 
				
			||||||
 | 
							#	Example:(LDAP_DEBUG_FILTER+LDAP_DEBUG_CONNS)
 | 
				
			||||||
 | 
							ldap_debug = 0x0028
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This subsection configures the tls related items
 | 
				
			||||||
 | 
						#  that control how FreeRADIUS connects to an LDAP
 | 
				
			||||||
 | 
						#  server.  It contains all of the 'tls_*' configuration
 | 
				
			||||||
 | 
						#  entries used in older versions of FreeRADIUS.  Those
 | 
				
			||||||
 | 
						#  configuration entries can still be used, but we recommend
 | 
				
			||||||
 | 
						#  using these.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Note that some distributions use NSS for libldap instead
 | 
				
			||||||
 | 
						#  of OpenSSL.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you see something like this in the debug output:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	TLSMC: MozNSS compatibility interception begins.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Then there is a problem.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	THIS LDAP INSTALLATION WILL NOT WORK WITH FREERADIUS.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You MUST install fixed LDAP libraries which use OpenSSL.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  For more details, see:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	http://packages.networkradius.com
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						tls {
 | 
				
			||||||
 | 
							# Set this to 'yes' to use TLS encrypted connections
 | 
				
			||||||
 | 
							# to the LDAP database by using the StartTLS extended
 | 
				
			||||||
 | 
							# operation.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							# The StartTLS operation is supposed to be
 | 
				
			||||||
 | 
							# used with normal ldap connections instead of
 | 
				
			||||||
 | 
							# using ldaps (port 636) connections
 | 
				
			||||||
 | 
					#		start_tls = yes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#		ca_file	= ${certdir}/cacert.pem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#		ca_path	= ${certdir}
 | 
				
			||||||
 | 
					#		certificate_file = /path/to/radius.crt
 | 
				
			||||||
 | 
					#		private_key_file = /path/to/radius.key
 | 
				
			||||||
 | 
					#		random_file = /dev/urandom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 		#  Certificate Verification requirements.  Can be:
 | 
				
			||||||
 | 
							#    'never' (do not even bother trying)
 | 
				
			||||||
 | 
					 		#    'allow' (try, but don't fail if the certificate
 | 
				
			||||||
 | 
							#		cannot be verified)
 | 
				
			||||||
 | 
							#    'demand' (fail if the certificate does not verify)
 | 
				
			||||||
 | 
							#    'hard'  (similar to 'demand' but fails if TLS
 | 
				
			||||||
 | 
							#             cannot negotiate)
 | 
				
			||||||
 | 
					 		#
 | 
				
			||||||
 | 
							#  The default is libldap's default, which varies based
 | 
				
			||||||
 | 
							#  on the contents of ldap.conf.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#		require_cert	= 'demand'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Check the CRL, as with the EAP module.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The default is "no".
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
					#		check_crl = yes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Minimum TLS version to accept. We STRONGLY recommend
 | 
				
			||||||
 | 
							#  setting this to "1.2"
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
					#		tls_min_version = "1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Set this option to specify the allowed
 | 
				
			||||||
 | 
							#  TLS cipher suites.  The format is listed
 | 
				
			||||||
 | 
							#  in "man 1 ciphers".
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							cipher_list = "DEFAULT"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  As of v3, the 'pool' section has replaced the
 | 
				
			||||||
 | 
						#  following v2 configuration items:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  ldap_connections_number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The connection pool is used to pool outgoing connections.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  When the server is not threaded, the connection pool
 | 
				
			||||||
 | 
						#  limits are ignored, and only one connection is used.
 | 
				
			||||||
 | 
						pool {
 | 
				
			||||||
 | 
							#  Connections to create during module instantiation.
 | 
				
			||||||
 | 
							#  If the server cannot create specified number of
 | 
				
			||||||
 | 
							#  connections during instantiation it will exit.
 | 
				
			||||||
 | 
							#  Set to 0 to allow the server to start without the
 | 
				
			||||||
 | 
							#  directory being available.
 | 
				
			||||||
 | 
							start = ${thread[pool].start_servers}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Minimum number of connections to keep open
 | 
				
			||||||
 | 
							min = ${thread[pool].min_spare_servers}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Maximum number of connections
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  If these connections are all in use and a new one
 | 
				
			||||||
 | 
							#  is requested, the request will NOT get a connection.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Setting 'max' to LESS than the number of threads means
 | 
				
			||||||
 | 
							#  that some threads may starve, and you will see errors
 | 
				
			||||||
 | 
							#  like 'No connections available and at max connection limit'
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Setting 'max' to MORE than the number of threads means
 | 
				
			||||||
 | 
							#  that there are more connections than necessary.
 | 
				
			||||||
 | 
							max = ${thread[pool].max_servers}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Spare connections to be left idle
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  NOTE: Idle connections WILL be closed if "idle_timeout"
 | 
				
			||||||
 | 
							#  is set.  This should be less than or equal to "max" above.
 | 
				
			||||||
 | 
							spare = ${thread[pool].max_spare_servers}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Number of uses before the connection is closed
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  0 means "infinite"
 | 
				
			||||||
 | 
							uses = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  The number of seconds to wait after the server tries
 | 
				
			||||||
 | 
							#  to open a connection, and fails.  During this time,
 | 
				
			||||||
 | 
							#  no new connections will be opened.
 | 
				
			||||||
 | 
							retry_delay = 30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  The lifetime (in seconds) of the connection
 | 
				
			||||||
 | 
							lifetime = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Idle timeout (in seconds).  A connection which is
 | 
				
			||||||
 | 
							#  unused for this length of time will be closed.
 | 
				
			||||||
 | 
							idle_timeout = 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  NOTE: All configuration settings are enforced.  If a
 | 
				
			||||||
 | 
							#  connection is closed because of 'idle_timeout',
 | 
				
			||||||
 | 
							#  'uses', or 'lifetime', then the total number of
 | 
				
			||||||
 | 
							#  connections MAY fall below 'min'.  When that
 | 
				
			||||||
 | 
							#  happens, it will open a new connection.  It will
 | 
				
			||||||
 | 
							#  also log a WARNING message.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  The solution is to either lower the 'min' connections,
 | 
				
			||||||
 | 
							#  or increase lifetime/idle_timeout.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#  Maximum number of times an operation can be retried
 | 
				
			||||||
 | 
							#  if it returns an error which indicates the connection
 | 
				
			||||||
 | 
							#  needs to be restarted.  This includes timeouts.
 | 
				
			||||||
 | 
							max_retries = 5
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										902
									
								
								freeradius/radiusd.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										902
									
								
								freeradius/radiusd.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,902 @@
 | 
				
			|||||||
 | 
					# -*- text -*-
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					## radiusd.conf	-- FreeRADIUS server configuration file - 3.2.3
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					##	http://www.freeradius.org/
 | 
				
			||||||
 | 
					##	$Id: 366dce419dee0e4ab8ea47351f6f2953bcba2899 $
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	The format of this (and other) configuration file is
 | 
				
			||||||
 | 
					#	documented in "man unlang".  There are also READMEs in many
 | 
				
			||||||
 | 
					#	subdirectories:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	  raddb/README.rst
 | 
				
			||||||
 | 
					#		How to upgrade from v2.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	  raddb/mods-available/README.rst
 | 
				
			||||||
 | 
					#		How to use mods-available / mods-enabled.
 | 
				
			||||||
 | 
					#		All of the modules are in individual files,
 | 
				
			||||||
 | 
					#		along with configuration items and full documentation.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	  raddb/sites-available/README
 | 
				
			||||||
 | 
					#		virtual servers, "listen" sections, clients, etc.
 | 
				
			||||||
 | 
					#		The "sites-available" directory contains many
 | 
				
			||||||
 | 
					#		worked examples of common configurations.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	  raddb/certs/README.md
 | 
				
			||||||
 | 
					#		How to create certificates for EAP or RadSec.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Every configuration item in the server is documented
 | 
				
			||||||
 | 
					#	extensively in the comments in the example configuration
 | 
				
			||||||
 | 
					#	files.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Before editing this (or any other) configuration file, PLEASE
 | 
				
			||||||
 | 
					#	read "man radiusd".  See the section titled DEBUGGING.  It
 | 
				
			||||||
 | 
					#	outlines a method where you can quickly create the
 | 
				
			||||||
 | 
					#	configuration you want, with minimal effort.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Run the server in debugging mode, and READ the output.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#		$ radiusd -X
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	We cannot emphasize this point strongly enough.  The vast
 | 
				
			||||||
 | 
					#	majority of problems can be solved by carefully reading the
 | 
				
			||||||
 | 
					#	debugging output, which includes warnings about common issues,
 | 
				
			||||||
 | 
					#	and suggestions for how they may be fixed.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	There may be a lot of output, but look carefully for words like:
 | 
				
			||||||
 | 
					#	"warning", "error", "reject", or "failure".  The messages there
 | 
				
			||||||
 | 
					#	will usually be enough to guide you to a solution.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	More documentation on "radiusd -X" is available on the wiki:
 | 
				
			||||||
 | 
					#		https://wiki.freeradius.org/radiusd-X
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	If you are going to ask a question on the mailing list, then
 | 
				
			||||||
 | 
					#	explain what you are trying to do, and include the output from
 | 
				
			||||||
 | 
					#	debugging mode (radiusd -X).  Failure to do so means that all
 | 
				
			||||||
 | 
					#	of the responses to your question will be people telling you
 | 
				
			||||||
 | 
					#	to "post the output of radiusd -X".
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Guidelines for posting to the mailing list are on the wiki:
 | 
				
			||||||
 | 
					#		https://wiki.freeradius.org/list-help
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Please read those guidelines before posting to the list.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Further documentation is available in the "doc" directory
 | 
				
			||||||
 | 
					#	of the server distribution, or on the wiki at:
 | 
				
			||||||
 | 
					#		https://wiki.freeradius.org/
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	New users to RADIUS should read the Technical Guide.  That guide
 | 
				
			||||||
 | 
					#	explains how RADIUS works, how FreeRADIUS works, and what each
 | 
				
			||||||
 | 
					#	part of a RADIUS system does.  It is not just "configure FreeRADIUS"!
 | 
				
			||||||
 | 
					#		https://networkradius.com/doc/FreeRADIUS-Technical-Guide.pdf
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	More documentation on dictionaries, modules, unlang, etc. is also
 | 
				
			||||||
 | 
					#	available on the Network RADIUS web site:
 | 
				
			||||||
 | 
					#		https://networkradius.com/freeradius-documentation/
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prefix = /usr
 | 
				
			||||||
 | 
					exec_prefix = /usr
 | 
				
			||||||
 | 
					sysconfdir = /etc
 | 
				
			||||||
 | 
					localstatedir = /var
 | 
				
			||||||
 | 
					sbindir = ${exec_prefix}/sbin
 | 
				
			||||||
 | 
					logdir = /var/log/freeradius
 | 
				
			||||||
 | 
					raddbdir = /etc/freeradius
 | 
				
			||||||
 | 
					radacctdir = ${logdir}/radacct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  name of the running server.  See also the "-n" command-line option.
 | 
				
			||||||
 | 
					name = freeradius
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  Location of config and logfiles.
 | 
				
			||||||
 | 
					confdir = ${raddbdir}
 | 
				
			||||||
 | 
					modconfdir = ${confdir}/mods-config
 | 
				
			||||||
 | 
					certdir = ${confdir}/certs
 | 
				
			||||||
 | 
					cadir   = ${confdir}/certs
 | 
				
			||||||
 | 
					run_dir = ${localstatedir}/run/${name}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Should likely be ${localstatedir}/lib/radiusd
 | 
				
			||||||
 | 
					db_dir = ${raddbdir}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# libdir: Where to find the rlm_* modules.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   This should be automatically set at configuration time.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   If the server builds and installs, but fails at execution time
 | 
				
			||||||
 | 
					#   with an 'undefined symbol' error, then you can use the libdir
 | 
				
			||||||
 | 
					#   directive to work around the problem.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   The cause is usually that a library has been installed on your
 | 
				
			||||||
 | 
					#   system in a place where the dynamic linker CANNOT find it.  When
 | 
				
			||||||
 | 
					#   executing as root (or another user), your personal environment MAY
 | 
				
			||||||
 | 
					#   be set up to allow the dynamic linker to find the library.  When
 | 
				
			||||||
 | 
					#   executing as a daemon, FreeRADIUS MAY NOT have the same
 | 
				
			||||||
 | 
					#   personalized configuration.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   To work around the problem, find out which library contains that symbol,
 | 
				
			||||||
 | 
					#   and add the directory containing that library to the end of 'libdir',
 | 
				
			||||||
 | 
					#   with a colon separating the directory names.  NO spaces are allowed.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   e.g. libdir = /usr/local/lib:/opt/package/lib
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   You can also try setting the LD_LIBRARY_PATH environment variable
 | 
				
			||||||
 | 
					#   in a script which starts the server.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   If that does not work, then you can re-configure and re-build the
 | 
				
			||||||
 | 
					#   server to NOT use shared libraries, via:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	./configure --disable-shared
 | 
				
			||||||
 | 
					#	make
 | 
				
			||||||
 | 
					#	make install
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					libdir = /usr/lib/freeradius
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  pidfile: Where to place the PID of the RADIUS server.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The server may be signalled while it's running by using this
 | 
				
			||||||
 | 
					#  file.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This file is written when ONLY running in daemon mode.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  e.g.:  kill -HUP `cat /var/run/radiusd/radiusd.pid`
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					pidfile = ${run_dir}/${name}.pid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  panic_action: Command to execute if the server dies unexpectedly.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  FOR PRODUCTION SYSTEMS, ACTIONS SHOULD ALWAYS EXIT.
 | 
				
			||||||
 | 
					#  AN INTERACTIVE ACTION MEANS THE SERVER IS NOT RESPONDING TO REQUESTS.
 | 
				
			||||||
 | 
					#  AN INTERACTICE ACTION MEANS THE SERVER WILL NOT RESTART.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  THE SERVER MUST NOT BE ALLOWED EXECUTE UNTRUSTED PANIC ACTION CODE
 | 
				
			||||||
 | 
					#  PATTACH CAN BE USED AS AN ATTACK VECTOR.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The panic action is a command which will be executed if the server
 | 
				
			||||||
 | 
					#  receives a fatal, non user generated signal, i.e. SIGSEGV, SIGBUS,
 | 
				
			||||||
 | 
					#  SIGABRT or SIGFPE.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This can be used to start an interactive debugging session so
 | 
				
			||||||
 | 
					#  that information regarding the current state of the server can
 | 
				
			||||||
 | 
					#  be acquired.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The following string substitutions are available:
 | 
				
			||||||
 | 
					#  - %e   The currently executing program e.g. /sbin/radiusd
 | 
				
			||||||
 | 
					#  - %p   The PID of the currently executing program e.g. 12345
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Standard ${} substitutions are also allowed.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  An example panic action for opening an interactive session in GDB would be:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#panic_action = "gdb %e %p"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Again, don't use that on a production system.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  An example panic action for opening an automated session in GDB would be:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#panic_action = "gdb -silent -x ${raddbdir}/panic.gdb %e %p 2>&1 | tee ${logdir}/gdb-${name}-%p.log"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  That command can be used on a production system.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  max_request_time: The maximum time (in seconds) to handle a request.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Requests which take more time than this to process may be killed, and
 | 
				
			||||||
 | 
					#  a REJECT message is returned.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  WARNING: If you notice that requests take a long time to be handled,
 | 
				
			||||||
 | 
					#  then this MAY INDICATE a bug in the server, in one of the modules
 | 
				
			||||||
 | 
					#  used to handle a request, OR in your local configuration.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This problem is most often seen when using an SQL database.  If it takes
 | 
				
			||||||
 | 
					#  more than a second or two to receive an answer from the SQL database,
 | 
				
			||||||
 | 
					#  then it probably means that you haven't indexed the database.  See your
 | 
				
			||||||
 | 
					#  SQL server documentation for more information.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Useful range of values: 5 to 120
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					max_request_time = 30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  cleanup_delay: The time to wait (in seconds) before cleaning up
 | 
				
			||||||
 | 
					#  a reply which was sent to the NAS.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The RADIUS request is normally cached internally for a short period
 | 
				
			||||||
 | 
					#  of time, after the reply is sent to the NAS.  The reply packet may be
 | 
				
			||||||
 | 
					#  lost in the network, and the NAS will not see it.  The NAS will then
 | 
				
			||||||
 | 
					#  re-send the request, and the server will respond quickly with the
 | 
				
			||||||
 | 
					#  cached reply.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If this value is set too low, then duplicate requests from the NAS
 | 
				
			||||||
 | 
					#  MAY NOT be detected, and will instead be handled as separate requests.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If this value is set too high, then the server will cache too many
 | 
				
			||||||
 | 
					#  requests, and some new requests may get blocked.  (See 'max_requests'.)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Useful range of values: 2 to 30
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					cleanup_delay = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  max_requests: The maximum number of requests which the server keeps
 | 
				
			||||||
 | 
					#  track of.  This should be 256 multiplied by the number of clients.
 | 
				
			||||||
 | 
					#  e.g. With 4 clients, this number should be 1024.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If this number is too low, then when the server becomes busy,
 | 
				
			||||||
 | 
					#  it will not respond to any new requests, until the 'cleanup_delay'
 | 
				
			||||||
 | 
					#  time has passed, and it has removed the old requests.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If this number is set too high, then the server will use a bit more
 | 
				
			||||||
 | 
					#  memory for no real benefit.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If you aren't sure what it should be set to, it's better to set it
 | 
				
			||||||
 | 
					#  too high than too low.  Setting it to 1000 per client is probably
 | 
				
			||||||
 | 
					#  the highest it should be.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Useful range of values: 256 to infinity
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					max_requests = 16384
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  hostname_lookups: Log the names of clients or just their IP addresses
 | 
				
			||||||
 | 
					#  e.g., www.freeradius.org (on) or 206.47.27.232 (off).
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The default is 'off' because it would be overall better for the net
 | 
				
			||||||
 | 
					#  if people had to knowingly turn this feature on, since enabling it
 | 
				
			||||||
 | 
					#  means that each client request will result in AT LEAST one lookup
 | 
				
			||||||
 | 
					#  request to the nameserver.   Enabling hostname_lookups will also
 | 
				
			||||||
 | 
					#  mean that your server may stop randomly for 30 seconds from time
 | 
				
			||||||
 | 
					#  to time, if the DNS requests take too long.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Turning hostname lookups off also means that the server won't block
 | 
				
			||||||
 | 
					#  for 30 seconds, if it sees an IP address which has no name associated
 | 
				
			||||||
 | 
					#  with it.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  allowed values: {no, yes}
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					hostname_lookups = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Run a "Post-Auth-Type Client-Lost" section.  This ONLY happens when
 | 
				
			||||||
 | 
					#  the server sends an Access-Challenge, and then client does not
 | 
				
			||||||
 | 
					#  respond to it.  The goal is to allow administrators to log
 | 
				
			||||||
 | 
					#  something when the client does not respond.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  See sites-available/default, "Post-Auth-Type Client-Lost" for more
 | 
				
			||||||
 | 
					#  information.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#postauth_client_lost = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Logging section.  The various "log_*" configuration items
 | 
				
			||||||
 | 
					#  will eventually be moved here.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					log {
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Destination for log messages.  This can be one of:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	files - log to "file", as defined below.
 | 
				
			||||||
 | 
						#	syslog - to syslog (see also the "syslog_facility", below.
 | 
				
			||||||
 | 
						#	stdout - standard output
 | 
				
			||||||
 | 
						#	stderr - standard error.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The command-line option "-X" over-rides this option, and forces
 | 
				
			||||||
 | 
						#  logging to go to stdout.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						destination = files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Highlight important messages sent to stderr and stdout.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Option will be ignored (disabled) if output if TERM is not
 | 
				
			||||||
 | 
						#  an xterm or output is not to a TTY.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						colourise = yes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The logging messages for the server are appended to the
 | 
				
			||||||
 | 
						#  tail of this file if destination == "files"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If the server is running in debugging mode, this file is
 | 
				
			||||||
 | 
						#  NOT used.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						file = ${logdir}/radius.log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Which syslog facility to use, if ${destination} == "syslog"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The exact values permitted here are OS-dependent.  You probably
 | 
				
			||||||
 | 
						#  don't want to change this.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						syslog_facility = daemon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Log the full User-Name attribute, as it was found in the request.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						# allowed values: {no, yes}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						stripped_names = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Log all (accept and reject) authentication results to the log file.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This is the same as setting "auth_accept = yes" and
 | 
				
			||||||
 | 
						#  "auth_reject = yes"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  allowed values: {no, yes}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						auth = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Log Access-Accept results to the log file.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This is only used if "auth = no"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  allowed values: {no, yes}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	auth_accept = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Log Access-Reject results to the log file.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This is only used if "auth = no"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  allowed values: {no, yes}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	auth_reject = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Log passwords with the authentication requests.
 | 
				
			||||||
 | 
						#  auth_badpass  - logs password if it's rejected
 | 
				
			||||||
 | 
						#  auth_goodpass - logs password if it's correct
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  allowed values: {no, yes}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						auth_badpass = no
 | 
				
			||||||
 | 
						auth_goodpass = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Log additional text at the end of the "Login OK" messages.
 | 
				
			||||||
 | 
						#  for these to work, the "auth" and "auth_goodpass" or "auth_badpass"
 | 
				
			||||||
 | 
						#  configurations above have to be set to "yes".
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The strings below are dynamically expanded, which means that
 | 
				
			||||||
 | 
						#  you can put anything you want in them.  However, note that
 | 
				
			||||||
 | 
						#  this expansion can be slow, and can negatively impact server
 | 
				
			||||||
 | 
						#  performance.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	msg_goodpass = ""
 | 
				
			||||||
 | 
					#	msg_badpass = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  The message when the user exceeds the Simultaneous-Use limit.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						msg_denied = "You are already logged in - access denied"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Suppress "secret" attributes when printing them in debug mode.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Secrets are NOT tracked across xlat expansions.  If your
 | 
				
			||||||
 | 
						#  configuration puts secrets into other strings, they will
 | 
				
			||||||
 | 
						#  still get printed.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Setting this to "yes" means that the server prints
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	<<< secret >>>
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  instead of the value, for attriburtes which contain secret
 | 
				
			||||||
 | 
						#  information.  e.g. User-Name, Tunnel-Password, etc.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This configuration is disabled by default.  It is extremely
 | 
				
			||||||
 | 
						#  important for administrators to be able to debug user logins
 | 
				
			||||||
 | 
						#  by seeing what is actually being sent.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	suppress_secrets = no
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  The program to execute to do concurrency checks.
 | 
				
			||||||
 | 
					checkrad = ${sbindir}/checkrad
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  ENVIRONMENT VARIABLES
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  You can reference environment variables using an expansion like
 | 
				
			||||||
 | 
					#  `$ENV{PATH}`.  However it is sometimes useful to be able to also set
 | 
				
			||||||
 | 
					#  environment variables.  This section lets you do that.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The main purpose of this section is to allow administrators to keep
 | 
				
			||||||
 | 
					#  RADIUS-specific configuration in the RADIUS configuration files.
 | 
				
			||||||
 | 
					#  For example, if you need to set an environment variable which is
 | 
				
			||||||
 | 
					#  used by a module.  You could put that variable into a shell script,
 | 
				
			||||||
 | 
					#  but that's awkward.  Instead, just list it here.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Note that these environment variables are set AFTER the
 | 
				
			||||||
 | 
					#  configuration file is loaded.  So you cannot set FOO here, and
 | 
				
			||||||
 | 
					#  expect to reference it via `$ENV{FOO}` in another configuration file.
 | 
				
			||||||
 | 
					#  You should instead just use a normal configuration variable for
 | 
				
			||||||
 | 
					#  that.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					ENV {
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Set environment varable `FOO` to value '/bar/baz'.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  NOTE: Note that you MUST use '='.  You CANNOT use '+=' to append
 | 
				
			||||||
 | 
						#  values.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	FOO = '/bar/baz'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Delete environment variable `BAR`.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	BAR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  `LD_PRELOAD` is special.  It is normally set before the
 | 
				
			||||||
 | 
						#  application runs, and is interpreted by the dynamic linker.
 | 
				
			||||||
 | 
						#  Which means you cannot set it inside of an application, and
 | 
				
			||||||
 | 
						#  expect it to load libraries.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Since this functionality is useful, we extend it here.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You can set
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  LD_PRELOAD = /path/to/library.so
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  and the server will load the named libraries.  Multiple
 | 
				
			||||||
 | 
						#  libraries can be loaded by specificing multiple individual
 | 
				
			||||||
 | 
						#  `LD_PRELOAD` entries.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	LD_PRELOAD = /path/to/library1.so
 | 
				
			||||||
 | 
					#	LD_PRELOAD = /path/to/library2.so
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SECURITY CONFIGURATION
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  There may be multiple methods of attacking on the server.  This
 | 
				
			||||||
 | 
					#  section holds the configuration items which minimize the impact
 | 
				
			||||||
 | 
					#  of those attacks
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					security {
 | 
				
			||||||
 | 
						#  chroot: directory where the server does "chroot".
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The chroot is done very early in the process of starting
 | 
				
			||||||
 | 
						#  the server.  After the chroot has been performed it
 | 
				
			||||||
 | 
						#  switches to the "user" listed below (which MUST be
 | 
				
			||||||
 | 
						#  specified).  If "group" is specified, it switches to that
 | 
				
			||||||
 | 
						#  group, too.  Any other groups listed for the specified
 | 
				
			||||||
 | 
						#  "user" in "/etc/group" are also added as part of this
 | 
				
			||||||
 | 
						#  process.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The current working directory (chdir / cd) is left
 | 
				
			||||||
 | 
						#  *outside* of the chroot until all of the modules have been
 | 
				
			||||||
 | 
						#  initialized.  This allows the "raddb" directory to be left
 | 
				
			||||||
 | 
						#  outside of the chroot.  Once the modules have been
 | 
				
			||||||
 | 
						#  initialized, it does a "chdir" to ${logdir}.  This means
 | 
				
			||||||
 | 
						#  that it should be impossible to break out of the chroot.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you are worried about security issues related to this
 | 
				
			||||||
 | 
						#  use of chdir, then simply ensure that the "raddb" directory
 | 
				
			||||||
 | 
						#  is inside of the chroot, and be sure to do "cd raddb"
 | 
				
			||||||
 | 
						#  BEFORE starting the server.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If the server is statically linked, then the only files
 | 
				
			||||||
 | 
						#  that have to exist in the chroot are ${run_dir} and
 | 
				
			||||||
 | 
						#  ${logdir}.  If you do the "cd raddb" as discussed above,
 | 
				
			||||||
 | 
						#  then the "raddb" directory has to be inside of the chroot
 | 
				
			||||||
 | 
						#  directory, too.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	chroot = /path/to/chroot/directory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# user/group: The name (or #number) of the user/group to run radiusd as.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#   If these are commented out, the server will run as the
 | 
				
			||||||
 | 
						#   user/group that started it.  In order to change to a
 | 
				
			||||||
 | 
						#   different user/group, you MUST be root ( or have root
 | 
				
			||||||
 | 
						#   privileges ) to start the server.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#   We STRONGLY recommend that you run the server with as few
 | 
				
			||||||
 | 
						#   permissions as possible.  That is, if you're not using
 | 
				
			||||||
 | 
						#   shadow passwords, the user and group items below should be
 | 
				
			||||||
 | 
						#   set to radius'.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  NOTE that some kernels refuse to setgid(group) when the
 | 
				
			||||||
 | 
						#  value of (unsigned)group is above 60000; don't use group
 | 
				
			||||||
 | 
						#  "nobody" on these systems!
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  On systems with shadow passwords, you might have to set
 | 
				
			||||||
 | 
						#  'group = shadow' for the server to be able to read the
 | 
				
			||||||
 | 
						#  shadow password file.  If you can authenticate users while
 | 
				
			||||||
 | 
						#  in debug mode, but not in daemon mode, it may be that the
 | 
				
			||||||
 | 
						#  debugging mode server is running as a user that can read
 | 
				
			||||||
 | 
						#  the shadow info, and the user listed below can not.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The server will also try to use "initgroups" to read
 | 
				
			||||||
 | 
						#  /etc/groups.  It will join all groups where "user" is a
 | 
				
			||||||
 | 
						#  member.  This can allow for some finer-grained access
 | 
				
			||||||
 | 
						#  controls.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						user = freerad
 | 
				
			||||||
 | 
						group = freerad
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Core dumps are a bad thing.  This should only be set to
 | 
				
			||||||
 | 
						#  'yes' if you're debugging a problem with the server.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  allowed values: {no, yes}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						allow_core_dumps = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  max_attributes: The maximum number of attributes
 | 
				
			||||||
 | 
						#  permitted in a RADIUS packet.  Packets which have MORE
 | 
				
			||||||
 | 
						#  than this number of attributes in them will be dropped.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If this number is set too low, then no RADIUS packets
 | 
				
			||||||
 | 
						#  will be accepted.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If this number is set too high, then an attacker may be
 | 
				
			||||||
 | 
						#  able to send a small number of packets which will cause
 | 
				
			||||||
 | 
						#  the server to use all available memory on the machine.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Setting this number to 0 means "allow any number of attributes"
 | 
				
			||||||
 | 
						max_attributes = 200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  reject_delay: When sending an Access-Reject, it can be
 | 
				
			||||||
 | 
						#  delayed for a few seconds.  This may help slow down a DoS
 | 
				
			||||||
 | 
						#  attack.  It also helps to slow down people trying to brute-force
 | 
				
			||||||
 | 
						#  crack a users password.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Setting this number to 0 means "send rejects immediately"
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If this number is set higher than 'cleanup_delay', then the
 | 
				
			||||||
 | 
						#  rejects will be sent at 'cleanup_delay' time, when the request
 | 
				
			||||||
 | 
						#  is deleted from the internal cache of requests.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This number can be a decimal, e.g. 3.4
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Useful ranges: 1 to 5
 | 
				
			||||||
 | 
						reject_delay = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  status_server: Whether or not the server will respond
 | 
				
			||||||
 | 
						#  to Status-Server requests.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  When sent a Status-Server message, the server responds with
 | 
				
			||||||
 | 
						#  an Access-Accept or Accounting-Response packet.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This is mainly useful for administrators who want to "ping"
 | 
				
			||||||
 | 
						#  the server, without adding test users, or creating fake
 | 
				
			||||||
 | 
						#  accounting packets.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  It's also useful when a NAS marks a RADIUS server "dead".
 | 
				
			||||||
 | 
						#  The NAS can periodically "ping" the server with a Status-Server
 | 
				
			||||||
 | 
						#  packet.  If the server responds, it must be alive, and the
 | 
				
			||||||
 | 
						#  NAS can start using it for real requests.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  See also raddb/sites-available/status
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						status_server = yes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# PROXY CONFIGURATION
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  proxy_requests: Turns proxying of RADIUS requests on or off.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The server has proxying turned on by default.  If your system is NOT
 | 
				
			||||||
 | 
					#  set up to proxy requests to another server, then you can turn proxying
 | 
				
			||||||
 | 
					#  off here.  This will save a small amount of resources on the server.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If you have proxying turned off, and your configuration files say
 | 
				
			||||||
 | 
					#  to proxy a request, then an error message will be logged.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  To disable proxying, change the "yes" to "no", and comment the
 | 
				
			||||||
 | 
					#  $INCLUDE line.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  allowed values: {no, yes}
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					proxy_requests  = yes
 | 
				
			||||||
 | 
					$INCLUDE proxy.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# CLIENTS CONFIGURATION
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Client configuration is defined in "clients.conf".
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  The 'clients.conf' file contains all of the information from the old
 | 
				
			||||||
 | 
					#  'clients' and 'naslist' configuration files.  We recommend that you
 | 
				
			||||||
 | 
					#  do NOT use 'client's or 'naslist', although they are still
 | 
				
			||||||
 | 
					#  supported.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Anything listed in 'clients.conf' will take precedence over the
 | 
				
			||||||
 | 
					#  information from the old-style configuration files.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					$INCLUDE clients.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# THREAD POOL CONFIGURATION
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The thread pool is a long-lived group of threads which
 | 
				
			||||||
 | 
					#  take turns (round-robin) handling any incoming requests.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  You probably want to have a few spare threads around,
 | 
				
			||||||
 | 
					#  so that high-load situations can be handled immediately.  If you
 | 
				
			||||||
 | 
					#  don't have any spare threads, then the request handling will
 | 
				
			||||||
 | 
					#  be delayed while a new thread is created, and added to the pool.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  You probably don't want too many spare threads around,
 | 
				
			||||||
 | 
					#  otherwise they'll be sitting there taking up resources, and
 | 
				
			||||||
 | 
					#  not doing anything productive.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The numbers given below should be adequate for most situations.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					thread pool {
 | 
				
			||||||
 | 
						#  Number of servers to start initially --- should be a reasonable
 | 
				
			||||||
 | 
						#  ballpark figure.
 | 
				
			||||||
 | 
						start_servers = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Limit on the total number of servers running.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If this limit is ever reached, clients will be LOCKED OUT, so it
 | 
				
			||||||
 | 
						#  should NOT BE SET TOO LOW.  It is intended mainly as a brake to
 | 
				
			||||||
 | 
						#  keep a runaway server from taking the system with it as it spirals
 | 
				
			||||||
 | 
						#  down...
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You may find that the server is regularly reaching the
 | 
				
			||||||
 | 
						#  'max_servers' number of threads, and that increasing
 | 
				
			||||||
 | 
						#  'max_servers' doesn't seem to make much difference.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If this is the case, then the problem is MOST LIKELY that
 | 
				
			||||||
 | 
						#  your back-end databases are taking too long to respond, and
 | 
				
			||||||
 | 
						#  are preventing the server from responding in a timely manner.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The solution is NOT do keep increasing the 'max_servers'
 | 
				
			||||||
 | 
						#  value, but instead to fix the underlying cause of the
 | 
				
			||||||
 | 
						#  problem: slow database, or 'hostname_lookups=yes'.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  For more information, see 'max_request_time', above.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						max_servers = 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Server-pool size regulation.  Rather than making you guess
 | 
				
			||||||
 | 
						#  how many servers you need, FreeRADIUS dynamically adapts to
 | 
				
			||||||
 | 
						#  the load it sees, that is, it tries to maintain enough
 | 
				
			||||||
 | 
						#  servers to handle the current load, plus a few spare
 | 
				
			||||||
 | 
						#  servers to handle transient load spikes.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  It does this by periodically checking how many servers are
 | 
				
			||||||
 | 
						#  waiting for a request.  If there are fewer than
 | 
				
			||||||
 | 
						#  min_spare_servers, it creates a new spare.  If there are
 | 
				
			||||||
 | 
						#  more than max_spare_servers, some of the spares die off.
 | 
				
			||||||
 | 
						#  The default values are probably OK for most sites.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						min_spare_servers = 3
 | 
				
			||||||
 | 
						max_spare_servers = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  When the server receives a packet, it places it onto an
 | 
				
			||||||
 | 
						#  internal queue, where the worker threads (configured above)
 | 
				
			||||||
 | 
						#  pick it up for processing.  The maximum size of that queue
 | 
				
			||||||
 | 
						#  is given here.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  When the queue is full, any new packets will be silently
 | 
				
			||||||
 | 
						#  discarded.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The most common cause of the queue being full is that the
 | 
				
			||||||
 | 
						#  server is dependent on a slow database, and it has received
 | 
				
			||||||
 | 
						#  a large "spike" of traffic.  When that happens, there is
 | 
				
			||||||
 | 
						#  very little you can do other than make sure the server
 | 
				
			||||||
 | 
						#  receives less traffic, or make sure that the database can
 | 
				
			||||||
 | 
						#  handle the load.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	max_queue_size = 65536
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Clean up old threads periodically.  For no reason other than
 | 
				
			||||||
 | 
						#  it might be useful.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  '0' is a special value meaning 'infinity', or 'the servers never
 | 
				
			||||||
 | 
						#  exit'
 | 
				
			||||||
 | 
						max_requests_per_server = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Automatically limit the number of accounting requests.
 | 
				
			||||||
 | 
						#  This configuration item tracks how many requests per second
 | 
				
			||||||
 | 
						#  the server can handle.  It does this by tracking the
 | 
				
			||||||
 | 
						#  packets/s received by the server for processing, and
 | 
				
			||||||
 | 
						#  comparing that to the packets/s handled by the child
 | 
				
			||||||
 | 
						#  threads.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  If the received PPS is larger than the processed PPS, *and*
 | 
				
			||||||
 | 
						#  the queue is more than half full, then new accounting
 | 
				
			||||||
 | 
						#  requests are probabilistically discarded.  This lowers the
 | 
				
			||||||
 | 
						#  number of packets that the server needs to process.  Over
 | 
				
			||||||
 | 
						#  time, the server will "catch up" with the traffic.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Throwing away accounting packets is usually safe and low
 | 
				
			||||||
 | 
						#  impact.  The NAS will retransmit them in a few seconds, or
 | 
				
			||||||
 | 
						#  even a few minutes.  Vendors should read RFC 5080 Section 2.2.1
 | 
				
			||||||
 | 
						#  to see how accounting packets should be retransmitted.  Using
 | 
				
			||||||
 | 
						#  any other method is likely to cause network meltdowns.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						auto_limit_acct = no
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  SNMP notifications.  Uncomment the following line to enable
 | 
				
			||||||
 | 
					#  snmptraps.  Note that you MUST also configure the full path
 | 
				
			||||||
 | 
					#  to the "snmptrap" command in the "trigger.conf" file.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#$INCLUDE trigger.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# MODULE CONFIGURATION
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The names and configuration of each module is located in this section.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  After the modules are defined here, they may be referred to by name,
 | 
				
			||||||
 | 
					#  in other sections of this configuration file.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					modules {
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Each module has a configuration as follows:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	name [ instance ] {
 | 
				
			||||||
 | 
						#		config_item = value
 | 
				
			||||||
 | 
						#		...
 | 
				
			||||||
 | 
						#	}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The 'name' is used to load the 'rlm_name' library
 | 
				
			||||||
 | 
						#  which implements the functionality of the module.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The 'instance' is optional.  To have two different instances
 | 
				
			||||||
 | 
						#  of a module, it first must be referred to by 'name'.
 | 
				
			||||||
 | 
						#  The different copies of the module are then created by
 | 
				
			||||||
 | 
						#  inventing two 'instance' names, e.g. 'instance1' and 'instance2'
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The instance names can then be used in later configuration
 | 
				
			||||||
 | 
						#  INSTEAD of the original 'name'.  See the 'radutmp' configuration
 | 
				
			||||||
 | 
						#  for an example.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Some modules have ordering issues.  e.g. "sqlippool" uses
 | 
				
			||||||
 | 
						#  the configuration from "sql".  In that case, the "sql"
 | 
				
			||||||
 | 
						#  module must be read off of disk before the "sqlippool".
 | 
				
			||||||
 | 
						#  However, the directory inclusion below just reads the
 | 
				
			||||||
 | 
						#  directory from start to finish.  Which means that the
 | 
				
			||||||
 | 
						#  modules are read off of disk randomly.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You can list individual modules *before* the directory
 | 
				
			||||||
 | 
						#  inclusion.  Those modules will be loaded first.  Then, when
 | 
				
			||||||
 | 
						#  the directory is read, those modules will be skipped and
 | 
				
			||||||
 | 
						#  not read twice.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	$INCLUDE mods-enabled/sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  All modules are in ther mods-enabled/ directory.  Files
 | 
				
			||||||
 | 
						#  matching the regex /[a-zA-Z0-9_.]+/ are read.  The
 | 
				
			||||||
 | 
						#  modules are initialized ONLY if they are referenced in a
 | 
				
			||||||
 | 
						#  processing section, such as authorize, authenticate,
 | 
				
			||||||
 | 
						#  accounting, pre/post-proxy, etc.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						$INCLUDE mods-enabled/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Instantiation
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This section sets the instantiation order of the modules.  listed
 | 
				
			||||||
 | 
					#  here will get started up BEFORE the sections like authorize,
 | 
				
			||||||
 | 
					#  authenticate, etc. get examined.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This section is not strictly needed.  When a section like authorize
 | 
				
			||||||
 | 
					#  refers to a module, the module is automatically loaded and
 | 
				
			||||||
 | 
					#  initialized.  However, some modules may not be listed in any of the
 | 
				
			||||||
 | 
					#  processing sections, so they should be listed here.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Also, listing modules here ensures that you have control over
 | 
				
			||||||
 | 
					#  the order in which they are initialized.  If one module needs
 | 
				
			||||||
 | 
					#  something defined by another module, you can list them in order
 | 
				
			||||||
 | 
					#  here, and ensure that the configuration will be OK.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  After the modules listed here have been loaded, all of the modules
 | 
				
			||||||
 | 
					#  in the "mods-enabled" directory will be loaded.  Loading the
 | 
				
			||||||
 | 
					#  "mods-enabled" directory means that unlike Version 2, you usually
 | 
				
			||||||
 | 
					#  don't need to list modules here.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					instantiate {
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						# We list the counter module here so that it registers
 | 
				
			||||||
 | 
						# the check_name attribute before any module which sets
 | 
				
			||||||
 | 
						# it
 | 
				
			||||||
 | 
					#	daily
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# subsections here can be thought of as "virtual" modules.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						# e.g. If you have two redundant SQL servers, and you want to
 | 
				
			||||||
 | 
						# use them in the authorize and accounting sections, you could
 | 
				
			||||||
 | 
						# place a "redundant" block in each section, containing the
 | 
				
			||||||
 | 
						# exact same text.  Or, you could uncomment the following
 | 
				
			||||||
 | 
						# lines, and list "redundant_sql" in the authorize and
 | 
				
			||||||
 | 
						# accounting sections.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The "virtual" module defined here can also be used with
 | 
				
			||||||
 | 
						#  dynamic expansions, under a few conditions:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  * The section is "redundant", or "load-balance", or
 | 
				
			||||||
 | 
						#    "redundant-load-balance"
 | 
				
			||||||
 | 
						#  * The section contains modules ONLY, and no sub-sections
 | 
				
			||||||
 | 
						#  * all modules in the section are using the same rlm_
 | 
				
			||||||
 | 
						#    driver, e.g. They are all sql, or all ldap, etc.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  When those conditions are satisfied, the server will
 | 
				
			||||||
 | 
						#  automatically register a dynamic expansion, using the
 | 
				
			||||||
 | 
						#  name of the "virtual" module.  In the example below,
 | 
				
			||||||
 | 
						#  it will be "redundant_sql".  You can then use this expansion
 | 
				
			||||||
 | 
						#  just like any other:
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#	update reply {
 | 
				
			||||||
 | 
						#		Filter-Id := "%{redundant_sql: ... }"
 | 
				
			||||||
 | 
						#	}
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  In this example, the expansion is done via module "sql1",
 | 
				
			||||||
 | 
						#  and if that expansion fails, using module "sql2".
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  For best results, configure the "pool" subsection of the
 | 
				
			||||||
 | 
						#  module so that "retry_delay" is non-zero.  That will allow
 | 
				
			||||||
 | 
						#  the redundant block to quickly ignore all "down" SQL
 | 
				
			||||||
 | 
						#  databases.  If instead we have "retry_delay = 0", then
 | 
				
			||||||
 | 
						#  every time the redundant block is used, the server will try
 | 
				
			||||||
 | 
						#  to open a connection to every "down" database, causing
 | 
				
			||||||
 | 
						#  problems.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#redundant redundant_sql {
 | 
				
			||||||
 | 
						#	sql1
 | 
				
			||||||
 | 
						#	sql2
 | 
				
			||||||
 | 
						#}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Policies are virtual modules, similar to those defined in the
 | 
				
			||||||
 | 
					#  "instantiate" section above.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Defining a policy in one of the policy.d files means that it can be
 | 
				
			||||||
 | 
					#  referenced in multiple places as a *name*, rather than as a series of
 | 
				
			||||||
 | 
					#  conditions to match, and actions to take.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Policies are something like subroutines in a normal language, but
 | 
				
			||||||
 | 
					#  they cannot be called recursively. They MUST be defined in order.
 | 
				
			||||||
 | 
					#  If policy A calls policy B, then B MUST be defined before A.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					policy {
 | 
				
			||||||
 | 
						$INCLUDE policy.d/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	Load virtual servers.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	This next $INCLUDE line loads files in the directory that
 | 
				
			||||||
 | 
					#	match the regular expression: /[a-zA-Z0-9_.]+/
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	It allows you to define new virtual servers simply by placing
 | 
				
			||||||
 | 
					#	a file into the raddb/sites-enabled/ directory.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					$INCLUDE sites-enabled/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	All of the other configuration sections like "authorize {}",
 | 
				
			||||||
 | 
					#	"authenticate {}", "accounting {}", have been moved to the
 | 
				
			||||||
 | 
					#	the file:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#		raddb/sites-available/default
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	This is the "default" virtual server that has the same
 | 
				
			||||||
 | 
					#	configuration as in version 1.0.x and 1.1.x.  The default
 | 
				
			||||||
 | 
					#	installation enables this virtual server.  You should
 | 
				
			||||||
 | 
					#	edit it to create policies for your local site.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	For more documentation on virtual servers, see:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#		raddb/sites-available/README
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
							
								
								
									
										1159
									
								
								freeradius/sites-available/default
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1159
									
								
								freeradius/sites-available/default
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										468
									
								
								freeradius/sites-available/inner-tunnel
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										468
									
								
								freeradius/sites-available/inner-tunnel
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,468 @@
 | 
				
			|||||||
 | 
					# -*- text -*-
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	This is a virtual server that handles *only* inner tunnel
 | 
				
			||||||
 | 
					#	requests for EAP-TTLS and PEAP types.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	$Id: c178baad0f720d5b87608d22c70d4485a43feee4 $
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					server inner-tunnel {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This next section is here to allow testing of the "inner-tunnel"
 | 
				
			||||||
 | 
					#  authentication methods, independently from the "default" server.
 | 
				
			||||||
 | 
					#  It is listening on "localhost", so that it can only be used from
 | 
				
			||||||
 | 
					#  the same machine.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	$ radtest USER PASSWORD 127.0.0.1:18120 0 testing123
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If it works, you have configured the inner tunnel correctly.  To check
 | 
				
			||||||
 | 
					#  if PEAP will work, use:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	$ radtest -t mschap USER PASSWORD 127.0.0.1:18120 0 testing123
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If that works, PEAP should work.  If that command doesn't work, then
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	FIX THE INNER TUNNEL CONFIGURATION SO THAT IT WORKS.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Do NOT do any PEAP tests.  It won't help.  Instead, concentrate
 | 
				
			||||||
 | 
					#  on fixing the inner tunnel configuration.  DO NOTHING ELSE.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					listen {
 | 
				
			||||||
 | 
					       ipaddr = 127.0.0.1
 | 
				
			||||||
 | 
					       port = 18120
 | 
				
			||||||
 | 
					       type = auth
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  Authorization. First preprocess (hints and huntgroups files),
 | 
				
			||||||
 | 
					#  then realms, and finally look in the "users" file.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The order of the realm modules will determine the order that
 | 
				
			||||||
 | 
					#  we try to find a matching realm.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Make *sure* that 'preprocess' comes before any realm if you
 | 
				
			||||||
 | 
					#  need to setup hints for the remote radius server
 | 
				
			||||||
 | 
					authorize {
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Take a User-Name, and perform some checks on it, for spaces and other
 | 
				
			||||||
 | 
						#  invalid characters.  If the User-Name appears invalid, reject the
 | 
				
			||||||
 | 
						#  request.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  See policy.d/filter for the definition of the filter_username policy.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						filter_username
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Do checks on outer / inner User-Name, so that users
 | 
				
			||||||
 | 
						#  can't spoof us by using incompatible identities
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	filter_inner_identity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The chap module will set 'Auth-Type := CHAP' if we are
 | 
				
			||||||
 | 
						#  handling a CHAP request and Auth-Type has not already been set
 | 
				
			||||||
 | 
						chap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If the users are logging in with an MS-CHAP-Challenge
 | 
				
			||||||
 | 
						#  attribute for authentication, the mschap module will find
 | 
				
			||||||
 | 
						#  the MS-CHAP-Challenge attribute, and add 'Auth-Type := MS-CHAP'
 | 
				
			||||||
 | 
						#  to the request, which will cause the server to then use
 | 
				
			||||||
 | 
						#  the mschap module for authentication.
 | 
				
			||||||
 | 
						mschap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Pull crypt'd passwords from /etc/passwd or /etc/shadow,
 | 
				
			||||||
 | 
						#  using the system API's to get the password.  If you want
 | 
				
			||||||
 | 
						#  to read /etc/passwd or /etc/shadow directly, see the
 | 
				
			||||||
 | 
						#  passwd module, above.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Look for IPASS style 'realm/', and if not found, look for
 | 
				
			||||||
 | 
						#  '@realm', and decide whether or not to proxy, based on
 | 
				
			||||||
 | 
						#  that.
 | 
				
			||||||
 | 
					#	IPASS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Look for realms in user@domain format
 | 
				
			||||||
 | 
						# 
 | 
				
			||||||
 | 
						#  Note that proxying the inner tunnel authentication means
 | 
				
			||||||
 | 
						#  that the user MAY use one identity in the outer session
 | 
				
			||||||
 | 
						#  (e.g. "anonymous", and a different one here
 | 
				
			||||||
 | 
						#  (e.g. "user@example.com").  The inner session will then be
 | 
				
			||||||
 | 
						#  proxied elsewhere for authentication.  If you are not
 | 
				
			||||||
 | 
						#  careful, this means that the user can cause you to forward
 | 
				
			||||||
 | 
						#  the authentication to another RADIUS server, and have the
 | 
				
			||||||
 | 
						#  accounting logs *not* sent to the other server.  This makes
 | 
				
			||||||
 | 
						#  it difficult to bill people for their network activity.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						suffix
 | 
				
			||||||
 | 
					#	ntdomain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The "suffix" module takes care of stripping the domain
 | 
				
			||||||
 | 
						#  (e.g. "@example.com") from the User-Name attribute, and the
 | 
				
			||||||
 | 
						#  next few lines ensure that the request is not proxied.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you want the inner tunnel request to be proxied, delete
 | 
				
			||||||
 | 
						#  the next few lines.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						update control {
 | 
				
			||||||
 | 
							&Proxy-To-Realm := LOCAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This module takes care of EAP-MSCHAPv2 authentication.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  It also sets the EAP-Type attribute in the request
 | 
				
			||||||
 | 
						#  attribute list to the EAP type from the packet.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The example below uses module failover to avoid querying all
 | 
				
			||||||
 | 
						#  of the following modules if the EAP module returns "ok".
 | 
				
			||||||
 | 
						#  Therefore, your LDAP and/or SQL servers will not be queried
 | 
				
			||||||
 | 
						#  for the many packets that go back and forth to set up TTLS
 | 
				
			||||||
 | 
						#  or PEAP.  The load on those servers will therefore be reduced.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						eap {
 | 
				
			||||||
 | 
							ok = return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Read the 'users' file
 | 
				
			||||||
 | 
						files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Look in an SQL database.  The schema of the database
 | 
				
			||||||
 | 
						#  is meant to mirror the "users" file.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  See "Authorization Queries" in `mods-config/sql/main/$driver/queries.conf`
 | 
				
			||||||
 | 
						-sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you are using /etc/smbpasswd, and are also doing
 | 
				
			||||||
 | 
						#  mschap authentication, the un-comment this line, and
 | 
				
			||||||
 | 
						#  enable the "smbpasswd" module.
 | 
				
			||||||
 | 
					#	smbpasswd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  The ldap module reads passwords from the LDAP database.
 | 
				
			||||||
 | 
						-ldap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Enforce daily limits on time spent logged in.
 | 
				
			||||||
 | 
					#	daily
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expiration
 | 
				
			||||||
 | 
						logintime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If no other module has claimed responsibility for
 | 
				
			||||||
 | 
						#  authentication, then try to use PAP.  This allows the
 | 
				
			||||||
 | 
						#  other modules listed above to add a "known good" password
 | 
				
			||||||
 | 
						#  to the request, and to do nothing else.  The PAP module
 | 
				
			||||||
 | 
						#  will then see that password, and use it to do PAP
 | 
				
			||||||
 | 
						#  authentication.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This module should be listed last, so that the other modules
 | 
				
			||||||
 | 
						#  get a chance to set Auth-Type for themselves.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						pap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Uncomment this section if you want to use ldap for
 | 
				
			||||||
 | 
						#  authentication.  The "Auth-Type ldap { ...}" configuration
 | 
				
			||||||
 | 
						#  section below also has to be uncommented.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Note that this means "check plain-text password against
 | 
				
			||||||
 | 
						#  the ldap database", which means that EAP won't work,
 | 
				
			||||||
 | 
						#  as it does not supply a plain-text password.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  We do NOT recommend using this, unless you have no other
 | 
				
			||||||
 | 
						#  choice.  LDAP servers are databases.  They are NOT
 | 
				
			||||||
 | 
						#  authentication servers.  FreeRADIUS is an authentication
 | 
				
			||||||
 | 
						#  server, and knows what to do with authentication.  LDAP
 | 
				
			||||||
 | 
						#  servers do not.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Note that we force "Auth-Type := LDAP" ONLY if nothing else
 | 
				
			||||||
 | 
						#  is authenticating the user, AND ONLY if the request contains
 | 
				
			||||||
 | 
						#  a plain-text password.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  LDAP servers can only do PAP.  They cannot do CHAP, MS-CHAP,
 | 
				
			||||||
 | 
						#  or EAP.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	if (!&control.Auth-Type && &User-Password) {
 | 
				
			||||||
 | 
					#		update control {
 | 
				
			||||||
 | 
					#		       &Auth-Type := LDAP
 | 
				
			||||||
 | 
					#		}
 | 
				
			||||||
 | 
					#	}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  Authentication.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This section lists which modules are available for authentication.
 | 
				
			||||||
 | 
					#  Note that it does NOT mean 'try each module in order'.  It means
 | 
				
			||||||
 | 
					#  that a module from the 'authorize' section adds a configuration
 | 
				
			||||||
 | 
					#  attribute 'Auth-Type := FOO'.  That authentication type is then
 | 
				
			||||||
 | 
					#  used to pick the appropriate module from the list below.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  In general, you SHOULD NOT set the Auth-Type attribute.  The server
 | 
				
			||||||
 | 
					#  will figure it out on its own, and will do the right thing.  The
 | 
				
			||||||
 | 
					#  most common side effect of erroneously setting the Auth-Type
 | 
				
			||||||
 | 
					#  attribute is that one authentication method will work, but the
 | 
				
			||||||
 | 
					#  others will not.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  The common reasons to set the Auth-Type attribute by hand
 | 
				
			||||||
 | 
					#  is to either forcibly reject the user, or forcibly accept him.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					authenticate {
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  PAP authentication, when a back-end database listed
 | 
				
			||||||
 | 
						#  in the 'authorize' section supplies a password.  The
 | 
				
			||||||
 | 
						#  password can be clear-text, or encrypted.
 | 
				
			||||||
 | 
						Auth-Type PAP {
 | 
				
			||||||
 | 
							pap
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Most people want CHAP authentication
 | 
				
			||||||
 | 
						#  A back-end database listed in the 'authorize' section
 | 
				
			||||||
 | 
						#  MUST supply a CLEAR TEXT password.  Encrypted passwords
 | 
				
			||||||
 | 
						#  won't work.
 | 
				
			||||||
 | 
						Auth-Type CHAP {
 | 
				
			||||||
 | 
							chap
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  MSCHAP authentication.
 | 
				
			||||||
 | 
						Auth-Type MS-CHAP {
 | 
				
			||||||
 | 
							mschap
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  For old names, too.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						mschap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Pluggable Authentication Modules.
 | 
				
			||||||
 | 
					#	pam
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Uncomment this section if you want to use ldap for
 | 
				
			||||||
 | 
						#  authentication.  The "Auth-Type := LDAP" configuration
 | 
				
			||||||
 | 
						#  at the end of the "authorize" section also has to be
 | 
				
			||||||
 | 
						#  uncommented.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Note that this means "check plain-text password against
 | 
				
			||||||
 | 
						#  the ldap database", which means that EAP won't work,
 | 
				
			||||||
 | 
						#  as it does not supply a plain-text password.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  We do NOT recommend using this.  LDAP servers are databases.
 | 
				
			||||||
 | 
						#  They are NOT authentication servers.  FreeRADIUS is an
 | 
				
			||||||
 | 
						#  authentication server, and knows what to do with authentication.
 | 
				
			||||||
 | 
						#  LDAP servers do not.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	Auth-Type LDAP {
 | 
				
			||||||
 | 
					#		ldap
 | 
				
			||||||
 | 
					#	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Allow EAP authentication.
 | 
				
			||||||
 | 
						eap
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#	There are no accounting requests inside of EAP-TTLS or PEAP
 | 
				
			||||||
 | 
					#	tunnels.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					######################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  Session database, used for checking Simultaneous-Use. Either the radutmp
 | 
				
			||||||
 | 
					#  or rlm_sql module can handle this.
 | 
				
			||||||
 | 
					#  The rlm_sql module is *much* faster
 | 
				
			||||||
 | 
					session {
 | 
				
			||||||
 | 
						radutmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  See "Simultaneous Use Checking Queries" in `mods-config/sql/main/$driver/queries.conf`
 | 
				
			||||||
 | 
					#	sql
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  Post-Authentication
 | 
				
			||||||
 | 
					#  Once we KNOW that the user has been authenticated, there are
 | 
				
			||||||
 | 
					#  additional steps we can take.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Note that the last packet of the inner-tunnel authentication
 | 
				
			||||||
 | 
					#  MAY NOT BE the last packet of the outer session.  So updating
 | 
				
			||||||
 | 
					#  the outer reply MIGHT work, and sometimes MIGHT NOT.  The
 | 
				
			||||||
 | 
					#  exact functionality depends on both the inner and outer
 | 
				
			||||||
 | 
					#  authentication methods.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  If you need to send a reply attribute in the outer session,
 | 
				
			||||||
 | 
					#  the ONLY safe way is to set "use_tunneled_reply = yes", and
 | 
				
			||||||
 | 
					#  then update the inner-tunnel reply.
 | 
				
			||||||
 | 
					post-auth {
 | 
				
			||||||
 | 
						#  If you want privacy to remain, see the
 | 
				
			||||||
 | 
						#  Chargeable-User-Identity attribute from RFC 4372.
 | 
				
			||||||
 | 
						#  If you want to use it just uncomment the line below.
 | 
				
			||||||
 | 
					#       cui-inner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you want the Access-Accept to contain the inner
 | 
				
			||||||
 | 
						#  User-Name, uncomment the following lines.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	update outer.session-state {
 | 
				
			||||||
 | 
					#	       User-Name := &User-Name
 | 
				
			||||||
 | 
					#	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you want to have a log of authentication replies,
 | 
				
			||||||
 | 
						#  un-comment the following line, and enable the
 | 
				
			||||||
 | 
						#  'detail reply_log' module.
 | 
				
			||||||
 | 
					#	reply_log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  After authenticating the user, do another SQL query.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  See "Authentication Logging Queries" in `mods-config/sql/main/$driver/queries.conf`
 | 
				
			||||||
 | 
						-sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Un-comment the following if you have set
 | 
				
			||||||
 | 
						#  'edir = yes' in the ldap module sub-section of
 | 
				
			||||||
 | 
						#  the 'modules' section.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	ldap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Un-comment the following if you want to generate Moonshot (ABFAB) TargetedIds
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  IMPORTANT: This requires the UUID package to be installed, and a targeted_id_salt
 | 
				
			||||||
 | 
						#             to be configured.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  This functionality also supports SQL backing. To use this functionality, enable
 | 
				
			||||||
 | 
						#  and configure the moonshot-targeted-ids SQL module in the mods-enabled directory.
 | 
				
			||||||
 | 
						#  Then remove the comments from the appropriate lines in each of the below
 | 
				
			||||||
 | 
						#  policies in the policy.d/moonshot-targeted-ids file.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
					#	moonshot_host_tid
 | 
				
			||||||
 | 
					#	moonshot_realm_tid
 | 
				
			||||||
 | 
					#	moonshot_coi_tid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Instead of "use_tunneled_reply", change this "if (0)" to an
 | 
				
			||||||
 | 
						#  "if (1)".
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						if (0) {
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  These attributes are for the inner-tunnel only,
 | 
				
			||||||
 | 
							#  and MUST NOT be copied to the outer reply.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							update reply {
 | 
				
			||||||
 | 
								User-Name !* ANY
 | 
				
			||||||
 | 
								Message-Authenticator !* ANY
 | 
				
			||||||
 | 
								EAP-Message !* ANY
 | 
				
			||||||
 | 
								Proxy-State !* ANY
 | 
				
			||||||
 | 
								MS-MPPE-Encryption-Types !* ANY
 | 
				
			||||||
 | 
								MS-MPPE-Encryption-Policy !* ANY
 | 
				
			||||||
 | 
								MS-MPPE-Send-Key !* ANY
 | 
				
			||||||
 | 
								MS-MPPE-Recv-Key !* ANY
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Copy the inner reply attributes to the outer
 | 
				
			||||||
 | 
							#  session-state list.  The post-auth policy will take
 | 
				
			||||||
 | 
							#  care of copying the outer session-state list to the
 | 
				
			||||||
 | 
							#  outer reply.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							update {
 | 
				
			||||||
 | 
								&outer.session-state: += &reply:
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Access-Reject packets are sent through the REJECT sub-section of the
 | 
				
			||||||
 | 
						#  post-auth section.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  Add the ldap module name (or instance) if you have set
 | 
				
			||||||
 | 
						#  'edir = yes' in the ldap module configuration
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						Post-Auth-Type REJECT {
 | 
				
			||||||
 | 
							# log failed authentications in SQL, too.
 | 
				
			||||||
 | 
							-sql
 | 
				
			||||||
 | 
							attr_filter.access_reject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							#  Let the outer session know which module failed, and why.
 | 
				
			||||||
 | 
							#
 | 
				
			||||||
 | 
							update outer.session-state {
 | 
				
			||||||
 | 
								&Module-Failure-Message := &request:Module-Failure-Message
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  When the server decides to proxy a request to a home server,
 | 
				
			||||||
 | 
					#  the proxied request is first passed through the pre-proxy
 | 
				
			||||||
 | 
					#  stage.  This stage can re-write the request, or decide to
 | 
				
			||||||
 | 
					#  cancel the proxy.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Only a few modules currently have this method.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					pre-proxy {
 | 
				
			||||||
 | 
						#  Uncomment the following line if you want to change attributes
 | 
				
			||||||
 | 
						#  as defined in the preproxy_users file.
 | 
				
			||||||
 | 
					#	files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Uncomment the following line if you want to filter requests
 | 
				
			||||||
 | 
						#  sent to remote servers based on the rules defined in the
 | 
				
			||||||
 | 
						#  'attrs.pre-proxy' file.
 | 
				
			||||||
 | 
					#	attr_filter.pre-proxy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  If you want to have a log of packets proxied to a home
 | 
				
			||||||
 | 
						#  server, un-comment the following line, and the
 | 
				
			||||||
 | 
						#  'detail pre_proxy_log' section, above.
 | 
				
			||||||
 | 
					#	pre_proxy_log
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  When the server receives a reply to a request it proxied
 | 
				
			||||||
 | 
					#  to a home server, the request may be massaged here, in the
 | 
				
			||||||
 | 
					#  post-proxy stage.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					post-proxy {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  If you want to have a log of replies from a home server,
 | 
				
			||||||
 | 
						#  un-comment the following line, and the 'detail post_proxy_log'
 | 
				
			||||||
 | 
						#  section, above.
 | 
				
			||||||
 | 
					#	post_proxy_log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#  Uncomment the following line if you want to filter replies from
 | 
				
			||||||
 | 
						#  remote proxies based on the rules defined in the 'attrs' file.
 | 
				
			||||||
 | 
					#	attr_filter.post-proxy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  If you are proxying LEAP, you MUST configure the EAP
 | 
				
			||||||
 | 
						#  module, and you MUST list it here, in the post-proxy
 | 
				
			||||||
 | 
						#  stage.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						#  You MUST also use the 'nostrip' option in the 'realm'
 | 
				
			||||||
 | 
						#  configuration.  Otherwise, the User-Name attribute
 | 
				
			||||||
 | 
						#  in the proxied request will not match the user name
 | 
				
			||||||
 | 
						#  hidden inside of the EAP packet, and the end server will
 | 
				
			||||||
 | 
						#  reject the EAP request.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						eap
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} # inner-tunnel server block
 | 
				
			||||||
		Reference in New Issue
	
	Block a user