How Does Session Teardown Work?
I received a question about how the PowerScale does session teardown so below I walk through a mid-level overview of what that looks like. PowerScale leverages Apache so let’s first understand what session teardown looks like from the webserver perspective.
Session Teardown in Apache
Section titled “Session Teardown in Apache”A highly detailed technical explanation of how Apache server handles session teardown, leading to a 204 response, involves understanding both the HTTP protocol and the specific implementation of session management in Apache.
HTTP Protocol and the 204 Response
Section titled “HTTP Protocol and the 204 Response”- 204 No Content: In HTTP, a 204 status code indicates that the server has successfully processed the request, but is not returning any content. This is often used in situations where the server’s response itself is not important, but the confirmation of successful processing is.
- Request Reception: When a request to terminate a session (typically a DELETE request) is received, Apache first parses and interprets the HTTP request.
- Session Identification: Apache identifies the session to be terminated. This is done with a session identifier.
- Session Management: Apache uses modules for session management. These modules are responsible for creating, maintaining, and destroying sessions. When a session teardown is requested, the relevant module locates the session in its storage (which could be memory, a database, etc.).
- Session Validation: Before proceeding with the teardown, Apache checks if the session exists and whether the client making the request has the right to terminate it.
- Resource Cleanup: Upon successful validation, Apache instructs the session management module to release any resources associated with the session. This includes things like freeing memory, deleting session data from any running applications, and revoking authentication tokens.
- Session Destruction: The session is then marked for destruction. This means it’s effectively invalidated and cannot be used for further requests.
- Client Notification: After the session is terminated, Apache sends a response back to the client. If there is no additional content to return (which is typical for session teardown), a 204 No Content response is used. This response is merely an acknowledgment that the request was successfully processed and the session was terminated.
- Logging and Monitoring: Apache logs this interaction for administrative and security purposes. This could include information about the request, the client IP, the session identifier, and the outcome of the operation.
To demonstrate this I wrote trace_teardown.py. It sets up a session with the PowerScale and then tears it down. Now we can’t see the guts of the PowerScale with this code (I’ll get to that) but we can see all the Apache-side handling.
C:\Users\grant\AppData\Local\Programs\Python\Python310\python.exe "C:\Users\grant\Documents\code\grantcurell.github.io\docs\PowerScale Failed Authentication\trace_teardown.py"DEBUG:__main__:Attempting to authenticate and create a session...DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 10.10.25.80:8080DEBUG:urllib3.connectionpool:https://10.10.25.80:8080 "POST /session/1/session HTTP/1.1" 201 104DEBUG:__main__:Authentication response: 201, {"services":["platform","namespace"],"timeout_absolute":14400,"timeout_inactive":900,"username":"root"}
DEBUG:__main__:Session successfully created. Cookies: {'isicsrf': '25cd0346-4204-4c5d-be1d-49630c78c4ff', 'isisessid': 'eyJhbGciOiJQUzUxMiJ9.eyJhdWQiOlsicGxhdGZvcm0iLCJuYW1lc3BhY2UiXSwiZXhwIjoxNzAxMjA5NDM4LCJpYXQiOjE3MDExOTUwMzgsIm9uZWZzL2NzcmYiOiIyNWNkMDM0Ni00MjA0LTRjNWQtYmUxZC00OTYzMGM3OGM0ZmYiLCJvbmVmcy9pcCI6IjE3Mi4xNi41LjE1NSIsIm9uZWZzL25vbmNlIjozOTM4NzI5NDg2NTQ2MDY1NjU2LCJvbmVmcy9zZXNzaW9uIjoiZThkYzYyM2ItOWM5Yy00YmE3LWE2MjAtYzQzZTdkNzBhMzlhIiwib25lZnMvdWEiOiJweXRob24tcmVxdWVzdHMvMi4yOC4xIiwib25lZnMvemlkIjoxLCJzdWIiOiJyb290In0K.nnaDPBOw6ZSHT66mguImZZL57PsMkodUG9S2Nop0_B3r3oSwgX-1CkL4R70_oGRDMPztaskMOVSbc0YsvHXERI9IqEdE2jZaseIAZIOmUEaqPDgpjEZzkBMAiqsAcp9kFAxhDInZHzJobJn7kSa3RBKFD1rr6fi8_MljtennkX8IWpwPOWutkVMN6MNGM0YUAPPLD6qnQ1VcbFeYZU6unljhj7-n7eLrvoOfWprWjTh6vtT1jHF-Ecu_uD5Tue5IMkivsAEFnti5-TCas1qatmWYG2jlXrOoHEH7q0fEv5ZUWO6T-jGxGLZtp4E01EBJzudlaSfCZqTpL4JPaZOgbJEyFiQU2BQp7Ik0lRkLqTUO40f1lJDDnIK4xDbiN_4cIGowQjq0yTcKlu-FW9hIC2xGajoICIAuMBIJz9mEh4R_Gcvap_K1vPo796Hib3xyM-fgdeUzS3GwTVBuBWPczZQP2UMLmKSFeJuuMDbsB3_tu4V_xqnsmxWSyP-E_Btudwi75lEOJNnA7N-vrU1VK8IyBEsNU2TIJ4f_BjTE3gMvyRsk-BXayqmQ4u9PwPOTISLKGpDGuAAgYEryb9N48O_AKojglMcGEdonHLI-ep4ajWV3es6KWCmpvblQ2tpP8mTVhIRVi4xefYUG_ZCF23CrtOgoYur843lz7Mx5iS0%3D'}DEBUG:__main__:Attempting to close the session...DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 10.10.25.80:8080DEBUG:urllib3.connectionpool:https://10.10.25.80:8080 "DELETE /session/1/session HTTP/1.1" 204 0DEBUG:__main__:Session closure response: 204,DEBUG:__main__:Session successfully closed.Here you can see the steps listed above play out to include visibility on both the session ID and the Cross-Site Request Forgery (CSRF) token.
Now in addition to the above PowerScale is going to do a whole bunch of things internally and tracing each line of what happens would be an extremely long essay so we’ll hit the highlights. Below is a copy of PowerScale’s webui_http.conf which defines Apache’s behaviors for any given thing. From this we have a very clear idea of how session teardown works on the PowerScale.
The provided configuration file for PowerScale, which is leveraging Apache, offers insights into how Apache is configured and potentially how it handles sessions in this environment. Let’s break down some key parts of the configuration related to session management and their implications:
- Session Authentication Modules:
mod_auth_isilon- PowerScale’s custom auth handler. This is handled by the shared librarymod_auth_isilon.so. Now we don’t have visibility into the code here, but realistically, these things follow design patterns that are pretty constant. If we were so inclined we could attach a debugger here, but the reality is we can make some pretty safe assumptions just based on how everyone does auth with Apache. The module is going to have all the code related to user authentication incluing the JWT tokens mentioned here README.md, it will handle session management and expiry, and it will likely make calls out to some other service for things like RBAC.IsiAuthSessionSecurity ip_check agent_checkindicates additional security checks for session validation, like IP address and user-agent consistency.
- Worker Module Configuration:
mpm_worker_moduleis used, which tells us it’s a multi-threaded processing model. This module allows efficient handling of multiple concurrent connections, crucial for session management in a high-traffic environment.
- FastCGI for External Handlers:
- FastCGI (
mod_fastcgi) is configured to communicate with external servers/processes likeisi_papi_d,isi_rsapi_d, andisi_object_d. These external servers are responsible for handling other parts of the session lifecycle.
- FastCGI (
- Session-Specific Directives:
<Location /session/1/session>tells us that session management (creation, validation, teardown) is handled by a specific handler (SetHandler session-service).IsiAuthSessionTimeoutInactiveandIsiAuthSessionTimeoutAbsolutedirectives give session timeout settings
- Virtual Host Configuration:
- Within the
<VirtualHost>section, you can see session-specific details.- We see that SSL is enforced
- CSP is present
- There are a series of custom error documents which can be returned
- There are a lot of custom URL rewrites
- Specific URLs are handled by FastCGI. This includes all the APIs
- Within the
- ErrorDocument Directives:
- Custom error documents for various HTTP status codes, including those that might be relevant to session handling (e.g., 401 Unauthorized).
Understanding Session Teardown
Section titled “Understanding Session Teardown”Apache itself, as configured here, doesn’t directly reveal the mechanisms of session teardown. However, the combination of the worker module, SSL settings, custom authentication module, and external FastCGI processes suggests a complex session handling mechanism that is likely controlled both by Apache and additional PowerScale components.
Teardown Process:
Section titled “Teardown Process:”- Session Termination Request: A request to terminate a session (a DELETE request to the session endpoint) is received by Apache.
- Request Handling: Apache, through its worker module, accepts and processes the request
- Custom Authentication Module Processing: The
mod_auth_isilonmodule, along with any session-related directives, validate the session and the request, ensuring that it’s legitimate and authorized. - Communication with External Handlers: If session management is partially offloaded to external processes (as seen in the FastCGI configuration), Apache forwards the relevant information to these processes.
- Session Invalidating and Cleanup: The responsible component (Apache module or external handler) invalidates the session, cleans up associated resources, and updates any necessary data stores.
- Response to Client: Once the session is successfully terminated, a response is sent back to the client. In the case of a successful teardown without further content, a 204 No Content response.
Apache Config
Section titled “Apache Config”# X: ----------------# X: This file is automatically generated and should not be# X: edited directly. If you must make changes to the# X: contents of this file it should be done via the PowerScale# X: Web UI, or via the template file located at# X: /etc/mcp/templates/webui_httpd.conf# X: ----------------
# =================================================# Basic settings# =================================================Listen 8080 https
# =================================================# Modules# =================================================LoadModule unixd_module modules/mod_unixd.soLoadModule ssl_module modules/mod_ssl.soLoadModule authz_core_module modules/mod_authz_core.soLoadModule authn_core_module modules/mod_authn_core.soLoadModule authz_host_module modules/mod_authz_host.soLoadModule authz_user_module modules/mod_authz_user.soLoadModule mpm_worker_module modules/mod_mpm_worker.soLoadModule auth_isilon_module modules/mod_auth_isilon.soLoadModule cgid_module modules/mod_cgid.soLoadModule fastcgi_module modules/mod_fastcgi.soLoadModule alias_module modules/mod_alias.soLoadModule deflate_module modules/mod_deflate.soLoadModule dir_module modules/mod_dir.soLoadModule filter_module modules/mod_filter.soLoadModule headers_module modules/mod_headers.soLoadModule log_config_module modules/mod_log_config.soLoadModule mime_module modules/mod_mime.soLoadModule reqtimeout_module modules/mod_reqtimeout.soLoadModule rewrite_module modules/mod_rewrite.soLoadModule setenvif_module modules/mod_setenvif.so
User daemonGroup daemonUseCanonicalName OnServerRoot "/usr/local/apache2"DocumentRoot "/usr/local/www/static"PidFile "/var/apache2/run/webui_httpd.pid"Mutex flock:/var/apache2/run mpm-acceptEnableMMAP OffEnableSendfile OnKeepAlive OnMaxKeepAliveRequests 500KeepAliveTimeout 15
## Implementing Clickjacking protectionHeader always set X-Frame-Options "sameorigin"## MIME types advertised in the Content-Type headers should not be changed## requires mod_headers.so (don't comment this line out)Header always set X-Content-Type-Options "nosniff"Header always set X-XSS-Protection "1; mode=block"
#Hiding apache version in http headerServerTokens ProdServerSignature Off
### Fix for CVE-2003-1567: HTTP TRACE / TRACK Methods Allowed ###TraceEnable off
# Enable/Disable IsiAuthSessionSecurity agent_check and ip_check# IsiAuthSessionSecurity ip_check -> ip_check enabled# IsiAuthSessionSecurity -ip_check -> ip_check disabled# IsiAuthSessionSecurity agent_check -> agent_check enabled# IsiAuthSessionSecurity -agent_check -> agent_check disabledIsiAuthSessionSecurity ip_check agent_check
# We must use a single process, multi-threaded server to correctly# cache user credentials (fds) across Platform API sessions.# StartServers: initial number of server processes to start# MaxRequestWorkers: maximum number of simultaneous client connections# MinSpareThreads: minimum number of worker threads which are kept spare# MaxSpareThreads: maximum number of worker threads which are kept spare# ThreadsPerChild: constant number of worker threads in each server process# MaxConnectionsPerChild: maximum number of requests a server process serves<IfModule mpm_worker_module> ServerLimit 1 StartServers 1 MaxRequestWorkers 64 MinSpareThreads 10 MaxSpareThreads 25 ThreadsPerChild 64 MaxConnectionsPerChild 0</IfModule>
# =================================================# REQTIMEOUT# =================================================<IfModule reqtimeout_module> RequestReadTimeout handshake=0 header=20-40,MinRate=500 body=20,MinRate=500</IfModule>
# =================================================# Logging, Errors, User Agent# =================================================LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined# Log errors with syslog to /var/log/apache2/webui_httpd_error.logErrorLog syslog:local2LogLevel error
ErrorDocument 500 /httpd/500Text.htmlErrorDocument 400 /httpd/400Text.html
SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0
# =================================================# Platform API# =================================================<IfModule fastcgi_module> FastCgiExternalServer /usr/sbin/isi_papi_d -socket /var/run/papi.sock -pass-cred -idle-timeout 600</IfModule>
# =================================================# Remote-Service API# =================================================<IfModule fastcgi_module> FastCgiExternalServer /usr/sbin/isi_rsapi_d -socket /var/run/isi_rsapi_d.sock -pass-cred -idle-timeout 600</IfModule>
# =================================================# Object API# =================================================<IfModule fastcgi_module> FastCgiExternalServer /usr/sbin/isi_object_d -pass-cred -idle-timeout 2147483647 -socket /var/run/isi_object_d.sock</IfModule>
# =================================================# Files# =================================================AcceptFilter http noneAcceptFilter https none
<IfModule dir_module> DirectoryIndex isilonnoindex.none</IfModule>
<Directory /> Options FollowSymLinks AllowOverride None Require all denied</Directory>
<Directory "/usr/local/www/static"> Options Indexes FollowSymLinks MultiViews AllowOverride None <LimitExcept GET POST DELETE HEAD> Require all denied </LimitExcept></Directory>
<FilesMatch "^\.ht"> Require all denied</FilesMatch>
<IfModule mime_module> TypesConfig conf/mime.types AddEncoding gzip .gz AddEncoding x-compress .Z AddType application/x-compress .Z AddType application/x-gzip .gz .tgz</IfModule>
# =================================================# SSL# =================================================<IfModule ssl_module> AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog builtin #SSLSessionCache dbm:/var/run/ssl_scache SSLSessionCache none SSLSessionCacheTimeout 300 Mutex flock:/var/apache2/run ssl-cache SSLRandomSeed startup file:/dev/urandom 1024 SSLRandomSeed connect file:/dev/urandom 1024 SSLProtocol -all -TLSv1.1 +TLSv1.2 SSLCipherSuite ECDHE+aRSA+AES:DHE+aRSA+AES:ECDHE+ECDSA+AES:@STRENGTH SSLHonorCipherOrder on SSLCompression off SSLSessionTickets off SSLPassPhraseDialog exec:/etc/mcp/scripts/httpd_keypass.py SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off SSLOpenSSLConfCmd DHParameters /usr/local/apache24/conf/webui_dhparams.pem SSLOpenSSLConfCmd Curves prime256v1:secp384r1:secp521r1</IfModule>
# =================================================# Platform API Virtual Hosts# =================================================<VirtualHost _default_:8080> SSLEngine on SSLCertificateFile /ifs/.ifsvar/modules/isi_certs/system/server/zone_1/certs/794429aa484f2be3114356307ea2ff0bf004a8fbaa66e3e9c8647a923720f1ba.crt SSLCertificateKeyFile /ifs/.ifsvar/modules/isi_certs/system/server/zone_1/private/794429aa484f2be3114356307ea2ff0bf004a8fbaa66e3e9c8647a923720f1ba.key DocumentRoot "/usr/local/www/static" ServerAdmin support@isilon.com Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' data:; script-src 'self' 'unsafe-eval'; style-src 'unsafe-inline' 'self'; "
# Log access with syslog to /var/log/apache2/webui_httpd_access.log CustomLog "|$ logger -t httpd -p local3.info" combined
AddOutputFilterByType DEFLATE text/css text/javascript application/javascript application/x-javascript BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html AllowEncodedSlashes On ErrorDocument 503 /httpd/503Text.html ErrorDocument 400 /httpd/400WebUIText.html ErrorDocument 401 /httpd/401WebUIText.html ErrorDocument 403 /httpd/403WebUIText.html ErrorDocument 404 /httpd/404WebUIText.html ErrorDocument 405 /httpd/405WebUIText.html ErrorDocument 422 /httpd/422WebUIText.html ErrorDocument 423 /httpd/423WebUIText.html ErrorDocument 424 /httpd/424WebUIText.html ErrorDocument 500 /httpd/500WebUIText.html
<IfModule rewrite_module> RewriteEngine On #Uncomment these lines to debug rewrite rules #RewriteLog "/var/log/apache2/webui_httpd_error.log" #RewriteLogLevel 9 # Redirect internal subrequests to an error to prevent them from being # redirected to another module and causing another authentication. RewriteCond %{IS_SUBREQ} t RewriteRule ^ - [G]
# Restrict unnecessary http methods RewriteCond %{REQUEST_METHOD} ^(PATCH|OPTIONS|TRACK|CONNECT|TRACE|COPY|LINK|UNLINK|PURGE|LOCK|UNLOCK|PROPFIND|VIEW) RewriteRule .* - [L,R=405] RewriteCond %{REQUEST_METHOD} ^(PATCH|OPTIONS|TRACK|CONNECT|TRACE|COPY|LINK|UNLINK|PURGE|LOCK|UNLOCK|PROPFIND|VIEW) RewriteRule .* - [L,R=405] RewriteCond %{REQUEST_METHOD} ^(PATCH|OPTIONS|TRACK|CONNECT|TRACE|COPY|LINK|UNLINK|PURGE|LOCK|UNLOCK|PROPFIND|VIEW) RewriteRule .* - [L,R=405]
# Older UI versions will redirect to (legacy) Login # after an upgrade. Force them into the new system RewriteRule ^/$ /v2/html/OneFS.html RewriteRule ^/Login.* /v2/html/OneFS.html RewriteRule ^/cloudpool_eula.* /v2/html/cloudpool_eula.txt RewriteRule ^/OneFS$ /v2/html/OneFS.html
# Reroute legacy /Status to base URI RewriteRule ^/Status* https://%{SERVER_ADDR}:8080/ [L,R]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.gz -f RewriteRule (.*\.(html|js|css))$ $1.gz [L]
# Rewrite all request past /OneFS to v3 RewriteRule ^/OneFS/(.*) /v3/$1
# For v3 requests, if the file exists on disk, serve it RewriteCond %{REQUEST_FILENAME} ^/v3 [NC] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.gz -f RewriteRule (.*)$ $1.gz [L]
RewriteCond %{REQUEST_FILENAME} ^/v3 [NC] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f RewriteRule ^ - [L]
# For all request to v3 that do no exists (like 404) return the index file so # the app can handle them RewriteRule ^/v3 /v3/index.html.gz [L]
# Stop requests for static files RewriteRule ^/(json|v2|vasa-catalog|httpd)/.* $0 [L]
RewriteRule ^/namespace(.*) /namespace$1 [PT]
RewriteRule ^/object(.*) - [R=503] RewriteRule ^/webhdfs(.*) - [R=503] RewriteRule ^/imagetransfer(.*) - [R=503] RewriteRule ^/jmx(.*) - [R=503]
RewriteRule ^/authenticate /session/1/session [P] RewriteRule ^/objectstore(.*) /object$1 [PT] RewriteRule ^/favicon.ico /v2/images/favicon.ico [L] RewriteRule ^/MIBs/(.*) "/usr/share/snmp/mibs/$1" [L] RewriteRule ^/MIBs-DEFs/(.*) "/usr/share/snmp/defs/$1" [L] RewriteRule ^/platform(.*) /platform$1 [PT] RewriteRule ^/remote-service(.*) /remote-service$1 [PT] RewriteRule ^/session(.*) /session$1 [PT] RewriteRule ^/mod_ssl:error:HTTP-request https://%{SERVER_ADDR}:8080/ [L,R] </IfModule>
<FilesMatch .*\.html.gz> ForceType text/html </FilesMatch>
<FilesMatch .*\.css.gz> ForceType text/css </FilesMatch>
<FilesMatch .*\.js.gz> ForceType application/javascript </FilesMatch>
<Directory "/usr/share/snmp/mibs"> Options Indexes MultiViews ForceType application/octet-stream AllowOverride None Require all granted </Directory> <Directory "/usr/share/snmp/defs"> Options Indexes MultiViews ForceType application/octet-stream AllowOverride None Require all granted </Directory>
<Location /webhdfs> RemoveEncoding .gz .Z </Location>
Header always add Strict-Transport-Security: "max-age=31536000;"
# ================================================= # Platform API # ================================================= Alias /platform /usr/sbin/isi_papi_d <Location /platform> AuthType Isilon IsiAuthName "platform" IsiAuthTypeBasic Off IsiAuthTypeSessionCookie On IsiDisabledZoneAllow Off IsiMultiZoneAllow On IsiCsrfCheck On Require valid-user SetHandler fastcgi-script Options +ExecCGI ErrorDocument 400 /httpd/400PAPIText.html ErrorDocument 401 /httpd/401PAPIText.html ErrorDocument 403 /httpd/403PAPIText.html ErrorDocument 404 /httpd/404PAPIText.html ErrorDocument 405 /httpd/405PAPIText.html ErrorDocument 422 /httpd/422PAPIText.html ErrorDocument 423 /httpd/423PAPIText.html ErrorDocument 424 /httpd/424PAPIText.html ErrorDocument 500 /httpd/500PAPIText.html </Location>
<Location /session/1/session> SetHandler session-service IsiAuthServices platform remote-service namespace ForceType text/plain ErrorDocument 401 /json/401.json
</Location>
<Location /session/1/saml/logout/slostatus> SetHandler saml-logout-slo ErrorDocument 401 /json/401.json
</Location>
<Location /session/1/saml/logout/session> SetHandler saml-logout-session ErrorDocument 401 /json/401.json
</Location>
# Authentication is not required to access these resources <Location /platform/*/cluster/identity> IsiAuthIgnore GET </Location> <Location /platform/*/cluster/identity/> IsiAuthIgnore GET </Location> <Location /platform/*/cluster/brand> IsiAuthIgnore GET </Location> <Location /platform/*/auth/users/*/change-password> IsiAuthIgnore PUT </Location> <Location /platform/*/auth/providers/saml-services/settings> IsiAuthIgnore GET </Location> <Location /platform/*/auth/providers/saml-services> IsiAuthIgnore GET </Location> <Location /platform/*/upgrade/cluster/mixed-mode> IsiAuthIgnore GET </Location> <Location /platform/*/cluster/version> IsiAuthIgnore GET </Location>
# ================================================= # Object API # =================================================
Alias /namespace /usr/sbin/isi_object_d <Location /namespace> AuthType Isilon IsiAuthName "namespace" IsiAuthTypeBasic Off IsiAuthTypeSessionCookie On IsiDisabledZoneAllow Off IsiMultiZoneAllow On IsiCsrfCheck On Require valid-user SetHandler fastcgi-script Options +ExecCGI ErrorDocument 401 /json/401.json Header set Content-Security-Policy "default-src 'none'" </Location>
# ================================================= # Remote-Service API # ================================================= Alias /remote-service /usr/sbin/isi_rsapi_d <Location /remote-service> AuthType Isilon IsiAuthName "remote-service" IsiAuthTypeBasic Off IsiAuthTypeSessionCookie On Require valid-user SetHandler fastcgi-script Options +ExecCGI ErrorDocument 401 /json/401.json </Location>
# Session timeouts IsiAuthSessionTimeoutInactive 900 IsiAuthSessionTimeoutAbsolute 14400 Timeout 500
</VirtualHost>