Commit 4c4ab953 authored by Angel L. Mateo's avatar Angel L. Mateo
Browse files

Add freeradius::module::eap to configure EAP

This define configures EAP in freeradius
parent e576ddc6
# == Class: freeradius::eap
#
# Define to configure eap FreeRADIUS module
#
define freeradius::module::eap (
$ensure = 'present',
$default_eap_type = 'md5',
Integer $timer_expire = 60,
Freeradius::Boolean $ignore_unknown_eap_types = 'no',
Freeradius::Boolean $cisco_accounting_username_bug = 'no',
Freeradius::Integer $max_sessions = "\${max_requests}",
Boolean $eap_pwd = false,
Optional[Variant[String,Integer]] $pwd_group = undef,
Optional[String] $pwd_server_id = undef,
Optional[Integer] $pwd_fragment_size = undef,
Optional[String] $pwd_virtual_server = undef,
Optional[String] $gtc_challenge = undef,
String $gtc_auth_type = 'PAP',
String $tls_config_name = 'tls-common',
Optional[String] $tls_private_key_password = undef,
String $tls_private_key_file = "\${certdir}/server.pem",
String $tls_certificate_file = "\${certdir}/server.pem",
String $tls_ca_file = "\${certdir}/ca.pem",
Optional[Freeradius::Boolean] $tls_auto_chain = undef,
Optional[String] $tls_psk_identity = undef,
Optional[String] $tls_psk_hexphrase = undef,
String $tls_dh_file = "\${certdir}/dh",
Optional[String] $tls_random_file = undef,
Optional[Integer] $tls_fragment_size = undef,
Optional[Freeradius::Boolean] $tls_include_length = undef,
Optional[Freeradius::Boolean] $tls_check_crl = undef,
Optional[Freeradius::Boolean] $tls_check_all_crl = undef,
String $tls_ca_path = "\${cadir}",
Optional[String] $tls_check_cert_issuer = undef,
Optional[String] $tls_check_cert_cn = undef,
String $tls_cipher_list = 'DEFAULT',
Optional[Freeradius::Boolean] $tls_disable_tlsv1_2 = undef,
String $tls_ecdh_curve = 'prime256v1',
Freeradius::Boolean $tls_cache_enable = 'yes',
Integer $tls_cache_lifetime = 24,
Integer $tls_cache_max_entries = 255,
Optional[String] $tls_cache_name = undef,
Optional[String] $tls_cache_persist_dir = undef,
Optional[Freeradius::Boolean] $tls_verify_skip_if_ocsp_ok = undef,
Optional[String] $tls_verify_tmpdir = undef,
Optional[String] $tls_verify_client = undef,
Freeradius::Boolean $tls_ocsp_enable = 'no',
Freeradius::Boolean $tls_ocsp_override_cert_url = 'yes',
String $tls_ocsp_url = 'http://127.0.0.1/ocsp/',
Optional[Freeradius::Boolean] $tls_ocsp_use_nonce = undef,
Optional[Integer] $tls_ocsp_timeout = undef,
Optional[Freeradius::Boolean] $tls_ocsp_softfail = undef,
Optional[String] $tls_virtual_server = undef,
String $ttls_default_eap_type = 'md5',
Freeradius::Boolean $ttls_copy_request_to_tunnel = 'no',
Freeradius::Boolean $ttls_use_tunneled_reply = 'no',
String $ttls_virtual_server = 'inner-tunnel',
Optional[Freeradius::Boolean] $ttls_include_length = undef,
Optional[Freeradius::Boolean] $ttls_require_client_cert = undef,
String $peap_default_eap_type = 'mschapv2',
Freeradius::Boolean $peap_copy_request_to_tunnel = 'no',
Freeradius::Boolean $peap_use_tunneled_reply = 'no',
Optional[Freeradius::Boolean] $peap_proxy_tunneled_request_as_eap = undef,
String $peap_virtual_server = 'inner-tunnel',
Optional[Freeradius::Boolean] $peap_soh = undef,
Optional[String] $peap_soh_virtual_server = undef,
Optional[Freeradius::Boolean] $peap_require_client_cert = undef,
Optional[Freeradius::Boolean] $mschapv2_send_error = undef,
Optional[String] $mschapv2_identity = undef,
) {
freeradius::module{$name:
ensure => $ensure,
content => template('freeradius/eap.erb'),
}
}
#######################################################################
#
# Whatever you do, do NOT set 'Auth-Type := EAP'. The server
# is smart enough to figure this out on its own. The most
# common side effect of setting 'Auth-Type := EAP' is that the
# users then cannot use ANY other authentication method.
#
# EAP types NOT listed here may be supported via the "eap2" module.
# See experimental.conf for documentation.
#
<%- if @name != 'eap' -%>
eap <%= @name %> {
<%- else -%>
eap {
<%- end -%>
# Invoke the default supported EAP type when
# EAP-Identity response is received.
#
# The incoming EAP messages DO NOT specify which EAP
# type they will be using, so it MUST be set here.
#
# For now, only one default EAP type may be used at a time.
#
# If the EAP-Type attribute is set by another module,
# then that EAP type takes precedence over the
# default type configured here.
#
default_eap_type = <%= @default_eap_type %>
# A list is maintained to correlate EAP-Response
# packets with EAP-Request packets. After a
# configurable length of time, entries in the list
# expire, and are deleted.
#
timer_expire = <%= @timer_expire %>
# There are many EAP types, but the server has support
# for only a limited subset. If the server receives
# a request for an EAP type it does not support, then
# it normally rejects the request. By setting this
# configuration to "yes", you can tell the server to
# instead keep processing the request. Another module
# MUST then be configured to proxy the request to
# another RADIUS server which supports that EAP type.
#
# If another module is NOT configured to handle the
# request, then the request will still end up being
# rejected.
ignore_unknown_eap_types = <%= @ignore_unknown_eap_types %>
# Cisco AP1230B firmware 12.2(13)JA1 has a bug. When given
# a User-Name attribute in an Access-Accept, it copies one
# more byte than it should.
#
# We can work around it by configurably adding an extra
# zero byte.
cisco_accounting_username_bug = <%= @cisco_accounting_username_bug %>
#
# Help prevent DoS attacks by limiting the number of
# sessions that the server is tracking. For simplicity,
# this is taken from the "max_requests" directive in
# radiusd.conf.
max_sessions = <%= @max_sessions %>
# Supported EAP-types
#
# We do NOT recommend using EAP-MD5 authentication
# for wireless connections. It is insecure, and does
# not provide for dynamic WEP keys.
#
md5 {
}
#
# EAP-pwd -- secure password-based authentication
#
<%- if @eap_pwd -%>
pwd {
# group = 19
<%- if @pwd_group -%>
group = <%= @pwd_group %>
<%- end -%>
#
# server_id = theserver@example.com
<%- if @pwd_server_id -%>
server_id = <%= @pwd_server_id %>
<%- end -%>
# This has the same meaning as for TLS.
# fragment_size = 1020
<%- if @pwd_fragment_size -%>
fragment_size = <%= @pwd_fragment_size %>
<%- end -%>
# The virtual server which determines the
# "known good" password for the user.
# Note that unlike TLS, only the "authorize"
# section is processed. EAP-PWD requests can be
# distinguished by having a User-Name, but
# no User-Password, CHAP-Password, EAP-Message, etc.
# virtual_server = "inner-tunnel"
<%- if @pwd_virtual_server -%>
virtual_server = <%= @pwd_virtual_server %>
<%- end -%>
}
<%- end -%>
# Cisco LEAP
#
# We do not recommend using LEAP in new deployments. See:
# http://www.securiteam.com/tools/5TP012ACKE.html
#
# Cisco LEAP uses the MS-CHAP algorithm (but not
# the MS-CHAP attributes) to perform it's authentication.
#
# As a result, LEAP *requires* access to the plain-text
# User-Password, or the NT-Password attributes.
# 'System' authentication is impossible with LEAP.
#
leap {
}
# Generic Token Card.
#
# Currently, this is only permitted inside of EAP-TTLS,
# or EAP-PEAP. The module "challenges" the user with
# text, and the response from the user is taken to be
# the User-Password.
#
# Proxying the tunneled EAP-GTC session is a bad idea,
# the users password will go over the wire in plain-text,
# for anyone to see.
#
gtc {
# The default challenge, which many clients
# ignore..
#challenge = "Password: "
<%- if @gtc_challenge -%>
challenge = "<%= @gtc_challenge %>"
<%- end -%>
# The plain-text response which comes back
# is put into a User-Password attribute,
# and passed to another module for
# authentication. This allows the EAP-GTC
# response to be checked against plain-text,
# or crypt'd passwords.
#
# If you say "Local" instead of "PAP", then
# the module will look for a User-Password
# configured for the request, and do the
# authentication itself.
#
auth_type = <%= @gtc_auth_type %>
}
## Common TLS configuration for TLS-based EAP types
#
# See raddb/certs/README for additional comments
# on certificates.
#
# If OpenSSL was not found at the time the server was
# built, the "tls", "ttls", and "peap" sections will
# be ignored.
#
# If you do not currently have certificates signed by
# a trusted CA you may use the 'snakeoil' certificates.
# Included with the server in raddb/certs.
#
# If these certificates have not been auto-generated:
# cd raddb/certs
# make
#
# These test certificates SHOULD NOT be used in a normal
# deployment. They are created only to make it easier
# to install the server, and to perform some simple
# tests with EAP-TLS, TTLS, or PEAP.
#
# See also:
#
# http://www.dslreports.com/forum/remark,9286052~mode=flat
#
# Note that you should NOT use a globally known CA here!
# e.g. using a Verisign cert as a "known CA" means that
# ANYONE who has a certificate signed by them can
# authenticate via EAP-TLS! This is likely not what you want.
tls-config <%= @tls_config_name %> {
<%- if @tls_private_key_password -%>
private_key_password = <%= @tls_private_key_password %>
<%- end -%>
private_key_file = <%= @tls_private_key_file %>
# If Private key & Certificate are located in
# the same file, then private_key_file &
# certificate_file must contain the same file
# name.
#
# If ca_file (below) is not used, then the
# certificate_file below MUST include not
# only the server certificate, but ALSO all
# of the CA certificates used to sign the
# server certificate.
certificate_file = <%= @tls_certificate_file %>
# Trusted Root CA list
#
# ALL of the CA's in this list will be trusted
# to issue client certificates for authentication.
#
# In general, you should use self-signed
# certificates for 802.1x (EAP) authentication.
# In that case, this CA file should contain
# *one* CA certificate.
#
ca_file = <%= @tls_ca_file %>
# OpenSSL will automatically create certificate chains,
# unless we tell it to not do that. The problem is that
# it sometimes gets the chains right from a certificate
# signature view, but wrong from the clients view.
#
# When setting "auto_chain = no", the server certificate
# file MUST include the full certificate chain.
# auto_chain = yes
<%- if @tls_auto_chain -%>
auto_chain = <%= @tls_auto_chain %>
<%- end -%>
#
# If OpenSSL supports TLS-PSK, then we can use
# a PSK identity and (hex) password. When the
# following two configuration items are specified,
# then certificate-based configuration items are
# not allowed. e.g.:
#
# private_key_password
# private_key_file
# certificate_file
# ca_file
# ca_path
#
# For now, the identity is fixed, and must be the
# same on the client. The passphrase must be a hex
# value, and can be up to 256 hex digits.
#
# Future versions of the server may be able to
# look up the shared key (hexphrase) based on the
# identity.
#
# psk_identity = "test"
# psk_hexphrase = "036363823"
<%- if @tls_psk_identity -%>
psk_identity = "<%= @tls_psk_identity %>"
<%- end -%>
<%- if @tls_psk_hexphrase -%>
psk_hexphrase = "<%= @tls_psk_hexphrase %>"
<%- end -%>
#
# For DH cipher suites to work, you have to
# run OpenSSL to create the DH file first:
#
# openssl dhparam -out certs/dh 2048
#
dh_file = <%= @tls_dh_file %>
#
# If your system doesn't have /dev/urandom,
# you will need to create this file, and
# periodically change its contents.
#
# For security reasons, FreeRADIUS doesn't
# write to files in its configuration
# directory.
#
# random_file = /dev/urandom
<%- if @tls_random_file -%>
random_file = <%= @tls_random_file %>"
<%- end -%>
#
# This can never exceed the size of a RADIUS
# packet (4096 bytes), and is preferably half
# that, to accommodate other attributes in
# RADIUS packet. On most APs the MAX packet
# length is configured between 1500 - 1600
# In these cases, fragment size should be
# 1024 or less.
#
# fragment_size = 1024
<%- if @tls_fragment_size -%>
fragment_size = <%= @tls_fragment_size %>
<%- end -%>
# include_length is a flag which is
# by default set to yes If set to
# yes, Total Length of the message is
# included in EVERY packet we send.
# If set to no, Total Length of the
# message is included ONLY in the
# First packet of a fragment series.
#
# include_length = yes
<%- if @tls_include_length -%>
include_length = <%= @tls_include_length %>
<%- end -%>
# Check the Certificate Revocation List
#
# 1) Copy CA certificates and CRLs to same directory.
# 2) Execute 'c_rehash <CA certs&CRLs Directory>'.
# 'c_rehash' is OpenSSL's command.
# 3) uncomment the line below.
# 5) Restart radiusd
# check_crl = yes
<%- if @tls_check_crl -%>
check_crl = <%= @tls_check_crl %>
<%- end -%>
# Check if intermediate CAs have been revoked.
# check_all_crl = yes
<%- if @tls_check_all_crl -%>
check_all_crl = <%= @tls_check_all_crl %>
<%- end -%>
ca_path = <%= @tls_ca_path %>
#
# If check_cert_issuer is set, the value will
# be checked against the DN of the issuer in
# the client certificate. If the values do not
# match, the certificate verification will fail,
# rejecting the user.
#
# In 2.1.10 and later, this check can be done
# more generally by checking the value of the
# TLS-Client-Cert-Issuer attribute. This check
# can be done via any mechanism you choose.
#
# check_cert_issuer = "/C=GB/ST=Berkshire/L=Newbury/O=My Company Ltd"
<%- if @tls_check_cert_issuer -%>
check_cert_issuer = "<%= @tls_check_cert_issuer %>"
<%- end -%>
#
# If check_cert_cn is set, the value will
# be xlat'ed and checked against the CN
# in the client certificate. If the values
# do not match, the certificate verification
# will fail rejecting the user.
#
# This check is done only if the previous
# "check_cert_issuer" is not set, or if
# the check succeeds.
#
# In 2.1.10 and later, this check can be done
# more generally by checking the value of the
# TLS-Client-Cert-CN attribute. This check
# can be done via any mechanism you choose.
#
# check_cert_cn = %{User-Name}
<%- if @tls_check_cert_cn -%>
check_cert_cn = <%= @tls_check_cert_cn %>
<%- end -%>
#
# Set this option to specify the allowed
# TLS cipher suites. The format is listed
# in "man 1 ciphers".
#
# For EAP-FAST, use "ALL:!EXPORT:!eNULL:!SSLv2"
#
cipher_list = "<%= @tls_cipher_list %>"
# Work-arounds for OpenSSL nonsense
# OpenSSL 1.0.1f and 1.0.1g do not calculate
# the EAP keys correctly. The fix is to upgrade
# OpenSSL, or disable TLS 1.2 here.
#
# For EAP-FAST, this MUST be set to "yes".
#
# disable_tlsv1_2 = no
<%- if @tls_disable_tlsv1_2 -%>
disable_tlsv1_2 = <%= @tls_disable_tlsv1_2 %>
<%- end -%>
#
#
# Elliptical cryptography configuration
#
# Only for OpenSSL >= 0.9.8.f
#
ecdh_curve = "<%= @tls_ecdh_curve %>"
#
# Session resumption / fast reauthentication
# cache.
#
# The cache contains the following information:
#
# session Id - unique identifier, managed by SSL
# User-Name - from the Access-Accept
# Stripped-User-Name - from the Access-Request
# Cached-Session-Policy - from the Access-Accept
#
# The "Cached-Session-Policy" is the name of a
# policy which should be applied to the cached
# session. This policy can be used to assign
# VLANs, IP addresses, etc. It serves as a useful
# way to re-apply the policy from the original
# Access-Accept to the subsequent Access-Accept
# for the cached session.
#
# On session resumption, these attributes are
# copied from the cache, and placed into the
# reply list.
#
# You probably also want "use_tunneled_reply = yes"
# when using fast session resumption.
#
cache {
#
# Enable it. The default is "no".
# Deleting the entire "cache" subsection
# also disables caching.
#
# You can disallow resumption for a
# particular user by adding the following
# attribute to the control item list:
#
# Allow-Session-Resumption = No
#
# If "enable = no" below, you CANNOT
# enable resumption for just one user
# by setting the above attribute to "yes".
#
enable = <%= @tls_cache_enable %>
#
# Lifetime of the cached entries, in hours.
# The sessions will be deleted after this
# time.
#
lifetime = <%= @tls_cache_lifetime %> # hours
#
# The maximum number of entries in the
# cache. Set to "0" for "infinite".
#
# This could be set to the number of users
# who are logged in... which can be a LOT.
#
max_entries = <%= @tls_cache_max_entries %>
#
# Internal "name" of the session cache. Used to
# distinguish which TLS context sessions belong to.
#
# The server will generate a random value if unset.
# This will change across server restart so you MUST
# set the "name" if you want to persist sessions (see
# below).
#
#name = "EAP module"
<%- if @tls_cache_name -%>
name = "<%= @tls_cache_name %>"
<%- end -%>
#
# Simple directory-based storage of sessions.
# Two files per session will be written, the SSL
# state and the cached VPs. This will persist session
# across server restarts.
#
# The server will need write perms, and the directory
# should be secured from anyone else. You might want
# a script to remove old files from here periodically:
#
# find ${logdir}/tlscache -mtime +2 -exec rm -f {} \;
#
# This feature REQUIRES "name" option be set above.
#
#persist_dir = "${logdir}/tlscache"
<%- if @tls_cache_persist_dir -%>
persist_dir = "<%= @tls_cache_persist_dir %>"
<%- end -%>
}
#
# As of version 2.1.10, client certificates can be
# validated via an external command. This allows
# dynamic CRLs or OCSP to be used.
#
# This configuration is commented out in the
# default configuration. Uncomment it, and configure
# the correct paths below to enable it.
#
# If OCSP checking is enabled, and the OCSP checks fail,
# the verify section is not run.
#
# If OCSP checking is disabled, the verify section is
# run on successful certificate validation.
#
verify {
# If the OCSP checks succeed, the verify section
# is run to allow additional checks.
#
# If you want to skip verify on OCSP success,
# uncomment this configuration item, and set it
# to "yes".
# skip_if_ocsp_ok = no
<%- if @tls_verify_skip_if_ocsp_ok -%>
skip_if_ocsp_ok = <%= @tls_verify_skip_if_ocsp_ok %>
<%- end -%>
# A temporary directory where the client
# certificates are stored. This directory
# MUST be owned by the UID of the server,
# and MUST not be accessible by any other
# users. When the server starts, it will do
# "chmod go-rwx" on the directory, for
# security reasons. The directory MUST
# exist when the server starts.
#
# You should also delete all of the files
# in the directory when the server starts.
# tmpdir = /tmp/radiusd
<%- if @tls_tmpdir -%>
tmpdir = <%= @tls_tmpdir %>
<%- end -%>
# The command used to verify the client cert.
# We recommend using the OpenSSL command-line
# tool.
#
# The ${..ca_path} text is a reference to
# the ca_path variable defined above.
#
# The %{TLS-Client-Cert-Filename} is the name
# of the temporary file containing the cert
# in PEM format. This file is automatically
# deleted by the server when the command
# returns.
# client = "/path/to/openssl verify -CApath ${..ca_path} %{TLS-Client-Cert-Filename}"
<%- if @tls_client -%>
client = "<%= @tls_client %>"
<%- end -%>
}
#
# OCSP Configuration
# Certificates can be verified against an OCSP
# Responder. This makes it possible to immediately
# revoke certificates without the distribution of
# new Certificate Revocation Lists (CRLs).
#
ocsp {
#
# Enable it. The default is "no".
# Deleting the entire "ocsp" subsection
# also disables ocsp checking
#
enable = <%= @tls_ocsp_enable %>
#
# The OCSP Responder URL can be automatically
# extracted from the certificate in question.