Grouper container documentation
The Grouper project currently supports Grouper v2.5+ running only in the i2incommon container (including of course subcontainers). If you want to take pieces out and run in an unsupported way feel free to do that on your own. If you have questions about how to do something with the container that you think you cannot do and think you need to do surgery, please discuss it with the Grouper team first, there is likely a way to do it with the existing container. We are open to changing how the container is structured in v2.6, lets discuss and improve together.
- Grouper container - changes in 2.6/2.7
- Grouper container institutional images
- Grouper Container running as non-root
- Grouper container unit tests
- Grouper container v2.6 change JVM
- Grouper customize container config files
- Grouper customize SSL certificate
- Grouper dev and container strategy for v2.5
- Grouper installer task to build the container v2.5
- Grouper v2.5 container apply patch
- Grouper v2.5 container docker-compose example
- Grouper v2.5 container SSL trust management
- Grouper v2.5 customize UI authentication Shibboleth
- Grouper v2.5 customize UI security headers
- Running Grouper in a different container
- Running Grouper not in a container
This is how the Grouper container works in v2.5
Directory structure
alpha order...
Path | Description |
|---|---|
/etc/httpd/conf.d/grouper-www.conf (removed in v5) | Apache config for Grouper. Includes Shibboleth directive if using Shibboleth |
/etc/shibboleth/shibboleth2.xml (removed in v5) | Shibboleth config |
/opt/grouper/ | Grouper base dir |
/opt/grouper/grouperWebapp/ | J2EE webapp dir for grouper |
/opt/grouper/grouperWebapp/WEB-INF/classes/ | Grouper config files |
/opt/grouper/grouperWebapp/WEB-INF/classes/log4j.properties (before v2.6.5) | Log file |
/opt/grouper/grouperWebapp/WEB-INF/classes/log4j2.xml (v2.6.7.1+) | Log file, replace if you like |
/opt/grouper/grouperWebapp/WEB-INF/classes/log4j_additional.properties (before v2.6.5) | If you want to append some configurations to the built-in log4j.properties, put those here (2.5.41+) |
/opt/grouper/grouperWebapp/WEB-INF/classes/log4j2.additionalLoggers.xml.txt (v2.6.7.1+) | If you want to put loggers in, put in this file, they will be substituted into the stock log4j2.xml e.g. <Logger name="edu.a.b.c" level="debug" additivity="false">
<AppenderRef ref="grouper_error"/>
</Logger>
|
/opt/grouper/grouperWebapp/WEB-INF/classes/log4j2.additionalAppenders.xml.txt (v2.6.8+) | If you want to put appenders in, put in this file, they will be substituted into the stock log4j2.xml e.g. <RollingFile name="some_appender_name" fileName="/opt/grouper/logs/someFile.log"
filePattern="/opt/grouper/logs/someFile.log.%d{yyyy-MM-dd}" >
<PatternLayout pattern="someFile.log;${ENV};${USERTOKEN};${layout}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="30" />
</RollingFile>
|
/opt/grouper/grouperWebapp/WEB-INF/classes/grouperText/grouper.text.en.us.properties | Externalized text file (note in 2.5.33+ this can be imported into database config) |
/opt/grouper/grouperWebapp/WEB-INF/ddlScripts | DDL scripts that are run automatically or not, are written here |
/opt/grouper/grouperWebapp/WEB-INF/libUiAndDaemon/ | Jars used in UI and daemon only. Place custom change log consumers here |
/opt/grouper/grouperWebapp/WEB-INF/lib/ | Jars used in all services (UI/WS/daemon/scim). Replace database drivers or add jars for all services |
/opt/grouper/grouperWebapp/WEB-INF/web.xml | web.xml for grouper might need security settings for authentication (e.g. tomcat LDAP authn for WS) |
/opt/grouper/logs | If you are externalizing logs to a "mount", this is the suggested standard location |
/opt/grouper/slashRoot | Any files or folders in here will be overlaid on / (root dir). This is useful for lower maturity levels If you have a dir in your host, lets say "/foo/bar/slashRoot", and you mount that to the container |
/opt/container_files/certs | built in self signed certs |
/opt/grouper/certs/anchors/*.pem | |
/opt/grouper/certs/client/*.pem | SSL certs (to connect from Grouper to external systems), not for client authentication necessarily |
/opt/grouper/certs/keys/*.key | SSL cert private keys (or could go somewhere else) |
/opt/hsqldb | HSQLDB directory if using an embedded database (for quick starts or demos) |
/opt/tomee (v2.5, v2.6) /opt/tomcat (v4+) | Tomee/Tomcat app server |
/opt/tomee/bin (v2.5, v2.6) /opt/tomcat/bin (v4+) | Startup and shutdown scripts for tomee/tomcat |
/opt/tomee/conf/server.xml (v2.5, v2.6) /opt/tomcat/conf/server.xml (v4+) | Tomee/Tomcat server.xml might need settings for authentication (e.g. tomcat LDAP authn for WS) |
/usr/lib/jvm/java-1.8.0-amazon-corretto (v2.5, v2.6) /usr/lib/jvm/java-17-amazon-corretto (v4) | JAVA_HOME (do not hard code this path, use the ENV var) |
/usr/lib/jvm/java-1.8.0-amazon-corretto/jre/lib/security/cacerts (v2.5, v2.6) /usr/lib/jvm/java-17-amazon-corretto/jre/lib/security/cacerts (v4) | cacerts for java |
Ports and configs
Port | Service | Description | Config file |
|---|---|---|---|
443 (removed in v5) | Apache | Apache listens to requests and reverse proxies to tomcat 8009. Note, v5 there is no apache and tomcat listens on 8443 by default. | /etc/httpd/conf.d/grouper-www.conf |
8009 | AJP | Tomcat listens here to get reverse proxied requests | /opt/tomee/conf/server.xml (v2.5, v2.6) /opt/tomcat/conf/server.xml (v4) |
|
| maps the /opt/grouper/grouperWebapp directory with | /opt/tomee/conf/Catalina/localhost/grouper.xml (v2.5, v2.6) /opt/tomcat/conf/Catalina/localhost/grouper.xml (v4) |
8005/8080/8443 | Tomcat | 8005 is the internal shutdown port for tomcat 8080 is the HTTP port for tomcat 8443 is the HTTPS port for tomcat | /opt/tomee/conf/server.xml (v2.5, v2.6) /opt/tomcat/conf/server.xml (v4) |
9001 | Hsqldb | Embedded database port (for quick starts and demos) | (removed in 2.6.5+) |
22 | SSHD | If you are running in a managed environment where there is no console access, you need to have the option to have SSHD for troubleshooting reasons (e.g. see env vars, run top, jstack, look at config files, etc) | You can make this work however you want, here is an example from AWS ECS Dockerfile RUN yum install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
EXPOSE 22 Mount or overlay: /opt/tier-support/supervisord_sshd.conf [program:sshd]
command=/usr/sbin/sshd -D
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0 Mount or overlay or edit: /usr/local/bin/grouperScriptHooks.sh #!/bin/sh
grouperScriptHooks_setupFilesPost() {
cp -v /opt/tier-support/supervisord.conf /opt/tier-support/supervisord.conf.origGrouper
cat /opt/tier-support/supervisord_sshd.conf >> /opt/tier-support/supervisord.conf
# assumes you have an env var PASS from your password manager
echo "root:${PASS}" | chpasswd
}
export -f grouperScriptHooks_setupFilesPost
|
Grouper Container params
There are a few arguments you can pass to the container, and env vars... Note the command if specified (optional) will set env vars before the env vars. So you could call the container with "ui" but then specify that -e GROUPER_RUN_SHIB_SP='false' (e.g. if you run CAS)
Argument | Description |
|---|---|
ui | will set env vars: |
ws | will set env vars: |
scim | will set env vars: |
daemon | will set env vars: |
bin/gsh <gshScriptFileName> -or- | will just run gsh commands from docker command line e.g. (note, you need to put that file in the container e.g. with slashRoot docker run --detach --mount type=bind,src=/opt/grouperInstaller/logs,dst=/opt/grouper/logs --mount type=bind,src=/opt/grouperInstaller/slashRoot,dst=/opt/grouper/slashRoot --name gsh i2incommon/grouper:2
.5.XX /opt/grouper/grouperWebapp/WEB-INF/bin/gsh.sh /opt/grouper/grouperWebapp/WEB-INF/bin/createGrouperSystemPasswordUi.gshNote: this will not work with a quickstart container. Shell into the quickstart container and run gsh.sh |
ui-ws | will set env vars (if not overridden): |
quickstart (v2.5.27+) | will set env vars (if not overridden): |
containerPing (v4.9.1+, v5.6.0+) | run ping every 10 minutes. This ensures a process is running so the container does not die. In v4, if you are running supervisor, you can run a container with no tomcat. But in v5, there needs to be a process running. So if you want a GSH container you can use the containerPing command. Or if you just want to start a grouper container that does nothing for testing of other things (file paths, file permissions, certs, etc). |
-e GROUPER_OPENSHIFT=true | will set env vars (if not overridden): |
<no command> | do nothing, so GSH can be used in bash in container, or pass in ENV vars to run something not with command above |
-e GROUPER_UI=true | env var will tell grouper to allow ui calls via grouper.hibernate.base.properties (default false) |
-e GROUPER_WS=true | env var will tell grouper to allow ws calls via grouper.hibernate.base.properties (default false) |
-e GROUPER_SCIM=true | env var will tell grouper to allow ws calls via grouper.hibernate.base.properties (default false) |
-e GROUPER_DAEMON=true | env var will tell grouper to kick of daemon thread in tomcat (default false) |
-e GROUPER_MCP=true (v7.0.1+) | env will enable the MCP servlets in Grouper for AI. This is needed in the UI env and WS env. |
-e GROUPER_QUICKSTART=true | env var will setup quickstart components (default false) |
-e GROUPER_RUN_APACHE=true (removed in v5) | env var will tell supervisor to kick off apache in container. Note, apache is not needed (default false) for Grouper. You could hook up an external web server to tomcat or run from tomcat itself (not recommended) |
-e GROUPER_RUN_SHIB_SP=true | env var will tell supervisor to kick off shib sp in container. Note if you dont use shib this is not needed. (default false) Note: you can also run shib outside the grouper container (e.g. in another container or from reverse proxy) Note: if RUN_SHIB_SP is false, it will take the shib apache directive out of grouper-www.conf |
-e GROUPER_USE_PIPES (v2.5.46+) (removed in v5) | if logs should go to pipe. Defaults to true if openshift if false |
-e GROUPER_SHIB_LOG_USE_PIPE (v2.5.30+) (removed in v5) | env var to not setup a pipe for shib. defaults to true. |
-e GROUPER_RUN_TOMEE=true (v2.5, v2.6) | env var will tell supervisor to kick off tomcat. Note you must have this to true if you are doing anything (default false) but a GSH env. The WS/UI/scim/daemon must run tomcat in container. |
-e GROUPER_RUN_HSQLDB=true (v2.5.27+) | env var will tell supervisor to start hsqldb, storing data files to /opt/hsqldb and listening in container on port 9001 (default false) |
-e GROUPER_USE_SSL=false (v2.5.28+) | if you do not want apache listening on 443 ssl. If apache is running, default is true in v5+ this applies to tomcat and not apache |
-e GROUPER_WEBCLIENT_IS_SSL=false (v2.5.44+) | (default is "true"). if the client to Grouper is not SSL (whether SSL is done in the Grouper container or outside), then set this to false (for browser or WS caller) so Grouper does not setup URLs back to itself with SSL |
-e GROUPER_SELF_SIGNED_CERT=true | if you dont set GROUPER_SELF_SIGNED_CERT, and you have GROUPER_USE_SSL=true (default), and you dont set GROUPER_SSL_CERT_FILE, and this file doesnt exist: /etc/pki/tls/certs/host-cert.pem, then this will be true. Means a self signed cert will be configured with apache so it will function though not ideal. Common to use this behind a load balancer which terminates SSL In v5 this applies to tomcat and not apache |
-e GROUPER_SSL_USE_STAPLING=false (v2.5.41+) (removed in v5) | set to false to turn stapling off in ssl-enabled.conf (if you don't overlay that file) |
-e GROUPER_SSL_CERT_FILE=a/b/c (v2.5.41+) | Location of cert file. For self signed built in cert see this page |
-e GROUPER_SSL_KEY_FILE=a/b/d (v2.5.41+) | Location of key file. For self signed built in cert see this page |
-e GROUPER_SSL_USE_CHAIN_FILE=true|false (v2.5.41+) | true if should include an SSL chain file in the ssl-enabled.conf, false if should remove it |
-e GROUPER_SSL_CHAIN_FILE=/a/b/e (v2.5.41+) | Location of chain file if GROUPER_SSL_USE_CHAIN_FILE=true. If GROUPER_SELF_SIGNED_CERT!=true, this defaults to /etc/pki/tls/certs/cachain.pem (if that file exists), if GROUPER_SELF_SIGNED_CERT=true, this is not used since GROUPER_SSL_USE_CHAIN_FILE=true |
-e GROUPER_APACHE_SERVER_NAME=https://a.b.c:443 (v2.5.28+) (removed in v5) | will set server name in grouper-www.conf and will set UseCanonicalName On. Note that if you are doing SSL offloading to your container which has Shibboleth, you will want to set this to https://your-hostname:443, and modify shibboleth2.xml to set handlerSSL="false" in <Sessions>. |
-e GROUPER_APACHE_NONSSL_PORT=80 (v2.5.28+) (removed in v5) | will change the non-ssl port of apache. default is 80. |
-e GROUPER_APACHE_SSL_PORT=443 (v2.5.28+) (removed in v5) | will change the ssl port of apache. default is 443. |
-e GROUPER_APACHE_AJP_TIMEOUT_SECONDS (v2.5.28+) (removed in v5) | defaults to 3600 (one hour), customize here |
-e GROUPER_APACHE_DIRECTORY_INDEXES (v2.5.30+) (removed in v5) | defaults to false. set to true to have apache directory indexes on |
-e GROUPER_APACHE_REMOTE_IP_HEADER (v2.5.41+) (removed in v5) | e.g. X-Forwarded-For Replaces source IP address from reverse proxy. See apache directive RemoteIPHeader (will put in grouper-www.conf) |
-e GROUPER_APACHE_REMOTE_IP_TRUSTED_PROXY (v2.5.41+) (removed in v5) | e.g. 1.2.3.4/28. Allows proxy from certain networks. See apache directive RemoteIPTrustedProxy (will put in grouper-www.conf) |
-e GROUPER_APACHE_REMOTE_IP_INTERNAL_PROXY (v2.6.8+) (removed in v5) | e.g. 10.1.2.3/24 Allows proxy from private networks. See apache directive RemoteIPInternalProxy (will put in grouper-www.conf) |
-e GROUPER_APACHE_STATUS_PATH (v2.5.51+) (removed in v5) (removed in v5) | The status path is good for monitoring (e.g. from nagios). You can restrict the source IP address of status in the grouper.properties: ws.diagnostic.sourceIpAddresses If nothing specified, there is a status path: /status_grouper/status If you don't want this, set: -e GROUPER_APACHE_STATUS_PATH=none If you want it something different, do this: -e GROUPER_APACHE_STATUS_PATH=/status2_grouper/status |
-e GROUPER_TOMCAT_HTTP_PORT (v2.5.28+) | defaults to -1. Set to -1 to not run the http/8080 connector (v4.10.2+, v5.7.0+). |
-e GROUPER_TOMCAT_HTTPS_PORT (v4.10.2+) (v5.7.0+) | defaults to 8443. Set to -1 to not run the https/8443 connector (v4.10.2+, v5.7.0+). |
-e GROUPER_TOMCAT_AJP_PORT (v2.5.28+) | defaults to 8009 in v4.10.2+. defaults to -1 in v5.7.0+. Set to -1 to not run the 8009 apache connector (v4.10.2+, v5.7.0+). |
-e GROUPER_TOMCAT_SHUTDOWN_PORT (v2.5.28+) | defaults to 8005 |
-e GROUPER_TOMCAT_LOG_ACCESS=true (v2.5.29+) | defaults to false. if you want tomcat to log access. Apache does this too. |
-e GROUPER_TOMCAT_LOG_ACCESS_DIRECTORY=/opt/grouper/logs | defaults to /tmp in v4. defaults to /opt/grouper/logs in v5.7.0+ in v7.1.0+ and v6.2.0+ this defaults to /opt/grouper/logs if GROUPER_LOG_TO_HOST=true, and blank if false (log to STDOUT) |
-e GROUPER_TOMCAT_LOG_ACCESS_PATTERN (v6.2.0+, v7.2.0+) | If GROUPER_TOMCAT_LOG_ACCESS is true, this is the pattern for the Tomcat access logging. The default is: Because of how Grouper wraps requests, the normal %u element may not available for Tomcat logging. The %{grouperRemoteUser}r element says to use the request attribute grouperRemoteUser, which Grouper will set for a session for both built-in UI auth and for Pac4j. If you are using an external authentication container and passing the remote user via a header or environment variable, you may need to override the default format and use %u which logs REMOTE_USER. |
-e GROUPER_TOMCAT_MAX_HEADER_COUNT=200 (v2.5.57+) | due to an error in chrome 93, tomcat throws an exception about too many http headers. The default is now 200 for tomcat, but can be customized |
-e GROUPER_TOMCAT_SESSION_TIMEOUT_MINUTES=600 (v2.5.36+) | tomcat defaults to <session-timeout>30</session-timeout> in /opt/tomee/conf/web.xml or /opt/tomcat/conf/web.xml, Grouper defaults to 10 hours (600) for UI and 1 minute fo WS. If you use SSO without requiring reauth, then you might as well default to the SSO session length for the UI (ask your IdP operator). Set to -2 to not change the default value in file |
-e GROUPER_TOMCAT_REMOTE_CIDR_VALVE_ALLOW='1.2.3.4/32' (v4.3.2+ and v5.1.1+) | inserts a valve into server.xml with RemoteCIDRValve to restrict the source IP address for requests to tomcat (e.g. AJP) |
-e GROUPER_TOMCAT_REMOTE_IP_VALVE=false (v4.10.2+ and v5.7.0+) | when tomcat is run without apache behind a web server or load balancer, set this to true and configure below. If you set controls over IP addresses allowed to configure (grouperUi.configurationEditor.sourceIpAddresses or GROUPER_UI_CONFIGURATION_EDITOR_SOURCEIPADDRESSES), you will want to use this so that you can use the IPs of the originating client and not the IPs for the load balancers |
-e GROUPER_TOMCAT_REMOTE_IP_INTERNAL_PROXIES="abc" (v4.10.2+ and v5.7.0+) | Sets the internalProxies matching pattern in the Tomcat RemoteIpValve valve. Use along with GROUPER_TOMCAT_REMOTE_IP_VALVE=true. Regular expression that matches the IP addresses of internal proxies. If they appear in the By default, 10/8, 192.168/16, 169.254/16, 127/8, 100.64/10, 172.16/12, and ::1 are allowed. Due to how they are processed by the Grouper startup script, the pipe character needs to be escaped once, and all other escapes need to be double escaped. Example: GROUPER_TOMCAT_REMOTE_IP_INTERNAL_PROXIES=10\\.10\\.\\d{1,3}\\.\\d{1,3}\|192\\.168\\.1\\.\\d{1,3} server.xml: <Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="10\.10\.\d{1,3}\.\d{1,3}|192\.168\.1\.\d{1,3}" /> |
-e GROUPER_TOMCAT_REMOTE_IP_HEADER=x-forwarded-for (v4.10.2+ and v5.7.0+) | Name of the Http Header read by this valve that holds the list of traversed IP addresses starting from the requesting client. Defaults to: x-forwarded-for |
-e GROUPER_TOMCAT_REMOTE_IP_PROXIES_HEADER=x-forwarded-by (v4.10.2+ and v5.7.0+) | Name of the http header created by this valve to hold the list of proxies that have been processed in the incoming remoteIpHeader. Defaults to: x-forwarded-by |
-e GROUPER_TOMCAT_REMOTE_IP_TRUSTED_PROXIES="abc" (v4.10.2+ and v5.7.0+) | Regular expression that matches the IP addresses of trusted proxies. If they appear in the |
-e GROUPER_TOMCAT_REMOTE_IP_PROTOCOL_HEADER=X-Forwarded-Proto (v4.10.2+ and v5.7.0+) | Name of the http header read by this valve that holds the flag that this request. Defaults to: X-Forwarded-Proto |
-e GROUPER_TOMCAT_REMOTE_IP_PROTOCOL_HEADER_HTTPS_VALUE=https (v4.10.2+ and v5.7.0+) | Value of the |
-e GROUPER_TOMCAT_REMOTE_IP_HTTP_SERVER_PORT=80 (v4.10.2+ and v5.7.0+) | Value returned by ServletRequest.getServerPort() when the |
When checking the java heap settings, might need to start the container with strace capabilities for jmap to work properly.
--cap-add=SYS_PTRACE