Configure apache auth

https://osc.github.io/ood-documentation/latest/authentication/overview/configure-authentication.html#compile-authentication-module

The first few steps on here refer to an httpd install residing at /opt/rh/httpd24/root/usr/bin
but I don’t have any apache httpd installation there on a new RHEL8 VM. I have followed the open ondemand RHEL8 installation guide at:

https://osc.github.io/ood-documentation/latest/installation/install-software.html

Is there some additional step I need to either symlink that path to the system installed httpd, or do another httpd install at that path?

/opt/rh/ondemand/root/usr/bin

I do have that path though.

It has:

passenger passenger-config passenger-install-apache2-module passenger-install-nginx-module

executable files in the directory.

Even stranger,

/opt/rh/ondemand/root/etc/nginx

I have an nginx web server installation directory where there should be an httpd one?

You should not need to compile any apache modules. That was just recently removed, but I need to now update the latest branch to reflect that removal.

Ah, cool.

In that case,

I still need to configure the Auth module though right?

This path:

/opt/rh/httpd24/root/etc/httpd/conf.d/auth-config.conf

Doesn’t exist on my new install RHEL8 and open ondemand install.

Is there another path that I can find the auth-config.conf file at?

Yes you need some sort of authentication. Where are you seeing this file auth-config.conf?

You should be following any one of these sections for the applicable authentication you’re looking for (CAS, or Shibboleth or OIDC, etc).

https://osc.github.io/ood-documentation/latest/authentication.html

https://osc.github.io/ood-documentation/latest/authentication/overview/configure-authentication.html#configure-authentication-module

Its in 1.2. heading

I want to configure LDAP with Apache I think…

https://osc.github.io/ood-documentation/latest/authentication/dex.html#configuring-ondemand-dex-for-ldap

I have the

/etc/ood/config/ood_portal.yml file with the following configuration, (redacted some stuff):

dex:
connectors:
- type: ldap
id: ldap
name: xxx
config:
host: xxxx.xxx.xxxx.edu:xxx
insecureSkipVerify: false
bindDN: cn=LDAP User,ou=Users,dc=xxx,dc=xxxx,dc=edu
bindPW: xxxxxxxxxxx
userSearch:
baseDN: ou=Users,dc=xxx,dc=xxxx,dc=edu
filter: “(objectClass=posixAccount)”
username: uid
idAttr: uid
emailAttr: mail
nameAttr: sn
preferredUsernameAttr: uid
groupSearch:
baseDN: ou=Groups,dc=xxx,dc=xxxx,dc=edu
filter: “(objectClass=posixgroup)”
userMatchers:
- userAttr: memberUid
groupAttr: cn
nameAttr: cn

and:

auth:

  • ‘AuthType Basic’
  • ‘Require group SomeGroup’
  • ‘AuthLDAPURL ldap://ldaphost/o=yourorg’

But still working out what settings I need in place for the auth: ldap configuraiton.

If you’re doing Dex + LDAP, you don’t need this. They conflict. Dex is OIDC authentication and this below is apache’s basic LDAP auth which is very insecure, so I’d recommend you keep the dex settings.

auth:
    - ‘AuthType Basic’
    - ‘Require group SomeGroup’
    - ‘AuthLDAPURL ldap://ldaphost/o=yourorg’

You’re dex configs look OK - given I don’t know your LDAP layout and so on, but I’d say now, bounce apache and start ondemand-dex both through systemctl and see what you get. You can let me know in this topic if it works directly or if you need anything more.

Ok, I have kept the dex and ldap settings, restarted both ondemand-dex and apache with systemctl.

I still have a message about:

However, you now have to configurure authentication for this apache instance. See the authentication documentation for all the options available.

On the webpage for the server. Is there something else I need to do to further configure authentication?

OK something’s off because it should have picked up the dex settings.

What’s the output of running this command?

/opt/ood/ood-portal-generator/sbin/update_ood_portal

I’d also take a second pass at your ood_portal.yml. I can’t tell from what you’ve posted if it’s valid YAML or no, but it seems like we’re not recognizing the dex YAML portion.

/opt/ood/ood-portal-generator/sbin/update_ood_portal

No change in Apache config.

Completed successfully!

---
#
# Portal configuration
#

# The address and port to listen for connections on
# Example:
#     listen_addr_port: 443
# Default: null (don't add any more listen directives)
#listen_addr_port: null

# The server name used for name-based Virtual Host
# Example:
#     servername: 'www.example.com'
# Default: null (don't use name-based Virtual Host)
#servername: null

# The server aliases used for the name-based Virtual Host
# Example:
#     server_aliases:
#       - foo.example.com
#server_aliases: []

# The server name used for rewrites
# Example:
#     proxy_server: 'proxy.example.com'
# Default: The value of servername
#proxy_server: null

# The port specification for the Virtual Host
# Example:
#     port: 8080
# Default: null (use default port 80 or 443 if SSL enabled)
#port: null

# List of SSL Apache directives
# Example:
     ssl:
       - 'SSLCertificateFile "/etc/pki/tls/certs/hostname.edu.crt"'
       - 'SSLCertificateKeyFile "/etc/pki/tls/private/hostname.edu.key"'
# Default: null (no SSL support)
#ssl: null

# Root directory of log files (can be relative ServerRoot)
# Example:
#     logroot: '/path/to/my/logs'
# Default: 'logs' (this is relative to ServerRoot)
#logroot: 'logs'

# Error log filename
# Example:
#     errorlog: 'error.log'
# Default: 'error.log' (If 'servername' and 'ssl' options are defined 
# the default value will be <servername>_error_ssl.log)
#errorlog: 'error.log'

# Access log filename
# Example:
#     accesslog: 'access.log'
# Default: 'access.log' (If 'servername' and 'ssl' options are defined 
# the default value will be <servername>_access_ssl.log)
#accesslog: 'access.log'

# Apache access log format (Don't specify log nickname see: http://httpd.apache.org/docs/current/mod/mod_log_config.html#transferlog)
# Example:
#     logformat: '"%v %h \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %T"'
# Default: Apache combined format
#logformat: Apache combine format

# Should RewriteEngine be used
# Example:
#     use_rewrites: false
# Default: true
#use_rewrites: true

# Should Maintenance Rewrite rules be added
# Example:
#   use_maintenance: false
# Default: true
#use_maintenance: true

# List of IPs to allowed when maintenance is enabled
# Example:
#   maintenance_ip_allowlist:
#     - 192.168.0..*
#     - 192.168.1..*
# Default: [] (no IPs allowed)
#maintenance_ip_allowlist: []

# Set Header Content-Security-Policy frame-ancestors.
# Example:
#   security_csp_frame_ancestors: https://ondemand.osc.edu
# Example to disable setting:
#   security_csp_frame_ancestors: false
# Default: based on servername and ssl settings
#security_csp_frame_ancestors:

# Set Header Strict-Transport-Security to help enforce SSL
# Example:
#   security_strict_transport: false
# Default: true when ssl is enabled, false otherwise
#security_strict_transport: false

# Root directory of the Lua handler code
# Example:
#     lua_root: '/path/to/lua/handlers'
# Default : '/opt/ood/mod_ood_proxy/lib' (default install directory of mod_ood_proxy)
#lua_root: '/opt/ood/mod_ood_proxy/lib'

# Verbosity of the Lua module logging
# (see https://httpd.apache.org/docs/2.4/mod/core.html#loglevel)
# Example:
#     lua_log_level: 'warn'
# Default: 'info' (get verbose logs)
#lua_log_level: 'info'

# Lua regular expression used to map authenticated-user to system-user
# This configuration is ignored if user_map_cmd is defined
# Example:
#     user_map_match: '^([^@]+)@.*$'
# Default: '.*'
#user_map_match: '.*'

# System command used to map authenticated-user to system-user
# This option takes precedence over user_map_match
# Example:
#     user_map_cmd: '/usr/local/bin/ondemand-usermap'
# Default: null (use user_map_match)
#user_map_cmd: null

# Use an alternative CGI environment variable instead of REMOTE_USER for
# determining the authenticated-user fed to the mapping script
# Example:
#     user_env: 'OIDC_CLAIM_preferred_username'
# Default: null (use REMOTE_USER)
#user_env: null

# Redirect user to the following URI if fail to map there authenticated-user to
# a system-user
# Example:
#     map_fail_uri: '/register'
# Default: null (don't redirect, just display error message)
#map_fail_uri: null

# System command used to run the `nginx_stage` script with sudo privileges
# Example:
#     pun_stage_cmd: 'sudo /path/to/nginx_stage'
# Default: 'sudo /opt/ood/nginx_stage/sbin/nginx_stage' (don't forget sudo)
#pun_stage_cmd: 'sudo /opt/ood/nginx_stage/sbin/nginx_stage'

# List of Apache authentication directives
# NB: Be sure the appropriate Apache module is installed for this
# Default: (see below, uses OIDC auth with Dex)
#auth:
#  - 'AuthType Basic'
#  - 'Require group accessexacloud'
#  - 'AuthLDAPURL ldap://ldaphost/o=yourorg'

# Redirect user to the following URI when accessing root URI
# Example:
#     root_uri: '/my_uri'
#     # https://www.example.com/ => https://www.example.com/my_uri
# Default: '/pun/sys/dashboard' (default location of the OOD Dashboard app)
#root_uri: '/pun/sys/dashboard'

# Track server-side analytics with a Google Analytics account and property
# (see https://github.com/OSC/mod_ood_proxy/blob/master/lib/analytics.lua for
# information on how to setup the GA property)
# Example:
#     analytics:
#       url: 'http://www.google-analytics.com/collect'
#       id: 'UA-79331310-4'
# Default: null (do not track)
#analytics: null

#
# Publicly available assets
#

# Public sub-uri (available to public with no authentication)
# Example:
#     public_uri: '/assets'
# Default: '/public'
#public_uri: '/public'

# Root directory that serves the public sub-uri (be careful, everything under
# here is open to the public)
# Example:
#     public_root: '/path/to/public/assets'
# Default: '/var/www/ood/public'
#public_root: '/var/www/ood/public'

#
# Logout redirect helper
#

# Logout sub-uri
# Example
#     logout_uri: '/log_me_out'
# NB: If you change this, then modify the Dashboard app with the new sub-uri
# Default: '/logout' (the Dashboard app is by default going to expect this)
#logout_uri: '/logout'

# Redirect user to the following URI when accessing logout URI
# Example:
#     logout_redirect: '/oidc?logout=https%3A%2F%2Fwww.example.com'
# Default: '/pun/sys/dashboard/logout' (the Dashboard app provides a simple
# HTML page explaining logout to the user)
#logout_redirect: '/pun/sys/dashboard/logout'

#
# Reverse proxy to backend nodes
#

# Regular expression used for whitelisting allowed hostnames of nodes
# Example:
#     host_regex: '[\w.-]+\.example\.com'
# Default: '[^/]+' (allow reverse proxying to all hosts, this allows external
# hosts as well)
#host_regex: '[^/]+'

# Sub-uri used to reverse proxy to backend web server running on node that
# knows the full URI path
# Example:
#     node_uri: '/node'
# Default: null (disable this feature)
#node_uri: null

# Sub-uri used to reverse proxy to backend web server running on node that
# ONLY uses *relative* URI paths
# Example:
#     rnode_uri: '/rnode'
# Default: null (disable this feature)
#rnode_uri: null

#
# Per-user NGINX Passenger apps
#

# Sub-uri used to control PUN processes
# Example:
#     nginx_uri: '/my_pun_controller'
# Default: '/nginx'
#nginx_uri: '/nginx'

# Sub-uri used to access the PUN processes
# Example:
#     pun_uri: '/my_pun_apps'
# Default: '/pun'
#pun_uri: '/pun'

# Root directory that contains the PUN Unix sockets that the proxy uses to
# connect to
# Example:
#     pun_socket_root: '/path/to/pun/sockets'
# Default: '/var/run/ondemand-nginx' (default location set in nginx_stage)
#pun_socket_root: '/var/run/ondemand-nginx'

# Number of times the proxy attempts to connect to the PUN Unix socket before
# giving up and displaying an error to the user
# Example:
#     pun_max_retries: 25
# Default: 5 (only try 5 times)
#pun_max_retries: 5

# The PUN pre hook command to execute as root
#
# Example:
#    pun_pre_hook_root_cmd: '/opt/hpc-site/ood_pun_prehook'
# Default: null (do not run any PUN pre hook as root)
#pun_pre_hook_root_cmd: null

# Comma separated list of environment variables to pass from the apache context
# into the PUN pre hook. Defaults to null so nothing is exported.
#
# Example:
#    pun_pre_hook_exports: 'OIDC_ACCESS_TOKEN,OIDC_CLAIM_EMAIL'
# Default: null (pass nothing)
#pun_pre_hook_exports: null

#
# Support for OpenID Connect
#

# Sub-uri used by mod_auth_openidc for authentication
# Example:
#     oidc_uri: '/oidc'
# Default: null (disable OpenID Connect support)
#oidc_uri: null

# Sub-uri user is redirected to if they are not authenticated. This is used to
# *discover* what ID provider the user will login through.
# Example:
#     oidc_discover_uri: '/discover'
# Default: null (disable support for discovering OpenID Connect IdP)
#oidc_discover_uri: null

# Root directory on the filesystem that serves the HTML code used to display
# the discovery page
# Example:
#     oidc_discover_root: '/var/www/ood/discover'
# Default: null (disable support for discovering OpenID Connect IdP)
#oidc_discover_root: null

#
# Support for registering unmapped users
#
# (Not necessary if using regular expressions for mapping users)
#

# Sub-uri user is redirected to if unable to map authenticated-user to
# system-user
# Example:
#     register_uri: '/register'
# Default: null (display error to user if mapping fails)
#register_uri: null

# Root directory on the filesystem that serves the HTML code used to register
# an unmapped user
# Example:
#     register_root: '/var/www/ood/register'
# Default: null (display error to user if mapping fails)
#register_root: null

# OIDC metadata URL
# Example:
#     oidc_provider_metadata_url: https://example.com:5554/.well-known/openid-configuration
# Default: null (value auto-generated if using Dex)
#oidc_provider_metadata_url: null

# OIDC client ID
# Example:
#     oidc_client_id: ondemand.example.com
# Default: null (value auto-generated if using Dex)
#oidc_client_id: null

# OIDC client secret
# Example:
#     oidc_client_secret: 334389048b872a533002b34d73f8c29fd09efc50
# Default: null (value auto-generated if using Dex)
#oidc_client_secret: null

# OIDC remote user claim. This is the claim that populates REMOTE_USER
# Example:
#     oidc_remote_user_claim: preferred_username
# Default: preferred_username
#oidc_remote_user_claim: preferred_username

# OIDC scopes
# Example:
#     oidc_scope: "openid profile email groups"
# Default: "openid profile email"
#oidc_scope: "openid profile email"

# OIDC session inactivity timeout
# Example:
#     oidc_session_inactivity_timeout: 28800
# Default: 28800
#oidc_session_inactivity_timeout: 28800

# OIDC session max duration
# Example:
#     oidc_session_max_duration: 28800
# Default: 28800
#oidc_session_max_duration: 28800

# OIDC max number of state cookies and if to automatically clean old cookies
# Example:
#     oidc_state_max_number_of_cookies: "10 true"
# Default: "10 true"
#oidc_state_max_number_of_cookies: "10 true"

# OIDC Enable SameSite cookie
# When ssl is defined this defaults to 'Off'
# When ssl is not defined this defaults to 'On'
# Example:
#     oidc_cookie_same_site: 'Off'
# Default: 'On'
#oidc_cookie_same_site: 'On'

# Additional OIDC settings as key-value pairs
# Example:
#     oidc_settings:
#       OIDCPassIDTokenAs: serialized
#       OIDCPassRefreshToken: On
# Default: {} (empty hash)
#oidc_settings: {}

# The Dex URI behind Apache reverse proxy
# Set to false or null to disable Dex behing the Apache reverse proxy
# Example:
#   dex_uri: /auth
# Default: /dex
#dex_uri: /dex

# Dex configurations, values inside the "dex" structure are directly used to configure Dex
# If the value for "dex" key is false or null, Dex support is disabled
# Dex support will auto-enable if ondemand-dex package is installed
#dex:
  # Default based on if ssl key for ood-portal-generator is defined
#  ssl: false
  # Only used if SSL is disabled
#  http_port: "5556"
  # Only used if SSL is enabled
#  https_port: "5554"
  # tls_cert and tls_key take OnDemand configured values for ssl and copy keys to /etc/ood/dex maintaining file names
#  tls_cert: null
#  tls_key: null
#  storage_file: /etc/ood/dex/dex.db
#  grpc: null
#  expiry: null
  # Client ID, defaults to servername or FQDN
#  client_id: null
#  client_name: OnDemand
  # Client secret, value auto generated
  # A value that is a filesystem path can be used to store secret in a file
#  client_secret: /etc/ood/dex/ondemand.secret
   # The OnDemand redirectURI is auto-generated, this option allows adding additional URIs
#  client_redirect_uris: []
  # Additional Dex OIDC clients to configure
#  static_clients: []
  # The following example is to configure OpenLDAP
  # Docs: https://github.com/dexidp/dex/blob/master/Documentation/connectors/ldap.md

dex:
  connectors:
    - type: ldap
      id: ldap
      name: XXX
      config:
        host: ldap.xxx.xxxx.edu:636
        insecureSkipVerify: false
        bindDN: cn=LDAP User,ou=Users,dc=xxx,dc=xxxx,dc=edu
        bindPW: xxxxxxxxxxx
        userSearch:
          baseDN: ou=Users,dc=xxx,dc=xxxx,dc=edu
          filter: "(objectClass=posixAccount)"
          username: uid
          idAttr: uid
          emailAttr: mail
          nameAttr: sn
          preferredUsernameAttr: uid
        groupSearch:
          baseDN: ou=Groups,dc=xxx,dc=xxxx,dc=edu
          filter: "(objectClass=posixgroup)"
          userMatchers:
            - userAttr: memberUid
              groupAttr: cn
          nameAttr: cn
  frontend:
    theme: ondemand
    dir: /usr/share/ondemand-dex/web

#  connectors:
#    - type: ldap
#      id: ldap
#      name: LDAP
#      config:
#        host: openldap.my_center.edu:636
#        insecureSkipVerify: false
#        bindDN: cn=admin,dc=example,dc=org
#        bindPW: admin
#        userSearch:
#          baseDN: ou=People,dc=example,dc=org
#          filter: "(objectClass=posixAccount)"
#          username: uid
#          idAttr: uid
#          emailAttr: mail
#          nameAttr: gecos
#          preferredUsernameAttr: uid
#        groupSearch:
#          baseDN: ou=Groups,dc=example,dc=org
#          filter: "(objectClass=posixGroup)"
#          userMatchers:
#            - userAttr: DN
#              groupAttr: member
#          nameAttr: cn
#  frontend:
#    theme: ondemand
#    dir: /usr/share/ondemand-dex/web

the ssl piece has different indentation - that matters in YAML. It’s not recognizing the dex portion because of it.

Strange,

I commented that part out and its still not working.

dex:
  connectors:
    - type: ldap
      id: ldap
      name: xxx
      config:
        host: ldap.xxx.xxxx.edu:636
        insecureSkipVerify: false
        bindDN: cn=LDAP User,ou=Users,dc=xxx,dc=xxxx,dc=edu
        bindPW: xxxxxxxxxxx
        userSearch:
          baseDN: ou=Users,dc=xxx,dc=xxxx,dc=edu
          filter: "(objectClass=posixAccount)"
          username: uid
          idAttr: uid
          emailAttr: mail
          nameAttr: sn
          preferredUsernameAttr: uid
        groupSearch:
          baseDN: ou=Groups,dc=xxx,dc=xxxx,dc=edu
          filter: "(objectClass=posixgroup)"
          userMatchers:
            - userAttr: memberUid
              groupAttr: cn
          nameAttr: cn


Can you elaborate on “not working”? Does it at least update .conf file /etc/httpd/conf.d/ood-portal.conf?

Hi Jeff,

Yes, the .conf file does change, but the web page still displays

OK - if it’s updating the conf file maybe it’s a cache issue, like you’ve cached that page? Can you try bouncing httpd and clearing your cache?

I think I figured it out, we have the VM hosted on an openstack cluster, and the local hostname was pulling in hostname.novalocal instead of hostname.domain. I am going to setup SSL next and then attempt to login via my LDAP account.

For the ssl config, is this the right syntax? This is in the ood_portal.yml file

dex:
  tls_cert: /etc/pki/tls/certs/hostname.domain.edu.crt
  tls_key: /etc/pki/tls/private/hostname.domain.edu.key
  connectors:
    - type: ldap
      id: ldap
      name: NAME

I think I got the SSL stuff correct, but its complaining about not being able to find a user?

I don’t have our home directory server mounted yet on this VM, and my perrymil ldap user doesn’t have a local home directory on there yet, I am assuming thats what this error is complaining about?

Yes, if the VM doesn’t have access to LDAP and $HOME directories, you’d need to create the local user through useradd. Though I don’t know if that’s advisable given UID mappings may be different.

So I think I have auth working now, but its still displaying the http://openondemanddevweb/public/need_auth.html page, which seems a little counterintuitive. The ldap lookup showed up in the logs on the ldap server.

Closing this ticket as done for now.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.