Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Freeradius2 with mOTP for 2 factor SSH authentication question

    Scheduled Pinned Locked Moved pfSense Packages
    3 Posts 2 Posters 2.9k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      sdb1031
      last edited by

      Hi,
      My goal is to have the ability to have 2 factor SSH authentication to my PFsense firewall.  I'm new to Pfsense, so I'm hoping that my approach is sound….
      I have Freeradius 2.1.12 installed on Pfsense 2.0.1.  I have a radius test user defined and configured to use a one time password.  This same account is also configured as an ssh user.  I receive the "Access-Accept" message when using the radtest utility for my radius test account when using the appropriate one time password.  So far so good.

      I then modified /etc/pam.d/sshd file to include the following line "auth            sufficient      pam_radius.so".  The full file is as follows:

      PAM configuration for the "sshd" service

      auth

      auth sufficient pam_opie.so no_warn no_fake_prompts
      auth requisite pam_opieaccess.so no_warn allow_local
      #auth sufficient pam_krb5.so no_warn try_first_pass
      #auth sufficient pam_ssh.so no_warn try_first_pass
      auth            sufficient      pam_radius.so
      auth required pam_unix.so no_warn try_first_pass

      account

      account required pam_nologin.so
      #account required pam_krb5.so
      account required pam_login_access.so
      account required pam_unix.so

      session

      #session optional pam_ssh.so
      session required pam_permit.so

      password

      #password sufficient pam_krb5.so no_warn try_first_pass
      password required pam_unix.so no_warn try_first_pass

      I then restarted the system and attempted to log in to via ssh using my radius test user account.  I am promted for a "RADIUS password", but the RADIUS one time password is not accepted.  After 3 attempts, ssh prompts for the ssh password which i can then log in with, but my desire is to use the ssh password along with the mOTP password.  On the System log tab in the gui, I see the following error:

      sshd[7949]: rad_config: Cannot open "/etc/radius.conf": No such file or directory

      I can confirm that there is no /etc/radius.conf file on the system.  If this file is required, I'm not sure how it gets generated or what its contents should be.  I also tried troubleshooting this by running /usr/local/etc/raddb/radiusd -X, which produces the  output seen below.  When I attempt to log in to ssh there is no change in the last status message that reads "Listening on authentication address…".  So it appears that the authentication information is not being passed from sshd to freeradius.  In my testing i've defined the Radius interface as 127.0.0.1 and 10.1.1.1 with no change in the results.

      Any Ideas???

      FreeRADIUS Version 2.1.12, for host i386-portbld-freebsd8.1, built on Jan  3 2012 at 23:44:16
      Copyright (C) 1999-2009 The FreeRADIUS server project and contributors.
      There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
      PARTICULAR PURPOSE.
      You may redistribute copies of FreeRADIUS under the terms of the
      GNU General Public License v2.
      Starting - reading configuration files …
      including configuration file /usr/local/etc/raddb/radiusd.conf
      including configuration file /usr/local/etc/raddb/clients.conf
      including files in directory /usr/local/etc/raddb/modules/
      including configuration file /usr/local/etc/raddb/modules/wimax
      including configuration file /usr/local/etc/raddb/modules/always
      including configuration file /usr/local/etc/raddb/modules/attr_filter
      including configuration file /usr/local/etc/raddb/modules/attr_rewrite
      including configuration file /usr/local/etc/raddb/modules/chap
      including configuration file /usr/local/etc/raddb/modules/checkval
      including configuration file /usr/local/etc/raddb/modules/counter
      including configuration file /usr/local/etc/raddb/modules/cui
      including configuration file /usr/local/etc/raddb/modules/detail
      including configuration file /usr/local/etc/raddb/modules/detail.example.com
      including configuration file /usr/local/etc/raddb/modules/detail.log
      including configuration file /usr/local/etc/raddb/modules/digest
      including configuration file /usr/local/etc/raddb/modules/dynamic_clients
      including configuration file /usr/local/etc/raddb/modules/echo
      including configuration file /usr/local/etc/raddb/modules/etc_group
      including configuration file /usr/local/etc/raddb/modules/exec
      including configuration file /usr/local/etc/raddb/modules/expiration
      including configuration file /usr/local/etc/raddb/modules/expr
      including configuration file /usr/local/etc/raddb/modules/files
      including configuration file /usr/local/etc/raddb/modules/inner-eap
      including configuration file /usr/local/etc/raddb/modules/ippool
      including configuration file /usr/local/etc/raddb/modules/krb5
      including configuration file /usr/local/etc/raddb/modules/ldap
      including configuration file /usr/local/etc/raddb/modules/linelog
      including configuration file /usr/local/etc/raddb/modules/logintime
      including configuration file /usr/local/etc/raddb/modules/mac2ip
      including configuration file /usr/local/etc/raddb/modules/mschap
      including configuration file /usr/local/etc/raddb/modules/mac2vlan
      including configuration file /usr/local/etc/raddb/modules/ntlm_auth
      including configuration file /usr/local/etc/raddb/modules/opendirectory
      including configuration file /usr/local/etc/raddb/modules/otp
      including configuration file /usr/local/etc/raddb/modules/pam
      including configuration file /usr/local/etc/raddb/modules/pap
      including configuration file /usr/local/etc/raddb/modules/passwd
      including configuration file /usr/local/etc/raddb/modules/perl
      including configuration file /usr/local/etc/raddb/modules/policy
      including configuration file /usr/local/etc/raddb/modules/preprocess
      including configuration file /usr/local/etc/raddb/modules/radutmp
      including configuration file /usr/local/etc/raddb/modules/realm
      including configuration file /usr/local/etc/raddb/modules/redis
      including configuration file /usr/local/etc/raddb/modules/rediswho
      including configuration file /usr/local/etc/raddb/modules/replicate
      including configuration file /usr/local/etc/raddb/modules/smbpasswd
      including configuration file /usr/local/etc/raddb/modules/smsotp
      including configuration file /usr/local/etc/raddb/modules/soh
      including configuration file /usr/local/etc/raddb/modules/sql_log
      including configuration file /usr/local/etc/raddb/modules/sqlcounter_expire_on_login
      including configuration file /usr/local/etc/raddb/modules/sradutmp
      including configuration file /usr/local/etc/raddb/modules/unix
      including configuration file /usr/local/etc/raddb/modules/acct_unique
      including configuration file /usr/local/etc/raddb/modules/motp
      including configuration file /usr/local/etc/raddb/modules/datacounter_acct
      including configuration file /usr/local/etc/raddb/eap.conf
      including configuration file /usr/local/etc/raddb/policy.conf
      including files in directory /usr/local/etc/raddb/sites-enabled/
      including configuration file /usr/local/etc/raddb/sites-enabled/default
      main {
      allow_core_dumps = no
      }
      including dictionary file /usr/local/etc/raddb/dictionary
      main {
      name = "radiusd"
      prefix = "/usr/local"
      localstatedir = "/var"
      sbindir = "/usr/local/sbin"
      logdir = "/var/log"
      run_dir = "/var/run"
      libdir = "/usr/local/lib/freeradius-2.1.12"
      radacctdir = "/var/log/radacct"
      hostname_lookups = no
      max_request_time = 30
      cleanup_delay = 5
      max_requests = 1024
      pidfile = "/var/run/radiusd.pid"
      checkrad = "/usr/local/sbin/checkrad"
      debug_level = 0
      proxy_requests = yes
      log {
      stripped_names = no
      auth = yes
      auth_badpass = no
      auth_goodpass = no
      msg_badpass = ""
      msg_goodpass = ""
      }
      security {
      max_attributes = 200
      reject_delay = 1
      status_server = no
      }
      }
      radiusd: #### Loading Realms and Home Servers ####
      radiusd: #### Loading Clients ####
      client local {
      ipaddr = 127.0.0.1
      require_message_authenticator = no
      secret = "test123"
      shortname = "local"
      nastype = "other"
      }
      radiusd: #### Instantiating modules ####
      instantiate {
      Module: Linked to module rlm_exec
      Module: Instantiating module "exec" from file /usr/local/etc/raddb/modules/exec
        exec {
      wait = no
      input_pairs = "request"
      shell_escape = yes
        }
      Module: Linked to module rlm_expr
      Module: Instantiating module "expr" from file /usr/local/etc/raddb/modules/expr
      Module: Linked to module rlm_counter
      Module: Instantiating module "daily" from file /usr/local/etc/raddb/modules/counter
        counter daily {
      filename = "/var/log/radacct/timecounter/db.daily"
      key = "User-Name"
      reset = "daily"
      count-attribute = "Acct-Session-Time"
      counter-name = "Daily-Session-Time"
      check-name = "Max-Daily-Session"
      reply-name = "Session-Timeout"
      cache-size = 5000
        }
      rlm_counter: Counter attribute Daily-Session-Time is number 11273
      rlm_counter: Current Time: 1335318792 [2012-04-25 01:53:12], Next reset 1335398400 [2012-04-26 00:00:00]
      Module: Instantiating module "weekly" from file /usr/local/etc/raddb/modules/counter
        counter weekly {
      filename = "/var/log/radacct/timecounter/db.weekly"
      key = "User-Name"
      reset = "weekly"
      count-attribute = "Acct-Session-Time"
      counter-name = "Weekly-Session-Time"
      check-name = "Max-Weekly-Session"
      reply-name = "Session-Timeout"
      cache-size = 5000
        }
      rlm_counter: Counter attribute Weekly-Session-Time is number 11275
      rlm_counter: Current Time: 1335318792 [2012-04-25 01:53:12], Next reset 1335657600 [2012-04-29 00:00:00]
      Module: Instantiating module "monthly" from file /usr/local/etc/raddb/modules/counter
        counter monthly {
      filename = "/var/log/radacct/timecounter/db.monthly"
      key = "User-Name"
      reset = "monthly"
      count-attribute = "Acct-Session-Time"
      counter-name = "Monthly-Session-Time"
      check-name = "Max-Monthly-Session"
      reply-name = "Session-Timeout"
      cache-size = 5000
        }
      rlm_counter: Counter attribute Monthly-Session-Time is number 11277
      rlm_counter: Current Time: 1335318792 [2012-04-25 01:53:12], Next reset 1335830400 [2012-05-01 00:00:00]
      Module: Instantiating module "forever" from file /usr/local/etc/raddb/modules/counter
        counter forever {
      filename = "/var/log/radacct/timecounter/db.forever"
      key = "User-Name"
      reset = "never"
      count-attribute = "Acct-Session-Time"
      counter-name = "Forever-Session-Time"
      check-name = "Max-Forever-Session"
      reply-name = "Session-Timeout"
      cache-size = 5000
        }
      rlm_counter: Counter attribute Forever-Session-Time is number 11279
      rlm_counter: Current Time: 1335318792 [2012-04-25 01:53:12], Next reset 0 [2012-04-25 01:00:00]
      Module: Linked to module rlm_expiration
      Module: Instantiating module "expiration" from file /usr/local/etc/raddb/modules/expiration
        expiration {
      reply-message = "Password Has Expired  "
        }
      Module: Linked to module rlm_logintime
      Module: Instantiating module "logintime" from file /usr/local/etc/raddb/modules/logintime
        logintime {
      reply-message = "You are calling outside your allowed timespan  "
      minimum-timeout = 60
        }
      }
      radiusd: #### Loading Virtual Servers ####
      server { # from file /usr/local/etc/raddb/radiusd.conf
      modules {
        Module: Creating Auth-Type = MOTP
        Module: Creating Auth-Type = digest
        Module: Creating Autz-Type = Status-Server
        Module: Creating Acct-Type = Status-Server
        Module: Creating Post-Auth-Type = REJECT
      Module: Checking authenticate {…} for more modules to load
      Module: Linked to module rlm_pap
      Module: Instantiating module "pap" from file /usr/local/etc/raddb/modules/pap
        pap {
      encryption_scheme = "auto"
      auto_header = no
        }
      Module: Linked to module rlm_chap
      Module: Instantiating module "chap" from file /usr/local/etc/raddb/modules/chap
      Module: Linked to module rlm_mschap
      Module: Instantiating module "mschap" from file /usr/local/etc/raddb/modules/mschap
        mschap {
      use_mppe = yes
      require_encryption = no
      require_strong = no
      with_ntdomain_hack = yes
      allow_retry = yes
        }
      Module: Instantiating module "motp" from file /usr/local/etc/raddb/modules/motp
        exec motp {
      wait = yes
      program = "/usr/local/bin/bash /usr/local/etc/raddb/scripts/otpverify.sh %{request:User-Name} %{request:User-Password} %{reply:MOTP-Init-Secret} %{reply:MOTP-PIN} %{reply:MOTP-Offset}"
      input_pairs = "request"
      shell_escape = yes
        }
      Module: Linked to module rlm_digest
      Module: Instantiating module "digest" from file /usr/local/etc/raddb/modules/digest
      Module: Linked to module rlm_pam
      Module: Instantiating module "pam" from file /usr/local/etc/raddb/modules/pam
        pam {
      pam_auth = "radiusd"
        }
      Module: Linked to module rlm_unix
      Module: Instantiating module "unix" from file /usr/local/etc/raddb/modules/unix
        unix {
      radwtmp = "/var/log/radwtmp"
        }
      Module: Linked to module rlm_eap
      Module: Instantiating module "eap" from file /usr/local/etc/raddb/eap.conf
        eap {
      default_eap_type = "md5"
      timer_expire = 60
      ignore_unknown_eap_types = no
      cisco_accounting_username_bug = no
      max_sessions = 4096
        }
      Module: Linked to sub-module rlm_eap_md5
      Module: Instantiating eap-md5
      Module: Linked to sub-module rlm_eap_leap
      Module: Instantiating eap-leap
      Module: Linked to sub-module rlm_eap_gtc
      Module: Instantiating eap-gtc
        gtc {
      challenge = "Password: "
      auth_type = "PAP"
        }
      Module: Linked to sub-module rlm_eap_tls
      Module: Instantiating eap-tls
        tls {
      rsa_key_exchange = no
      dh_key_exchange = yes
      rsa_key_length = 512
      dh_key_length = 512
      verify_depth = 0
      CA_path = "/usr/local/etc/raddb/certs"
      pem_file_type = yes
      private_key_file = "/usr/local/etc/raddb/certs/server.pem"
      certificate_file = "/usr/local/etc/raddb/certs/server.pem"
      CA_file = "/usr/local/etc/raddb/certs/ca.pem"
      private_key_password = "whatever"
      dh_file = "/usr/local/etc/raddb/certs/dh"
      random_file = "/usr/local/etc/raddb/certs/random"
      fragment_size = 1024
      include_length = yes
      check_crl = no
      cipher_list = "DEFAULT"
      ecdh_curve = "prime256v1"
          cache {
      enable = no
      lifetime = 24
      max_entries = 255
          }
          verify {
          }
          ocsp {
      enable = no
      override_cert_url = no
      url = "http://127.0.0.1/ocsp/"
          }
        }
      Module: Linked to sub-module rlm_eap_ttls
      Module: Instantiating eap-ttls
        ttls {
      default_eap_type = "md5"
      copy_request_to_tunnel = no
      use_tunneled_reply = no
      include_length = yes
        }
      Module: Linked to sub-module rlm_eap_peap
      Module: Instantiating eap-peap
        peap {
      default_eap_type = "mschapv2"
      copy_request_to_tunnel = no
      use_tunneled_reply = no
      proxy_tunneled_request_as_eap = yes
      soh = no
        }
      Module: Linked to sub-module rlm_eap_mschapv2
      Module: Instantiating eap-mschapv2
        mschapv2 {
      with_ntdomain_hack = no
      send_error = no
        }
      Module: Checking authorize {...} for more modules to load
      Module: Linked to module rlm_preprocess
      Module: Instantiating module "preprocess" from file /usr/local/etc/raddb/modules/preprocess
        preprocess {
      huntgroups = "/usr/local/etc/raddb/huntgroups"
      hints = "/usr/local/etc/raddb/hints"
      with_ascend_hack = no
      ascend_channels_per_line = 23
      with_ntdomain_hack = no
      with_specialix_jetstream_hack = no
      with_cisco_vsa_hack = no
      with_alvarion_vsa_hack = no
        }
      Module: Linked to module rlm_realm
      Module: Instantiating module "suffix" from file /usr/local/etc/raddb/modules/realm
        realm suffix {
      format = "suffix"
      delimiter = "@"
      ignore_default = no
      ignore_null = yes
        }
      Module: Instantiating module "ntdomain" from file /usr/local/etc/raddb/modules/realm
        realm ntdomain {
      format = "prefix"
      delimiter = ""
      ignore_default = no
      ignore_null = yes
        }
      Module: Linked to module rlm_files
      Module: Instantiating module "files" from file /usr/local/etc/raddb/modules/files
        files {
      usersfile = "/usr/local/etc/raddb/users"
      acctusersfile = "/usr/local/etc/raddb/acct_users"
      preproxy_usersfile = "/usr/local/etc/raddb/preproxy_users"
      compat = "no"
        }
      Module: Linked to module rlm_checkval
      Module: Instantiating module "checkval" from file /usr/local/etc/raddb/modules/checkval
        checkval {
      item-name = "Calling-Station-Id"
      check-name = "Calling-Station-Id"
      data-type = "string"
      notfound-reject = no
        }
      rlm_checkval: Registered name Calling-Station-Id for attribute 31
      Module: Checking preacct {...} for more modules to load
      Module: Linked to module rlm_acct_unique
      Module: Instantiating module "acct_unique" from file /usr/local/etc/raddb/modules/acct_unique
        acct_unique {
      key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
        }
      Module: Checking accounting {...} for more modules to load
      Module: Linked to module rlm_detail
      Module: Instantiating module "detail" from file /usr/local/etc/raddb/modules/detail
        detail {
      detailfile = "/var/log/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d"
      header = "%t"
      detailperm = 384
      dirperm = 493
      locking = no
      log_packet_header = no
        }
      Module: Instantiating module "datacounterdaily" from file /usr/local/etc/raddb/modules/datacounter_acct
        exec datacounterdaily {
      wait = yes
      program = "/bin/sh /usr/local/etc/raddb/scripts/datacounter_acct.sh %{request:User-Name} daily %{request:Acct-Input-Octets} %{request:Acct-Output-Octets}"
      input_pairs = "request"
      shell_escape = yes
        }
      Module: Instantiating module "datacounterweekly" from file /usr/local/etc/raddb/modules/datacounter_acct
        exec datacounterweekly {
      wait = yes
      program = "/bin/sh /usr/local/etc/raddb/scripts/datacounter_acct.sh %{request:User-Name} weekly %{request:Acct-Input-Octets} %{request:Acct-Output-Octets}"
      input_pairs = "request"
      shell_escape = yes
        }
      Module: Instantiating module "datacountermonthly" from file /usr/local/etc/raddb/modules/datacounter_acct
        exec datacountermonthly {
      wait = yes
      program = "/bin/sh /usr/local/etc/raddb/scripts/datacounter_acct.sh %{request:User-Name} monthly %{request:Acct-Input-Octets} %{request:Acct-Output-Octets}"
      input_pairs = "request"
      shell_escape = yes
        }
      Module: Instantiating module "datacounterforever" from file /usr/local/etc/raddb/modules/datacounter_acct
        exec datacounterforever {
      wait = yes
      program = "/bin/sh /usr/local/etc/raddb/scripts/datacounter_acct.sh %{request:User-Name} forever %{request:Acct-Input-Octets} %{request:Acct-Output-Octets}"
      input_pairs = "request"
      shell_escape = yes
        }
      Module: Linked to module rlm_radutmp
      Module: Instantiating module "radutmp" from file /usr/local/etc/raddb/modules/radutmp
        radutmp {
      filename = "/var/log/radutmp"
      username = "%{User-Name}"
      case_sensitive = yes
      check_with_nas = yes
      perm = 384
      callerid = yes
        }
      Module: Linked to module rlm_attr_filter
      Module: Instantiating module "attr_filter.accounting_response" from file /usr/local/etc/raddb/modules/attr_filter
        attr_filter attr_filter.accounting_response {
      attrsfile = "/usr/local/etc/raddb/attrs.accounting_response"
      key = "%{User-Name}"
      relaxed = no
        }
      Module: Checking session {...} for more modules to load
      Module: Checking pre-proxy {...} for more modules to load
      Module: Instantiating module "attr_filter.pre-proxy" from file /usr/local/etc/raddb/modules/attr_filter
        attr_filter attr_filter.pre-proxy {
      attrsfile = "/usr/local/etc/raddb/attrs.pre-proxy"
      key = "%{Realm}"
      relaxed = no
        }
      Module: Checking post-proxy {...} for more modules to load
      Module: Instantiating module "attr_filter.post-proxy" from file /usr/local/etc/raddb/modules/attr_filter
        attr_filter attr_filter.post-proxy {
      attrsfile = "/usr/local/etc/raddb/attrs"
      key = "%{Realm}"
      relaxed = no
        }
      Module: Checking post-auth {...} for more modules to load
      Module: Instantiating module "attr_filter.access_reject" from file /usr/local/etc/raddb/modules/attr_filter
        attr_filter attr_filter.access_reject {
      attrsfile = "/usr/local/etc/raddb/attrs.access_reject"
      key = "%{User-Name}"
      relaxed = no
        }
      } # modules
      } # server
      radiusd: #### Opening IP addresses and Ports ####
      listen {
      type = "auth"
      ipaddr = 10.1.1.1
      port = 1812
      }
      Listening on authentication address 10.1.1.1 port 1812
      Listening on proxy address 10.1.1.1 port 1814

      1 Reply Last reply Reply Quote 0
      • N
        Nachtfalke
        last edited by

        Hi,

        on pfsense 1.2.3 there was a description how to do it with OpenVPN
        http://doc.pfsense.org/index.php/Using_OpenVPN_With_FreeRADIUS

        On pfsense 2.0.x this was improved and is much easier:
        http://doc.pfsense.org/index.php/Using_OpenVPN_With_FreeRADIUS#Configuration_on_pfSense_2.x
        Important would be these steps: pfSense configuration as NAS

        So perhaps this will help you a little bit with SSH.

        PS: To make sure that freeradius is listening on the correct interface chose a  *****  as address which means all interfaces.

        1 Reply Last reply Reply Quote 0
        • S
          sdb1031
          last edited by

          Thanks for your reply.  After looking at the articles you suggested, I saw that I needed to create an /etc/radius.conf file and specify the appropriate values in the file.  I have it working now.  Thanks again!

          1 Reply Last reply Reply Quote 0
          • First post
            Last post
          Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.