diff --git a/comanage-registry-mod-auth-openidc/000-comanage.conf b/comanage-registry-mod-auth-openidc/000-comanage.conf new file mode 100644 index 0000000..b55ceba --- /dev/null +++ b/comanage-registry-mod-auth-openidc/000-comanage.conf @@ -0,0 +1,65 @@ +# COmanage Registry Apache HTTP Server configuration +# +# Portions licensed to the University Corporation for Advanced Internet +# Development, Inc. ("UCAID") under one or more contributor license agreements. +# See the NOTICE file distributed with this work for additional information +# regarding copyright ownership. +# +# UCAID licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + + RewriteEngine On + RewriteCond %{HTTPS} off + RewriteRule ^ https://%{HTTP_HOST}:443%{REQUEST_URI} [R=302,L,QSA] + + + + + DocumentRoot /var/www/html + + RedirectMatch ^/$ /registry/ + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + LogLevel warn + + Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" + + SSLEngine on + SSLProtocol all -SSLv2 -SSLv3 + SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH + SSLHonorCipherOrder on + + SSLCertificateFile /etc/apache2/cert.pem + SSLCertificateKeyFile /etc/apache2/privkey.pem + SSLCertificateChainFile /etc/apache2/chain.pem + + IncludeOptional /etc/apache2/conf-enabled/mod-auth-openidc.conf + + + Options Indexes FollowSymLinks + DirectoryIndex index.php + AllowOverride All + AuthType openid-connect + OIDCUnAuthAction pass + Require valid-user + + + + AuthType openid-connect + OIDCUnAuthAction auth + Require valid-user + + + diff --git a/comanage-registry-mod-auth-openidc/Dockerfile.template b/comanage-registry-mod-auth-openidc/Dockerfile.template new file mode 100644 index 0000000..133a789 --- /dev/null +++ b/comanage-registry-mod-auth-openidc/Dockerfile.template @@ -0,0 +1,144 @@ +# COmanage Registry Dockerfile template +# +# Portions licensed to the University Corporation for Advanced Internet +# Development, Inc. ("UCAID") under one or more contributor license agreements. +# See the NOTICE file distributed with this work for additional information +# regarding copyright ownership. +# +# UCAID licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +FROM php:7.0-apache + +ARG COMANAGE_REGISTRY_VERSION=%%COMANAGE_REGISTRY_VERSION%% +ARG COMANAGE_REGISTRY_SRC_URL=https://github.com/Internet2/comanage-registry/archive/$COMANAGE_REGISTRY_VERSION.tar.gz + +LABEL comanage_registry_version=$COMANAGE_REGISTRY_VERSION +LABEL comanage_registry_src_url=$COMANAGE_REGISTRY_SRC_URL + +ENV COMANAGE_REGISTRY_DIR /srv/comanage-registry + +RUN apt-get update && apt-get install -y \ + libldap-2.4-2 \ + libldap2-dev \ + libmysqlclient18 \ + libmysqlclient-dev \ + libpq-dev \ + libxml2 \ + libxslt1-dev \ + libxslt1.1 \ + ssl-cert \ + wget \ + zlib1g \ + && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ + && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu \ + && docker-php-ext-configure mysqli --with-mysqli=/usr/bin/mysql_config \ + && docker-php-ext-install xsl pdo pdo_mysql pdo_pgsql mysqli pgsql ldap \ + && docker-php-source delete \ + && apt-get purge -y \ + libldap2-dev \ + libmysqlclient-dev \ + libpq-dev \ + && apt-get clean + +ENV MOD_AUTH_OPENIDC_SRC_URL https://github.com/pingidentity/mod_auth_openidc/archive/v2.1.6.tar.gz +ENV MOD_AUTH_OPENIDC_SRC /opt/OIDC_SRC + +RUN awk '$1 ~ "^deb" { $3 = $3 "-backports"; print; exit }' /etc/apt/sources.list > /etc/apt/sources.list.d/backports.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + apache2-dev \ + libcjose0 \ + libcjose-dev \ + libssl-dev \ + libcurl4-openssl-dev \ + libjansson-dev \ + libpcre3-dev \ + pkg-config \ + automake \ + && mkdir -p "$MOD_AUTH_OPENIDC_SRC" \ + && wget -O mod_auth_openidc.tar.gz "$MOD_AUTH_OPENIDC_SRC_URL" \ + && tar -zxf mod_auth_openidc.tar.gz -C "$MOD_AUTH_OPENIDC_SRC" --strip-components=1 \ + && cd "$MOD_AUTH_OPENIDC_SRC" \ + && ./autogen.sh \ + && ./configure --with-apxs2=`which apxs2` \ + && make \ + && make install \ + && rm -f mod_auth_openidc.tar.gz \ + && cd \ + && rm -rf "$MOD_AUTH_OPENIDC_SRC" \ + && echo "LoadModule auth_openidc_module /usr/lib/apache2/modules/mod_auth_openidc.so" > /etc/apache2/mods-available/auth_openidc.load \ + && a2enmod auth_openidc \ + && apt-get purge -y \ + apache2-dev \ + libcjose-dev \ + libssl-dev \ + libcurl4-openssl-dev \ + libjansson-dev \ + libpcre3-dev \ + pkg-config \ + automake \ + && apt-get clean + +WORKDIR "$COMANAGE_REGISTRY_DIR" + +COPY 000-comanage.conf /etc/apache2/sites-available/000-comanage.conf + +RUN mkdir -p "$COMANAGE_REGISTRY_DIR" \ + && wget -O comanage.tar.gz $COMANAGE_REGISTRY_SRC_URL \ + && tar -zxf comanage.tar.gz -C "$COMANAGE_REGISTRY_DIR" --strip-components=1 \ + && rm -f comanage.tar.gz \ + && rm -f "$COMANAGE_REGISTRY_DIR/app/tmp" \ + && cp -r "$COMANAGE_REGISTRY_DIR/app/tmp.dist" "$COMANAGE_REGISTRY_DIR/app/tmp" \ + && chown -R www-data:www-data "$COMANAGE_REGISTRY_DIR/app/tmp" \ + && cd /var/www/html \ + && ln -s "$COMANAGE_REGISTRY_DIR/app/webroot" registry \ + && cd "$COMANAGE_REGISTRY_DIR" \ + && rm -rf local \ + && mkdir -p /local \ + && ln -s /local local \ + && a2enmod headers \ + && a2enmod ssl \ + && a2enmod rewrite \ + && a2dissite 000-default.conf \ + && a2ensite 000-comanage.conf \ + && a2disconf other-vhosts-access-log \ + && cd /etc/apache2 \ + && ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem cert.pem \ + && ln -s /etc/ssl/private/ssl-cert-snakeoil.key privkey.pem \ + && ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem chain.pem \ + && sed -ie 's/'"'"'engine'"'"' => '"'"'FileLog'"'"'/'"'"'engine'"'"' => '"'"'ConsoleLog'"'"'/' "$COMANAGE_REGISTRY_DIR/app/Config/bootstrap.php" + +COPY docker-comanage-entrypoint /usr/local/bin/ + +# expose COmanage Registry local directory +VOLUME ["/local"] + +WORKDIR /var/www/html + +EXPOSE 80 443 + +# Default values for first administrator bootstrapped +# into the platform, most likely overridden at build time +# using build arguments. +ARG COMANAGE_REGISTRY_ADMIN_GIVEN_NAME +ARG COMANAGE_REGISTRY_ADMIN_FAMILY_NAME +ARG COMANAGE_REGISTRY_ADMIN_USERNAME +ARG COMANAGE_REGISTRY_ENABLE_POOLING + +ENV COMANAGE_REGISTRY_ADMIN_GIVEN_NAME ${COMANAGE_REGISTRY_ADMIN_GIVEN_NAME:-Registry} +ENV COMANAGE_REGISTRY_ADMIN_FAMILY_NAME ${COMANAGE_REGISTRY_ADMIN_FAMILY_NAME:-Admin} +ENV COMANAGE_REGISTRY_ADMIN_USERNAME ${COMANAGE_REGISTRY_ADMIN_USERNAME:-registry.admin} +ENV COMANAGE_REGISTRY_ENABLE_POOLING ${COMANAGE_REGISTRY_ENABLE_POOLING:-No} + +ENTRYPOINT ["docker-comanage-entrypoint"] + +CMD ["apache2-foreground"] diff --git a/comanage-registry-mod-auth-openidc/README.md b/comanage-registry-mod-auth-openidc/README.md new file mode 100644 index 0000000..453ea85 --- /dev/null +++ b/comanage-registry-mod-auth-openidc/README.md @@ -0,0 +1,175 @@ + + +# COmanage Registry mod\_auth\_openidc + +Intended to build a COmanage Registry image +using the official PHP 7 with Apache image as the foundation +and providing mod\_auth\_openidc for Apache HTTP Server +as the authentication mechanism. + +## Build + +``` +export COMANAGE_REGISTRY_VERSION=develop +sed -e s/%%COMANAGE_REGISTRY_VERSION%%/${COMANAGE_REGISTRY_VERSION}/g Dockerfile.template > Dockerfile +docker build -t comanage-registry:${COMANAGE_REGISTRY_VERSION}-mod-auth-openidc . +``` + +You can (and should) use build arguments to bootstrap the first +platform administrator. The administrator username is the value +COmanage Registry expects to read from $REMOTE\_USER after +the administrator authenticates using whichever authentication +method is provided: + +``` +export COMANAGE_REGISTRY_VERSION=develop + +export COMANAGE_REGISTRY_ADMIN_GIVEN_NAME=Karel +export COMANAGE_REGISTRY_ADMIN_FAMILY_NAME=Novak +export COMANAGE_REGISTRY_ADMIN_USERNAME=karel.novak@my.org + +sed -e s/%%COMANAGE_REGISTRY_VERSION%%/${COMANAGE_REGISTRY_VERSION}/g Dockerfile.template > Dockerfile +docker build \ + --build-arg COMANAGE_REGISTRY_ADMIN_GIVEN_NAME=${COMANAGE_REGISTRY_ADMIN_GIVEN_NAME} \ + --build-arg COMANAGE_REGISTRY_ADMIN_FAMILY_NAME=${COMANAGE_REGISTRY_ADMIN_FAMILY_NAME} \ + --build-arg COMANAGE_REGISTRY_ADMIN_USERNAME=${COMANAGE_REGISTRY_ADMIN_USERNAME} \ + -t comanage-registry:${COMANAGE_REGISTRY_VERSION}-mod-auth-openidc . +``` +## Run + +### Database + +COmanage Registry requires a relational database. See the +[PostgreSQL example for COmanage Registry](../comanage-registry-postgres/README.md). + +### Network + +Create a user-defined network bridge with + +``` +docker network create --driver=bridge \ + --subnet=192.168.0.0/16 \ + --gateway=192.168.0.100 \ + comanage-registry-internal-network +``` + +### COmanage Registry Configuration + +Create a directory to hold persistent COmanage Registry configuration and +other state such as local plugins and other customizations. In that directory +create a `Config` directory and in it place a `database.php` and `email.php` +configuration file: + +``` +mkdir -p /opt/comanage-registry/Config + +cat >> /opt/comanage-registry/Config/database.php <<"EOF" + 'Database/Postgres', + 'persistent' => false, + 'host' => 'comanage-registry-database', + 'login' => 'registry_user', + 'password' => 'password', + 'database' => 'registry', + 'prefix' => 'cm_', + ); + +} +EOF + +cat >> /opt/comanage-registry/Config/database.php <<"EOF" + 'Smtp', + 'host' => 'tls://smtp.gmail.com', + 'port' => 465, + 'username' => 'account@gmail.com', + 'password' => 'password' + ); +} +EOF +``` + +### mod\_auth\_openidc Configuration + +Mount or COPY mod\_auth\_openidc configuration into the file +`/etc/apache2/conf-enabled/mod-auth-openidc.conf`. The configuration +will usually include + +``` +OIDCProviderMetadataURL +OIDCRemoteUserClaim +OIDCClientID +OIDCClientSecret +OIDCScope +OIDCCryptoPassphrase +OIDCRedirectURI +``` + +It should also include a `` directive to identify the +`OIDCRedirectURI`. + +``` + + AuthType openid-connect + Require valid-user + +``` + +You may also want to enable logout. For example + +``` +Redirect /registry/users/logout https:///secure/redirect?logout=https%3A%2F%2F%2Fregistry%2F +``` + +### Container + +``` +docker run -d --name comanage-registry \ + -v /opt/comanage-registry:/local \ + --network comanage-registry-internal-network \ + -p 80:80 -p 443:443 \ + comanage-registry:${COMANAGE_REGISTRY_VERSION}-mod-auth-openidc +``` + +### Logging + +Both Apache HTTP Server and COmanage Registry log to the stdout and +stderr of the container. + +### HTTPS Configuration + +Mount or COPY in an X.509 certificate file, associated private key file, +and certificate signing chain file. + +``` +COPY cert.pem /etc/apache2/cert.pem +COPY privkey.pem /etc/apache2/privkey.pem +COPY chain.pem /etc/apache2/chain.pem +``` diff --git a/comanage-registry-mod-auth-openidc/docker-comanage-entrypoint b/comanage-registry-mod-auth-openidc/docker-comanage-entrypoint new file mode 100755 index 0000000..95a57dd --- /dev/null +++ b/comanage-registry-mod-auth-openidc/docker-comanage-entrypoint @@ -0,0 +1,87 @@ +#!/bin/bash + +# COmanage Registry Dockerfile entrypoint +# +# Portions licensed to the University Corporation for Advanced Internet +# Development, Inc. ("UCAID") under one or more contributor license agreements. +# See the NOTICE file distributed with this work for additional information +# regarding copyright ownership. +# +# UCAID licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Database initialization or schema management using adodb +# is idempotent so we always run it at startup. +pushd "$COMANAGE_REGISTRY_DIR/app" > /dev/null 2>&1 +./Console/cake database > /dev/null 2>&1 +popd > /dev/null 2>&1 + +# We only want to run the setup script once since it creates +# state in the database. Until COmanage Registry has a better +# mechanism for telling us if setup has already been run +# we create an ephemeral CakePHP script to tell us. +SETUP_ALREADY_SCRIPT="$COMANAGE_REGISTRY_DIR/app/Console/Command/SetupAlreadyShell.php" + +cat >> $SETUP_ALREADY_SCRIPT <<"EOF" +Co->find('first', $args); + + if(!empty($co)) { + $this->error('Setup already'); + } + } +} +EOF + +pushd /srv/comanage-registry/app > /dev/null 2>&1 +./Console/cake setupAlready > /dev/null 2>&1 +setup_already=$? + +rm -f "$SETUP_ALREADY_SCRIPT" + +if [ $setup_already -eq 0 ]; then + rm -f "$COMANAGE_REGISTRY_DIR/local/Config/security.salt" > /dev/null 2>&1 + rm -f "$COMANAGE_REGISTRY_DIR/local/Config/security.seed" > /dev/null 2>&1 + ./Console/cake setup --admin-given-name "${COMANAGE_REGISTRY_ADMIN_GIVEN_NAME}" \ + --admin-family-name "${COMANAGE_REGISTRY_ADMIN_FAMILY_NAME}" \ + --admin-username "${COMANAGE_REGISTRY_ADMIN_USERNAME}" \ + --enable-pooling "${COMANAGE_REGISTRY_ENABLE_POOLING}" > /dev/null 2>&1 +fi + +popd > /dev/null 2>&1 + +# Running CakePHP console commands generates cache files so +# set the ownership of those files appropriately. +chown -R www-data:www-data "$COMANAGE_REGISTRY_DIR/app/tmp" + +# Make sure the directory structure we need is available +# in the data volume for $COMANAGE_REGISTRY_DIR/local +mkdir -p "$COMANAGE_REGISTRY_DIR/local/Config" +mkdir -p "$COMANAGE_REGISTRY_DIR/local/Plugin" +mkdir -p "$COMANAGE_REGISTRY_DIR/local/View/Pages/public" +mkdir -p "$COMANAGE_REGISTRY_DIR/local/webroot/img" + +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- apache2-foreground "$@" +fi + +exec "$@"