The compat symlinks have been removed in current mariadb containers. Let's not run into nasty surprises when we update.
286 lines
12 KiB
Bash
286 lines
12 KiB
Bash
#!/bin/bash
|
||
#
|
||
# Authelia Service
|
||
|
||
PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||
get_appvars
|
||
|
||
config_authelia() {
|
||
echo -ne "* Configuring authelia container.."
|
||
|
||
if [ ! -d "/federated/apps/authelia" ]; then
|
||
mkdir -p /federated/apps/authelia/data/config
|
||
mkdir -p /federated/apps/authelia/data/secrets
|
||
fi
|
||
|
||
cat > /federated/apps/authelia/docker-compose.yml <<EOF
|
||
services:
|
||
authelia:
|
||
image: authelia/authelia:\${IMAGE_VERSION}
|
||
container_name: authelia
|
||
hostname: authelia.$DOMAIN
|
||
restart: always
|
||
networks:
|
||
core:
|
||
ipv4_address: 192.168.0.42
|
||
env_file:
|
||
- ./.env
|
||
volumes:
|
||
- ./data/config:/config
|
||
- ./data/secrets:/secrets
|
||
labels:
|
||
- "traefik.enable=true"
|
||
- "traefik.http.routers.authelia.rule=Host(\`authelia.$DOMAIN\`)"
|
||
- "traefik.http.routers.authelia.entrypoints=websecure"
|
||
- "traefik.http.routers.authelia.tls.certresolver=letsencrypt"
|
||
- "traefik.http.middlewares.authelia.forwardAuth.address=http://authelia.$DOMAIN:9091/api/authz/forward-auth"
|
||
- "traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true"
|
||
- "traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email"
|
||
|
||
networks:
|
||
core:
|
||
external: true
|
||
EOF
|
||
|
||
tr -cd '[:alnum:]' < /dev/urandom | fold -w "64" | head -n 1 > /federated/apps/authelia/data/secrets/JWT_SECRET
|
||
tr -cd '[:alnum:]' < /dev/urandom | fold -w "64" | head -n 1 > /federated/apps/authelia/data/secrets/SESSION_SECRET
|
||
tr -cd '[:alnum:]' < /dev/urandom | fold -w "64" | head -n 1 > /federated/apps/authelia/data/secrets/STORAGE_ENCRYPTION_KEY
|
||
echo "$LDAP_SECRET" > /federated/apps/authelia/data/secrets/AUTHENTICATION_BACKEND_LDAP_PASSWORD
|
||
echo "$ADMINPASS" > /federated/apps/authelia/data/secrets/NOTIFIER_SMTP_PASSWORD
|
||
openssl genrsa -out /federated/apps/authelia/data/secrets/private.pem 4096 2>/dev/null
|
||
openssl rsa -in /federated/apps/authelia/data/secrets/private.pem -outform PEM -pubout -out /federated/apps/authelia/data/secrets/public.pem 2>/dev/null
|
||
POWERDNS_CLIENT_SECRET=$(create_password);
|
||
POWERDNS_CLIENT_SECRET_HASH=$(docker run --rm authelia/authelia:latest authelia crypto hash generate pbkdf2 --password $POWERDNS_CLIENT_SECRET 2>/dev/null | awk '{ print $2 }')
|
||
[[ -d "/federated/apps/pdnsmysql/data/var/lib/mysql/pdnsadmin" ]] && POWERDNS_DB="pdnsadmin" || POWERDNS_DB="pdns"
|
||
|
||
cat > /federated/apps/authelia/.env <<EOF
|
||
IMAGE_VERSION=$(current_version authelia)
|
||
X_AUTHELIA_CONFIG_FILTERS=template
|
||
X_AUTHELIA_CONFIG=/config/configuration.yml,/config/idproviders.yml
|
||
AUTHELIA_TOTP_ISSUER=$DOMAIN
|
||
AUTHELIA_WEBAUTHN_DISPLAY_NAME=home
|
||
AUTHELIA_NOTIFIER_SMTP_ADDRESS=submission://mail.$DOMAIN:587
|
||
AUTHELIA_NOTIFIER_SMTP_USERNAME=$SMTPUSER
|
||
AUTHELIA_NOTIFIER_SMTP_SENDER="Authelia <authelia@$DOMAIN>"
|
||
AUTHELIA_AUTHENTICATION_BACKEND_LDAP_ADDRESS=ldaps://ldap.$DOMAIN
|
||
AUTHELIA_AUTHENTICATION_BACKEND_LDAP_BASE_DN=dc=$LDAP_DOMAIN_FIRST,dc=$LDAP_DOMAIN_LAST
|
||
AUTHELIA_AUTHENTICATION_BACKEND_LDAP_USER=cn=admin,dc=$LDAP_DOMAIN_FIRST,dc=$LDAP_DOMAIN_LAST
|
||
AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE=/secrets/JWT_SECRET
|
||
AUTHELIA_SESSION_SECRET_FILE=/secrets/SESSION_SECRET
|
||
AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE=/secrets/STORAGE_ENCRYPTION_KEY
|
||
AUTHELIA_NOTIFIER_SMTP_PASSWORD_FILE=/secrets/NOTIFIER_SMTP_PASSWORD
|
||
AUTHELIA_AUTHENTICATION_BACKEND_LDAP_PASSWORD_FILE=/secrets/AUTHENTICATION_BACKEND_LDAP_PASSWORD
|
||
EOF
|
||
chmod 600 /federated/apps/authelia/.env
|
||
|
||
# Set the ldap configuration up for subdomain if we need to
|
||
if [ "${#LDAP_DOMAIN_ARRAY[@]}" -eq "3" ]; then
|
||
sed -i "s#dc=$LDAP_DOMAIN_FIRST,dc=$LDAP_DOMAIN_LAST#dc=$LDAP_DOMAIN_FIRST,dc=$LDAP_DOMAIN_MIDDLE,dc=$LDAP_DOMAIN_LAST#g" /federated/apps/authelia/.env
|
||
fi
|
||
|
||
cat > /federated/apps/authelia/data/config/configuration.yml <<EOF
|
||
---
|
||
theme: auto
|
||
default_2fa_method: totp
|
||
server:
|
||
address: tcp://0.0.0.0:9091/
|
||
log:
|
||
level: info
|
||
totp:
|
||
disable: false
|
||
issuer: 'authelia.$DOMAIN'
|
||
algorithm: sha1
|
||
digits: 6
|
||
period: 45
|
||
skew: 1
|
||
secret_size: 32
|
||
webauthn:
|
||
disable: false
|
||
timeout: 60s
|
||
attestation_conveyance_preference: indirect
|
||
user_verification: preferred
|
||
authentication_backend:
|
||
password_reset:
|
||
disable: false
|
||
refresh_interval: 5m
|
||
ldap:
|
||
implementation: custom
|
||
timeout: 5s
|
||
start_tls: false
|
||
attributes:
|
||
username: mail
|
||
display_name: uid
|
||
group_name: gidNumber
|
||
mail: mail
|
||
additional_users_dn: ou=people
|
||
users_filter: "(&({username_attribute}={input})(objectClass=person))"
|
||
additional_groups_dn: ou=groups
|
||
groups_filter: "(member={dn})"
|
||
password_policy:
|
||
standard:
|
||
enabled: false
|
||
min_length: 8
|
||
max_length: 0
|
||
require_uppercase: true
|
||
require_lowercase: true
|
||
require_number: true
|
||
require_special: false
|
||
access_control:
|
||
default_policy: one_factor
|
||
session:
|
||
name: 'authelia_session'
|
||
same_site: 'lax'
|
||
inactivity: '5m'
|
||
expiration: '1h'
|
||
remember_me: '1M'
|
||
cookies:
|
||
- domain: '$DOMAIN'
|
||
authelia_url: 'https://authelia.$DOMAIN'
|
||
regulation:
|
||
max_retries: 3
|
||
find_time: 2m
|
||
ban_time: 5m
|
||
storage:
|
||
local:
|
||
path: /config/db.sqlite3
|
||
notifier:
|
||
disable_startup_check: false
|
||
EOF
|
||
|
||
cat > /federated/apps/authelia/data/config/idproviders.yml <<EOF
|
||
identity_providers:
|
||
oidc:
|
||
jwks:
|
||
- key: {{ secret "/secrets/private.pem" | mindent 10 "|" | msquote }}
|
||
## The other portions of the mandatory OpenID Connect 1.0 configuration go here.
|
||
## See: https://www.authelia.com/c/oidc
|
||
clients:
|
||
### PowerDNS
|
||
- client_id: 'powerdns'
|
||
client_name: 'PowerDNS Admin'
|
||
client_secret: $POWERDNS_CLIENT_SECRET_HASH
|
||
consent_mode: 'implicit'
|
||
public: false
|
||
authorization_policy: 'one_factor'
|
||
redirect_uris:
|
||
- 'https://powerdns.$DOMAIN/oidc/authorized'
|
||
scopes:
|
||
- 'openid'
|
||
- 'profile'
|
||
- 'groups'
|
||
- 'email'
|
||
response_types:
|
||
- 'code'
|
||
grant_types:
|
||
- 'authorization_code'
|
||
userinfo_signed_response_alg: 'none'
|
||
EOF
|
||
|
||
# Insert PowerDNS configuration because we need an initial
|
||
# config for Authelia to run
|
||
PDNS_MYSQL_COMMAND1="insert into setting (name, value) values (\"oidc_oauth_enabled\", \"True\");insert into setting (name, value) values (\"oidc_oauth_key\", \"powerdns\");"
|
||
PDNS_MYSQL_COMMAND2="insert into setting (name, value) values (\"oidc_oauth_scope\", \"openid profile groups email\");insert into setting (name, value) values (\"oidc_oauth_api_url\", \"https://authelia.$DOMAIN/api/oidc/userinfo\");"
|
||
PDNS_MYSQL_COMMAND3="insert into setting (name, value) values (\"oidc_oauth_auto_configure\", \"True\");insert into setting (name, value) values (\"oidc_oauth_metadata_url\", \"https://authelia.$DOMAIN/.well-known/openid-configuration\");"
|
||
PDNS_MYSQL_COMMAND4="insert into setting (name, value) values (\"oidc_oauth_token_url\", \"\");insert into setting (name, value) values (\"oidc_oauth_authorize_url\", \"\");"
|
||
PDNS_MYSQL_COMMAND5="insert into setting (name, value) values (\"oidc_oauth_logout_url\", \"https://authelia.$DOMAIN/logout?rd=https://dashboard.$DOMAIN\");insert into setting (name, value) values (\"oidc_oauth_username\", \"preferred_username\");"
|
||
PDNS_MYSQL_COMMAND6="insert into setting (name, value) values (\"oidc_oauth_email\", \"email\");insert into setting (name, value) values (\"oidc_oauth_firstname\", \"preferred_username\");"
|
||
PDNS_MYSQL_COMMAND7="insert into setting (name, value) values (\"oidc_oauth_last_name\", \"name\");insert into setting (name, value) values (\"oidc_oauth_account_name_property\", \"preferred_username\");"
|
||
PDNS_MYSQL_COMMAND8="insert into setting (name, value) values (\"oidc_oauth_account_description_property\", \"name\");insert into setting (name, value) values (\"oidc_oauth_secret\", \"$POWERDNS_CLIENT_SECRET\");"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND1;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND2;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND3;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND4;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND5;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND6;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND7;'"
|
||
docker exec pdnsmysql bash -c "mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e '$PDNS_MYSQL_COMMAND8;'"
|
||
|
||
echo -ne "done.\n"
|
||
}
|
||
start_authelia() {
|
||
# Start service with command to make sure it's up before proceeding
|
||
start_service "authelia" "nc -z 192.168.0.42 9091 &> /dev/null" "7"
|
||
|
||
docker exec pdns pdnsutil add-record $DOMAIN authelia A 86400 $EXTERNALIP &> /dev/null
|
||
[ $? -ne 0 ] && fail "Couldn't add dns record for authelia"
|
||
|
||
# If extra_hosts doesn't exist then insert extra_host configuration in pdnsadmin docker compose
|
||
add_authelia_config_to_dockercompose "pdnsadmin" "$EXTERNALIP"
|
||
|
||
# Stop and start pdnsadmin for internal dns externalhosts to work
|
||
/federated/bin/stop pdnsadmin &> /dev/null
|
||
[ $? -ne 0 ] && fail "Couldn't stop pdnsadmin"
|
||
|
||
/federated/bin/start pdnsadmin &> /dev/null
|
||
[ $? -ne 0 ] && fail "Couldn't start pdnsadmin"
|
||
|
||
echo -ne "done.\n"
|
||
}
|
||
email_authelia() {
|
||
echo -ne "* Sending email to customer.."
|
||
|
||
cat > /federated/apps/mail/data/root/certs/mailfile <<EOF
|
||
<html>
|
||
<img src="https://www.federated.computer/wp-content/uploads/2023/11/logo.png" alt="" /><br>
|
||
<p>
|
||
<h4>Authelia (SSO) is now installed on $DOMAIN, Your Federated Computer Single Sign On</h4>
|
||
<p>
|
||
Dear Customer,<br>
|
||
We’re excited to introduce your new Single Sign-On (SSO) for Federated Core.
|
||
<br>
|
||
<br>
|
||
Your Single Sign On is called Authelia. With Authelia, a single login grants you seamless access to multiple Federated applications.<br>
|
||
Authelia provides single sign-on (SSO) access to the following Federated applications:<br>
|
||
Nextcloud, Element/Matrix, Bookstack, Jitsi, Gitea, RoundCube (Web Mail), EspoCRM, PowerDNS, and WordPress<br>
|
||
<br>
|
||
How to use Authelia<br>
|
||
• Click on any application in your Federated Dashboard and login by clicking, “Login with Authelia”<br>
|
||
• Look for a pop up that will be labeled “https://authelia.YOUR.DOMAIN”<br>
|
||
• Enter your panel user@domain.com and password, then click, “Sign In”<br>
|
||
• That’s It! You can now access all of the Applications listed above.<br>
|
||
<br>
|
||
IMPORTANT: When logging into Nextcloud through traditional login (Not Authelia) use only your 'user' and not 'user@domain.com'.<br>
|
||
<br>
|
||
Using EspoCRM or Gitea?<br>
|
||
These applications need extra configuration to work with SSO.<br>
|
||
Reply to support@federated.computer, and we’ll send you step-by-step instructions to set up SSO for them.<br>
|
||
<br>
|
||
As always, We are here to make the process simple and straightforward. Reply now if you have any questions about Authelia and we will respond promptly.
|
||
<br>
|
||
Thank you for choosing Federated Computer. We’re committed to improving your experience every step of the way.
|
||
<br>
|
||
<br>
|
||
Best regards,<br>
|
||
Federated Computer Support Team
|
||
<br>
|
||
EOF
|
||
|
||
# Send out e-mail from mail container with details
|
||
docker exec mail bash -c "mail -r admin@$DOMAIN -a \"Content-type: text/html\" -s \"Authelia (SSO) is now installed on $DOMAIN\" $EMAIL < /root/certs/mailfile"
|
||
rm /federated/apps/mail/data/root/certs/mailfile
|
||
|
||
echo -ne "done.\n"
|
||
}
|
||
uninstall_authelia() {
|
||
echo -ne "* Uninstalling authelia container.."
|
||
|
||
# First stop the service
|
||
cd /federated/apps/authelia && docker compose -f docker-compose.yml -p authelia down &> /dev/null
|
||
|
||
# Delete the entries in the settings table
|
||
[[ -d "/federated/apps/pdnsmysql/data/var/lib/mysql/pdnsadmin" ]] && POWERDNS_DB="pdnsadmin" || POWERDNS_DB="pdns"
|
||
docker exec pdnsmysql mariadb -uroot -p$MYSQL_ROOTPASSWORD $POWERDNS_DB -e "delete from setting where name like '%oidc_oauth%';"
|
||
|
||
# Delete the app directory
|
||
rm -rf /federated/apps/authelia
|
||
|
||
# Delete the image
|
||
docker image rm authelia/authelia:$IMAGE_VERSION &> /dev/null
|
||
|
||
# Delete the DNS record
|
||
docker exec pdns pdnsutil delete-rrset $DOMAIN authelia A
|
||
|
||
echo -ne "done.\n"
|
||
}
|